OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library test.runner.engine; | 5 library test.runner.engine; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:collection'; | 8 import 'dart:collection'; |
9 | 9 |
10 import 'package:async/async.dart' hide Result; | 10 import 'package:async/async.dart' hide Result; |
11 import 'package:collection/collection.dart'; | 11 import 'package:collection/collection.dart'; |
12 import 'package:pool/pool.dart'; | 12 import 'package:pool/pool.dart'; |
13 | 13 |
14 import '../backend/group.dart'; | 14 import '../backend/group.dart'; |
15 import '../backend/invoker.dart'; | 15 import '../backend/invoker.dart'; |
16 import '../backend/live_test.dart'; | 16 import '../backend/live_test.dart'; |
17 import '../backend/live_test_controller.dart'; | 17 import '../backend/live_test_controller.dart'; |
18 import '../backend/state.dart'; | 18 import '../backend/state.dart'; |
19 import '../backend/suite_entry.dart'; | 19 import '../backend/group_entry.dart'; |
20 import '../backend/test.dart'; | 20 import '../backend/test.dart'; |
21 import 'load_suite.dart'; | 21 import 'load_suite.dart'; |
22 import 'runner_suite.dart'; | 22 import 'runner_suite.dart'; |
23 | 23 |
24 /// An [Engine] manages a run that encompasses multiple test suites. | 24 /// An [Engine] manages a run that encompasses multiple test suites. |
25 /// | 25 /// |
26 /// Test suites are provided by passing them into [suiteSink]. Once all suites | 26 /// Test suites are provided by passing them into [suiteSink]. Once all suites |
27 /// have been provided, the user should close [suiteSink] to indicate this. | 27 /// have been provided, the user should close [suiteSink] to indicate this. |
28 /// [run] won't terminate until [suiteSink] is closed. Suites will be run in the | 28 /// [run] won't terminate until [suiteSink] is closed. Suites will be run in the |
29 /// order they're provided to [suiteSink]. Tests within those suites will | 29 /// order they're provided to [suiteSink]. Tests within those suites will |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 if (suite is LoadSuite) { | 192 if (suite is LoadSuite) { |
193 suite = await _addLoadSuite(suite); | 193 suite = await _addLoadSuite(suite); |
194 if (suite == null) { | 194 if (suite == null) { |
195 loadResource.release(); | 195 loadResource.release(); |
196 return; | 196 return; |
197 } | 197 } |
198 } | 198 } |
199 | 199 |
200 await _runPool.withResource(() async { | 200 await _runPool.withResource(() async { |
201 if (_closed) return; | 201 if (_closed) return; |
202 await _runEntries(suite, suite.entries); | 202 await _runGroup(suite, suite.group); |
203 loadResource.allowRelease(() => suite.close()); | 203 loadResource.allowRelease(() => suite.close()); |
204 }); | 204 }); |
205 })); | 205 })); |
206 }, onDone: _group.close); | 206 }, onDone: _group.close); |
207 | 207 |
208 return success; | 208 return success; |
209 } | 209 } |
210 | 210 |
211 /// Runs all the entries in [entries] in sequence. | 211 /// Runs all the entries in [entries] in sequence. |
212 Future _runEntries(RunnerSuite suite, List<SuiteEntry> entries) async { | 212 Future _runGroup(RunnerSuite suite, Group group) async { |
213 for (var entry in entries) { | 213 if (group.metadata.skip) { |
| 214 await _runLiveTest(_skippedTest(suite, group)); |
| 215 return; |
| 216 } |
| 217 |
| 218 for (var entry in group.entries) { |
214 if (_closed) return; | 219 if (_closed) return; |
215 | 220 |
216 if (entry.metadata.skip) { | 221 if (entry is Group) { |
| 222 await _runGroup(suite, entry); |
| 223 } else if (entry.metadata.skip) { |
217 await _runLiveTest(_skippedTest(suite, entry)); | 224 await _runLiveTest(_skippedTest(suite, entry)); |
218 } else if (entry is Test) { | |
219 await _runLiveTest(entry.load(suite)); | |
220 } else { | 225 } else { |
221 var group = entry as Group; | 226 var test = entry as Test; |
222 await _runEntries(suite, group.entries); | 227 await _runLiveTest(test.load(suite)); |
223 } | 228 } |
224 } | 229 } |
225 } | 230 } |
226 | 231 |
227 /// Returns a dummy [LiveTest] for a test or group marked as "skip". | 232 /// Returns a dummy [LiveTest] for a test or group marked as "skip". |
228 LiveTest _skippedTest(RunnerSuite suite, SuiteEntry entry) { | 233 LiveTest _skippedTest(RunnerSuite suite, GroupEntry entry) { |
229 var test = new LocalTest(entry.name, entry.metadata, () {}); | 234 // The netry name will be `null` for the root group. |
| 235 var test = new LocalTest(entry.name ?? "(suite)", entry.metadata, () {}); |
| 236 |
230 var controller; | 237 var controller; |
231 controller = new LiveTestController(suite, test, () { | 238 controller = new LiveTestController(suite, test, () { |
232 controller.setState(const State(Status.running, Result.success)); | 239 controller.setState(const State(Status.running, Result.success)); |
233 controller.setState(const State(Status.complete, Result.success)); | 240 controller.setState(const State(Status.complete, Result.success)); |
234 controller.completer.complete(); | 241 controller.completer.complete(); |
235 }, () {}); | 242 }, () {}); |
236 return controller.liveTest; | 243 return controller.liveTest; |
237 } | 244 } |
238 | 245 |
239 /// Runs [liveTest]. | 246 /// Runs [liveTest]. |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 | 347 |
341 // Close the running tests first so that we're sure to wait for them to | 348 // Close the running tests first so that we're sure to wait for them to |
342 // finish before we close their suites and cause them to become unloaded. | 349 // finish before we close their suites and cause them to become unloaded. |
343 var allLiveTests = liveTests.toSet()..addAll(_activeLoadTests); | 350 var allLiveTests = liveTests.toSet()..addAll(_activeLoadTests); |
344 await Future.wait(allLiveTests.map((liveTest) => liveTest.close())); | 351 await Future.wait(allLiveTests.map((liveTest) => liveTest.close())); |
345 | 352 |
346 var allSuites = allLiveTests.map((liveTest) => liveTest.suite).toSet(); | 353 var allSuites = allLiveTests.map((liveTest) => liveTest.suite).toSet(); |
347 await Future.wait(allSuites.map((suite) => suite.close())); | 354 await Future.wait(allSuites.map((suite) => suite.close())); |
348 } | 355 } |
349 } | 356 } |
OLD | NEW |