blob: b5bc362d94a65294cdbab64976a969ee96446a45 [file] [log] [blame] [edit]
// Copyright (c) 2015, 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.
//
// OtherScripts=error_exit_at_spawnuri_iso.dart
library error_exit_at_spawnuri;
import "dart:isolate";
import "dart:async";
import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";
main() {
asyncStart();
// Setup the port for communication with the newly spawned isolate.
RawReceivePort reply = new RawReceivePort(null);
SendPort sendPort;
int state = 0;
reply.handler = (port) {
sendPort = port;
port.send(state);
reply.handler = (v) {
Expect.equals(0, state);
Expect.equals(42, v);
state++;
sendPort.send(state);
};
};
// Capture errors from other isolate as raw messages.
RawReceivePort errorPort = new RawReceivePort();
errorPort.handler = (message) {
String error = message[0];
String stack = message[1];
switch (state) {
case 1:
Expect.equals(new ArgumentError("whoops").toString(), "$error");
state++;
sendPort.send(state);
break;
case 2:
Expect.equals(new RangeError.value(37).toString(), "$error");
state++;
sendPort.send(state);
reply.close();
errorPort.close();
break;
default:
throw "Bad state for error: $state: $error";
}
};
// Get exit notifications from other isolate as raw messages.
RawReceivePort exitPort = new RawReceivePort();
exitPort.handler = (message) {
// onExit ports registered at spawn cannot have a particular message
// associated.
Expect.equals(null, message);
// Only exit after sending the termination message.
Expect.equals(3, state);
exitPort.close();
asyncEnd();
};
Isolate.spawnUri(
Uri.parse("error_exit_at_spawnuri_iso.dart"), [], reply.sendPort,
// Setup handlers as part of spawn.
errorsAreFatal: false,
onError: errorPort.sendPort,
onExit: exitPort.sendPort);
}