Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # -*- coding: utf-8 -*- | 1 # -*- coding: utf-8 -*- |
| 2 # Copyright 2014 The Chromium Authors. All rights reserved. | 2 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """This file allows the bots to be easily configure and run the tests. | 6 """This file allows the bots to be easily configure and run the tests. |
|
engedy
2015/03/04 13:20:30
nit: configured
vabr (Chromium)
2015/03/04 13:25:34
Done.
| |
| 7 | 7 |
| 8 Running this script requires passing --config-path with a path to a config file | 8 Running this script requires passing --config-path with a path to a config file |
| 9 of the following structure: | 9 of the following structure: |
|
engedy
2015/03/04 13:20:31
nit: Add newline here.
vabr (Chromium)
2015/03/04 13:25:34
Done.
| |
| 10 [data_files] | 10 [data_files] |
| 11 passwords_path=<path to a file with passwords> | 11 passwords_path=<path to a file with passwords> |
| 12 [binaries] | 12 [binaries] |
| 13 chrome-path=<chrome binary path> | 13 chrome-path=<chrome binary path> |
| 14 chromedriver-path=<chrome driver path> | 14 chromedriver-path=<chrome driver path> |
| 15 [run_options] | 15 [run_options] |
| 16 # |write_to_sheet| is optional, the default value is false. | |
| 16 write_to_sheet=[false|true] | 17 write_to_sheet=[false|true] |
| 17 tests_in_parrallel=<number of parallel tests> | 18 # |tests_in_parallel| is optional, the default value is 1. |
| 19 tests_in_parallel=<number of parallel tests> | |
| 18 # |tests_to_runs| field is optional, if it is absent all tests will be run. | 20 # |tests_to_runs| field is optional, if it is absent all tests will be run. |
| 19 tests_to_run=<test names to run, comma delimited> | 21 tests_to_run=<test names to run, comma delimited> |
| 20 [output] | 22 [output] |
| 23 # |save-path| is optional, the default value is /dev/null. | |
| 21 save-path=<file where to save result> | 24 save-path=<file where to save result> |
| 22 [sheet_info] | 25 [sheet_info] |
| 23 # This section is required only when write_to_sheet=true | 26 # This section is required only when write_to_sheet=true |
| 24 pkey=full_path | 27 pkey=full_path |
| 25 client_email=email_assigned_by_google_dev_console | 28 client_email=email_assigned_by_google_dev_console |
| 26 sheet_key=sheet_key_from_sheet_url | 29 sheet_key=sheet_key_from_sheet_url |
| 27 """ | 30 """ |
| 28 from datetime import datetime | 31 from datetime import datetime |
| 29 import ConfigParser | 32 import ConfigParser |
| 30 import sys | 33 import sys |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 170 except Exception: | 173 except Exception: |
| 171 pass | 174 pass |
| 172 try: | 175 try: |
| 173 shutil.rmtree(self.profile_path) | 176 shutil.rmtree(self.profile_path) |
| 174 except Exception: | 177 except Exception: |
| 175 pass | 178 pass |
| 176 self.max_test_runs_left -= 1 | 179 self.max_test_runs_left -= 1 |
| 177 print "Run of test %s started" % self.test_name | 180 print "Run of test %s started" % self.test_name |
| 178 self.runner_process = subprocess.Popen(self.test_cmd) | 181 self.runner_process = subprocess.Popen(self.test_cmd) |
| 179 | 182 |
| 183 def _apply_defaults(config, defaults): | |
| 184 """Adds default values from |defaults| to |config|. | |
| 185 | |
| 186 Note: This differs from ConfigParser's mechanism for providing defaults in | |
| 187 two points: | |
|
engedy
2015/03/04 13:20:31
nit: s/points/aspects/
vabr (Chromium)
2015/03/04 13:25:34
Done.
| |
| 188 * The "defaults" here become explicit, and are associated with sections. | |
| 189 * Sections get created for the added defaults where needed, they need not | |
|
engedy
2015/03/04 13:20:31
nit: ..., that is, if
vabr (Chromium)
2015/03/04 13:25:34
Done.
| |
| 190 exist before. | |
| 191 | |
| 192 Args: | |
| 193 config: A ConfigParser instance to be updated | |
| 194 defaults: A dictionary with keys (section_string, option_string) and | |
|
engedy
2015/03/04 13:20:30
Phrasing suggestion: A dictionary mapping (section
vabr (Chromium)
2015/03/04 13:25:34
Done.
| |
| 195 string values. For every section/option combination not already | |
| 196 contained in |config|, the value from |defaults| is stored in |config|. | |
| 197 """ | |
| 198 for (section, option) in defaults: | |
| 199 if not config.has_section(section): | |
| 200 config.add_section(section) | |
| 201 if not config.has_option(section, option): | |
| 202 config.set(section, option, defaults[(section, option)]) | |
| 203 | |
| 180 def run_tests(config_path): | 204 def run_tests(config_path): |
| 181 """ Runs automated tests. """ | 205 """ Runs automated tests. """ |
| 182 environment = Environment("", "", "", None, False) | 206 environment = Environment("", "", "", None, False) |
| 183 tests.Tests(environment) | 207 tests.Tests(environment) |
| 208 defaults = { ("output", "save-path"): "/dev/null", | |
| 209 ("run_options", "tests_in_parallel"): "1", | |
| 210 ("run_options", "write_to_sheet"): "false" } | |
| 184 config = ConfigParser.ConfigParser() | 211 config = ConfigParser.ConfigParser() |
| 212 _apply_defaults(config, defaults) | |
| 185 config.read(config_path) | 213 config.read(config_path) |
| 186 date = datetime.now().strftime('%Y-%m-%dT%H:%M:%S') | 214 date = datetime.now().strftime('%Y-%m-%dT%H:%M:%S') |
| 187 max_tests_in_parrallel = config.getint("run_options", "tests_in_parrallel") | 215 max_tests_in_parallel = config.getint("run_options", "tests_in_parallel") |
| 188 sheet_writer = SheetWriter(config) | 216 sheet_writer = SheetWriter(config) |
| 189 full_path = os.path.realpath(__file__) | 217 full_path = os.path.realpath(__file__) |
| 190 tests_dir = os.path.dirname(full_path) | 218 tests_dir = os.path.dirname(full_path) |
| 191 tests_path = os.path.join(tests_dir, "tests.py") | 219 tests_path = os.path.join(tests_dir, "tests.py") |
| 192 general_test_cmd = ["python", tests_path, "test_name_placeholder", | 220 general_test_cmd = ["python", tests_path, "test_name_placeholder", |
| 193 "--chrome-path", config.get("binaries", "chrome-path"), | 221 "--chrome-path", config.get("binaries", "chrome-path"), |
| 194 "--chromedriver-path", config.get("binaries", "chromedriver-path"), | 222 "--chromedriver-path", config.get("binaries", "chromedriver-path"), |
| 195 "--passwords-path", config.get("data_files", "passwords_path")] | 223 "--passwords-path", config.get("data_files", "passwords_path")] |
| 196 runners = [] | 224 runners = [] |
| 197 tests_to_run = [test.name for test in environment.websitetests] | 225 tests_to_run = [test.name for test in environment.websitetests] |
| 198 if config.has_option("run_options", "tests_to_run"): | 226 if config.has_option("run_options", "tests_to_run"): |
| 199 user_selected_tests = config.get("run_options", "tests_to_run").split(',') | 227 user_selected_tests = config.get("run_options", "tests_to_run").split(',') |
| 200 # TODO((dvadym) Validate the user selected tests are available. | 228 # TODO((dvadym) Validate the user selected tests are available. |
| 201 tests_to_run = list(set(tests_to_run) & set(user_selected_tests)) | 229 tests_to_run = list(set(tests_to_run) & set(user_selected_tests)) |
| 202 | 230 |
| 203 with open(config.get("output", "save-path"), 'w') as savefile: | 231 with open(config.get("output", "save-path"), 'w') as savefile: |
| 204 print "Tests to run %d\nTests: %s" % (len(tests_to_run), tests_to_run) | 232 print "Tests to run %d\nTests: %s" % (len(tests_to_run), tests_to_run) |
| 205 while len(runners) + len(tests_to_run) > 0: | 233 while len(runners) + len(tests_to_run) > 0: |
| 206 i = 0 | 234 i = 0 |
| 207 while i < len(runners): | 235 while i < len(runners): |
| 208 result = runners[i].get_test_result() | 236 result = runners[i].get_test_result() |
| 209 if result: # This test run is finished. | 237 if result: # This test run is finished. |
| 210 status, log = result | 238 status, log = result |
| 211 testinfo = [runners[i].test_name, status, date, " | ".join(log)] | 239 testinfo = [runners[i].test_name, status, date, " | ".join(log)] |
| 212 sheet_writer.write_line_to_sheet(testinfo) | 240 sheet_writer.write_line_to_sheet(testinfo) |
| 213 print>>savefile, " ".join(testinfo) | 241 print>>savefile, " ".join(testinfo) |
| 214 del runners[i] | 242 del runners[i] |
| 215 else: | 243 else: |
| 216 i += 1 | 244 i += 1 |
| 217 while len(runners) < max_tests_in_parrallel and len(tests_to_run) > 0: | 245 while len(runners) < max_tests_in_parallel and len(tests_to_run) > 0: |
| 218 runners.append(TestRunner(general_test_cmd, tests_to_run.pop())) | 246 runners.append(TestRunner(general_test_cmd, tests_to_run.pop())) |
| 219 time.sleep(1) # Let us wait for worker process to finish. | 247 time.sleep(1) # Let us wait for worker process to finish. |
| 220 | 248 |
| 221 if __name__ == "__main__": | 249 if __name__ == "__main__": |
| 222 if len(sys.argv) != 2: | 250 if len(sys.argv) != 2: |
| 223 print "Synopsis:\n python run_tests.py <config_path>" | 251 print "Synopsis:\n python run_tests.py <config_path>" |
| 224 config_path = sys.argv[1] | 252 config_path = sys.argv[1] |
| 225 run_tests(config_path) | 253 run_tests(config_path) |
| OLD | NEW |