/*
 * 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 pauseCapability
 *    read-only
 *    Capability granting the ability to pause the isolate.
 *    This capability is used by pause. If the capability is not the correct
 * pause capability of the isolate, including if the capability is null,
 * then calls to pause will have no effect.
 *
 * @description Check that if pauseCapability is null, calls to pause()
 * 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);
  Isolate isolate = new Isolate(server.isolate.controlPort,
                                  pauseCapability:null,
                                  terminateCapability:null);
  Expect.equals("hello", await server.ping("hello"));
  isolate.pause();
  Expect.equals("pause1", await server.ping("pause1"));
  isolate.pause(new Capability());
  Expect.equals("pause2", await server.ping("pause2"));

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

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