OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 library echo_apptests; | 5 library echo_apptests; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 | 8 |
9 import 'package:mojo_apptest/apptest.dart'; | 9 import 'package:mojo_apptest/apptest.dart'; |
10 import 'package:mojo/application.dart'; | 10 import 'package:mojo/application.dart'; |
11 import 'package:mojo/bindings.dart'; | 11 import 'package:mojo/bindings.dart'; |
12 import 'package:mojo/core.dart'; | 12 import 'package:mojo/core.dart'; |
13 import 'package:_mojo_for_test_only/test/echo_service.mojom.dart'; | 13 import 'package:_mojo_for_test_only/test/echo_service.mojom.dart'; |
14 | 14 |
15 echoApptests(Application application, String url) { | 15 echoApptests(Application application, String url) { |
16 group('Echo Service Apptests', () { | 16 group('Echo Service Apptests', () { |
17 test('String', () async { | 17 test('String', () async { |
18 var echoProxy = | 18 var echoProxy = |
19 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); | 19 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); |
20 | 20 |
21 var v = await echoProxy.ptr.echoString("foo"); | 21 var v = await echoProxy.echoString("foo"); |
22 expect(v.value, equals("foo")); | 22 expect(v.value, equals("foo")); |
23 | 23 |
24 var q = await echoProxy.ptr.echoString("quit"); | 24 var q = await echoProxy.echoString("quit"); |
25 expect(q.value, equals("quit")); | 25 expect(q.value, equals("quit")); |
26 | 26 |
27 await echoProxy.close(); | 27 await echoProxy.close(); |
28 }); | 28 }); |
29 | 29 |
30 test('Empty String', () async { | 30 test('Empty String', () async { |
31 var echoProxy = | 31 var echoProxy = |
32 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); | 32 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); |
33 | 33 |
34 var v = await echoProxy.ptr.echoString(""); | 34 var v = await echoProxy.echoString(""); |
35 expect(v.value, equals("")); | 35 expect(v.value, equals("")); |
36 | 36 |
37 var q = await echoProxy.ptr.echoString("quit"); | 37 var q = await echoProxy.echoString("quit"); |
38 expect(q.value, equals("quit")); | 38 expect(q.value, equals("quit")); |
39 | 39 |
40 await echoProxy.close(); | 40 await echoProxy.close(); |
41 }); | 41 }); |
42 | 42 |
43 test('Null String', () async { | 43 test('Null String', () async { |
44 var echoProxy = | 44 var echoProxy = |
45 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); | 45 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); |
46 | 46 |
47 var v = await echoProxy.ptr.echoString(null); | 47 var v = await echoProxy.echoString(null); |
48 expect(v.value, equals(null)); | 48 expect(v.value, equals(null)); |
49 | 49 |
50 var q = await echoProxy.ptr.echoString("quit"); | 50 var q = await echoProxy.echoString("quit"); |
51 expect(q.value, equals("quit")); | 51 expect(q.value, equals("quit")); |
52 | 52 |
53 await echoProxy.close(); | 53 await echoProxy.close(); |
54 }); | 54 }); |
55 | 55 |
56 test('Delayed Success', () async { | 56 test('Delayed Success', () async { |
57 var echoProxy = | 57 var echoProxy = |
58 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); | 58 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); |
59 | 59 |
60 var milliseconds = 100; | 60 var milliseconds = 100; |
61 var watch = new Stopwatch()..start(); | 61 var watch = new Stopwatch()..start(); |
62 var v = await echoProxy.ptr.delayedEchoString("foo", milliseconds); | 62 var v = await echoProxy.delayedEchoString("foo", milliseconds); |
63 var elapsed = watch.elapsedMilliseconds; | 63 var elapsed = watch.elapsedMilliseconds; |
64 expect(v.value, equals("foo")); | 64 expect(v.value, equals("foo")); |
65 expect(elapsed, greaterThanOrEqualTo(milliseconds)); | 65 expect(elapsed, greaterThanOrEqualTo(milliseconds)); |
66 | 66 |
67 var q = await echoProxy.ptr.echoString("quit"); | 67 var q = await echoProxy.echoString("quit"); |
68 expect(q.value, equals("quit")); | 68 expect(q.value, equals("quit")); |
69 | 69 |
70 await echoProxy.close(); | 70 await echoProxy.close(); |
71 }); | 71 }); |
72 | 72 |
73 test('Delayed Close', () { | 73 test('Delayed Close', () { |
74 var echoProxy = | 74 var echoProxy = |
75 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); | 75 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); |
76 | 76 |
77 var milliseconds = 100; | 77 var milliseconds = 100; |
78 echoProxy.responseOrError(echoProxy.ptr.delayedEchoString( | 78 echoProxy.responseOrError(echoProxy.delayedEchoString( |
79 "quit", milliseconds)).then((result) { | 79 "quit", milliseconds)).then((result) { |
80 fail('This future should not complete.'); | 80 fail('This future should not complete.'); |
81 }, onError: (e) { | 81 }, onError: (e) { |
82 expect(e is ProxyError, isTrue); | 82 expect(e is ProxyError, isTrue); |
83 }); | 83 }); |
84 | 84 |
85 return new Future.delayed( | 85 return new Future.delayed( |
86 new Duration(milliseconds: 10), () => echoProxy.close()); | 86 new Duration(milliseconds: 10), () => echoProxy.close()); |
87 }); | 87 }); |
88 | 88 |
89 test('Swap', () async { | 89 test('Swap', () async { |
90 var echoProxy = | 90 var echoProxy = |
91 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); | 91 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); |
92 | 92 |
93 for (int i = 0; i < 10; i++) { | 93 for (int i = 0; i < 10; i++) { |
94 var v = | 94 var v = |
95 await echoProxy.responseOrError(echoProxy.ptr.echoString("foo")); | 95 await echoProxy.responseOrError(echoProxy.echoString("foo")); |
96 expect(v.value, equals("foo")); | 96 expect(v.value, equals("foo")); |
97 } | 97 } |
98 | 98 |
99 echoProxy.impl.errorFuture.then((e) { | 99 echoProxy.ctrl.errorFuture.then((e) { |
100 fail("echoProxy: $e"); | 100 fail("echoProxy: $e"); |
101 }); | 101 }); |
102 | 102 |
103 // Trigger an implementation swap in the echo server. | 103 // Trigger an implementation swap in the echo server. |
104 echoProxy.ptr.swap(); | 104 echoProxy.swap(); |
105 | 105 |
106 expect(echoProxy.impl.isBound, isTrue); | 106 expect(echoProxy.ctrl.isBound, isTrue); |
107 | 107 |
108 for (int i = 0; i < 10; i++) { | 108 for (int i = 0; i < 10; i++) { |
109 var v = | 109 var v = |
110 await echoProxy.responseOrError(echoProxy.ptr.echoString("foo")); | 110 await echoProxy.responseOrError(echoProxy.echoString("foo")); |
111 expect(v.value, equals("foo")); | 111 expect(v.value, equals("foo")); |
112 } | 112 } |
113 | 113 |
114 var q = await echoProxy.responseOrError(echoProxy.ptr.echoString("quit")); | 114 var q = await echoProxy.responseOrError(echoProxy.echoString("quit")); |
115 expect(q.value, equals("quit")); | 115 expect(q.value, equals("quit")); |
116 | 116 |
117 await echoProxy.close(); | 117 await echoProxy.close(); |
118 }); | 118 }); |
119 | 119 |
120 test('Multiple Error Checks Success', () { | 120 test('Multiple Error Checks Success', () { |
121 var echoProxy = | 121 var echoProxy = |
122 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); | 122 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); |
123 | 123 |
124 List<Future> futures = []; | 124 List<Future> futures = []; |
125 for (int i = 0; i < 100; i++) { | 125 for (int i = 0; i < 100; i++) { |
126 var f = echoProxy.responseOrError(echoProxy.ptr.echoString("foo")) | 126 var f = echoProxy.responseOrError(echoProxy.echoString("foo")) |
127 .then((r) { | 127 .then((r) { |
128 expect(r.value, equals("foo")); | 128 expect(r.value, equals("foo")); |
129 }, onError: (e) { | 129 }, onError: (e) { |
130 fail('There should be no errors'); | 130 fail('There should be no errors'); |
131 }); | 131 }); |
132 futures.add(f); | 132 futures.add(f); |
133 } | 133 } |
134 return Future.wait(futures).whenComplete(() => echoProxy.close()); | 134 return Future.wait(futures).whenComplete(() => echoProxy.close()); |
135 }); | 135 }); |
136 | 136 |
137 test('Multiple Error Checks Fail', () { | 137 test('Multiple Error Checks Fail', () { |
138 var echoProxy = | 138 var echoProxy = |
139 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); | 139 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); |
140 | 140 |
141 List<Future> futures = []; | 141 List<Future> futures = []; |
142 var milliseconds = 100; | 142 var milliseconds = 100; |
143 for (int i = 0; i < 100; i++) { | 143 for (int i = 0; i < 100; i++) { |
144 var f = echoProxy.responseOrError( | 144 var f = echoProxy.responseOrError( |
145 echoProxy.ptr.delayedEchoString("foo", milliseconds)).then((_) { | 145 echoProxy.delayedEchoString("foo", milliseconds)).then((_) { |
146 fail('This call should fail'); | 146 fail('This call should fail'); |
147 }, onError: (e) { | 147 }, onError: (e) { |
148 expect(e is ProxyError, isTrue); | 148 expect(e is ProxyError, isTrue); |
149 }); | 149 }); |
150 futures.add(f); | 150 futures.add(f); |
151 } | 151 } |
152 return echoProxy.close().then((_) => Future.wait(futures)); | 152 return echoProxy.close().then((_) => Future.wait(futures)); |
153 }); | 153 }); |
154 | 154 |
155 test('Uncaught Call Closed', () async { | 155 test('Uncaught Call Closed', () async { |
156 var echoProxy = | 156 var echoProxy = |
157 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); | 157 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); |
158 | 158 |
159 // Do a normal call. | 159 // Do a normal call. |
160 var v = await echoProxy.ptr.echoString("foo"); | 160 var v = await echoProxy.echoString("foo"); |
161 expect(v.value, equals("foo")); | 161 expect(v.value, equals("foo")); |
162 | 162 |
163 // Close the proxy. | 163 // Close the proxy. |
164 await echoProxy.close(); | 164 await echoProxy.close(); |
165 | 165 |
166 // Try to do another call, which should not return. | 166 // Try to do another call, which should not return. |
167 echoProxy.ptr.echoString("foo").then((_) { | 167 echoProxy.echoString("foo").then((_) { |
168 fail('This should be unreachable'); | 168 fail('This should be unreachable'); |
169 }); | 169 }); |
170 }); | 170 }); |
171 | 171 |
172 test('Catch Call Closed', () async { | 172 test('Catch Call Closed', () async { |
173 var echoProxy = | 173 var echoProxy = |
174 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); | 174 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); |
175 | 175 |
176 // Do a normal call. | 176 // Do a normal call. |
177 var v = await echoProxy.ptr.echoString("foo"); | 177 var v = await echoProxy.echoString("foo"); |
178 expect(v.value, equals("foo")); | 178 expect(v.value, equals("foo")); |
179 | 179 |
180 // Close the proxy. | 180 // Close the proxy. |
181 await echoProxy.close(); | 181 await echoProxy.close(); |
182 | 182 |
183 // Try to do another call, which should fail. | 183 // Try to do another call, which should fail. |
184 bool caughtException = false; | 184 bool caughtException = false; |
185 try { | 185 try { |
186 v = await echoProxy.responseOrError(echoProxy.ptr.echoString("foo")); | 186 v = await echoProxy.responseOrError(echoProxy.echoString("foo")); |
187 fail('This should be unreachable'); | 187 fail('This should be unreachable'); |
188 } on ProxyError catch (e) { | 188 } on ProxyError catch (e) { |
189 caughtException = true; | 189 caughtException = true; |
190 } | 190 } |
191 expect(caughtException, isTrue); | 191 expect(caughtException, isTrue); |
192 }); | 192 }); |
193 | 193 |
194 test('Catch Call Sequence Closed Twice', () async { | 194 test('Catch Call Sequence Closed Twice', () async { |
195 var echoProxy = | 195 var echoProxy = |
196 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); | 196 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); |
197 | 197 |
198 // Do a normal call. | 198 // Do a normal call. |
199 var v = await echoProxy.ptr.echoString("foo"); | 199 var v = await echoProxy.echoString("foo"); |
200 expect(v.value, equals("foo")); | 200 expect(v.value, equals("foo")); |
201 | 201 |
202 // Close the proxy. | 202 // Close the proxy. |
203 await echoProxy.close(); | 203 await echoProxy.close(); |
204 | 204 |
205 // Try to do another call, which should fail. | 205 // Try to do another call, which should fail. |
206 bool caughtException = false; | 206 bool caughtException = false; |
207 try { | 207 try { |
208 v = await echoProxy.responseOrError(echoProxy.ptr.echoString("foo")); | 208 v = await echoProxy.responseOrError(echoProxy.echoString("foo")); |
209 fail('This should be unreachable'); | 209 fail('This should be unreachable'); |
210 } on ProxyError catch (e) { | 210 } on ProxyError catch (e) { |
211 caughtException = true; | 211 caughtException = true; |
212 } | 212 } |
213 expect(caughtException, isTrue); | 213 expect(caughtException, isTrue); |
214 | 214 |
215 // Make sure we can catch an error more than once. | 215 // Make sure we can catch an error more than once. |
216 caughtException = false; | 216 caughtException = false; |
217 try { | 217 try { |
218 v = await echoProxy.responseOrError(echoProxy.ptr.echoString("foo")); | 218 v = await echoProxy.responseOrError(echoProxy.echoString("foo")); |
219 fail('This should be unreachable'); | 219 fail('This should be unreachable'); |
220 } on ProxyError catch (e) { | 220 } on ProxyError catch (e) { |
221 caughtException = true; | 221 caughtException = true; |
222 } | 222 } |
223 expect(caughtException, isTrue); | 223 expect(caughtException, isTrue); |
224 }); | 224 }); |
225 | 225 |
226 test('Catch Call Parallel Closed Twice', () async { | 226 test('Catch Call Parallel Closed Twice', () async { |
227 var echoProxy = | 227 var echoProxy = |
228 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); | 228 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); |
229 | 229 |
230 // Do a normal call. | 230 // Do a normal call. |
231 var v = await echoProxy.ptr.echoString("foo"); | 231 var v = await echoProxy.echoString("foo"); |
232 expect(v.value, equals("foo")); | 232 expect(v.value, equals("foo")); |
233 | 233 |
234 // Close the proxy. | 234 // Close the proxy. |
235 await echoProxy.close(); | 235 await echoProxy.close(); |
236 | 236 |
237 // Queue up two calls after the close, and make sure they both fail. | 237 // Queue up two calls after the close, and make sure they both fail. |
238 var f1 = echoProxy.responseOrError(echoProxy.ptr.echoString("foo")) | 238 var f1 = echoProxy.responseOrError(echoProxy.echoString("foo")) |
239 .then((_) { | 239 .then((_) { |
240 fail('This should be unreachable'); | 240 fail('This should be unreachable'); |
241 }, onError: (e) { | 241 }, onError: (e) { |
242 expect(e is ProxyError, isTrue); | 242 expect(e is ProxyError, isTrue); |
243 }); | 243 }); |
244 | 244 |
245 var f2 = echoProxy.responseOrError(echoProxy.ptr.echoString("foo")) | 245 var f2 = echoProxy.responseOrError(echoProxy.echoString("foo")) |
246 .then((_) { | 246 .then((_) { |
247 fail('This should be unreachable'); | 247 fail('This should be unreachable'); |
248 }, onError: (e) { | 248 }, onError: (e) { |
249 expect(e is ProxyError, isTrue); | 249 expect(e is ProxyError, isTrue); |
250 }); | 250 }); |
251 | 251 |
252 return Future.wait([f1, f2]); | 252 return Future.wait([f1, f2]); |
253 }); | 253 }); |
254 | 254 |
255 test('Unbind, close', () async { | 255 test('Unbind, close', () async { |
256 var echoProxy = | 256 var echoProxy = |
257 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); | 257 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); |
258 | 258 |
259 var r = await echoProxy.responseOrError(echoProxy.ptr.echoString("foo")); | 259 var r = await echoProxy.responseOrError(echoProxy.echoString("foo")); |
260 expect(r.value, equals("foo")); | 260 expect(r.value, equals("foo")); |
261 | 261 |
262 var endpoint = echoProxy.impl.unbind(); | 262 var endpoint = echoProxy.ctrl.unbind(); |
263 await echoProxy.close(); | 263 await echoProxy.close(); |
264 endpoint.close(); | 264 endpoint.close(); |
265 }); | 265 }); |
266 | 266 |
267 test('Unbind, rebind to same', () async { | 267 test('Unbind, rebind to same', () async { |
268 var echoProxy = | 268 var echoProxy = |
269 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); | 269 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); |
270 | 270 |
271 var r = await echoProxy.responseOrError(echoProxy.ptr.echoString("foo")); | 271 var r = await echoProxy.responseOrError(echoProxy.echoString("foo")); |
272 expect(r.value, equals("foo")); | 272 expect(r.value, equals("foo")); |
273 | 273 |
274 var endpoint = echoProxy.impl.unbind(); | 274 var endpoint = echoProxy.ctrl.unbind(); |
275 echoProxy.impl.bind(endpoint); | 275 echoProxy.ctrl.bind(endpoint); |
276 | 276 |
277 r = await echoProxy.responseOrError(echoProxy.ptr.echoString("foo")); | 277 r = await echoProxy.responseOrError(echoProxy.echoString("foo")); |
278 expect(r.value, equals("foo")); | 278 expect(r.value, equals("foo")); |
279 | 279 |
280 await echoProxy.close(); | 280 await echoProxy.close(); |
281 }); | 281 }); |
282 | 282 |
283 test('Unbind, rebind to different', () async { | 283 test('Unbind, rebind to different', () async { |
284 var echoProxy = | 284 var echoProxy = |
285 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); | 285 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); |
286 | 286 |
287 var r = await echoProxy.responseOrError(echoProxy.ptr.echoString("foo")); | 287 var r = await echoProxy.responseOrError(echoProxy.echoString("foo")); |
288 expect(r.value, equals("foo")); | 288 expect(r.value, equals("foo")); |
289 | 289 |
290 var endpoint = echoProxy.impl.unbind(); | 290 var endpoint = echoProxy.ctrl.unbind(); |
291 var differentEchoProxy = new EchoServiceProxy.fromEndpoint(endpoint); | 291 var differentEchoProxy = new EchoServiceProxy.fromEndpoint(endpoint); |
292 | 292 |
293 r = await differentEchoProxy.responseOrError( | 293 r = await differentEchoProxy.responseOrError( |
294 differentEchoProxy.ptr.echoString("foo")); | 294 differentEchoProxy.echoString("foo")); |
295 expect(r.value, equals("foo")); | 295 expect(r.value, equals("foo")); |
296 | 296 |
297 await differentEchoProxy.close(); | 297 await differentEchoProxy.close(); |
298 }); | 298 }); |
299 | 299 |
300 test('Unbind, rebind to different, close original', () async { | 300 test('Unbind, rebind to different, close original', () async { |
301 var echoProxy = | 301 var echoProxy = |
302 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); | 302 new EchoServiceProxy.connectToService(application, "mojo:dart_echo"); |
303 | 303 |
304 var r = await echoProxy.responseOrError(echoProxy.ptr.echoString("foo")); | 304 var r = await echoProxy.responseOrError(echoProxy.echoString("foo")); |
305 expect(r.value, equals("foo")); | 305 expect(r.value, equals("foo")); |
306 | 306 |
307 var endpoint = echoProxy.impl.unbind(); | 307 var endpoint = echoProxy.ctrl.unbind(); |
308 var differentEchoProxy = new EchoServiceProxy.fromEndpoint(endpoint); | 308 var differentEchoProxy = new EchoServiceProxy.fromEndpoint(endpoint); |
309 await echoProxy.close(); | 309 await echoProxy.close(); |
310 | 310 |
311 r = await differentEchoProxy.responseOrError( | 311 r = await differentEchoProxy.responseOrError( |
312 differentEchoProxy.ptr.echoString("foo")); | 312 differentEchoProxy.echoString("foo")); |
313 expect(r.value, equals("foo")); | 313 expect(r.value, equals("foo")); |
314 | 314 |
315 await differentEchoProxy.close(); | 315 await differentEchoProxy.close(); |
316 }); | 316 }); |
317 }); | 317 }); |
318 } | 318 } |
OLD | NEW |