blob: f1879aa6b23ec9b09ad00479e78e3241fa9368b1 [file] [log] [blame]
/*
* 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 void resume(
* Capability resumeCapability
* )
* Resumes a paused isolate.
* Sends a message to an isolate requesting that it ends a pause that was
* requested using the resumeCapability.
* When all active pause requests have been cancelled, the isolate will
* continue processing events and handling normal messages.
*
* @description Check that isolate continue processing events only after
* all pause requests are canceled by call to resume()
*
* @author a.semenov@unipro.ru
*/
import "dart:isolate";
import "dart:async";
import "../../../Utils/expect.dart";
import "IsolateUtil.dart";
Duration _500MS = new Duration(milliseconds: 500);
Future test(List<int> resumePermutation) async {
ReceivePort receivePort = new ReceivePort();
EchoServer server = await EchoServer.spawn(receivePort.sendPort);
Expect.equals("hello", await server.ping("hello"));
List<Capability> resumeCapability = [];
resumeCapability.add(server.isolate.pause());
Expect.equals("timeout", await server.ping("paused0", _500MS, "timeout"));
for (int i = 1; i < resumePermutation.length; i++) {
resumeCapability.add(server.isolate.pause(new Capability()));
Expect.equals("timeout", await server.ping("paused$i", _500MS, "timeout"));
}
int i = 0;
while (i < resumePermutation.length - 1) {
server.isolate.resume(resumeCapability[resumePermutation[i]]);
Expect.equals("timeout", await server.ping("resume$i", _500MS, "timeout"));
i++;
}
server.isolate.resume(resumeCapability[resumePermutation[i]]);
Expect.equals("resume", await server.ping("resume", _500MS, "timeout"));
Expect.equals("server", await server.ping("server"));
await server.stop();
receivePort.close();
}
main() {
asyncStart();
Future.wait([
test([0, 1, 2, 3, 4]),
test([4, 3, 2, 1, 0]),
test([3, 2, 0, 1, 4]),
test([2, 0, 3, 4, 1])
]).then((_) => asyncEnd());
}