| 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 24 matching lines...) Expand all Loading... |
| 35 } | 35 } |
| 36 return result; | 36 return result; |
| 37 } | 37 } |
| 38 | 38 |
| 39 void encode(bindings.Encoder encoder) { | 39 void encode(bindings.Encoder encoder) { |
| 40 var encoder0 = encoder.getStructEncoderAtOffset(kDefaultStructInfo); | 40 var encoder0 = encoder.getStructEncoderAtOffset(kDefaultStructInfo); |
| 41 encoder0.encodeString(a, 8, false); | 41 encoder0.encodeString(a, 8, false); |
| 42 } | 42 } |
| 43 } | 43 } |
| 44 | 44 |
| 45 | |
| 46 class EchoStringResponse extends bindings.Struct { | 45 class EchoStringResponse extends bindings.Struct { |
| 47 static const int kStructSize = 16; | 46 static const int kStructSize = 16; |
| 48 static const bindings.StructDataHeader kDefaultStructInfo = | 47 static const bindings.StructDataHeader kDefaultStructInfo = |
| 49 const bindings.StructDataHeader(kStructSize, 1); | 48 const bindings.StructDataHeader(kStructSize, 1); |
| 50 String a = null; | 49 String a = null; |
| 51 | 50 |
| 52 EchoStringResponse() : super(kStructSize); | 51 EchoStringResponse() : super(kStructSize); |
| 53 | 52 |
| 54 static EchoStringResponse deserialize(bindings.Message message) { | 53 static EchoStringResponse deserialize(bindings.Message message) { |
| 55 return decode(new bindings.Decoder(message)); | 54 return decode(new bindings.Decoder(message)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 66 } | 65 } |
| 67 return result; | 66 return result; |
| 68 } | 67 } |
| 69 | 68 |
| 70 void encode(bindings.Encoder encoder) { | 69 void encode(bindings.Encoder encoder) { |
| 71 var encoder0 = encoder.getStructEncoderAtOffset(kDefaultStructInfo); | 70 var encoder0 = encoder.getStructEncoderAtOffset(kDefaultStructInfo); |
| 72 encoder0.encodeString(a, 8, false); | 71 encoder0.encodeString(a, 8, false); |
| 73 } | 72 } |
| 74 } | 73 } |
| 75 | 74 |
| 76 | |
| 77 const int kEchoString_name = 0; | 75 const int kEchoString_name = 0; |
| 78 const int kEchoStringResponse_name = 1; | 76 const int kEchoStringResponse_name = 1; |
| 79 | 77 |
| 80 class EchoStub extends bindings.Stub { | 78 class EchoStub extends bindings.Stub { |
| 81 EchoStub(core.MojoMessagePipeEndpoint endpoint) | 79 EchoStub(core.MojoMessagePipeEndpoint endpoint) |
| 82 : super.fromEndpoint(endpoint); | 80 : super.fromEndpoint(endpoint); |
| 83 | 81 |
| 84 Future<EchoStringResponse> echoString(EchoString es) { | 82 Future<EchoStringResponse> echoString(EchoString es) { |
| 85 var response = new EchoStringResponse(); | 83 var response = new EchoStringResponse(); |
| 86 response.a = es.a; | 84 response.a = es.a; |
| 87 return new Future.value(response); | 85 return new Future.value(response); |
| 88 } | 86 } |
| 89 | 87 |
| 90 Future<bindings.Message> handleMessage(bindings.ServiceMessage message) { | 88 Future<bindings.Message> handleMessage(bindings.ServiceMessage message) { |
| 91 switch (message.header.type) { | 89 switch (message.header.type) { |
| 92 case kEchoString_name: | 90 case kEchoString_name: |
| 93 var es = EchoString.deserialize(message.payload); | 91 var es = EchoString.deserialize(message.payload); |
| 94 return echoString(es).then((response) { | 92 return echoString(es).then((response) { |
| 95 if (response != null) { | 93 if (response != null) { |
| 96 return buildResponseWithId( | 94 return buildResponseWithId(response, kEchoStringResponse_name, |
| 97 response, | |
| 98 kEchoStringResponse_name, | |
| 99 message.header.requestId, | 95 message.header.requestId, |
| 100 bindings.MessageHeader.kMessageIsResponse); | 96 bindings.MessageHeader.kMessageIsResponse); |
| 101 } | 97 } |
| 102 }); | 98 }); |
| 103 break; | 99 break; |
| 104 default: | 100 default: |
| 105 throw new Exception("Unexpected case"); | 101 throw new Exception("Unexpected case"); |
| 106 break; | 102 break; |
| 107 } | 103 } |
| 108 return null; | 104 return null; |
| 109 } | 105 } |
| 110 } | 106 } |
| 111 | 107 |
| 112 | |
| 113 class EchoProxy extends bindings.Proxy { | 108 class EchoProxy extends bindings.Proxy { |
| 114 EchoProxy(core.MojoMessagePipeEndpoint endpoint, {bool doListen: true, | 109 EchoProxy(core.MojoMessagePipeEndpoint endpoint) |
| 115 Function onClosed}) | 110 : super.fromEndpoint(endpoint); |
| 116 : super.fromEndpoint(endpoint, doListen: doListen, onClosed: onClosed); | |
| 117 | 111 |
| 118 Future<EchoStringResponse> echoString(String a) { | 112 Future<EchoStringResponse> echoString(String a) { |
| 119 // compose message. | 113 // compose message. |
| 120 var es = new EchoString(); | 114 var es = new EchoString(); |
| 121 es.a = a; | 115 es.a = a; |
| 122 return sendMessageWithRequestId( | 116 return sendMessageWithRequestId(es, kEchoString_name, -1, |
| 123 es, | |
| 124 kEchoString_name, | |
| 125 -1, | |
| 126 bindings.MessageHeader.kMessageExpectsResponse); | 117 bindings.MessageHeader.kMessageExpectsResponse); |
| 127 } | 118 } |
| 128 | 119 |
| 129 void handleResponse(bindings.ServiceMessage message) { | 120 void handleResponse(bindings.ServiceMessage message) { |
| 130 switch (message.header.type) { | 121 switch (message.header.type) { |
| 131 case kEchoStringResponse_name: | 122 case kEchoStringResponse_name: |
| 132 var esr = EchoStringResponse.deserialize(message.payload); | 123 var esr = EchoStringResponse.deserialize(message.payload); |
| 133 Completer c = completerMap[message.header.requestId]; | 124 Completer c = completerMap[message.header.requestId]; |
| 134 completerMap[message.header.requestId] = null; | 125 completerMap[message.header.requestId] = null; |
| 135 c.complete(esr); | 126 c.complete(esr); |
| 136 break; | 127 break; |
| 137 default: | 128 default: |
| 138 throw new Exception("Unexpected case"); | 129 throw new Exception("Unexpected case"); |
| 139 break; | 130 break; |
| 140 } | 131 } |
| 141 } | 132 } |
| 142 } | 133 } |
| 143 | 134 |
| 144 | |
| 145 void providerIsolate(core.MojoMessagePipeEndpoint endpoint) { | 135 void providerIsolate(core.MojoMessagePipeEndpoint endpoint) { |
| 146 new EchoStub(endpoint); | 136 new EchoStub(endpoint); |
| 147 } | 137 } |
| 148 | 138 |
| 149 | |
| 150 Future<int> runTest() async { | 139 Future<int> runTest() async { |
| 151 var testCompleter = new Completer(); | 140 var testCompleter = new Completer(); |
| 152 | 141 |
| 153 var pipe = new core.MojoMessagePipe(); | 142 var pipe = new core.MojoMessagePipe(); |
| 154 var proxy = new EchoProxy(pipe.endpoints[0]); | 143 var proxy = new EchoProxy(pipe.endpoints[0]); |
| 155 await Isolate.spawn(providerIsolate, pipe.endpoints[1]); | 144 await Isolate.spawn(providerIsolate, pipe.endpoints[1]); |
| 156 | 145 |
| 157 int n = kEchoesCount; | 146 int n = kEchoesCount; |
| 158 int count = 0; | 147 int count = 0; |
| 159 for (int i = 0; i < n; i++) { | 148 for (int i = 0; i < n; i++) { |
| 160 proxy.echoString("hello").then((response) { | 149 proxy.echoString("hello").then((response) { |
| 161 Expect.equals("hello", response.a); | 150 Expect.equals("hello", response.a); |
| 162 count++; | 151 count++; |
| 163 if (i == (n - 1)) { | 152 if (i == (n - 1)) { |
| 164 proxy.close(); | 153 proxy.close(); |
| 165 testCompleter.complete(count); | 154 testCompleter.complete(count); |
| 166 } | 155 } |
| 167 }); | 156 }); |
| 168 } | 157 } |
| 169 | 158 |
| 170 return testCompleter.future; | 159 return testCompleter.future; |
| 171 } | 160 } |
| 172 | 161 |
| 173 | |
| 174 Future runAwaitTest() async { | 162 Future runAwaitTest() async { |
| 175 var pipe = new core.MojoMessagePipe(); | 163 var pipe = new core.MojoMessagePipe(); |
| 176 var proxy = new EchoProxy(pipe.endpoints[0]); | 164 var proxy = new EchoProxy(pipe.endpoints[0]); |
| 177 await Isolate.spawn(providerIsolate, pipe.endpoints[1]); | 165 await Isolate.spawn(providerIsolate, pipe.endpoints[1]); |
| 178 | 166 |
| 179 int n = kEchoesCount; | 167 int n = kEchoesCount; |
| 180 for (int i = 0; i < n; i++) { | 168 for (int i = 0; i < n; i++) { |
| 181 var response = await proxy.echoString("Hello"); | 169 var response = await proxy.echoString("Hello"); |
| 182 Expect.equals("Hello", response.a); | 170 Expect.equals("Hello", response.a); |
| 183 } | 171 } |
| 184 proxy.close(); | 172 proxy.close(); |
| 185 } | 173 } |
| 186 | 174 |
| 187 | |
| 188 void closingProviderIsolate(core.MojoMessagePipeEndpoint endpoint) { | 175 void closingProviderIsolate(core.MojoMessagePipeEndpoint endpoint) { |
| 189 var provider = new EchoStub(endpoint); | 176 var provider = new EchoStub(endpoint); |
| 190 provider.close(); | 177 provider.close(); |
| 191 } | 178 } |
| 192 | 179 |
| 193 | |
| 194 Future<bool> runOnClosedTest() async { | 180 Future<bool> runOnClosedTest() async { |
| 195 var testCompleter = new Completer(); | 181 var testCompleter = new Completer(); |
| 196 | 182 |
| 197 var pipe = new core.MojoMessagePipe(); | 183 var pipe = new core.MojoMessagePipe(); |
| 198 var proxy = new EchoProxy(pipe.endpoints[0], onClosed: () { | 184 var proxy = new EchoProxy(pipe.endpoints[0]); |
| 199 testCompleter.complete(true); | 185 proxy.onError = () => testCompleter.complete(true); |
| 200 }); | |
| 201 await Isolate.spawn(closingProviderIsolate, pipe.endpoints[1]); | 186 await Isolate.spawn(closingProviderIsolate, pipe.endpoints[1]); |
| 202 return testCompleter.future.timeout( | 187 return testCompleter.future.timeout(new Duration(seconds: 1), |
| 203 new Duration(seconds: 1), | |
| 204 onTimeout: () => false); | 188 onTimeout: () => false); |
| 205 } | 189 } |
| 206 | 190 |
| 207 | |
| 208 main() async { | 191 main() async { |
| 209 Expect.equals(kEchoesCount, await runTest()); | 192 Expect.equals(kEchoesCount, await runTest()); |
| 210 await runAwaitTest(); | 193 await runAwaitTest(); |
| 211 Expect.isTrue(await runOnClosedTest()); | 194 Expect.isTrue(await runOnClosedTest()); |
| 212 } | 195 } |
| OLD | NEW |