OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 import 'dart:async'; | 5 import 'dart:async'; |
6 | 6 |
7 import 'package:fake_async/fake_async.dart'; | 7 import 'package:fake_async/fake_async.dart'; |
8 import 'package:pool/pool.dart'; | 8 import 'package:pool/pool.dart'; |
9 import 'package:stack_trace/stack_trace.dart'; | 9 import 'package:stack_trace/stack_trace.dart'; |
10 import 'package:test/test.dart'; | 10 import 'package:test/test.dart'; |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 group("close()", () { | 292 group("close()", () { |
293 test("disallows request() and withResource()", () { | 293 test("disallows request() and withResource()", () { |
294 var pool = new Pool(1)..close(); | 294 var pool = new Pool(1)..close(); |
295 expect(pool.request, throwsStateError); | 295 expect(pool.request, throwsStateError); |
296 expect(() => pool.withResource(() {}), throwsStateError); | 296 expect(() => pool.withResource(() {}), throwsStateError); |
297 }); | 297 }); |
298 | 298 |
299 test("pending requests are fulfilled", () async { | 299 test("pending requests are fulfilled", () async { |
300 var pool = new Pool(1); | 300 var pool = new Pool(1); |
301 var resource1 = await pool.request(); | 301 var resource1 = await pool.request(); |
302 expect(pool.request().then((resource2) { | 302 expect( |
303 resource2.release(); | 303 pool.request().then((resource2) { |
304 }), completes); | 304 resource2.release(); |
| 305 }), |
| 306 completes); |
305 expect(pool.done, completes); | 307 expect(pool.done, completes); |
306 expect(pool.close(), completes); | 308 expect(pool.close(), completes); |
307 resource1.release(); | 309 resource1.release(); |
308 }); | 310 }); |
309 | 311 |
310 test("pending requests are fulfilled with allowRelease", () async { | 312 test("pending requests are fulfilled with allowRelease", () async { |
311 var pool = new Pool(1); | 313 var pool = new Pool(1); |
312 var resource1 = await pool.request(); | 314 var resource1 = await pool.request(); |
313 | 315 |
314 var completer = new Completer(); | 316 var completer = new Completer(); |
315 expect(pool.request().then((resource2) { | 317 expect( |
316 expect(completer.isCompleted, isTrue); | 318 pool.request().then((resource2) { |
317 resource2.release(); | 319 expect(completer.isCompleted, isTrue); |
318 }), completes); | 320 resource2.release(); |
| 321 }), |
| 322 completes); |
319 expect(pool.close(), completes); | 323 expect(pool.close(), completes); |
320 | 324 |
321 resource1.allowRelease(() => completer.future); | 325 resource1.allowRelease(() => completer.future); |
322 await new Future.delayed(Duration.ZERO); | 326 await new Future.delayed(Duration.ZERO); |
323 | 327 |
324 completer.complete(); | 328 completer.complete(); |
325 }); | 329 }); |
326 | 330 |
327 test("doesn't complete until all resources are released", () async { | 331 test("doesn't complete until all resources are released", () async { |
328 var pool = new Pool(2); | 332 var pool = new Pool(2); |
329 var resource1 = await pool.request(); | 333 var resource1 = await pool.request(); |
330 var resource2 = await pool.request(); | 334 var resource2 = await pool.request(); |
331 var resource3Future = pool.request(); | 335 var resource3Future = pool.request(); |
332 | 336 |
333 var resource1Released = false; | 337 var resource1Released = false; |
334 var resource2Released = false; | 338 var resource2Released = false; |
335 var resource3Released = false; | 339 var resource3Released = false; |
336 expect(pool.close().then((_) { | 340 expect( |
337 expect(resource1Released, isTrue); | 341 pool.close().then((_) { |
338 expect(resource2Released, isTrue); | 342 expect(resource1Released, isTrue); |
339 expect(resource3Released, isTrue); | 343 expect(resource2Released, isTrue); |
340 }), completes); | 344 expect(resource3Released, isTrue); |
| 345 }), |
| 346 completes); |
341 | 347 |
342 resource1Released = true; | 348 resource1Released = true; |
343 resource1.release(); | 349 resource1.release(); |
344 await new Future.delayed(Duration.ZERO); | 350 await new Future.delayed(Duration.ZERO); |
345 | 351 |
346 resource2Released = true; | 352 resource2Released = true; |
347 resource2.release(); | 353 resource2.release(); |
348 await new Future.delayed(Duration.ZERO); | 354 await new Future.delayed(Duration.ZERO); |
349 | 355 |
350 var resource3 = await resource3Future; | 356 var resource3 = await resource3Future; |
351 resource3Released = true; | 357 resource3Released = true; |
352 resource3.release(); | 358 resource3.release(); |
353 }); | 359 }); |
354 | 360 |
355 test("active onReleases complete as usual", () async { | 361 test("active onReleases complete as usual", () async { |
356 var pool = new Pool(1); | 362 var pool = new Pool(1); |
357 var resource = await pool.request(); | 363 var resource = await pool.request(); |
358 | 364 |
359 // Set up an onRelease callback whose completion is controlled by | 365 // Set up an onRelease callback whose completion is controlled by |
360 // [completer]. | 366 // [completer]. |
361 var completer = new Completer(); | 367 var completer = new Completer(); |
362 resource.allowRelease(() => completer.future); | 368 resource.allowRelease(() => completer.future); |
363 expect(pool.request().then((_) { | 369 expect( |
364 expect(completer.isCompleted, isTrue); | 370 pool.request().then((_) { |
365 }), completes); | 371 expect(completer.isCompleted, isTrue); |
| 372 }), |
| 373 completes); |
366 | 374 |
367 await new Future.delayed(Duration.ZERO); | 375 await new Future.delayed(Duration.ZERO); |
368 pool.close(); | 376 pool.close(); |
369 | 377 |
370 await new Future.delayed(Duration.ZERO); | 378 await new Future.delayed(Duration.ZERO); |
371 completer.complete(); | 379 completer.complete(); |
372 }); | 380 }); |
373 | 381 |
374 test("inactive onReleases fire", () async { | 382 test("inactive onReleases fire", () async { |
375 var pool = new Pool(2); | 383 var pool = new Pool(2); |
376 var resource1 = await pool.request(); | 384 var resource1 = await pool.request(); |
377 var resource2 = await pool.request(); | 385 var resource2 = await pool.request(); |
378 | 386 |
379 var completer1 = new Completer(); | 387 var completer1 = new Completer(); |
380 resource1.allowRelease(() => completer1.future); | 388 resource1.allowRelease(() => completer1.future); |
381 var completer2 = new Completer(); | 389 var completer2 = new Completer(); |
382 resource2.allowRelease(() => completer2.future); | 390 resource2.allowRelease(() => completer2.future); |
383 | 391 |
384 expect(pool.close().then((_) { | 392 expect( |
385 expect(completer1.isCompleted, isTrue); | 393 pool.close().then((_) { |
386 expect(completer2.isCompleted, isTrue); | 394 expect(completer1.isCompleted, isTrue); |
387 }), completes); | 395 expect(completer2.isCompleted, isTrue); |
| 396 }), |
| 397 completes); |
388 | 398 |
389 await new Future.delayed(Duration.ZERO); | 399 await new Future.delayed(Duration.ZERO); |
390 completer1.complete(); | 400 completer1.complete(); |
391 | 401 |
392 await new Future.delayed(Duration.ZERO); | 402 await new Future.delayed(Duration.ZERO); |
393 completer2.complete(); | 403 completer2.complete(); |
394 }); | 404 }); |
395 | 405 |
396 test("new allowReleases fire immediately", () async { | 406 test("new allowReleases fire immediately", () async { |
397 var pool = new Pool(1); | 407 var pool = new Pool(1); |
398 var resource = await pool.request(); | 408 var resource = await pool.request(); |
399 | 409 |
400 var completer = new Completer(); | 410 var completer = new Completer(); |
401 expect(pool.close().then((_) { | 411 expect( |
402 expect(completer.isCompleted, isTrue); | 412 pool.close().then((_) { |
403 }), completes); | 413 expect(completer.isCompleted, isTrue); |
| 414 }), |
| 415 completes); |
404 | 416 |
405 await new Future.delayed(Duration.ZERO); | 417 await new Future.delayed(Duration.ZERO); |
406 resource.allowRelease(() => completer.future); | 418 resource.allowRelease(() => completer.future); |
407 | 419 |
408 await new Future.delayed(Duration.ZERO); | 420 await new Future.delayed(Duration.ZERO); |
409 completer.complete(); | 421 completer.complete(); |
410 }); | 422 }); |
411 | 423 |
412 test("an onRelease error is piped to the return value", () async { | 424 test("an onRelease error is piped to the return value", () async { |
413 var pool = new Pool(1); | 425 var pool = new Pool(1); |
(...skipping 17 matching lines...) Expand all Loading... |
431 Function expectNoAsync() { | 443 Function expectNoAsync() { |
432 var stack = new Trace.current(1); | 444 var stack = new Trace.current(1); |
433 return () => registerException( | 445 return () => registerException( |
434 new TestFailure("Expected function not to be called."), stack); | 446 new TestFailure("Expected function not to be called."), stack); |
435 } | 447 } |
436 | 448 |
437 /// A matcher for Futures that asserts that they don't complete. | 449 /// A matcher for Futures that asserts that they don't complete. |
438 /// | 450 /// |
439 /// This should only be called within a [FakeAsync.run] zone. | 451 /// This should only be called within a [FakeAsync.run] zone. |
440 Matcher get doesNotComplete => predicate((future) { | 452 Matcher get doesNotComplete => predicate((future) { |
441 expect(future, new isInstanceOf<Future>()); | 453 expect(future, new isInstanceOf<Future>()); |
442 | 454 |
443 var stack = new Trace.current(1); | 455 var stack = new Trace.current(1); |
444 future.then((_) => registerException( | 456 future.then((_) => registerException( |
445 new TestFailure("Expected future not to complete."), stack)); | 457 new TestFailure("Expected future not to complete."), stack)); |
446 return true; | 458 return true; |
447 }); | 459 }); |
OLD | NEW |