| 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:unittest/unittest.dart'; | 10 import 'package:test/test.dart'; |
| 11 | 11 |
| 12 void main() { | 12 void main() { |
| 13 group("request()", () { | 13 group("request()", () { |
| 14 test("resources can be requested freely up to the limit", () { | 14 test("resources can be requested freely up to the limit", () { |
| 15 var pool = new Pool(50); | 15 var pool = new Pool(50); |
| 16 var requests = []; | |
| 17 for (var i = 0; i < 50; i++) { | 16 for (var i = 0; i < 50; i++) { |
| 18 expect(pool.request(), completes); | 17 expect(pool.request(), completes); |
| 19 } | 18 } |
| 20 }); | 19 }); |
| 21 | 20 |
| 22 test("resources block past the limit", () { | 21 test("resources block past the limit", () { |
| 23 new FakeAsync().run((async) { | 22 new FakeAsync().run((async) { |
| 24 var pool = new Pool(50); | 23 var pool = new Pool(50); |
| 25 var requests = []; | |
| 26 for (var i = 0; i < 50; i++) { | 24 for (var i = 0; i < 50; i++) { |
| 27 expect(pool.request(), completes); | 25 expect(pool.request(), completes); |
| 28 } | 26 } |
| 29 expect(pool.request(), doesNotComplete); | 27 expect(pool.request(), doesNotComplete); |
| 30 | 28 |
| 31 async.elapse(new Duration(seconds: 1)); | 29 async.elapse(new Duration(seconds: 1)); |
| 32 }); | 30 }); |
| 33 }); | 31 }); |
| 34 | 32 |
| 35 test("a blocked resource is allocated when another is released", () { | 33 test("a blocked resource is allocated when another is released", () { |
| 36 new FakeAsync().run((async) { | 34 new FakeAsync().run((async) { |
| 37 var pool = new Pool(50); | 35 var pool = new Pool(50); |
| 38 var requests = []; | |
| 39 for (var i = 0; i < 49; i++) { | 36 for (var i = 0; i < 49; i++) { |
| 40 expect(pool.request(), completes); | 37 expect(pool.request(), completes); |
| 41 } | 38 } |
| 42 | 39 |
| 43 pool.request().then((lastAllocatedResource) { | 40 pool.request().then((lastAllocatedResource) { |
| 44 // This will only complete once [lastAllocatedResource] is released. | 41 // This will only complete once [lastAllocatedResource] is released. |
| 45 expect(pool.request(), completes); | 42 expect(pool.request(), completes); |
| 46 | 43 |
| 47 new Future.delayed(new Duration(microseconds: 1)).then((_) { | 44 new Future.delayed(new Duration(microseconds: 1)).then((_) { |
| 48 lastAllocatedResource.release(); | 45 lastAllocatedResource.release(); |
| 49 }); | 46 }); |
| 50 }); | 47 }); |
| 51 | 48 |
| 52 async.elapse(new Duration(seconds: 1)); | 49 async.elapse(new Duration(seconds: 1)); |
| 53 }); | 50 }); |
| 54 }); | 51 }); |
| 55 }); | 52 }); |
| 56 | 53 |
| 57 group("withResource()", () { | 54 group("withResource()", () { |
| 58 test("can be called freely up to the limit", () { | 55 test("can be called freely up to the limit", () { |
| 59 var pool = new Pool(50); | 56 var pool = new Pool(50); |
| 60 var requests = []; | |
| 61 for (var i = 0; i < 50; i++) { | 57 for (var i = 0; i < 50; i++) { |
| 62 pool.withResource(expectAsync(() => new Completer().future)); | 58 pool.withResource(expectAsync(() => new Completer().future)); |
| 63 } | 59 } |
| 64 }); | 60 }); |
| 65 | 61 |
| 66 test("blocks the callback past the limit", () { | 62 test("blocks the callback past the limit", () { |
| 67 new FakeAsync().run((async) { | 63 new FakeAsync().run((async) { |
| 68 var pool = new Pool(50); | 64 var pool = new Pool(50); |
| 69 var requests = []; | |
| 70 for (var i = 0; i < 50; i++) { | 65 for (var i = 0; i < 50; i++) { |
| 71 pool.withResource(expectAsync(() => new Completer().future)); | 66 pool.withResource(expectAsync(() => new Completer().future)); |
| 72 } | 67 } |
| 73 pool.withResource(expectNoAsync()); | 68 pool.withResource(expectNoAsync()); |
| 74 | 69 |
| 75 async.elapse(new Duration(seconds: 1)); | 70 async.elapse(new Duration(seconds: 1)); |
| 76 }); | 71 }); |
| 77 }); | 72 }); |
| 78 | 73 |
| 79 test("a blocked resource is allocated when another is released", () { | 74 test("a blocked resource is allocated when another is released", () { |
| 80 new FakeAsync().run((async) { | 75 new FakeAsync().run((async) { |
| 81 var pool = new Pool(50); | 76 var pool = new Pool(50); |
| 82 var requests = []; | |
| 83 for (var i = 0; i < 49; i++) { | 77 for (var i = 0; i < 49; i++) { |
| 84 pool.withResource(expectAsync(() => new Completer().future)); | 78 pool.withResource(expectAsync(() => new Completer().future)); |
| 85 } | 79 } |
| 86 | 80 |
| 87 var completer = new Completer(); | 81 var completer = new Completer(); |
| 88 var lastAllocatedResource = pool.withResource(() => completer.future); | 82 pool.withResource(() => completer.future); |
| 89 var blockedResourceAllocated = false; | 83 var blockedResourceAllocated = false; |
| 90 var blockedResource = pool.withResource(() { | 84 pool.withResource(() { |
| 91 blockedResourceAllocated = true; | 85 blockedResourceAllocated = true; |
| 92 }); | 86 }); |
| 93 | 87 |
| 94 new Future.delayed(new Duration(microseconds: 1)).then((_) { | 88 new Future.delayed(new Duration(microseconds: 1)).then((_) { |
| 95 expect(blockedResourceAllocated, isFalse); | 89 expect(blockedResourceAllocated, isFalse); |
| 96 completer.complete(); | 90 completer.complete(); |
| 97 return new Future.delayed(new Duration(microseconds: 1)); | 91 return new Future.delayed(new Duration(microseconds: 1)); |
| 98 }).then((_) { | 92 }).then((_) { |
| 99 expect(blockedResourceAllocated, isTrue); | 93 expect(blockedResourceAllocated, isTrue); |
| 100 }); | 94 }); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 expect(pool.request(), completes); | 138 expect(pool.request(), completes); |
| 145 } | 139 } |
| 146 expect(pool.request(), doesNotComplete); | 140 expect(pool.request(), doesNotComplete); |
| 147 | 141 |
| 148 new Future.delayed(new Duration(seconds: 3)).then((_) { | 142 new Future.delayed(new Duration(seconds: 3)).then((_) { |
| 149 expect(pool.request(), doesNotComplete); | 143 expect(pool.request(), doesNotComplete); |
| 150 }); | 144 }); |
| 151 | 145 |
| 152 async.elapse(new Duration(seconds: 6)); | 146 async.elapse(new Duration(seconds: 6)); |
| 153 }); | 147 }); |
| 154 }); | 148 }); |
| 155 | 149 |
| 156 test("times out if nothing happens", () { | 150 test("times out if nothing happens", () { |
| 157 new FakeAsync().run((async) { | 151 new FakeAsync().run((async) { |
| 158 var pool = new Pool(50, timeout: new Duration(seconds: 5)); | 152 var pool = new Pool(50, timeout: new Duration(seconds: 5)); |
| 159 for (var i = 0; i < 50; i++) { | 153 for (var i = 0; i < 50; i++) { |
| 160 expect(pool.request(), completes); | 154 expect(pool.request(), completes); |
| 161 } | 155 } |
| 162 expect(pool.request(), throwsA(new isInstanceOf<TimeoutException>())); | 156 expect(pool.request(), throwsA(new isInstanceOf<TimeoutException>())); |
| 163 | 157 |
| 164 async.elapse(new Duration(seconds: 6)); | 158 async.elapse(new Duration(seconds: 6)); |
| 165 }); | 159 }); |
| 166 }); | 160 }); |
| 167 }); | 161 }); |
| 168 } | 162 } |
| 169 | 163 |
| 170 /// Returns a function that will cause the test to fail if it's called. | 164 /// Returns a function that will cause the test to fail if it's called. |
| 171 /// | 165 /// |
| 172 /// This should only be called within a [FakeAsync.run] zone. | 166 /// This should only be called within a [FakeAsync.run] zone. |
| 173 Function expectNoAsync() { | 167 Function expectNoAsync() { |
| 174 var stack = new Trace.current(1); | 168 var stack = new Trace.current(1); |
| 175 return () => handleExternalError( | 169 return () => registerException( |
| 176 new TestFailure("Expected function not to be called."), "", | 170 new TestFailure("Expected function not to be called."), stack); |
| 177 stack); | |
| 178 } | 171 } |
| 179 | 172 |
| 180 /// A matcher for Futures that asserts that they don't complete. | 173 /// A matcher for Futures that asserts that they don't complete. |
| 181 /// | 174 /// |
| 182 /// This should only be called within a [FakeAsync.run] zone. | 175 /// This should only be called within a [FakeAsync.run] zone. |
| 183 Matcher get doesNotComplete => predicate((future) { | 176 Matcher get doesNotComplete => predicate((future) { |
| 184 expect(future, new isInstanceOf<Future>('Future')); | 177 expect(future, new isInstanceOf<Future>()); |
| 185 | 178 |
| 186 var stack = new Trace.current(1); | 179 var stack = new Trace.current(1); |
| 187 future.then((_) => handleExternalError( | 180 future.then((_) => registerException( |
| 188 new TestFailure("Expected future not to complete."), "", | 181 new TestFailure("Expected future not to complete."), stack)); |
| 189 stack)); | |
| 190 return true; | 182 return true; |
| 191 }); | 183 }); |
| OLD | NEW |