Index: tests/compiler/dart2js/user_crash_test.dart |
diff --git a/tests/compiler/dart2js/user_crash_test.dart b/tests/compiler/dart2js/user_crash_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..305de2ae424da49c8981b34ab926458f701b1a78 |
--- /dev/null |
+++ b/tests/compiler/dart2js/user_crash_test.dart |
@@ -0,0 +1,102 @@ |
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+import 'dart:async'; |
+import 'package:async_helper/async_helper.dart'; |
+import 'package:expect/expect.dart'; |
+import 'package:compiler/compiler_new.dart'; |
+import 'memory_compiler.dart'; |
+ |
+final EXCEPTION = 'Crash'; |
+ |
+main() { |
+ asyncTest(() async { |
+ test('Empty program', await run()); |
+ test('Crash diagnostics', |
+ await run(diagnostics: new CrashingDiagnostics()), |
+ expectedLines: [ |
+ 'Uncaught exception in diagnostic handler: $EXCEPTION', |
+ null /* Stack trace*/], |
+ expectedExceptions: [EXCEPTION]); |
+ test('Throw in package discovery', |
+ await run(packagesDiscoveryProvider: (_) { throw EXCEPTION; }), |
+ expectedLines: [ |
+ 'Uncaught exception in package discovery: $EXCEPTION', |
+ null /* Stack trace*/], |
+ expectedExceptions: [EXCEPTION]); |
+ test('new Future.error in package discovery', |
+ await run(packagesDiscoveryProvider: |
+ (_) => new Future.error(EXCEPTION)), |
+ expectedExceptions: [EXCEPTION]); |
+ test('Throw in input provider', |
+ await run(memorySourceFiles: new CrashingMap()), |
+ expectedLines: [ |
+ 'Uncaught exception in input provider: $EXCEPTION', |
+ null, // Stack trace |
+ 'memory:main.dart:\nError: $EXCEPTION' /* READ_SELF_ERROR */]); |
+ }); |
+} |
+ |
+void test(String title, RunResult result, |
+ {List expectedLines: const [], |
+ List expectedExceptions: const []}) { |
+ print('--------------------------------------------------------------------'); |
+ print('Running $title'); |
+ print('--------------------------------------------------------------------'); |
+ print('lines:'); |
+ result.lines.forEach(print); |
+ print('exceptions:'); |
+ result.exceptions.forEach(print); |
+ Expect.equals(expectedLines.length, result.lines.length, |
+ "Unexpected number of calls to print."); |
+ Expect.equals(expectedExceptions.length, result.exceptions.length, |
+ "Unexpected number of exceptions."); |
+ for (int i = 0; i < expectedLines.length; i++) { |
+ if (expectedLines[i] != null) { |
+ Expect.equals(expectedLines[i], result.lines[i]); |
+ } |
+ } |
+} |
+ |
+Future<RunResult> run( |
+ {Map<String, String> memorySourceFiles: const {'main.dart': 'main() {}'}, |
+ CompilerDiagnostics diagnostics, |
+ PackagesDiscoveryProvider packagesDiscoveryProvider}) async { |
+ RunResult result = new RunResult(); |
+ await runZoned(() async { |
+ try { |
+ await runCompiler( |
+ entryPoint: Uri.parse('memory:main.dart'), |
+ memorySourceFiles: memorySourceFiles, |
+ diagnosticHandler: diagnostics, |
+ packagesDiscoveryProvider: packagesDiscoveryProvider); |
+ } catch (e) { |
+ result.exceptions.add(e); |
+ } |
+ |
+ }, |
+ zoneSpecification: new ZoneSpecification(print: |
+ (Zone self, ZoneDelegate parent, Zone zone, String line) { |
+ result.lines.add(line); |
+ })); |
+ return result; |
+} |
+ |
+class RunResult { |
+ List<String> lines = <String>[]; |
+ List exceptions = []; |
+} |
+ |
+class CrashingDiagnostics extends DiagnosticCollector { |
+ @override |
+ void report(code, Uri uri, int begin, int end, String text, Diagnostic kind) { |
+ throw EXCEPTION; |
+ } |
+} |
+ |
+class CrashingMap implements Map<String, String> { |
+ operator [](_) => throw EXCEPTION; |
+ |
+ noSuchMethod(_) => null; |
+} |