| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011, 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 // Dart test program for testing that heavy and light isolates can be mixed. | |
| 6 | |
| 7 #library('Mixed2Test'); | |
| 8 #import("dart:isolate"); | |
| 9 #import('../../lib/unittest/unittest.dart'); | |
| 10 | |
| 11 // We want to send a message from the main-isolate to a chain of different | |
| 12 // isolates and then get a reply back. | |
| 13 // In the following description heavy2 is not used, because it is shut down | |
| 14 // just after heaving created heavy2.light1,2 and light3. | |
| 15 // main-> | |
| 16 // heavy1->heavy1.light1->heavy1.light2->heavy1.light3-> | |
| 17 // heavy2.light1->heavy2.light2->heavy2.light3-> | |
| 18 // heavy3->heavy3.pong | |
| 19 | |
| 20 class LightRedirect extends Isolate { | |
| 21 LightRedirect() : super.light(); | |
| 22 | |
| 23 void main() { | |
| 24 this.port.receive((targetPort, ignored) { | |
| 25 this.port.receive((msg, replyTo) { | |
| 26 targetPort.send(msg + 1000, replyTo); | |
| 27 this.port.close(); | |
| 28 }); | |
| 29 }); | |
| 30 } | |
| 31 } | |
| 32 | |
| 33 class HeavyIsolate1 extends Isolate { | |
| 34 HeavyIsolate1() : super.heavy(); | |
| 35 | |
| 36 void main() { | |
| 37 Future<SendPort> light1 = new LightRedirect().spawn(); | |
| 38 Future<SendPort> light2 = new LightRedirect().spawn(); | |
| 39 Future<SendPort> light3 = new LightRedirect().spawn(); | |
| 40 | |
| 41 this.port.receive((SendPort heavy2Light1Port, ignored) { | |
| 42 light3.then((SendPort light3Port) { | |
| 43 light3Port.send(heavy2Light1Port, null); | |
| 44 light2.then((SendPort light2Port) { | |
| 45 light2Port.send(light3Port, null); | |
| 46 light1.then((SendPort light1Port) { | |
| 47 light1Port.send(light2Port, null); | |
| 48 // Next message we receive is the one that must go through the | |
| 49 // chain. | |
| 50 this.port.receive((msg, SendPort replyTo) { | |
| 51 light1Port.send(msg + 1, replyTo); | |
| 52 this.port.close(); | |
| 53 }); | |
| 54 }); | |
| 55 }); | |
| 56 }); | |
| 57 }); | |
| 58 } | |
| 59 } | |
| 60 | |
| 61 class HeavyIsolate2 extends Isolate { | |
| 62 HeavyIsolate2() : super.heavy(); | |
| 63 | |
| 64 void main() { | |
| 65 Future<SendPort> light1 = new LightRedirect().spawn(); | |
| 66 Future<SendPort> light2 = new LightRedirect().spawn(); | |
| 67 Future<SendPort> light3 = new LightRedirect().spawn(); | |
| 68 | |
| 69 this.port.receive((heavy3Port, replyWithLight1Port) { | |
| 70 light3.then((SendPort light3Port) { | |
| 71 light3Port.send(heavy3Port, null); | |
| 72 light2.then((SendPort light2Port) { | |
| 73 light2Port.send(light3Port, null); | |
| 74 light1.then((SendPort light1Port) { | |
| 75 light1Port.send(light2Port, null); | |
| 76 replyWithLight1Port.send(light1Port, null); | |
| 77 this.port.close(); | |
| 78 }); | |
| 79 }); | |
| 80 }); | |
| 81 }); | |
| 82 } | |
| 83 } | |
| 84 | |
| 85 class LightPong extends Isolate { | |
| 86 LightPong() : super.light(); | |
| 87 | |
| 88 void main() { | |
| 89 this.port.receive((msg, replyTo) { | |
| 90 replyTo.send(msg + 499, null); | |
| 91 this.port.close(); | |
| 92 }); | |
| 93 } | |
| 94 } | |
| 95 | |
| 96 class HeavyIsolate3 extends Isolate { | |
| 97 HeavyIsolate3() : super.heavy(); | |
| 98 | |
| 99 void main() { | |
| 100 Future<SendPort> pong = new LightPong().spawn(); | |
| 101 this.port.receive((msg, replyTo) { | |
| 102 pong.then((SendPort pongPort) { | |
| 103 pongPort.send(msg + 30, replyTo); | |
| 104 this.port.close(); | |
| 105 }); | |
| 106 }); | |
| 107 } | |
| 108 } | |
| 109 | |
| 110 | |
| 111 main() { | |
| 112 test("heavy and light isolates can be mixed", () { | |
| 113 Future<SendPort> heavy1 = new HeavyIsolate1().spawn(); | |
| 114 Future<SendPort> heavy2 = new HeavyIsolate2().spawn(); | |
| 115 Future<SendPort> heavy3 = new HeavyIsolate3().spawn(); | |
| 116 | |
| 117 heavy2.then(expectAsync1((SendPort heavy2Port) { | |
| 118 heavy3.then(expectAsync1((SendPort heavy3Port) { | |
| 119 heavy2Port.call(heavy3Port).then(expectAsync1((h2l1Port) { | |
| 120 heavy1.then(expectAsync1((SendPort heavy1Port) { | |
| 121 heavy1Port.send(h2l1Port, null); | |
| 122 // --------------- | |
| 123 // Setup complete. | |
| 124 // Start the chain-message. | |
| 125 heavy1Port.call(1).then(expectAsync1((result) { | |
| 126 Expect.equals(6531, result); | |
| 127 })); | |
| 128 })); | |
| 129 })); | |
| 130 })); | |
| 131 })); | |
| 132 }); | |
| 133 } | |
| OLD | NEW |