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 |