Index: utils/tests/pub/test_pub.dart |
diff --git a/utils/tests/pub/test_pub.dart b/utils/tests/pub/test_pub.dart |
index 3fc2039fb9493983bef29303a398c94c7454fc82..a03b0fec339a74a9988d4eb7589d0d540409ab8c 100644 |
--- a/utils/tests/pub/test_pub.dart |
+++ b/utils/tests/pub/test_pub.dart |
@@ -1399,18 +1399,23 @@ class ScheduledServer { |
/// The wrapped server. |
final Future<HttpServer> _server; |
+ /// The queue of handlers to run for upcoming requests. |
+ final _handlers = new Queue<Future>(); |
+ |
ScheduledServer._(this._server); |
/// Creates a new server listening on an automatically-allocated port on |
/// localhost. |
factory ScheduledServer() { |
- return new ScheduledServer._(_scheduleValue((_) { |
+ var scheduledServer; |
+ scheduledServer = new ScheduledServer._(_scheduleValue((_) { |
var server = new HttpServer(); |
- server.defaultRequestHandler = _unexpectedRequest; |
+ server.defaultRequestHandler = scheduledServer._awaitHandle; |
server.listen("127.0.0.1", 0); |
_scheduleCleanup((_) => server.close()); |
return new Future.immediate(server); |
})); |
+ return scheduledServer; |
} |
/// The port on which the server is listening. |
@@ -1425,24 +1430,35 @@ class ScheduledServer { |
/// it's completed to continue the schedule. |
void handle(String method, String path, |
Future handler(HttpRequest request, HttpResponse response)) { |
- _schedule((_) => timeout(_server.chain((server) { |
- var completer = new Completer(); |
- server.defaultRequestHandler = (request, response) { |
- server.defaultRequestHandler = _unexpectedRequest; |
+ var handlerCompleter = new Completer<Function>(); |
+ _scheduleValue((_) { |
+ var requestCompleteCompleter = new Completer(); |
+ handlerCompleter.complete((request, response) { |
expect(request.method, equals(method)); |
expect(request.path, equals(path)); |
var future = handler(request, response); |
if (future == null) future = new Future.immediate(null); |
- chainToCompleter(future, completer); |
- }; |
- return completer.future; |
- }), 5000, "waiting for $method $path")); |
+ chainToCompleter(future, requestCompleteCompleter); |
+ }); |
+ return timeout(requestCompleteCompleter.future, |
+ 5000, "waiting for $method $path"); |
+ }); |
+ _handlers.add(handlerCompleter.future); |
} |
/// Raises an error complaining of an unexpected request. |
- static void _unexpectedRequest(HttpRequest request, HttpResponse response) { |
- fail('Unexpected ${request.method} request to ${request.path}.'); |
+ void _awaitHandle(HttpRequest request, HttpResponse response) { |
+ var future = timeout(new Future.immediate(null).chain((_) { |
+ var handlerFuture = _handlers.removeFirst(); |
+ if (handlerFuture == null) { |
+ fail('Unexpected ${request.method} request to ${request.path}.'); |
+ } |
+ return handlerFuture; |
+ }).transform((handler) { |
+ handler(request, response); |
+ }), 5000, "waiting for a handler for ${request.method} ${request.path}"); |
+ expect(future, completes); |
} |
} |
@@ -1510,7 +1526,7 @@ void _scheduleOnException(_ScheduledEvent event) { |
/// |
/// Note that [matcher] matches against the completed value of [actual], so |
/// calling [completion] is unnecessary. |
-Matcher expectLater(Future actual, matcher, {String reason, |
+void expectLater(Future actual, matcher, {String reason, |
FailureHandler failureHandler, bool verbose: false}) { |
_schedule((_) { |
return actual.transform((value) { |