/*
 * 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 correct pause capability,
 * call to pause() with argument pauses the isolate, call to resume()
 * resumes the isolate.
 *
 * @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:server.isolate.pauseCapability,
                                 terminateCapability:null);
  Expect.equals("hello", await server.ping("hello"));
  Capability resumeCapability = isolate.pause(new Capability());
  Expect.equals("timeout", await server.ping("pause1", ONE_SECOND, "timeout"));
  isolate.resume(resumeCapability);
  Expect.equals("server", await server.ping("server"));

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

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