| 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:mojo_bindings' as bindings; | 7 import 'dart:mojo_bindings' as bindings; |
| 8 import 'dart:mojo_core' as core; | 8 import 'dart:mojo_core' as core; |
| 9 import 'dart:typed_data'; | 9 import 'dart:typed_data'; |
| 10 | 10 |
| 11 import 'package:mojo/dart/testing/expect.dart'; | 11 import 'package:mojo/dart/testing/expect.dart'; |
| 12 | 12 |
| 13 const int kEchoesCount = 100; |
| 14 |
| 13 class EchoString { | 15 class EchoString { |
| 14 String a = null; | 16 String a = null; |
| 15 | 17 |
| 16 EchoString(); | 18 EchoString(); |
| 17 | 19 |
| 18 static const int encodedSize = bindings.kStructHeaderSize + 8; | 20 static const int encodedSize = bindings.kStructHeaderSize + 8; |
| 19 static EchoString decode(bindings.MojoDecoder decoder) { | 21 static EchoString decode(bindings.MojoDecoder decoder) { |
| 20 var val = new EchoString(); | 22 var val = new EchoString(); |
| 21 var numBytes = decoder.readUint32(); | 23 var numBytes = decoder.readUint32(); |
| 22 var numFields = decoder.readUint32(); | 24 var numFields = decoder.readUint32(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 37 static var encode = EchoString.encode; | 39 static var encode = EchoString.encode; |
| 38 } | 40 } |
| 39 | 41 |
| 40 | 42 |
| 41 const int kEchoString_name = 0; | 43 const int kEchoString_name = 0; |
| 42 const int kEchoStringResponse_name = 1; | 44 const int kEchoStringResponse_name = 1; |
| 43 | 45 |
| 44 class EchoInterface extends bindings.Interface { | 46 class EchoInterface extends bindings.Interface { |
| 45 EchoInterface(core.MojoMessagePipeEndpoint endpoint) : super(endpoint); | 47 EchoInterface(core.MojoMessagePipeEndpoint endpoint) : super(endpoint); |
| 46 | 48 |
| 47 EchoStringResponse echoString(EchoString es) { | 49 Future<EchoStringResponse> echoString(EchoString es) { |
| 48 var response = new EchoStringResponse(); | 50 var response = new EchoStringResponse(); |
| 49 response.a = es.a; | 51 response.a = es.a; |
| 50 return response; | 52 return new Future.value(response); |
| 51 } | 53 } |
| 52 | 54 |
| 53 bindings.Message handleMessage(bindings.MessageReader reader) { | 55 Future<bindings.Message> handleMessage(bindings.MessageReader reader) { |
| 54 switch (reader.name) { | 56 switch (reader.name) { |
| 55 case kEchoString_name: | 57 case kEchoString_name: |
| 56 var es = reader.decodeStruct(EchoString); | 58 var es = reader.decodeStruct(EchoString); |
| 57 var response = echoString(es); | 59 return echoString(es).then((response) { |
| 58 return buildResponseWithID(EchoStringResponse, | 60 if (response != null) { |
| 59 kEchoStringResponse_name, | 61 return buildResponseWithID(EchoStringResponse, |
| 60 reader.requestID, | 62 kEchoStringResponse_name, |
| 61 bindings.kMessageIsResponse, | 63 reader.requestID, |
| 62 response); | 64 bindings.kMessageIsResponse, |
| 65 response); |
| 66 } |
| 67 }); |
| 63 break; | 68 break; |
| 64 default: | 69 default: |
| 65 throw new Exception("Unexpected case"); | 70 throw new Exception("Unexpected case"); |
| 66 break; | 71 break; |
| 67 } | 72 } |
| 68 return null; | 73 return null; |
| 69 } | 74 } |
| 70 } | 75 } |
| 71 | 76 |
| 72 | 77 |
| 73 class EchoClient extends bindings.Client { | 78 class EchoClient extends bindings.Client { |
| 74 EchoClient(core.MojoMessagePipeEndpoint endpoint) : super(endpoint); | 79 EchoClient(core.MojoMessagePipeEndpoint endpoint) : super(endpoint); |
| 75 | 80 |
| 76 Future<EchoStringResponse> echoString(String a) { | 81 Future<EchoStringResponse> echoString(String a) { |
| 77 // compose message. | 82 // compose message. |
| 78 var es = new EchoString(); | 83 var es = new EchoString(); |
| 79 es.a = a; | 84 es.a = a; |
| 80 return enqueueMessageWithRequestID(EchoString, | 85 return enqueueMessageWithRequestID(EchoString, |
| 81 kEchoString_name, | 86 kEchoString_name, |
| 82 0, | 87 -1, |
| 83 bindings.kMessageExpectsResponse, | 88 bindings.kMessageExpectsResponse, |
| 84 es); | 89 es); |
| 85 } | 90 } |
| 86 | 91 |
| 87 void handleResponse(bindings.MessageReader reader) { | 92 void handleResponse(bindings.MessageReader reader) { |
| 88 switch (reader.name) { | 93 switch (reader.name) { |
| 89 case kEchoStringResponse_name: | 94 case kEchoStringResponse_name: |
| 90 var esr = reader.decodeStruct(EchoStringResponse); | 95 var esr = reader.decodeStruct(EchoStringResponse); |
| 91 Completer c = completerQueue.removeAt(0); | 96 Completer c = completerMap[reader.requestID]; |
| 97 completerMap[reader.requestID] = null; |
| 92 c.complete(esr); | 98 c.complete(esr); |
| 93 break; | 99 break; |
| 94 default: | 100 default: |
| 95 throw new Exception("Unexpected case"); | 101 throw new Exception("Unexpected case"); |
| 96 break; | 102 break; |
| 97 } | 103 } |
| 98 } | 104 } |
| 99 } | 105 } |
| 100 | 106 |
| 101 | 107 |
| 102 void providerIsolate(core.MojoMessagePipeEndpoint endpoint) { | 108 void providerIsolate(core.MojoMessagePipeEndpoint endpoint) { |
| 103 var provider = new EchoInterface(endpoint); | 109 var provider = new EchoInterface(endpoint); |
| 104 provider.listen(); | 110 provider.listen(); |
| 105 } | 111 } |
| 106 | 112 |
| 107 | 113 |
| 108 Future<bool> runTest() async { | 114 Future<bool> runTest() async { |
| 109 var testCompleter = new Completer(); | 115 var testCompleter = new Completer(); |
| 110 | 116 |
| 111 var pipe = new core.MojoMessagePipe(); | 117 var pipe = new core.MojoMessagePipe(); |
| 112 var client = new EchoClient(pipe.endpoints[0]); | 118 var client = new EchoClient(pipe.endpoints[0]); |
| 113 await Isolate.spawn(providerIsolate, pipe.endpoints[1]); | 119 await Isolate.spawn(providerIsolate, pipe.endpoints[1]); |
| 114 | 120 |
| 115 int n = 100; | 121 int n = kEchoesCount; |
| 116 int count = 0; | 122 int count = 0; |
| 117 client.open(); | 123 client.open(); |
| 118 for (int i = 0; i < n; i++) { | 124 for (int i = 0; i < n; i++) { |
| 119 client.echoString("hello").then((response) { | 125 client.echoString("hello").then((response) { |
| 120 Expect.equals("hello", response.a); | 126 Expect.equals("hello", response.a); |
| 121 count++; | 127 count++; |
| 122 if (i == (n - 1)) { | 128 if (i == (n - 1)) { |
| 123 client.close(); | 129 client.close(); |
| 124 testCompleter.complete(count); | 130 testCompleter.complete(count); |
| 125 } | 131 } |
| 126 }); | 132 }); |
| 127 } | 133 } |
| 128 | 134 |
| 129 return testCompleter.future; | 135 return testCompleter.future; |
| 130 } | 136 } |
| 131 | 137 |
| 132 | 138 |
| 133 Future runAwaitTest() async { | 139 Future runAwaitTest() async { |
| 134 var pipe = new core.MojoMessagePipe(); | 140 var pipe = new core.MojoMessagePipe(); |
| 135 var client = new EchoClient(pipe.endpoints[0]); | 141 var client = new EchoClient(pipe.endpoints[0]); |
| 136 await Isolate.spawn(providerIsolate, pipe.endpoints[1]); | 142 await Isolate.spawn(providerIsolate, pipe.endpoints[1]); |
| 137 | 143 |
| 138 int n = 100; | 144 int n = kEchoesCount; |
| 139 client.open(); | 145 client.open(); |
| 140 for (int i = 0; i < n; i++) { | 146 for (int i = 0; i < n; i++) { |
| 141 var response = await client.echoString("Hello"); | 147 var response = await client.echoString("Hello"); |
| 142 Expect.equals("Hello", response.a); | 148 Expect.equals("Hello", response.a); |
| 143 } | 149 } |
| 144 client.close(); | 150 client.close(); |
| 145 } | 151 } |
| 146 | 152 |
| 147 | 153 |
| 148 main() async { | 154 main() async { |
| 149 Expect.equals(100, await runTest()); | 155 Expect.equals(kEchoesCount, await runTest()); |
| 150 await runAwaitTest(); | 156 await runAwaitTest(); |
| 151 } | 157 } |
| OLD | NEW |