Index: utils/tests/pub/test_pub.dart |
diff --git a/utils/tests/pub/test_pub.dart b/utils/tests/pub/test_pub.dart |
index 81bc9e9cceb98505e635080b454dc700668517e9..98ba5ba3fb5cb604e05c662eed2591e56d1f5776 100644 |
--- a/utils/tests/pub/test_pub.dart |
+++ b/utils/tests/pub/test_pub.dart |
@@ -462,42 +462,47 @@ final _TIMEOUT = 30000; |
/// operations which will be run asynchronously. |
void integration(String description, void body()) { |
test(description, () { |
- body(); |
- _run(); |
- }); |
-} |
+ // Sanity check. Make sure we cleaned up the last test. |
+ assert(_scheduled == null); |
+ assert(_scheduledCleanup == null); |
+ assert(_scheduledOnException == null); |
-/// Runs all the scheduled events for a test case. This should only be called |
-/// once per test case. |
-void _run() { |
- var createdSandboxDir; |
- var asyncDone = expectAsync0(() {}); |
- |
- Future cleanup() { |
- return _runScheduled(createdSandboxDir, _scheduledCleanup).then((_) { |
- _scheduled = null; |
- _scheduledCleanup = null; |
- _scheduledOnException = null; |
- if (createdSandboxDir != null) return deleteDir(createdSandboxDir); |
- }); |
- } |
+ // Schedule the test. |
+ body(); |
- timeout(_setUpSandbox().then((sandboxDir) { |
- createdSandboxDir = sandboxDir; |
- return _runScheduled(sandboxDir, _scheduled); |
- }).catchError((e) { |
- // If an error occurs during testing, delete the sandbox, throw the error so |
- // that the test framework sees it, then finally call asyncDone so that the |
- // test framework knows we're done doing asynchronous stuff. |
- return _runScheduled(createdSandboxDir, _scheduledOnException) |
- .then((_) => registerException(e.error, e.stackTrace)).catchError((e) { |
- print("Exception while cleaning up: ${e.error}"); |
- print(e.stackTrace); |
+ // Run all of the scheduled tasks. If an error occurs, it will propagate |
+ // through the futures back up to here where we can hand it off to unittest. |
+ var asyncDone = expectAsync0(() {}); |
+ var createdSandboxDir; |
+ _setUpSandbox().then((sandboxDir) { |
+ createdSandboxDir = sandboxDir; |
+ return timeout(_runScheduled(sandboxDir, _scheduled), |
+ _TIMEOUT, 'waiting for a test to complete'); |
+ }).catchError((e) { |
+ return _runScheduled(createdSandboxDir, _scheduledOnException).then((_) { |
+ // Rethrow the original error so it keeps propagating. |
+ throw e; |
+ }); |
+ }).whenComplete(() { |
+ // Clean up after ourselves. Do this first before reporting back to |
+ // unittest because it will advance to the next test immediately. |
+ return _runScheduled(createdSandboxDir, _scheduledCleanup).then((_) { |
+ _scheduled = null; |
+ _scheduledCleanup = null; |
+ _scheduledOnException = null; |
+ if (createdSandboxDir != null) return deleteDir(createdSandboxDir); |
+ }); |
+ }).then((_) { |
+ // If we got here, the test completed successfully so tell unittest so. |
+ asyncDone(); |
+ }).catchError((e) { |
+ // If we got here, an error occurred. We will register it with unittest |
+ // directly so that the error message isn't wrapped in any matcher stuff. |
+ // We do this call last because it will cause unittest to *synchronously* |
+ // advance to the next test and run it. |
registerException(e.error, e.stackTrace); |
}); |
- }), _TIMEOUT, 'waiting for a test to complete') |
- .then((_) => cleanup()) |
- .then((_) => asyncDone()); |
+ }); |
} |
/// Get the path to the root "util/test/pub" directory containing the pub |
@@ -514,8 +519,7 @@ String get testDirectory { |
void schedulePub({List args, Pattern output, Pattern error, |
Future<Uri> tokenEndpoint, int exitCode: 0}) { |
_schedule((sandboxDir) { |
- return _doPub(runProcess, sandboxDir, args, tokenEndpoint) |
- .then((result) { |
+ return _doPub(runProcess, sandboxDir, args, tokenEndpoint).then((result) { |
var failures = []; |
_validateOutput(failures, 'stdout', output, result.stdout); |