From bfbbef108dae4333a3759783d76a67dd84ebb03f Mon Sep 17 00:00:00 2001 From: Chris Bracken Date: Mon, 22 Aug 2016 15:30:10 -0700 Subject: [PATCH] Prevent hangs due to bad import/export directives (#5538) If the input test script contains a bad import, sky_shell will fail to execute main(), in which case a connection to /runner is never established and the _ServerInfo.socket never completes. This change works around this by issuing a request on /shutdown when sky_shell exits. --- .../lib/src/test/flutter_platform.dart | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/flutter_tools/lib/src/test/flutter_platform.dart b/packages/flutter_tools/lib/src/test/flutter_platform.dart index ee4ac588f9a..0bca68bdc49 100644 --- a/packages/flutter_tools/lib/src/test/flutter_platform.dart +++ b/packages/flutter_tools/lib/src/test/flutter_platform.dart @@ -21,7 +21,8 @@ import 'coverage_collector.dart'; final String _kSkyShell = Platform.environment['SKY_SHELL']; const String _kHost = '127.0.0.1'; -const String _kPath = '/runner'; +const String _kRunnerPath = '/runner'; +const String _kShutdownPath = '/shutdown'; String shellPath; @@ -33,20 +34,24 @@ void installHook() { class _ServerInfo { final String url; + final String shutdownUrl; final Future socket; final HttpServer server; - _ServerInfo(this.server, this.url, this.socket); + _ServerInfo(this.server, this.url, this.shutdownUrl, this.socket); } Future<_ServerInfo> _startServer() async { HttpServer server = await HttpServer.bind(_kHost, 0); Completer socket = new Completer(); server.listen((HttpRequest request) { - if (request.uri.path == _kPath) + if (request.uri.path == _kRunnerPath) socket.complete(WebSocketTransformer.upgrade(request)); + else if (!socket.isCompleted && request.uri.path == _kShutdownPath) + socket.completeError('Failed to start test'); }); - return new _ServerInfo(server, 'ws://$_kHost:${server.port}$_kPath', socket.future); + return new _ServerInfo(server, 'ws://$_kHost:${server.port}$_kRunnerPath', + 'ws://$_kHost:${server.port}$_kShutdownPath', socket.future); } Future _startProcess(String mainPath, { String packages, int observatoryPort }) { @@ -172,6 +177,10 @@ void main() { } } + process.exitCode.then((_) { + WebSocket.connect(info.shutdownUrl); + }); + try { WebSocket socket = await info.socket; StreamChannel channel = new StreamChannel(socket.map(JSON.decode), socket);