Unverified Commit 9534082f authored by Alexander Aprelev's avatar Alexander Aprelev Committed by GitHub

Handle abnormal termination of frontend compiler. (#13982)

* Check frontend_server exit code.

When frontend_server completes abnormally, flutter tools has to stop and let user know.

* Add tests
parent 5c88f8f2
......@@ -342,6 +342,10 @@ Future<String> _buildAotSnapshot(
aot : true,
strongMode: strongMode,
);
if (mainPath == null) {
printError('Compiler terminated unexpectedly.');
return null;
}
}
genSnapshotCmd.add(mainPath);
......
......@@ -110,8 +110,8 @@ Future<String> compile(
.transform(UTF8.decoder)
.transform(const LineSplitter())
.listen(stdoutHandler.handler);
await server.exitCode;
return stdoutHandler.outputFilename.future;
final int exitCode = await server.exitCode;
return exitCode == 0 ? stdoutHandler.outputFilename.future : null;
}
/// Wrapper around incremental frontend server compiler, that communicates with
......@@ -175,7 +175,8 @@ class ResidentCompiler {
_server.stdin.writeln('compile $scriptFilename');
return stdoutHandler.outputFilename.future;
final int exitCode = await _server.exitCode;
return exitCode == 0 ? stdoutHandler.outputFilename.future : null;
}
......
......@@ -76,6 +76,9 @@ Future<Null> build({
mainPath: fs.file(mainPath).absolute.path,
strongMode: strongMode
);
if (kernelBinaryFilename == null) {
throwToolExit('Compiler terminated unexpectedly on $mainPath');
}
kernelContent = new DevFSFileContent(fs.file(kernelBinaryFilename));
}
......
......@@ -74,6 +74,28 @@ void main() {
}, overrides: <Type, Generator>{
ProcessManager: () => mockProcessManager,
});
testUsingContext('single dart abnormal compiler termination', () async {
when(mockFrontendServer.exitCode).thenReturn(255);
final BufferLogger logger = context[Logger];
when(mockFrontendServer.stdout)
.thenAnswer((Invocation invocation) => new Stream<List<int>>.fromFuture(
new Future<List<int>>.value(UTF8.encode(
'result abc\nline1\nline2\nabc'
))
));
final String output = await compile(sdkRoot: '/path/to/sdkroot',
mainPath: '/path/to/main.dart'
);
expect(mockFrontendServerStdIn.getAndClear(), isEmpty);
expect(logger.errorText, equals('compiler message: line1\ncompiler message: line2\n'));
expect(output, equals(null));
}, overrides: <Type, Generator>{
ProcessManager: () => mockProcessManager,
});
});
group('incremental compile', () {
......@@ -125,6 +147,27 @@ void main() {
ProcessManager: () => mockProcessManager,
});
testUsingContext('single dart compile abnormally terminates', () async {
when(mockFrontendServer.exitCode).thenReturn(255);
final BufferLogger logger = context[Logger];
when(mockFrontendServer.stdout)
.thenAnswer((Invocation invocation) => new Stream<List<int>>.fromFuture(
new Future<List<int>>.value(UTF8.encode(
'result abc\nline1\nline2\nabc /path/to/main.dart.dill'
))
));
final String output = await generator.recompile(
'/path/to/main.dart', null /* invalidatedFiles */
);
expect(logger.errorText, equals('compiler message: line1\ncompiler message: line2\n'));
expect(output, equals(null));
}, overrides: <Type, Generator>{
ProcessManager: () => mockProcessManager,
});
testUsingContext('compile and recompile', () async {
final BufferLogger logger = context[Logger];
......
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