OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 library handle_error_test; | |
6 | |
7 import "dart:isolate"; | |
8 import "dart:async"; | |
9 import "package:async_helper/async_helper.dart"; | |
10 import "package:expect/expect.dart"; | |
11 | |
12 isomain1(replyPort) { | |
13 RawReceivePort port = new RawReceivePort(); | |
14 port.handler = (v) { | |
15 switch (v) { | |
16 case 0: | |
17 replyPort.send(42); | |
18 break; | |
19 case 1: | |
20 throw new ArgumentError("whoops"); | |
21 case 2: | |
22 throw new RangeError.value(37); | |
23 case 3: | |
24 port.close(); | |
25 } | |
26 }; | |
27 replyPort.send(port.sendPort); | |
28 } | |
29 | |
30 Future spawn(entry) { | |
31 ReceivePort reply = new ReceivePort(); | |
32 Future isolate = Isolate.spawn(entry, reply.sendPort, paused: true); | |
33 return isolate.then((Isolate isolate) { | |
34 isolate.setErrorsFatal(false); | |
35 isolate.resume(isolate.pauseCapability); | |
36 Future result = reply.first.then((sendPort) { | |
37 return [isolate, sendPort]; | |
38 }); | |
39 return result; | |
40 }); | |
41 } | |
42 | |
43 main(){ | |
44 asyncStart(); | |
45 asyncStart(); | |
46 RawReceivePort reply = new RawReceivePort(null); | |
47 RawReceivePort reply2 = new RawReceivePort(null); | |
48 // Start paused so we have time to set up the error handler. | |
floitsch
2014/05/15 12:15:25
ditto (as in handle_error2)
| |
49 Future iso1 = spawn(isomain1); | |
50 Future iso2 = spawn(isomain1); | |
51 Future.wait([iso1, iso2]).then((l) { | |
52 var isolate1 = l[0][0]; | |
53 var sendPort1 = l[0][1]; | |
54 var isolate2 = l[1][0]; | |
55 var sendPort2 = l[1][1]; | |
56 // Capture errors from one isolate as stream. | |
57 Stream errors = isolate1.errors; // Broadcast stream, never a done message. | |
58 int state = 1; | |
59 var subscription; | |
60 subscription = errors.listen(null, onError: (error, stack) { | |
61 switch (state) { | |
62 case 1: | |
63 Expect.equals(new ArgumentError("whoops").toString(), "$error"); | |
64 state++; | |
65 break; | |
66 case 2: | |
67 Expect.equals(new RangeError.value(37).toString(), "$error"); | |
68 state++; | |
69 reply.close(); | |
70 subscription.cancel(); | |
71 asyncEnd(); | |
72 break; | |
73 default: | |
74 throw "Bad state for error: $state: $error"; | |
75 } | |
76 }); | |
77 // Capture errors from other isolate as raw messages. | |
78 RawReceivePort errorPort2 = new RawReceivePort(); | |
79 int state2 = 1; | |
80 errorPort2.handler = (message) { | |
81 String error = message[0]; | |
82 String stack = message[1]; | |
83 switch (state2) { | |
84 case 1: | |
85 Expect.equals(new ArgumentError("whoops").toString(), "$error"); | |
86 state2++; | |
87 break; | |
88 case 2: | |
89 Expect.equals(new RangeError.value(37).toString(), "$error"); | |
90 state2++; | |
91 reply.close(); | |
92 isolate2.removeErrorListener(errorPort2.sendPort); | |
93 errorPort2.close(); | |
94 asyncEnd(); | |
95 break; | |
96 default: | |
97 throw "Bad state-2 for error: $state: $error"; | |
98 } | |
99 }; | |
100 isolate2.addErrorListener(errorPort2.sendPort); | |
101 | |
102 sendPort1.send(0); | |
103 sendPort2.send(0); | |
104 sendPort1.send(1); | |
105 sendPort2.send(1); | |
106 sendPort1.send(2); | |
107 sendPort2.send(2); | |
108 sendPort1.send(3); | |
109 sendPort2.send(3); | |
110 }); | |
111 } | |
112 | |
OLD | NEW |