Index: lib/src/runner/engine.dart |
diff --git a/lib/src/runner/engine.dart b/lib/src/runner/engine.dart |
index 8862ee312f237e2a86388a3ae98c63b0f21fa633..2ec9ca6a81aa783c14d755de6eedd5ac5741f1ef 100644 |
--- a/lib/src/runner/engine.dart |
+++ b/lib/src/runner/engine.dart |
@@ -205,7 +205,7 @@ class Engine { |
await _runPool.withResource(() async { |
if (_closed) return; |
- await _runGroup(suite, suite.group); |
+ await _runGroup(suite, suite.group, []); |
loadResource.allowRelease(() => suite.close()); |
}); |
})); |
@@ -215,45 +215,57 @@ class Engine { |
} |
/// Runs all the entries in [entries] in sequence. |
- Future _runGroup(RunnerSuite suite, Group group) async { |
+ /// |
+ /// [parents] is a list of groups that contain [group]. It may be modified, |
+ /// but it's guaranteed to be in its original state once this function has |
+ /// finished. |
+ Future _runGroup(RunnerSuite suite, Group group, List<Group> parents) async { |
if (group.metadata.skip) { |
- await _runLiveTest(_skippedTest(suite, group)); |
+ await _runLiveTest(_skippedTest(suite, group, parents)); |
return; |
} |
var setUpAllSucceeded = true; |
if (group.setUpAll != null) { |
- var liveTest = group.setUpAll.load(suite); |
+ var liveTest = group.setUpAll.load(suite, groups: parents); |
await _runLiveTest(liveTest, countSuccess: false); |
setUpAllSucceeded = liveTest.state.result == Result.success; |
} |
if (!_closed && setUpAllSucceeded) { |
- for (var entry in group.entries) { |
- if (_closed) return; |
- |
- if (entry is Group) { |
- await _runGroup(suite, entry); |
- } else if (entry.metadata.skip) { |
- await _runLiveTest(_skippedTest(suite, entry)); |
- } else { |
- var test = entry as Test; |
- await _runLiveTest(test.load(suite)); |
+ parents.add(group); |
+ try { |
+ for (var entry in group.entries) { |
+ if (_closed) return; |
+ |
+ if (entry is Group) { |
+ await _runGroup(suite, entry, parents); |
+ } else if (entry.metadata.skip) { |
+ await _runLiveTest(_skippedTest(suite, entry, parents)); |
+ } else { |
+ var test = entry as Test; |
+ await _runLiveTest(test.load(suite, groups: parents)); |
+ } |
} |
+ } finally { |
+ parents.remove(group); |
} |
} |
// Even if we're closed or setUpAll failed, we want to run all the teardowns |
// to ensure that any state is properly cleaned up. |
if (group.tearDownAll != null) { |
- var liveTest = group.tearDownAll.load(suite); |
+ var liveTest = group.tearDownAll.load(suite, groups: parents); |
await _runLiveTest(liveTest, countSuccess: false); |
if (_closed) await liveTest.close(); |
} |
} |
/// Returns a dummy [LiveTest] for a test or group marked as "skip". |
- LiveTest _skippedTest(RunnerSuite suite, GroupEntry entry) { |
+ /// |
+ /// [parents] is a list of groups that contain [entry]. |
+ LiveTest _skippedTest(RunnerSuite suite, GroupEntry entry, |
+ List<Group> parents) { |
// The netry name will be `null` for the root group. |
var test = new LocalTest(entry.name ?? "(suite)", entry.metadata, () {}); |
@@ -262,7 +274,7 @@ class Engine { |
controller.setState(const State(Status.running, Result.success)); |
controller.setState(const State(Status.complete, Result.success)); |
controller.completer.complete(); |
- }, () {}); |
+ }, () {}, groups: parents); |
return controller.liveTest; |
} |