| OLD | NEW |
| (Empty) |
| 1 # Copyright 2013 The Chromium Authors. All rights reserved. | |
| 2 # Use of this source code is governed by a BSD-style license that can be | |
| 3 # found in the LICENSE file. | |
| 4 | |
| 5 """Generates test runner factory and tests for performance tests.""" | |
| 6 | |
| 7 import json | |
| 8 import fnmatch | |
| 9 import logging | |
| 10 import os | |
| 11 import shutil | |
| 12 | |
| 13 from pylib import constants | |
| 14 from pylib import forwarder | |
| 15 from pylib.device import device_list | |
| 16 from pylib.device import device_utils | |
| 17 from pylib.perf import test_runner | |
| 18 from pylib.utils import test_environment | |
| 19 | |
| 20 | |
| 21 def _GetAllDevices(): | |
| 22 devices_path = os.path.join(os.environ.get('CHROMIUM_OUT_DIR', 'out'), | |
| 23 device_list.LAST_DEVICES_FILENAME) | |
| 24 try: | |
| 25 devices = [device_utils.DeviceUtils(s) | |
| 26 for s in device_list.GetPersistentDeviceList(devices_path)] | |
| 27 except IOError as e: | |
| 28 logging.error('Unable to find %s [%s]', devices_path, e) | |
| 29 devices = device_utils.DeviceUtils.HealthyDevices() | |
| 30 return sorted(devices) | |
| 31 | |
| 32 | |
| 33 def _GetStepsDictFromSingleStep(test_options): | |
| 34 # Running a single command, build the tests structure. | |
| 35 steps_dict = { | |
| 36 'version': 1, | |
| 37 'steps': { | |
| 38 'single_step': { | |
| 39 'device_affinity': 0, | |
| 40 'cmd': test_options.single_step | |
| 41 }, | |
| 42 } | |
| 43 } | |
| 44 return steps_dict | |
| 45 | |
| 46 | |
| 47 def _GetStepsDict(test_options): | |
| 48 if test_options.single_step: | |
| 49 return _GetStepsDictFromSingleStep(test_options) | |
| 50 if test_options.steps: | |
| 51 with file(test_options.steps, 'r') as f: | |
| 52 steps = json.load(f) | |
| 53 | |
| 54 # Already using the new format. | |
| 55 assert steps['version'] == 1 | |
| 56 return steps | |
| 57 | |
| 58 | |
| 59 def Setup(test_options): | |
| 60 """Create and return the test runner factory and tests. | |
| 61 | |
| 62 Args: | |
| 63 test_options: A PerformanceOptions object. | |
| 64 | |
| 65 Returns: | |
| 66 A tuple of (TestRunnerFactory, tests, devices). | |
| 67 """ | |
| 68 # TODO(bulach): remove this once the bot side lands. BUG=318369 | |
| 69 constants.SetBuildType('Release') | |
| 70 if os.path.exists(constants.PERF_OUTPUT_DIR): | |
| 71 shutil.rmtree(constants.PERF_OUTPUT_DIR) | |
| 72 os.makedirs(constants.PERF_OUTPUT_DIR) | |
| 73 | |
| 74 # Before running the tests, kill any leftover server. | |
| 75 test_environment.CleanupLeftoverProcesses() | |
| 76 | |
| 77 # We want to keep device affinity, so return all devices ever seen. | |
| 78 all_devices = _GetAllDevices() | |
| 79 | |
| 80 steps_dict = _GetStepsDict(test_options) | |
| 81 sorted_step_names = sorted(steps_dict['steps'].keys()) | |
| 82 | |
| 83 if test_options.test_filter: | |
| 84 sorted_step_names = fnmatch.filter(sorted_step_names, | |
| 85 test_options.test_filter) | |
| 86 | |
| 87 flaky_steps = [] | |
| 88 if test_options.flaky_steps: | |
| 89 with file(test_options.flaky_steps, 'r') as f: | |
| 90 flaky_steps = json.load(f) | |
| 91 | |
| 92 def TestRunnerFactory(device, shard_index): | |
| 93 return test_runner.TestRunner( | |
| 94 test_options, device, shard_index, len(all_devices), | |
| 95 steps_dict, flaky_steps) | |
| 96 | |
| 97 return (TestRunnerFactory, sorted_step_names, all_devices) | |
| OLD | NEW |