Index: test/pool_test.dart |
diff --git a/test/pool_test.dart b/test/pool_test.dart |
index 5dfef2a24707df2f8f4c6d2ca50ad860b7455b14..65fd00ee25f0ed9a498681d61077198f2d67283f 100644 |
--- a/test/pool_test.dart |
+++ b/test/pool_test.dart |
@@ -271,6 +271,139 @@ void main() { |
pool.request(); |
}); |
}); |
+ |
+ group("close()", () { |
+ test("disallows request() and withResource()", () { |
+ var pool = new Pool(1)..close(); |
+ expect(pool.request, throwsStateError); |
+ expect(() => pool.withResource(() {}), throwsStateError); |
+ }); |
+ |
+ test("pending requests are fulfilled", () async { |
+ var pool = new Pool(1); |
+ var resource1 = await pool.request(); |
+ expect(pool.request().then((resource2) { |
+ resource2.release(); |
+ }), completes); |
+ expect(pool.close(), completes); |
+ resource1.release(); |
+ }); |
+ |
+ test("pending requests are fulfilled with allowRelease", () async { |
+ var pool = new Pool(1); |
+ var resource1 = await pool.request(); |
+ |
+ var completer = new Completer(); |
+ expect(pool.request().then((resource2) { |
+ expect(completer.isCompleted, isTrue); |
+ resource2.release(); |
+ }), completes); |
+ expect(pool.close(), completes); |
+ |
+ resource1.allowRelease(() => completer.future); |
+ await new Future.delayed(Duration.ZERO); |
+ |
+ completer.complete(); |
+ }); |
+ |
+ test("doesn't complete until all resources are released", () async { |
+ var pool = new Pool(2); |
+ var resource1 = await pool.request(); |
+ var resource2 = await pool.request(); |
+ var resource3Future = pool.request(); |
+ |
+ var resource1Released = false; |
+ var resource2Released = false; |
+ var resource3Released = false; |
+ expect(pool.close().then((_) { |
+ expect(resource1Released, isTrue); |
+ expect(resource2Released, isTrue); |
+ expect(resource3Released, isTrue); |
+ }), completes); |
+ |
+ resource1Released = true; |
+ resource1.release(); |
+ await new Future.delayed(Duration.ZERO); |
+ |
+ resource2Released = true; |
+ resource2.release(); |
+ await new Future.delayed(Duration.ZERO); |
+ |
+ var resource3 = await resource3Future; |
+ resource3Released = true; |
+ resource3.release(); |
+ }); |
+ |
+ test("active onReleases complete as usual", () async { |
+ var pool = new Pool(1); |
+ var resource = await pool.request(); |
+ |
+ // Set up an onRelease callback whose completion is controlled by |
+ // [completer]. |
+ var completer = new Completer(); |
+ resource.allowRelease(() => completer.future); |
+ expect(pool.request().then((_) { |
+ expect(completer.isCompleted, isTrue); |
+ }), completes); |
+ |
+ await new Future.delayed(Duration.ZERO); |
+ pool.close(); |
+ |
+ await new Future.delayed(Duration.ZERO); |
+ completer.complete(); |
+ }); |
+ |
+ test("inactive onReleases fire", () async { |
+ var pool = new Pool(2); |
+ var resource1 = await pool.request(); |
+ var resource2 = await pool.request(); |
+ |
+ var completer1 = new Completer(); |
+ resource1.allowRelease(() => completer1.future); |
+ var completer2 = new Completer(); |
+ resource2.allowRelease(() => completer2.future); |
+ |
+ expect(pool.close().then((_) { |
+ expect(completer1.isCompleted, isTrue); |
+ expect(completer2.isCompleted, isTrue); |
+ }), completes); |
+ |
+ await new Future.delayed(Duration.ZERO); |
+ completer1.complete(); |
+ |
+ await new Future.delayed(Duration.ZERO); |
+ completer2.complete(); |
+ }); |
+ |
+ test("new allowReleases fire immediately", () async { |
+ var pool = new Pool(1); |
+ var resource = await pool.request(); |
+ |
+ var completer = new Completer(); |
+ expect(pool.close().then((_) { |
+ expect(completer.isCompleted, isTrue); |
+ }), completes); |
+ |
+ await new Future.delayed(Duration.ZERO); |
+ resource.allowRelease(() => completer.future); |
+ |
+ await new Future.delayed(Duration.ZERO); |
+ completer.complete(); |
+ }); |
+ |
+ test("an onRelease error is piped to the return value", () async { |
+ var pool = new Pool(1); |
+ var resource = await pool.request(); |
+ |
+ var completer = new Completer(); |
+ resource.allowRelease(() => completer.future); |
+ |
+ expect(pool.close(), throwsA("oh no!")); |
+ |
+ await new Future.delayed(Duration.ZERO); |
+ completer.completeError("oh no!"); |
+ }); |
+ }); |
} |
/// Returns a function that will cause the test to fail if it's called. |