Chromium Code Reviews| Index: utils/tests/pub/test_pub.dart |
| diff --git a/utils/tests/pub/test_pub.dart b/utils/tests/pub/test_pub.dart |
| index e0ea168d7168948a65ca696be1ddb05f0b41a5b7..09883f07abf81ef498ec69a1393c718018f318b6 100644 |
| --- a/utils/tests/pub/test_pub.dart |
| +++ b/utils/tests/pub/test_pub.dart |
| @@ -52,8 +52,15 @@ TarFileDescriptor tar(Pattern name, [List<Descriptor> contents]) => |
| new TarFileDescriptor(name, contents); |
| /** |
| + * The current [HttpServer] created using [serve]. |
| + */ |
| +var _server; |
| + |
| +/** |
| * Creates an HTTP server to serve [contents] as static files. This server will |
| * exist only for the duration of the pub run. |
| + * |
| + * Subsequent calls to [serve] will replace the previous server. |
| */ |
| void serve(String host, int port, [List<Descriptor> contents]) { |
| var baseDir = dir("serve-dir", contents); |
| @@ -62,43 +69,58 @@ void serve(String host, int port, [List<Descriptor> contents]) { |
| } |
| _schedule((_) { |
| - var server = new HttpServer(); |
| - server.defaultRequestHandler = (request, response) { |
| - var path = request.uri.replaceFirst("/", "").split("/"); |
| - response.persistentConnection = false; |
| - var stream; |
| - try { |
| - stream = baseDir.load(path); |
| - } catch (var e) { |
| - response.statusCode = 404; |
| - response.contentLength = 0; |
| - response.outputStream.close(); |
| - return; |
| - } |
| - |
| - var future = consumeInputStream(stream); |
| - future.then((data) { |
| - response.statusCode = 200; |
| - response.contentLength = data.length; |
| - response.outputStream.write(data); |
| - response.outputStream.close(); |
| - }); |
| - |
| - future.handleException((e) { |
| - print("Exception while handling ${request.uri}: $e"); |
| - response.statusCode = 500; |
| - response.reasonPhrase = e.message; |
| - response.outputStream.close(); |
| - }); |
| - }; |
| - server.listen(host, port); |
| - _scheduleCleanup((_) => server.close()); |
| + _closeServer().transform((_) { |
| + _server = new HttpServer(); |
| + _server.defaultRequestHandler = (request, response) { |
| + var path = request.uri.replaceFirst("/", "").split("/"); |
| + response.persistentConnection = false; |
| + var stream; |
| + try { |
| + stream = baseDir.load(path); |
| + } catch (var e) { |
| + response.statusCode = 404; |
| + response.contentLength = 0; |
| + response.outputStream.close(); |
| + return; |
| + } |
| + |
| + var future = consumeInputStream(stream); |
| + future.then((data) { |
| + response.statusCode = 200; |
| + response.contentLength = data.length; |
| + response.outputStream.write(data); |
| + response.outputStream.close(); |
| + }); |
| - return new Future.immediate(null); |
| + future.handleException((e) { |
| + print("Exception while handling ${request.uri}: $e"); |
| + response.statusCode = 500; |
| + response.reasonPhrase = e.message; |
| + response.outputStream.close(); |
| + }); |
| + }; |
| + _server.listen(host, port); |
| + _scheduleCleanup((_) => _closeServer()); |
| + return null; |
| + }); |
| }); |
| } |
| /** |
| + * Closes [_server]. Returns a [Future] that will complete after the [_server] |
| + * is closed. |
| + */ |
| +Future _closeServer() { |
| + if (_server == null) return new Future.immediate(null); |
| + _server.close(); |
| + _server = null; |
| + // TODO(nweiz): Remove this once issue 4155 is fixed. Pumping the event loop |
| + // *seems* to be enough to ensure that the server is actually closed, but I'm |
|
Jennifer Messerly
2012/07/20 00:59:17
agree, I suspect it works as long as it gets to th
|
| + // putting this at 10ms to be safe. |
| + return sleep(10); |
| +} |
| + |
| +/** |
| * Creates an HTTP server that replicates the structure of pub.dartlang.org. |
| * [pubspecs] is a list of YAML-format pubspecs representing the packages to |
| * serve. |