// 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 Capability terminateCapability
///    read-only
///    Capability granting the ability to terminate the isolate.
///    This capability is used by kill and setErrorsFatal. If the capability
/// is not the correct termination capability of the isolate, including
/// if the capability is null, then calls to those methods will have no effect.
///
/// @description Check that if terminateCapability is not correct, calls
/// to kill() have no effect.
///
/// @author a.semenov@unipro.ru

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

test() async {
  ReceivePort receivePort = new ReceivePort();
  EchoServer server = await EchoServer.spawn(receivePort.sendPort);
  Capability wrongCapability = new Capability();
  Isolate isolate = new Isolate(server.isolate.controlPort,
                                  pauseCapability:null,
                                  terminateCapability:wrongCapability);
  Expect.equals("hello", await server.ping("hello"));
  isolate.kill();
  Expect.equals("alive1", await ping(isolate, "alive1"));
  isolate.kill(priority:Isolate.immediate);
  Expect.equals("alive2", await ping(isolate, "alive2"));
  isolate.kill(priority:Isolate.beforeNextEvent);
  Expect.equals("alive3", await ping(isolate, "alive3"));

  // clean up
  await server.stop();
  receivePort.close();
  asyncEnd();
}

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