// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS
// file for details. All rights reserved. Use of this source code is governed
// by a BSD-style license that can be found in the LICENSE file.

/// @assertion If the errorAreFatal, onExit and/or onError parameters are
/// provided, the isolate will act as if, respectively, setErrorsFatal,
/// addOnExitListener and addErrorListener were called with the corresponding
/// parameter and was processed before the isolate starts running.
///
/// @description Check that with errorAreFatal set to true the isolate is
/// terminated on first error. The isolate is passive.
/// @author a.semenov@unipro.ru

import "dart:isolate";
import "dart:async";
import "../../../Utils/expect.dart";
import "IsolateUtil.dart";

void entryPoint(List message) {
  dynamic i = 1;
  SendPort sendPort = message[1];
  ReceivePort receivePort = new ReceivePort();
  receivePort.listen((data) {
    sendPort.send(data);
    // An error that should stop the isolate
    sendPort.send(", " + i);
    sendPort.send("hello");
  });
  message[0].send(receivePort.sendPort);
}

test() async {
  ReceivePort controlPort = new ReceivePort();
  ReceivePort receivePort = new ReceivePort();
  Future<List> receivedData = receivePort.toList();

  Isolate isolate = await Isolate.spawn(
      entryPoint, [controlPort.sendPort, receivePort.sendPort],
      errorsAreFatal: true);
  SendPort sendPort = await controlPort.first;

  sendPort.send("test1");
  sendPort.send("test2");
  sendPort.send("test3");

  await new Future.delayed(ONE_SECOND);
  Expect.equals("timeout", await ping(isolate, "ping", THREE_SECONDS));
  receivePort.close();
  Expect.listEquals(["test1"], await receivedData);
  asyncEnd();
}

main() {
  asyncStart();
  test();
}
