/*
 * 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.
 *    If the isolate is started in a paused state, use this capability
 * as argument to resume to resume the isolate.
 *
 * @description Check that if pauseCapability is not correct pause capability,
 * call to resume() with pauseCapability as argument will not resume
 * the isolate, which is started in paused state.
 *
 * @author a.semenov@unipro.ru
 */
import "dart:isolate";
import "dart:async";
import "../../../Utils/expect.dart";
import "IsolateUtil.dart";

void entryPoint(SendPort sendPort) {
  sendPort.send("hello");
}

Future test(Capability? pauseCapability) async {
  ReceivePort receivePort = new ReceivePort();
  Future receiveFuture = receivePort.first;
  Isolate isolate = await Isolate.spawn(entryPoint,
                                        receivePort.sendPort,
                                        paused:true);

  Isolate clone = new Isolate(isolate.controlPort,
                              pauseCapability: pauseCapability,
                              terminateCapability:null);

  var pc = clone.pauseCapability;
  if (pc != null) {
    clone.resume(pc);
  }

  var timeout = receiveFuture.timeout(ONE_SECOND, onTimeout:() => "timeout");
  Expect.equals("timeout", await timeout);

  isolate.resume(isolate.pauseCapability!);
  receivePort.close();
  return null;
}

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