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( ...@@ -342,6 +342,10 @@ Future<String> _buildAotSnapshot(
aot : true, aot : true,
strongMode: strongMode, strongMode: strongMode,
); );
if (mainPath == null) {
printError('Compiler terminated unexpectedly.');
return null;
}
} }
genSnapshotCmd.add(mainPath); genSnapshotCmd.add(mainPath);
......
...@@ -110,8 +110,8 @@ Future<String> compile( ...@@ -110,8 +110,8 @@ Future<String> compile(
.transform(UTF8.decoder) .transform(UTF8.decoder)
.transform(const LineSplitter()) .transform(const LineSplitter())
.listen(stdoutHandler.handler); .listen(stdoutHandler.handler);
await server.exitCode; final int exitCode = await server.exitCode;
return stdoutHandler.outputFilename.future; return exitCode == 0 ? stdoutHandler.outputFilename.future : null;
} }
/// Wrapper around incremental frontend server compiler, that communicates with /// Wrapper around incremental frontend server compiler, that communicates with
...@@ -175,7 +175,8 @@ class ResidentCompiler { ...@@ -175,7 +175,8 @@ class ResidentCompiler {
_server.stdin.writeln('compile $scriptFilename'); _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({ ...@@ -76,6 +76,9 @@ Future<Null> build({
mainPath: fs.file(mainPath).absolute.path, mainPath: fs.file(mainPath).absolute.path,
strongMode: strongMode strongMode: strongMode
); );
if (kernelBinaryFilename == null) {
throwToolExit('Compiler terminated unexpectedly on $mainPath');
}
kernelContent = new DevFSFileContent(fs.file(kernelBinaryFilename)); kernelContent = new DevFSFileContent(fs.file(kernelBinaryFilename));
} }
......
...@@ -74,6 +74,28 @@ void main() { ...@@ -74,6 +74,28 @@ void main() {
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
ProcessManager: () => mockProcessManager, 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', () { group('incremental compile', () {
...@@ -125,6 +147,27 @@ void main() { ...@@ -125,6 +147,27 @@ void main() {
ProcessManager: () => mockProcessManager, 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 { testUsingContext('compile and recompile', () async {
final BufferLogger logger = context[Logger]; 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