/*
 * Copyright (c) 2017, 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 void setErrorsFatal(
 *                                bool errorsAreFatal
 *                               )
 * ...
 *    This call requires the terminateCapability for the isolate. If the
 * capability is not correct, no change is made.
 *
 * @description Check that call to setErrorsFatal(false) on isolate without
 * terminateCapability have no effect
 *
 * @author a.semenov@unipro.ru
 */
import "dart:isolate";
import "dart:async";
import "../../../Utils/expect.dart";
import "IsolateUtil.dart";

Future test(Capability? wrongCapability) async {
  // setup
  ReceivePort errorPort = new ReceivePort();
  StreamIterator errors = new StreamIterator(errorPort);
  ReceivePort exitPort = new ReceivePort();
  ErrorServer server = await ErrorServer.spawn(
                                                errorsAreFatal:true,
                                                onError: errorPort.sendPort,
                                                onExit: exitPort.sendPort
                                             );
  Isolate isolate = new Isolate(
      server.isolate.controlPort,
      pauseCapability:null,
      terminateCapability:wrongCapability
  );

  isolate.setErrorsFatal(false);
  // verify that errors are still fatal
  server.generateError();
  Expect.isTrue(await errors.moveNext());
  Expect.equals("0".toString(), errors.current[0]);

  server.generateError();
  Expect.isFalse(await errors.moveNext().timeout(ONE_SECOND, onTimeout:()=>false));

  await exitPort.first;
  // clean up
  errorPort.close();
}

main() {
  asyncStart();
  Future.wait(
      [test(null), test(new Capability())]
  ).then(
      (_) => asyncEnd()
  );
}
