| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 import 'dart:async'; | 5 import 'dart:async'; |
| 6 import 'dart:isolate'; | 6 import 'dart:isolate'; |
| 7 import 'dart:typed_data'; | 7 import 'dart:typed_data'; |
| 8 import 'mojo:bindings' as bindings; | 8 import 'mojo:bindings' as bindings; |
| 9 import 'mojo:core' as core; | 9 import 'mojo:core' as core; |
| 10 | 10 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 var encoder0 = encoder.getStructEncoderAtOffset(kDefaultStructInfo); | 71 var encoder0 = encoder.getStructEncoderAtOffset(kDefaultStructInfo); |
| 72 encoder0.encodeString(a, 8, false); | 72 encoder0.encodeString(a, 8, false); |
| 73 } | 73 } |
| 74 } | 74 } |
| 75 | 75 |
| 76 | 76 |
| 77 const int kEchoString_name = 0; | 77 const int kEchoString_name = 0; |
| 78 const int kEchoStringResponse_name = 1; | 78 const int kEchoStringResponse_name = 1; |
| 79 | 79 |
| 80 class EchoStub extends bindings.Stub { | 80 class EchoStub extends bindings.Stub { |
| 81 EchoStub(core.MojoMessagePipeEndpoint endpoint) : super(endpoint); | 81 EchoStub(core.MojoMessagePipeEndpoint endpoint) |
| 82 : super.fromEndpoint(endpoint); |
| 82 | 83 |
| 83 Future<EchoStringResponse> echoString(EchoString es) { | 84 Future<EchoStringResponse> echoString(EchoString es) { |
| 84 var response = new EchoStringResponse(); | 85 var response = new EchoStringResponse(); |
| 85 response.a = es.a; | 86 response.a = es.a; |
| 86 return new Future.value(response); | 87 return new Future.value(response); |
| 87 } | 88 } |
| 88 | 89 |
| 89 Future<bindings.Message> handleMessage(bindings.ServiceMessage message) { | 90 Future<bindings.Message> handleMessage(bindings.ServiceMessage message) { |
| 90 switch (message.header.type) { | 91 switch (message.header.type) { |
| 91 case kEchoString_name: | 92 case kEchoString_name: |
| (...skipping 11 matching lines...) Expand all Loading... |
| 103 default: | 104 default: |
| 104 throw new Exception("Unexpected case"); | 105 throw new Exception("Unexpected case"); |
| 105 break; | 106 break; |
| 106 } | 107 } |
| 107 return null; | 108 return null; |
| 108 } | 109 } |
| 109 } | 110 } |
| 110 | 111 |
| 111 | 112 |
| 112 class EchoProxy extends bindings.Proxy { | 113 class EchoProxy extends bindings.Proxy { |
| 113 EchoProxy(core.MojoMessagePipeEndpoint endpoint) : super(endpoint); | 114 EchoProxy(core.MojoMessagePipeEndpoint endpoint, {bool doListen: true, |
| 115 Function onClosed}) |
| 116 : super.fromEndpoint(endpoint, doListen: doListen, onClosed: onClosed); |
| 114 | 117 |
| 115 Future<EchoStringResponse> echoString(String a) { | 118 Future<EchoStringResponse> echoString(String a) { |
| 116 // compose message. | 119 // compose message. |
| 117 var es = new EchoString(); | 120 var es = new EchoString(); |
| 118 es.a = a; | 121 es.a = a; |
| 119 return sendMessageWithRequestId( | 122 return sendMessageWithRequestId( |
| 120 es, | 123 es, |
| 121 kEchoString_name, | 124 kEchoString_name, |
| 122 -1, | 125 -1, |
| 123 bindings.MessageHeader.kMessageExpectsResponse); | 126 bindings.MessageHeader.kMessageExpectsResponse); |
| 124 } | 127 } |
| 125 | 128 |
| 126 void handleResponse(bindings.ServiceMessage message) { | 129 void handleResponse(bindings.ServiceMessage message) { |
| 127 switch (message.header.type) { | 130 switch (message.header.type) { |
| 128 case kEchoStringResponse_name: | 131 case kEchoStringResponse_name: |
| 129 var esr = EchoStringResponse.deserialize(message.payload); | 132 var esr = EchoStringResponse.deserialize(message.payload); |
| 130 Completer c = completerMap[message.header.requestId]; | 133 Completer c = completerMap[message.header.requestId]; |
| 131 completerMap[message.header.requestId] = null; | 134 completerMap[message.header.requestId] = null; |
| 132 c.complete(esr); | 135 c.complete(esr); |
| 133 break; | 136 break; |
| 134 default: | 137 default: |
| 135 throw new Exception("Unexpected case"); | 138 throw new Exception("Unexpected case"); |
| 136 break; | 139 break; |
| 137 } | 140 } |
| 138 } | 141 } |
| 139 } | 142 } |
| 140 | 143 |
| 141 | 144 |
| 142 void providerIsolate(core.MojoMessagePipeEndpoint endpoint) { | 145 void providerIsolate(core.MojoMessagePipeEndpoint endpoint) { |
| 143 var provider = new EchoStub(endpoint); | 146 new EchoStub(endpoint); |
| 144 provider.listen(); | |
| 145 } | 147 } |
| 146 | 148 |
| 147 | 149 |
| 148 Future<int> runTest() async { | 150 Future<int> runTest() async { |
| 149 var testCompleter = new Completer(); | 151 var testCompleter = new Completer(); |
| 150 | 152 |
| 151 var pipe = new core.MojoMessagePipe(); | 153 var pipe = new core.MojoMessagePipe(); |
| 152 var proxy = new EchoProxy(pipe.endpoints[0]); | 154 var proxy = new EchoProxy(pipe.endpoints[0]); |
| 153 await Isolate.spawn(providerIsolate, pipe.endpoints[1]); | 155 await Isolate.spawn(providerIsolate, pipe.endpoints[1]); |
| 154 | 156 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 void closingProviderIsolate(core.MojoMessagePipeEndpoint endpoint) { | 188 void closingProviderIsolate(core.MojoMessagePipeEndpoint endpoint) { |
| 187 var provider = new EchoStub(endpoint); | 189 var provider = new EchoStub(endpoint); |
| 188 provider.close(); | 190 provider.close(); |
| 189 } | 191 } |
| 190 | 192 |
| 191 | 193 |
| 192 Future<bool> runOnClosedTest() async { | 194 Future<bool> runOnClosedTest() async { |
| 193 var testCompleter = new Completer(); | 195 var testCompleter = new Completer(); |
| 194 | 196 |
| 195 var pipe = new core.MojoMessagePipe(); | 197 var pipe = new core.MojoMessagePipe(); |
| 196 var proxy = new EchoProxy(pipe.endpoints[0]); | 198 var proxy = new EchoProxy(pipe.endpoints[0], onClosed: () { |
| 197 await Isolate.spawn(closingProviderIsolate, pipe.endpoints[1]); | |
| 198 proxy.listen(onClosed: () { | |
| 199 testCompleter.complete(true); | 199 testCompleter.complete(true); |
| 200 }); | 200 }); |
| 201 | 201 await Isolate.spawn(closingProviderIsolate, pipe.endpoints[1]); |
| 202 return testCompleter.future.timeout( | 202 return testCompleter.future.timeout( |
| 203 new Duration(seconds: 1), | 203 new Duration(seconds: 1), |
| 204 onTimeout: () => false); | 204 onTimeout: () => false); |
| 205 } | 205 } |
| 206 | 206 |
| 207 | 207 |
| 208 main() async { | 208 main() async { |
| 209 Expect.equals(kEchoesCount, await runTest()); | 209 Expect.equals(kEchoesCount, await runTest()); |
| 210 await runAwaitTest(); | 210 await runAwaitTest(); |
| 211 Expect.isTrue(await runOnClosedTest()); | 211 Expect.isTrue(await runOnClosedTest()); |
| 212 } | 212 } |
| OLD | NEW |