Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(124)

Side by Side Diff: test/registry_test.dart

Issue 928663003: Add IsolateRunner as a helper around Isolate. (Closed) Base URL: https://github.com/dart-lang/isolate.git@master
Patch Set: Add .status. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « test/ports_test.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 library dart.pkg.isolate.test.registry;
6
7 import "package:isolate/isolaterunner.dart";
8 import "package:isolate/registry.dart";
9 import "dart:async";
10 import "dart:isolate";
11
12 import "package:unittest/unittest.dart";
13
14 const MS = const Duration(milliseconds: 1);
15
16 void main() {
17 testLookup();
18 testAddLookup();
19 testAddRemoveTags();
20 testRemove();
21 testCrossIsolate();
22 testTimeout();
23 testMultiRegistry();
24 testObjectsAndTags();
25 }
26
27 class Oddity {
28 static const int EVEN = 0;
29 static const int ODD = 1;
30 }
31
32 Future<List> waitAll(int n, Future action(int n)) {
33 return Future.wait(new Iterable.generate(n, action));
34 }
35
36 void testLookup() {
37
38 test("lookupAll", () {
39 RegistryManager regman = new RegistryManager();
40 Registry registry = regman.registry;
41 return waitAll(10, (i) {
42 var element = new Element(i);
43 var tag = i.isEven ? Oddity.EVEN : Oddity.ODD;
44 return registry.add(element, tags: [tag]);
45 })
46 .then((_) => registry.lookup())
47 .then((all) {
48 expect(all.length, 10);
49 expect(all.map((v) => v.id).toList()..sort(),
50 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
51 })
52 .then((_) { regman.close(); });
53 });
54
55 test("lookupOdd", () {
56 RegistryManager regman = new RegistryManager();
57 Registry registry = regman.registry;
58 return waitAll(10, (i) {
59 var element = new Element(i);
60 var tag = i.isEven ? Oddity.EVEN : Oddity.ODD;
61 return registry.add(element, tags: [tag]);
62 })
63 .then((_) =>registry.lookup(tags:[Oddity.ODD]))
64 .then((all) {
65 expect(all.length, 5);
66 expect(all.map((v) => v.id).toList()..sort(),
67 [1, 3, 5, 7, 9]);
68 })
69 .then((_) { regman.close(); });
70 });
71
72 test("lookupMax", () {
73 RegistryManager regman = new RegistryManager();
74 Registry registry = regman.registry;
75 return waitAll(10, (i) {
76 var element = new Element(i);
77 var tag = i.isEven ? Oddity.EVEN : Oddity.ODD;
78 return registry.add(element, tags: [tag]);
79 })
80 .then((_) => registry.lookup(max: 5))
81 .then((all) {
82 expect(all.length, 5);
83 })
84 .then((_) { regman.close(); });
85 });
86
87 test("lookupMultiTag", () {
88 RegistryManager regman = new RegistryManager();
89 Registry registry = regman.registry;
90 return waitAll(25, (i) {
91 var element = new Element(i);
92 // Collect all numbers dividing i.
93 var tags = [i];
94 for (int j = 2; j < 25; j++) {
95 if (i % j == 0) tags.add(j);
96 }
97 return registry.add(element, tags: tags);
98 })
99 .then((_) => registry.lookup(tags: [2, 3]))
100 .then((all) {
101 expect(all.length, 5);
102 expect(all.map((v) => v.id).toList()..sort(),
103 [0, 6, 12, 18, 24]);
104 })
105 .then((_) { regman.close(); });
106 });
107
108 test("lookupMultiTagMax", () {
109 RegistryManager regman = new RegistryManager();
110 Registry registry = regman.registry;
111 return waitAll(25, (i) {
112 var element = new Element(i);
113 // Collect all numbers dividing i.
114 var tags = [i];
115 for (int j = 2; j < 25; j++) {
116 if (i % j == 0) tags.add(j);
117 }
118 return registry.add(element, tags: tags);
119 })
120 .then((_) => registry.lookup(tags: [2, 3], max: 3))
121 .then((all) {
122 expect(all.length, 3);
123 expect(all.every((v) => (v.id % 6) == 0), isTrue);
124 })
125 .then((_) { regman.close(); });
126 });
127 }
128
129 void testAddLookup() {
130 test("Add-lookup-identical", () {
131 RegistryManager regman = new RegistryManager();
132 Registry registry = regman.registry;
133 var object = new Object();
134 return registry.add(object).then((_) {
135 return registry.lookup().then((entries) {
136 expect(entries, hasLength(1));
137 expect(entries.first, same(object));
138 });
139 }).whenComplete(regman.close);
140 });
141
142 test("Add-multiple-identical", () {
143 RegistryManager regman = new RegistryManager();
144 Registry registry = regman.registry;
145 var object1 = new Object();
146 var object2 = new Object();
147 var object3 = new Object();
148 var objects = [object1, object2, object3];
149 return Future.wait(objects.map(registry.add))
150 .then((_) {
151 return registry.lookup().then((entries) {
152 expect(entries, hasLength(3));
153 for (var entry in entries) {
154 expect(entry, isIn(objects));
155 }
156 });
157 }).whenComplete(regman.close);
158 });
159
160 test("Add-twice", () {
161 RegistryManager regman = new RegistryManager();
162 Registry registry = regman.registry;
163 var object = new Object();
164 return registry.add(object).then((_) {
165 return registry.add(object).then((_) {
166 fail("Unreachable");
167 }, onError: (e, s) {
168 expect(e, isStateError);
169 });
170 }).whenComplete(regman.close);
171 });
172
173 test("Add-lookup-add-lookup", () {
174 RegistryManager regman = new RegistryManager();
175 Registry registry = regman.registry;
176 var object = new Object();
177 var object2 = new Object();
178 return registry.add(object).then((_) {
179 return registry.lookup();
180 }).then((entries) {
181 expect(entries, hasLength(1));
182 expect(entries.first, same(object));
183 return registry.add(object2);
184 }).then((_) {
185 return registry.lookup().then((entries) {
186 expect(entries, hasLength(2));
187 var entry1 = entries.first;
188 var entry2 = entries.last;
189 if (object == entry1) {
190 expect(entry2, same(object2));
191 } else {
192 expect(entry1, same(object));
193 }
194 });
195 }).whenComplete(regman.close);
196 });
197
198 test("lookup-add-lookup", () {
199 RegistryManager regman = new RegistryManager();
200 Registry registry = regman.registry;
201 var object = new Object();
202 return registry.lookup().then((entries) {
203 expect(entries, isEmpty);
204 return registry.add(object);
205 }).then((_) {
206 return registry.lookup();
207 }).then((entries) {
208 expect(entries, hasLength(1));
209 expect(entries.first, same(object));
210 }).whenComplete(regman.close);
211 });
212
213 test("Add-multiple-tags", () {
214 RegistryManager regman = new RegistryManager();
215 Registry registry = regman.registry;
216 var object1 = new Object();
217 var object2 = new Object();
218 var object3 = new Object();
219 return registry.add(object1, tags: [1, 3, 5, 7]).then((_){
220 return registry.add(object2, tags: [2, 3, 6, 7]);
221 }).then((_) {
222 return registry.add(object3, tags: [4, 5, 6, 7]);
223 }).then((_) {
224 return registry.lookup(tags: [3]).then((entries) {
225 expect(entries, hasLength(2));
226 expect(entries.first == object1 || entries.last == object1, isTrue);
227 expect(entries.first == object2 || entries.last == object2, isTrue);
228 });
229 }).then((_) {
230 return registry.lookup(tags: [2]).then((entries) {
231 expect(entries, hasLength(1));
232 expect(entries.first, same(object2));
233 });
234 }).then((_) {
235 return registry.lookup(tags: [3, 6]).then((entries) {
236 expect(entries, hasLength(1));
237 expect(entries.first, same(object2));
238 });
239 }).whenComplete(regman.close);
240 });
241 }
242
243 void testRemove() {
244 test("Add-remove", () {
245 RegistryManager regman = new RegistryManager();
246 Registry registry = regman.registry;
247 var object = new Object();
248 return registry.add(object).then((removeCapability) {
249 return registry.lookup().then((entries) {
250 expect(entries, hasLength(1));
251 expect(entries.first, same(object));
252 return registry.remove(object, removeCapability);
253 }).then((removeSuccess) {
254 expect(removeSuccess, isTrue);
255 return registry.lookup();
256 }).then((entries) {
257 expect(entries, isEmpty);
258 });
259 }).whenComplete(regman.close);
260 });
261
262 test("Add-remove-fail", () {
263 RegistryManager regman = new RegistryManager();
264 Registry registry = regman.registry;
265 var object = new Object();
266 return registry.add(object).then((removeCapability) {
267 return registry.lookup().then((entries) {
268 expect(entries, hasLength(1));
269 expect(entries.first, same(object));
270 return registry.remove(object, new Capability());
271 }).then((removeSuccess) {
272 expect(removeSuccess, isFalse);
273 });
274 }).whenComplete(regman.close);
275 });
276 }
277
278 void testAddRemoveTags() {
279 test("Add-remove-tag", () {
280 RegistryManager regman = new RegistryManager();
281 Registry registry = regman.registry;
282 var object = new Object();
283 return registry.add(object).then((removeCapability) {
284 return registry.lookup(tags: ["x"]);
285 }).then((entries) {
286 expect(entries, isEmpty);
287 return registry.addTags([object], ["x"]);
288 }).then((_) {
289 return registry.lookup(tags: ["x"]);
290 }).then((entries) {
291 expect(entries, hasLength(1));
292 expect(entries.first, same(object));
293 return registry.removeTags([object], ["x"]);
294 }).then((_) {
295 return registry.lookup(tags: ["x"]);
296 }).then((entries) {
297 expect(entries, isEmpty);
298 }).whenComplete(regman.close);
299 });
300
301 test("Tag-twice", () {
302 RegistryManager regman = new RegistryManager();
303 Registry registry = regman.registry;
304 var object = new Object();
305 return registry.add(object, tags: ["x"]).then((removeCapability) {
306 return registry.lookup(tags: ["x"]);
307 }).then((entries) {
308 expect(entries, hasLength(1));
309 expect(entries.first, same(object));
310 // Adding the same tag twice is allowed, but does nothing.
311 return registry.addTags([object], ["x"]);
312 }).then((_) {
313 return registry.lookup(tags: ["x"]);
314 }).then((entries) {
315 expect(entries, hasLength(1));
316 expect(entries.first, same(object));
317 // Removing the tag once is enough to remove it.
318 return registry.removeTags([object], ["x"]);
319 }).then((_) {
320 return registry.lookup(tags: ["x"]);
321 }).then((entries) {
322 expect(entries, isEmpty);
323 }).whenComplete(regman.close);
324 });
325
326 test("Add-remove-multiple", () {
327 RegistryManager regman = new RegistryManager();
328 Registry registry = regman.registry;
329 var object1 = new Object();
330 var object2 = new Object();
331 var object3 = new Object();
332 var objects = [object1, object2, object3];
333 return Future.wait(objects.map(registry.add)).then((_){
334 return registry.addTags([object1, object2], ["x", "y"]);
335 }).then((_) {
336 return registry.addTags([object1, object3], ["z", "w"]);
337 }).then((_) {
338 return registry.lookup(tags: ["x", "z"]);
339 }).then((entries) {
340 expect(entries, hasLength(1));
341 expect(entries.first, same(object1));
342 return registry.removeTags([object1, object2], ["x", "z"]);
343 }).then((_) {
344 return registry.lookup(tags: ["z"]);
345 }).then((entries) {
346 expect(entries, hasLength(1));
347 expect(entries.first, same(object3));
348 }).whenComplete(regman.close);
349 });
350
351 test("Remove-wrong-object", () {
352 RegistryManager regman = new RegistryManager();
353 Registry registry = regman.registry;
354 expect(() => registry.removeTags([new Object()], ["x"]),
355 throws);
356 regman.close();
357 });
358 }
359
360 var _regmen = {};
361 Registry createRegMan(id) {
362 var regman = new RegistryManager();
363 _regmen[id] = regman;
364 return regman.registry;
365 }
366 void closeRegMan(id) {
367 _regmen.remove(id).close();
368 }
369
370 void testCrossIsolate() {
371 var object = new Object();
372 test("regman-other-isolate", () {
373 // Add, lookup and remove object in other isolate.
374 return IsolateRunner.spawn().then((isolate) {
375 isolate.run(createRegMan, 1).then((registry) {
376 return registry.add(object, tags: ["a", "b"])
377 .then((removeCapability) {
378 return registry.lookup(tags: ["a"]).then((entries) {
379 expect(entries, hasLength(1));
380 expect(entries.first, same(object));
381 return registry.remove(entries.first, removeCapability);
382 }).then((removeSuccess) {
383 expect(removeSuccess, isTrue);
384 });
385 });
386 }).whenComplete(() {
387 return isolate.run(closeRegMan, 1);
388 }).whenComplete(() {
389 return isolate.close();
390 });
391 });
392 });
393 }
394
395 void testTimeout() {
396 test("Timeout-add", () {
397 RegistryManager regman = new RegistryManager(timeout: MS * 500);
398 Registry registry = regman.registry;
399 regman.close();
400 return registry.add(new Object()).then((_) {
401 fail("unreachable");
402 }, onError: (e, s) {
403 expect(e is TimeoutException, isTrue);
404 });
405 });
406
407 test("Timeout-remove", () {
408 RegistryManager regman = new RegistryManager(timeout: MS * 500);
409 Registry registry = regman.registry;
410 var object = new Object();
411 return registry.add(object).then((rc) {
412 regman.close();
413 return registry.remove(object, rc).then((_) {
414 fail("unreachable");
415 }, onError: (e, s) {
416 expect(e is TimeoutException, isTrue);
417 });
418 });
419 });
420
421 test("Timeout-addTags", () {
422 RegistryManager regman = new RegistryManager(timeout: MS * 500);
423 Registry registry = regman.registry;
424 var object = new Object();
425 return registry.add(object).then((rc) {
426 regman.close();
427 return registry.addTags([object], ["x"]).then((_) {
428 fail("unreachable");
429 }, onError: (e, s) {
430 expect(e is TimeoutException, isTrue);
431 });
432 });
433 });
434
435 test("Timeout-removeTags", () {
436 RegistryManager regman = new RegistryManager(timeout: MS * 500);
437 Registry registry = regman.registry;
438 var object = new Object();
439 return registry.add(object).then((rc) {
440 regman.close();
441 return registry.removeTags([object], ["x"]).then((_) {
442 fail("unreachable");
443 }, onError: (e, s) {
444 expect(e is TimeoutException, isTrue);
445 });
446 });
447 });
448
449 test("Timeout-lookup", () {
450 RegistryManager regman = new RegistryManager(timeout: MS * 500);
451 Registry registry = regman.registry;
452 regman.close();
453 registry.lookup().then((_) {
454 fail("unreachable");
455 }, onError: (e, s) {
456 expect(e is TimeoutException, isTrue);
457 });
458 });
459 }
460
461 void testMultiRegistry() {
462 test("dual-registyr", () {
463 RegistryManager regman = new RegistryManager();
464 Registry registry1 = regman.registry;
465 Registry registry2 = regman.registry;
466 var l1 = ["x"];
467 var l2;
468 return registry1.add(l1, tags: ["y"]).then((removeCapability) {
469 return registry2.lookup().then((entries) {
470 expect(entries, hasLength(1));
471 l2 = entries.first;
472 expect(l2, equals(l1));
473 // The object for registry2 is not idential the one for registry1.
474 expect(!identical(l1, l2), isTrue);
475 // Removeing the registry1 object through registry2 doesn't work.
476 return registry2.remove(l1, removeCapability);
477 }).then((removeSuccess) {
478 expect(removeSuccess, isFalse);
479 return registry2.remove(l2, removeCapability);
480 }).then((removeSuccess) {
481 expect(removeSuccess, isTrue);
482 return registry1.lookup();
483 }).then((entries) {
484 expect(entries, isEmpty);
485 });
486 }).whenComplete(regman.close);
487 });
488 }
489
490 void testObjectsAndTags() {
491 testObject(object) {
492 String name = "Transfer-${object.runtimeType}";
493 test(name, () {
494 RegistryManager regman = new RegistryManager();
495 Registry registry1 = regman.registry;
496 Registry registry2 = regman.registry;
497 return registry1.add(object, tags: [object]).then((removeCapability) {
498 return registry2.lookup().then((entries) {
499 expect(entries, hasLength(1));
500 expect(entries.first, equals(object));
501 return registry2.lookup(tags: [object]);
502 }).then((entries) {
503 expect(entries, hasLength(1));
504 expect(entries.first, equals(object));
505 return registry2.removeTags([entries.first], [object]);
506 }).then((_) {
507 return registry2.lookup();
508 }).then((entries) {
509 expect(entries, hasLength(1));
510 expect(entries.first, equals(object));
511 return registry2.remove(entries.first, removeCapability);
512 }).then((removeSuccess) {
513 expect(removeSuccess, isTrue);
514 return registry2.lookup();
515 }).then((entries) {
516 expect(entries, isEmpty);
517 });
518 }).whenComplete(regman.close);
519 });
520 }
521 // Test objects that are sendable between equivalent isolates and
522 // that has an operator== that works after cloning (for use as tags).
523 testObject(42);
524 testObject(3.14);
525 testObject("string");
526 testObject(true);
527 testObject(null);
528 testObject(new Element(42));
529 testObject(#symbol);
530 testObject(#_privateSymbol);
531 testObject(new Capability());
532 }
533
534 class Element {
535 final int id;
536 Element(this.id);
537 int get hashCode => id;
538 bool operator==(Object other) => other is Element && id == other.id;
539 }
OLDNEW
« no previous file with comments | « test/ports_test.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698