// 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 pause([
///    Capability resumeCapability
/// ])
///    Requests the isolate to pause.
///    When the isolate receives the pause command, it stops processing events
/// from the event loop queue. It may still add new events to the queue in
/// response to, e.g., timers or receive-port messages. When the isolate is
/// resumed, it handles the already enqueued events.
///
/// @description Check that isolate does not process events after pause() call
/// with given capability.
///
/// @author a.semenov@unipro.ru

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

test() async {
  ReceivePort receivePort = new ReceivePort();
  Future<List> receivedDataFuture = receivePort.toList();
  EchoServer server = await EchoServer.spawn(receivePort.sendPort);
  server.send("hello");
  await new Future.delayed(new Duration(milliseconds:100));
  server.isolate.pause(new Capability());
  server.send("paused");
  server.send("server");
  await new Future.delayed(new Duration(milliseconds:200));
// clean up & check
  await server.kill(priority:Isolate.immediate);
  receivePort.close();
  // first message "hello" may be blocked by pause call
  List receivedData = await receivedDataFuture;
  Expect.isTrue(receivedData.length==0 ||
    (receivedData.length==1 && "hello"==receivedData[0]));
  asyncEnd();
}

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