| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 /** | 5 /** |
| 6 * Classes and methods for executing tests. | 6 * Classes and methods for executing tests. |
| 7 * | 7 * |
| 8 * This module includes: | 8 * This module includes: |
| 9 * - Managing parallel execution of tests, including timeout checks. | 9 * - Managing parallel execution of tests, including timeout checks. |
| 10 * - Evaluating the output of each test as pass/fail/crash/timeout. | 10 * - Evaluating the output of each test as pass/fail/crash/timeout. |
| 11 */ | 11 */ |
| 12 #library("test_runner"); | 12 #library("test_runner"); |
| 13 | 13 |
| 14 #import("dart:io"); | 14 #import("dart:io"); |
| 15 #import("dart:isolate"); | 15 #import("dart:isolate"); |
| 16 #import("status_file_parser.dart"); | 16 #import("status_file_parser.dart"); |
| 17 #import("test_progress.dart"); | 17 #import("test_progress.dart"); |
| 18 #import("test_suite.dart"); | 18 #import("test_suite.dart"); |
| 19 | 19 |
| 20 const int NO_TIMEOUT = 0; | 20 const int NO_TIMEOUT = 0; |
| 21 const int SLOW_TIMEOUT_MULTIPLIER = 4; | 21 const int SLOW_TIMEOUT_MULTIPLIER = 4; |
| 22 | 22 |
| 23 typedef void TestCaseEvent(TestCase testCase); | 23 typedef void TestCaseEvent(TestCase testCase); |
| 24 typedef void ExitCodeEvent(int exitCode); | 24 typedef void ExitCodeEvent(int exitCode); |
| 25 typedef bool EnqueMoreWork(ProcessQueue queue); | 25 typedef bool EnqueueMoreWork(ProcessQueue queue); |
| 26 | 26 |
| 27 /** A command executed as a step in a test case. */ | 27 /** A command executed as a step in a test case. */ |
| 28 class Command { | 28 class Command { |
| 29 /** Path to the executable of this command. */ | 29 /** Path to the executable of this command. */ |
| 30 String executable; | 30 String executable; |
| 31 | 31 |
| 32 /** Command line arguments to the executable. */ | 32 /** Command line arguments to the executable. */ |
| 33 List<String> arguments; | 33 List<String> arguments; |
| 34 | 34 |
| 35 /** The actual command line that will be executed. */ | 35 /** The actual command line that will be executed. */ |
| (...skipping 910 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 946 */ | 946 */ |
| 947 class ProcessQueue { | 947 class ProcessQueue { |
| 948 int _numProcesses = 0; | 948 int _numProcesses = 0; |
| 949 int _activeTestListers = 0; | 949 int _activeTestListers = 0; |
| 950 int _maxProcesses; | 950 int _maxProcesses; |
| 951 | 951 |
| 952 /** The number of tests we allow to actually fail before we stop retrying. */ | 952 /** The number of tests we allow to actually fail before we stop retrying. */ |
| 953 int _MAX_FAILED_NO_RETRY = 4; | 953 int _MAX_FAILED_NO_RETRY = 4; |
| 954 bool _verbose; | 954 bool _verbose; |
| 955 bool _listTests; | 955 bool _listTests; |
| 956 EnqueMoreWork _enqueueMoreWork; | 956 Function _allDone; |
| 957 EnqueueMoreWork _enqueueMoreWork; |
| 957 Queue<TestCase> _tests; | 958 Queue<TestCase> _tests; |
| 958 ProgressIndicator _progress; | 959 ProgressIndicator _progress; |
| 959 | 960 |
| 960 // For dartc/selenium batch processing we keep a list of batch processes. | 961 // For dartc/selenium batch processing we keep a list of batch processes. |
| 961 Map<String, List<BatchRunnerProcess>> _batchProcesses; | 962 Map<String, List<BatchRunnerProcess>> _batchProcesses; |
| 962 | 963 |
| 963 // Cache information about test cases per test suite. For multiple | 964 // Cache information about test cases per test suite. For multiple |
| 964 // configurations there is no need to repeatedly search the file | 965 // configurations there is no need to repeatedly search the file |
| 965 // system, generate tests, and search test files for options. | 966 // system, generate tests, and search test files for options. |
| 966 Map<String, List<TestInformation>> _testCache; | 967 Map<String, List<TestInformation>> _testCache; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 981 bool _startingServer = false; | 982 bool _startingServer = false; |
| 982 | 983 |
| 983 /** True if we find that there is already a selenium jar running. */ | 984 /** True if we find that there is already a selenium jar running. */ |
| 984 bool _seleniumAlreadyRunning = false; | 985 bool _seleniumAlreadyRunning = false; |
| 985 | 986 |
| 986 ProcessQueue(int this._maxProcesses, | 987 ProcessQueue(int this._maxProcesses, |
| 987 String progress, | 988 String progress, |
| 988 Date startTime, | 989 Date startTime, |
| 989 bool printTiming, | 990 bool printTiming, |
| 990 this._enqueueMoreWork, | 991 this._enqueueMoreWork, |
| 992 this._allDone, |
| 991 [bool verbose = false, | 993 [bool verbose = false, |
| 992 bool listTests = false]) | 994 bool listTests = false]) |
| 993 : _verbose = verbose, | 995 : _verbose = verbose, |
| 994 _listTests = listTests, | 996 _listTests = listTests, |
| 995 _tests = new Queue<TestCase>(), | 997 _tests = new Queue<TestCase>(), |
| 996 _progress = new ProgressIndicator.fromName(progress, | 998 _progress = new ProgressIndicator.fromName(progress, |
| 997 startTime, | 999 startTime, |
| 998 printTiming), | 1000 printTiming), |
| 999 _batchProcesses = new Map<String, List<BatchRunnerProcess>>(), | 1001 _batchProcesses = new Map<String, List<BatchRunnerProcess>>(), |
| 1000 _testCache = new Map<String, List<TestInformation>>() { | 1002 _testCache = new Map<String, List<TestInformation>>() { |
| 1001 if (!_enqueueMoreWork(this)) _progress.allDone(); | 1003 _checkDone(); |
| 1002 } | 1004 } |
| 1003 | 1005 |
| 1004 /** | 1006 /** |
| 1005 * Registers a TestSuite so that all of its tests will be run. | 1007 * Registers a TestSuite so that all of its tests will be run. |
| 1006 */ | 1008 */ |
| 1007 void addTestSuite(TestSuite testSuite) { | 1009 void addTestSuite(TestSuite testSuite) { |
| 1008 _activeTestListers++; | 1010 _activeTestListers++; |
| 1009 testSuite.forEachTest(_runTest, _testCache, _testListerDone); | 1011 testSuite.forEachTest(_runTest, _testCache, _testListerDone); |
| 1010 } | 1012 } |
| 1011 | 1013 |
| 1012 void _testListerDone() { | 1014 void _testListerDone() { |
| 1013 _activeTestListers--; | 1015 _activeTestListers--; |
| 1014 _checkDone(); | 1016 _checkDone(); |
| 1015 } | 1017 } |
| 1016 | 1018 |
| 1017 /** | 1019 /** |
| 1018 * Perform any cleanup needed once all tests in a TestSuite have completed | 1020 * Perform any cleanup needed once all tests in a TestSuite have completed |
| 1019 * and notify our progress indicator that we are done. | 1021 * and notify our progress indicator that we are done. |
| 1020 */ | 1022 */ |
| 1021 void _cleanupAndMarkDone() { | 1023 void _cleanupAndMarkDone() { |
| 1024 // _progress.allDone() exits the process, so we have to call the |
| 1025 // _allDone callback before. |
| 1026 _allDone(); |
| 1022 if (browserUsed != '' && _seleniumServer != null) { | 1027 if (browserUsed != '' && _seleniumServer != null) { |
| 1023 _seleniumServer.kill(); | 1028 _seleniumServer.kill(); |
| 1024 } else { | 1029 } else { |
| 1025 _progress.allDone(); | 1030 _progress.allDone(); |
| 1026 } | 1031 } |
| 1027 } | 1032 } |
| 1028 | 1033 |
| 1029 void _checkDone() { | 1034 void _checkDone() { |
| 1030 // When there are no more active test listers ask for more work | 1035 // When there are no more active test listers ask for more work |
| 1031 // from process queue users. | 1036 // from process queue users. |
| 1032 if (_activeTestListers == 0 && !_enqueueMoreWork(this)) { | 1037 if (_activeTestListers == 0) { |
| 1038 _enqueueMoreWork(this); |
| 1039 } |
| 1040 // If there is still no work, we are done. |
| 1041 if (_activeTestListers == 0) { |
| 1033 _progress.allTestsKnown(); | 1042 _progress.allTestsKnown(); |
| 1034 if (_tests.isEmpty() && _numProcesses == 0) { | 1043 if (_tests.isEmpty() && _numProcesses == 0) { |
| 1035 _terminateBatchRunners(); | 1044 _terminateBatchRunners(); |
| 1036 _cleanupAndMarkDone(); | 1045 _cleanupAndMarkDone(); |
| 1037 } | 1046 } |
| 1038 } | 1047 } |
| 1039 } | 1048 } |
| 1040 | 1049 |
| 1041 /** | 1050 /** |
| 1042 * True if we are using a browser + platform combination that needs the | 1051 * True if we are using a browser + platform combination that needs the |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1236 // the developer doesn't waste his or her time trying to fix a bunch of | 1245 // the developer doesn't waste his or her time trying to fix a bunch of |
| 1237 // tests that appear to be broken but were actually just flakes that | 1246 // tests that appear to be broken but were actually just flakes that |
| 1238 // didn't get retried because there had already been one failure. | 1247 // didn't get retried because there had already been one failure. |
| 1239 bool allowRetry = _MAX_FAILED_NO_RETRY > _progress.numFailedTests; | 1248 bool allowRetry = _MAX_FAILED_NO_RETRY > _progress.numFailedTests; |
| 1240 new RunningProcess(test, allowRetry, this).start(); | 1249 new RunningProcess(test, allowRetry, this).start(); |
| 1241 } | 1250 } |
| 1242 _numProcesses++; | 1251 _numProcesses++; |
| 1243 } | 1252 } |
| 1244 } | 1253 } |
| 1245 } | 1254 } |
| OLD | NEW |