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 import 'dart:async'; | 5 import 'dart:async'; |
6 import 'dart:collection'; | 6 import 'dart:collection'; |
7 | 7 |
8 import 'package:async/async.dart' hide Result; | 8 import 'package:async/async.dart' hide Result; |
9 import 'package:collection/collection.dart'; | 9 import 'package:collection/collection.dart'; |
10 import 'package:pool/pool.dart'; | 10 import 'package:pool/pool.dart'; |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 final _skipped = new Set<LiveTest>(); | 140 final _skipped = new Set<LiveTest>(); |
141 | 141 |
142 /// The set of tests that have completed and been marked as failing or error. | 142 /// The set of tests that have completed and been marked as failing or error. |
143 Set<LiveTest> get failed => new UnmodifiableSetView(_failed); | 143 Set<LiveTest> get failed => new UnmodifiableSetView(_failed); |
144 final _failed = new Set<LiveTest>(); | 144 final _failed = new Set<LiveTest>(); |
145 | 145 |
146 /// The tests that are still running, in the order they begain running. | 146 /// The tests that are still running, in the order they begain running. |
147 List<LiveTest> get active => new UnmodifiableListView(_active); | 147 List<LiveTest> get active => new UnmodifiableListView(_active); |
148 final _active = new QueueList<LiveTest>(); | 148 final _active = new QueueList<LiveTest>(); |
149 | 149 |
150 /// The set of tests that have completed successfully but shouldn't be | |
151 /// displayed by the reporter. | |
152 /// | |
153 /// This includes load tests, `setUpAll`, and `tearDownAll`. | |
154 final _hidden = new Set<LiveTest>(); | |
155 | |
156 /// The set of tests that have been marked for restarting. | 150 /// The set of tests that have been marked for restarting. |
157 /// | 151 /// |
158 /// This is always a subset of [active]. Once a test in here has finished | 152 /// This is always a subset of [active]. Once a test in here has finished |
159 /// running, it's run again. | 153 /// running, it's run again. |
160 final _restarted = new Set<LiveTest>(); | 154 final _restarted = new Set<LiveTest>(); |
161 | 155 |
162 /// The tests from [LoadSuite]s that are still running, in the order they | 156 /// The tests from [LoadSuite]s that are still running, in the order they |
163 /// began running. | 157 /// began running. |
164 /// | 158 /// |
165 /// This is separate from [active] because load tests aren't always surfaced. | 159 /// This is separate from [active] because load tests aren't always surfaced. |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
332 | 326 |
333 if (state.result != Result.success) { | 327 if (state.result != Result.success) { |
334 _passed.remove(liveTest); | 328 _passed.remove(liveTest); |
335 _failed.add(liveTest); | 329 _failed.add(liveTest); |
336 } else if (liveTest.test.metadata.skip) { | 330 } else if (liveTest.test.metadata.skip) { |
337 _skipped.add(liveTest); | 331 _skipped.add(liveTest); |
338 } else if (countSuccess) { | 332 } else if (countSuccess) { |
339 _passed.add(liveTest); | 333 _passed.add(liveTest); |
340 } else { | 334 } else { |
341 _liveTests.remove(liveTest); | 335 _liveTests.remove(liveTest); |
342 _hidden.add(liveTest); | |
343 } | 336 } |
344 }); | 337 }); |
345 | 338 |
346 _onTestStartedController.add(liveTest); | 339 _onTestStartedController.add(liveTest); |
347 | 340 |
348 // First, schedule a microtask to ensure that [onTestStarted] fires before | 341 // First, schedule a microtask to ensure that [onTestStarted] fires before |
349 // the first [LiveTest.onStateChange] event. Once the test finishes, use | 342 // the first [LiveTest.onStateChange] event. Once the test finishes, use |
350 // [new Future] to do a coarse-grained event loop pump to avoid starving | 343 // [new Future] to do a coarse-grained event loop pump to avoid starving |
351 // non-microtask events. | 344 // non-microtask events. |
352 await new Future.microtask(liveTest.run); | 345 await new Future.microtask(liveTest.run); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
401 _active.remove(liveTest); | 394 _active.remove(liveTest); |
402 _liveTests.remove(liveTest); | 395 _liveTests.remove(liveTest); |
403 | 396 |
404 if (_activeLoadTests.isNotEmpty) { | 397 if (_activeLoadTests.isNotEmpty) { |
405 _active.add(_activeLoadTests.last); | 398 _active.add(_activeLoadTests.last); |
406 _liveTests.add(_activeLoadTests.last); | 399 _liveTests.add(_activeLoadTests.last); |
407 } | 400 } |
408 } | 401 } |
409 | 402 |
410 // Surface the load test if it fails so that the user can see the failure. | 403 // Surface the load test if it fails so that the user can see the failure. |
411 if (state.result == Result.success) { | 404 if (state.result == Result.success) return; |
412 _hidden.add(liveTest); | 405 _failed.add(liveTest); |
413 } else { | 406 _liveTests.add(liveTest); |
414 _failed.add(liveTest); | |
415 _liveTests.add(liveTest); | |
416 } | |
417 }); | 407 }); |
418 | 408 |
419 // Run the test immediately. We don't want loading to be blocked on suites | 409 // Run the test immediately. We don't want loading to be blocked on suites |
420 // that are already running. | 410 // that are already running. |
421 _onTestStartedController.add(liveTest); | 411 _onTestStartedController.add(liveTest); |
422 await liveTest.run(); | 412 await liveTest.run(); |
423 | 413 |
424 return suite.suite; | 414 return suite.suite; |
425 } | 415 } |
426 | 416 |
427 /// Signals that the caller is done paying attention to test results and the | 417 /// Signals that the caller is done paying attention to test results and the |
428 /// engine should release any resources it has allocated. | 418 /// engine should release any resources it has allocated. |
429 /// | 419 /// |
430 /// Any actively-running tests are also closed. VM tests are allowed to finish | 420 /// Any actively-running tests are also closed. VM tests are allowed to finish |
431 /// running so that any modifications they've made to the filesystem can be | 421 /// running so that any modifications they've made to the filesystem can be |
432 /// cleaned up. | 422 /// cleaned up. |
433 /// | 423 /// |
434 /// **Note that closing the engine is not the same as closing [suiteSink].** | 424 /// **Note that closing the engine is not the same as closing [suiteSink].** |
435 /// Closing [suiteSink] indicates that no more input will be provided, closing | 425 /// Closing [suiteSink] indicates that no more input will be provided, closing |
436 /// the engine indicates that no more output should be emitted. | 426 /// the engine indicates that no more output should be emitted. |
437 Future close() async { | 427 Future close() async { |
438 _closed = true; | 428 _closed = true; |
439 if (_closedBeforeDone != null) _closedBeforeDone = true; | 429 if (_closedBeforeDone != null) _closedBeforeDone = true; |
440 _onSuiteAddedController.close(); | 430 _onSuiteAddedController.close(); |
441 _suiteController.close(); | 431 _suiteController.close(); |
442 | 432 |
443 // Close the running tests first so that we're sure to wait for them to | 433 // Close the running tests first so that we're sure to wait for them to |
444 // finish before we close their suites and cause them to become unloaded. | 434 // finish before we close their suites and cause them to become unloaded. |
445 var allLiveTests = liveTests.toSet() | 435 var allLiveTests = liveTests.toSet()..addAll(_activeLoadTests); |
446 ..addAll(_activeLoadTests) | |
447 ..addAll(_hidden); | |
448 var futures = allLiveTests.map((liveTest) => liveTest.close()).toList(); | 436 var futures = allLiveTests.map((liveTest) => liveTest.close()).toList(); |
449 | 437 |
450 // Closing the load pool will close the test suites as soon as their tests | 438 // Closing the load pool will close the test suites as soon as their tests |
451 // are done. For browser suites this is effectively immediate since their | 439 // are done. For browser suites this is effectively immediate since their |
452 // tests shut down as soon as they're closed, but for VM suites we may need | 440 // tests shut down as soon as they're closed, but for VM suites we may need |
453 // to wait for tearDowns or tearDownAlls to run. | 441 // to wait for tearDowns or tearDownAlls to run. |
454 futures.add(_loadPool.close()); | 442 futures.add(_loadPool.close()); |
455 await Future.wait(futures, eagerError: true); | 443 await Future.wait(futures, eagerError: true); |
456 } | 444 } |
457 } | 445 } |
OLD | NEW |