Commit bfbbef10 authored by Chris Bracken's avatar Chris Bracken Committed by GitHub

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.
parent 74446d78
......@@ -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<WebSocket> 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<WebSocket> socket = new Completer<WebSocket>();
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<Process> _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<dynamic> channel = new StreamChannel<dynamic>(socket.map(JSON.decode), socket);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment