| 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; |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 final _skipped = new Set<LiveTest>(); | 125 final _skipped = new Set<LiveTest>(); |
| 126 | 126 |
| 127 /// The set of tests that have completed and been marked as failing or error. | 127 /// The set of tests that have completed and been marked as failing or error. |
| 128 Set<LiveTest> get failed => new UnmodifiableSetView(_failed); | 128 Set<LiveTest> get failed => new UnmodifiableSetView(_failed); |
| 129 final _failed = new Set<LiveTest>(); | 129 final _failed = new Set<LiveTest>(); |
| 130 | 130 |
| 131 /// The tests that are still running, in the order they begain running. | 131 /// The tests that are still running, in the order they begain running. |
| 132 List<LiveTest> get active => new UnmodifiableListView(_active); | 132 List<LiveTest> get active => new UnmodifiableListView(_active); |
| 133 final _active = new QueueList<LiveTest>(); | 133 final _active = new QueueList<LiveTest>(); |
| 134 | 134 |
| 135 /// The set of tests that have completed successfully but shouldn't be |
| 136 /// displayed by the reporter. |
| 137 /// |
| 138 /// This includes load tests, `setUpAll`, and `tearDownAll`. |
| 139 final _hidden = new Set<LiveTest>(); |
| 140 |
| 135 /// The tests from [LoadSuite]s that are still running, in the order they | 141 /// The tests from [LoadSuite]s that are still running, in the order they |
| 136 /// began running. | 142 /// began running. |
| 137 /// | 143 /// |
| 138 /// This is separate from [active] because load tests aren't always surfaced. | 144 /// This is separate from [active] because load tests aren't always surfaced. |
| 139 final _activeLoadTests = new List<LiveTest>(); | 145 final _activeLoadTests = new List<LiveTest>(); |
| 140 | 146 |
| 141 /// Whether this engine is idle—that is, not currently executing a test. | 147 /// Whether this engine is idle—that is, not currently executing a test. |
| 142 bool get isIdle => _group.isIdle; | 148 bool get isIdle => _group.isIdle; |
| 143 | 149 |
| 144 /// A broadcast stream that fires an event whenever [isIdle] switches from | 150 /// A broadcast stream that fires an event whenever [isIdle] switches from |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 | 293 |
| 288 if (state.result != Result.success) { | 294 if (state.result != Result.success) { |
| 289 _passed.remove(liveTest); | 295 _passed.remove(liveTest); |
| 290 _failed.add(liveTest); | 296 _failed.add(liveTest); |
| 291 } else if (liveTest.test.metadata.skip) { | 297 } else if (liveTest.test.metadata.skip) { |
| 292 _skipped.add(liveTest); | 298 _skipped.add(liveTest); |
| 293 } else if (countSuccess) { | 299 } else if (countSuccess) { |
| 294 _passed.add(liveTest); | 300 _passed.add(liveTest); |
| 295 } else { | 301 } else { |
| 296 _liveTests.remove(liveTest); | 302 _liveTests.remove(liveTest); |
| 303 _hidden.add(liveTest); |
| 297 } | 304 } |
| 298 }); | 305 }); |
| 299 | 306 |
| 300 _onTestStartedController.add(liveTest); | 307 _onTestStartedController.add(liveTest); |
| 301 | 308 |
| 302 // First, schedule a microtask to ensure that [onTestStarted] fires before | 309 // First, schedule a microtask to ensure that [onTestStarted] fires before |
| 303 // the first [LiveTest.onStateChange] event. Once the test finishes, use | 310 // the first [LiveTest.onStateChange] event. Once the test finishes, use |
| 304 // [new Future] to do a coarse-grained event loop pump to avoid starving | 311 // [new Future] to do a coarse-grained event loop pump to avoid starving |
| 305 // non-microtask events. | 312 // non-microtask events. |
| 306 await new Future.microtask(liveTest.run); | 313 await new Future.microtask(liveTest.run); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 332 _active.remove(liveTest); | 339 _active.remove(liveTest); |
| 333 _liveTests.remove(liveTest); | 340 _liveTests.remove(liveTest); |
| 334 | 341 |
| 335 if (_activeLoadTests.isNotEmpty) { | 342 if (_activeLoadTests.isNotEmpty) { |
| 336 _active.add(_activeLoadTests.last); | 343 _active.add(_activeLoadTests.last); |
| 337 _liveTests.add(_activeLoadTests.last); | 344 _liveTests.add(_activeLoadTests.last); |
| 338 } | 345 } |
| 339 } | 346 } |
| 340 | 347 |
| 341 // Surface the load test if it fails so that the user can see the failure. | 348 // Surface the load test if it fails so that the user can see the failure. |
| 342 if (state.result == Result.success) return; | 349 if (state.result == Result.success) { |
| 343 _failed.add(liveTest); | 350 _hidden.add(liveTest); |
| 344 _liveTests.add(liveTest); | 351 } else { |
| 352 _failed.add(liveTest); |
| 353 _liveTests.add(liveTest); |
| 354 } |
| 345 }); | 355 }); |
| 346 | 356 |
| 347 // Run the test immediately. We don't want loading to be blocked on suites | 357 // Run the test immediately. We don't want loading to be blocked on suites |
| 348 // that are already running. | 358 // that are already running. |
| 349 _onTestStartedController.add(liveTest); | 359 _onTestStartedController.add(liveTest); |
| 350 await liveTest.run(); | 360 await liveTest.run(); |
| 351 | 361 |
| 352 return suite.suite; | 362 return suite.suite; |
| 353 } | 363 } |
| 354 | 364 |
| 355 /// Signals that the caller is done paying attention to test results and the | 365 /// Signals that the caller is done paying attention to test results and the |
| 356 /// engine should release any resources it has allocated. | 366 /// engine should release any resources it has allocated. |
| 357 /// | 367 /// |
| 358 /// Any actively-running tests are also closed. VM tests are allowed to finish | 368 /// Any actively-running tests are also closed. VM tests are allowed to finish |
| 359 /// running so that any modifications they've made to the filesystem can be | 369 /// running so that any modifications they've made to the filesystem can be |
| 360 /// cleaned up. | 370 /// cleaned up. |
| 361 /// | 371 /// |
| 362 /// **Note that closing the engine is not the same as closing [suiteSink].** | 372 /// **Note that closing the engine is not the same as closing [suiteSink].** |
| 363 /// Closing [suiteSink] indicates that no more input will be provided, closing | 373 /// Closing [suiteSink] indicates that no more input will be provided, closing |
| 364 /// the engine indicates that no more output should be emitted. | 374 /// the engine indicates that no more output should be emitted. |
| 365 Future close() async { | 375 Future close() async { |
| 366 _closed = true; | 376 _closed = true; |
| 367 if (_closedBeforeDone != null) _closedBeforeDone = true; | 377 if (_closedBeforeDone != null) _closedBeforeDone = true; |
| 368 _suiteController.close(); | 378 _suiteController.close(); |
| 369 | 379 |
| 370 // Close the running tests first so that we're sure to wait for them to | 380 // Close the running tests first so that we're sure to wait for them to |
| 371 // finish before we close their suites and cause them to become unloaded. | 381 // finish before we close their suites and cause them to become unloaded. |
| 372 var allLiveTests = liveTests.toSet()..addAll(_activeLoadTests); | 382 var allLiveTests = liveTests.toSet() |
| 383 ..addAll(_activeLoadTests) |
| 384 ..addAll(_hidden); |
| 373 var futures = allLiveTests.map((liveTest) => liveTest.close()).toList(); | 385 var futures = allLiveTests.map((liveTest) => liveTest.close()).toList(); |
| 374 | 386 |
| 375 // Closing the load pool will close the test suites as soon as their tests | 387 // Closing the load pool will close the test suites as soon as their tests |
| 376 // are done. For browser suites this is effectively immediate since their | 388 // are done. For browser suites this is effectively immediate since their |
| 377 // tests shut down as soon as they're closed, but for VM suites we may need | 389 // tests shut down as soon as they're closed, but for VM suites we may need |
| 378 // to wait for tearDowns or tearDownAlls to run. | 390 // to wait for tearDowns or tearDownAlls to run. |
| 379 futures.add(_loadPool.close()); | 391 futures.add(_loadPool.close()); |
| 380 await Future.wait(futures, eagerError: true); | 392 await Future.wait(futures, eagerError: true); |
| 381 } | 393 } |
| 382 } | 394 } |
| OLD | NEW |