Index: lib/src/vm_listener.dart |
diff --git a/lib/src/vm_listener.dart b/lib/src/vm_listener.dart |
index 7deb0b42eb52be1e943af0456317959a28420f31..2a35f2219b95470dd3e858922c6eb260b939a175 100644 |
--- a/lib/src/vm_listener.dart |
+++ b/lib/src/vm_listener.dart |
@@ -11,6 +11,7 @@ import 'declarer.dart'; |
import 'remote_exception.dart'; |
import 'suite.dart'; |
import 'test.dart'; |
+import 'utils.dart'; |
/// A class that runs tests in a separate isolate and communicates the results |
/// back to the main isolate. |
@@ -18,18 +19,54 @@ class VmListener { |
/// The test suite to run. |
final Suite _suite; |
- /// Extracts metadata about all the tests in [main] and sends information |
- /// about them over [sendPort]. |
+ /// Extracts metadata about all the tests in the function returned by |
+ /// [getMain] and sends information about them over [sendPort]. |
+ /// |
+ /// The main function is wrapped in a closure so that we can handle it being |
+ /// undefined here rather than in the generated code. |
/// |
/// Once that's done, this starts listening for commands about which tests to |
/// run. |
- static void start(SendPort sendPort, main()) { |
+ static void start(SendPort sendPort, Function getMain()) { |
+ var main; |
+ try { |
+ main = getMain(); |
+ } on NoSuchMethodError catch (_) { |
+ _sendLoadException(sendPort, "No top-level main() function defined."); |
+ return; |
+ } |
+ |
+ if (main is! Function) { |
+ _sendLoadException(sendPort, "Top-level main getter is not a function."); |
+ return; |
+ } else if (main is! AsyncFunction) { |
+ _sendLoadException( |
+ sendPort, "Top-level main() function takes arguments."); |
+ return; |
+ } |
+ |
var declarer = new Declarer(); |
- runZoned(main, zoneValues: {#unittest.declarer: declarer}); |
+ try { |
+ runZoned(main, zoneValues: {#unittest.declarer: declarer}); |
+ } catch (error, stackTrace) { |
+ sendPort.send({ |
+ "type": "error", |
+ "error": RemoteException.serialize(error, stackTrace) |
+ }); |
+ return; |
+ } |
+ |
new VmListener._(new Suite("VmListener", declarer.tests)) |
._listen(sendPort); |
} |
+ /// Sends a message over [sendPort] indicating that the tests failed to load. |
+ /// |
+ /// [message] should describe the failure. |
+ static void _sendLoadException(SendPort sendPort, String message) { |
+ sendPort.send({"type": "loadException", "message": message}); |
+ } |
+ |
VmListener._(this._suite); |
/// Send information about [_suite] across [sendPort] and start listening for |
@@ -47,7 +84,10 @@ class VmListener { |
}); |
} |
- sendPort.send(tests); |
+ sendPort.send({ |
+ "type": "success", |
+ "tests": tests |
+ }); |
} |
/// Runs [test] and send the results across [sendPort]. |