OLD | NEW |
1 # Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 """Generates test runner factory and tests for performance tests.""" | 5 """Generates test runner factory and tests for performance tests.""" |
6 | 6 |
7 import json | 7 import json |
8 import fnmatch | 8 import fnmatch |
9 import logging | 9 import logging |
10 import os | 10 import os |
11 import psutil | 11 import psutil |
12 import signal | 12 import signal |
13 import shutil | 13 import shutil |
14 import time | 14 import time |
15 | 15 |
| 16 from pylib import android_commands |
| 17 from pylib import cmd_helper |
16 from pylib import constants | 18 from pylib import constants |
17 from pylib import forwarder | 19 from pylib import forwarder |
18 from pylib.utils import test_environment | 20 from pylib import ports |
19 | 21 |
20 import test_runner | 22 import test_runner |
21 | 23 |
22 | 24 |
| 25 def _KillPendingServers(): |
| 26 for retry in range(5): |
| 27 for server in ['lighttpd', 'web-page-replay']: |
| 28 pids = [p.pid for p in psutil.process_iter() if server in p.name] |
| 29 for pid in pids: |
| 30 try: |
| 31 logging.warning('Killing %s %s', server, pid) |
| 32 os.kill(pid, signal.SIGQUIT) |
| 33 except Exception as e: |
| 34 logging.warning('Failed killing %s %s %s', server, pid, e) |
| 35 # Restart the adb server with taskset to set a single CPU affinity. |
| 36 cmd_helper.RunCmd([constants.ADB_PATH, 'kill-server']) |
| 37 cmd_helper.RunCmd(['taskset', '-c', '0', constants.ADB_PATH, 'start-server']) |
| 38 cmd_helper.RunCmd(['taskset', '-c', '0', constants.ADB_PATH, 'root']) |
| 39 i = 1 |
| 40 while not android_commands.GetAttachedDevices(): |
| 41 time.sleep(i) |
| 42 i *= 2 |
| 43 if i > 10: |
| 44 break |
| 45 |
| 46 forwarder.Forwarder.UseMultiprocessing() |
| 47 |
| 48 |
23 def Setup(test_options): | 49 def Setup(test_options): |
24 """Create and return the test runner factory and tests. | 50 """Create and return the test runner factory and tests. |
25 | 51 |
26 Args: | 52 Args: |
27 test_options: A PerformanceOptions object. | 53 test_options: A PerformanceOptions object. |
28 | 54 |
29 Returns: | 55 Returns: |
30 A tuple of (TestRunnerFactory, tests). | 56 A tuple of (TestRunnerFactory, tests). |
31 """ | 57 """ |
32 # TODO(bulach): remove this once the bot side lands. BUG=318369 | 58 # TODO(bulach): remove this once the bot side lands. BUG=318369 |
33 constants.SetBuildType('Release') | 59 constants.SetBuildType('Release') |
34 if os.path.exists(constants.PERF_OUTPUT_DIR): | 60 if os.path.exists(constants.PERF_OUTPUT_DIR): |
35 shutil.rmtree(constants.PERF_OUTPUT_DIR) | 61 shutil.rmtree(constants.PERF_OUTPUT_DIR) |
36 os.makedirs(constants.PERF_OUTPUT_DIR) | 62 os.makedirs(constants.PERF_OUTPUT_DIR) |
37 | 63 |
38 # Before running the tests, kill any leftover server. | 64 # Before running the tests, kill any leftover server. |
39 test_environment.CleanupLeftoverProcesses() | 65 _KillPendingServers() |
40 forwarder.Forwarder.UseMultiprocessing() | |
41 | 66 |
42 if test_options.single_step: | 67 if test_options.single_step: |
43 # Running a single command, build the tests structure. | 68 # Running a single command, build the tests structure. |
44 tests = [['single_step', test_options.single_step]] | 69 tests = [['single_step', test_options.single_step]] |
45 | 70 |
46 if test_options.steps: | 71 if test_options.steps: |
47 with file(test_options.steps, 'r') as f: | 72 with file(test_options.steps, 'r') as f: |
48 tests = json.load(f) | 73 tests = json.load(f) |
49 | 74 |
50 # The list is necessary to keep the steps order, but internally | 75 # The list is necessary to keep the steps order, but internally |
(...skipping 11 matching lines...) Expand all Loading... |
62 flaky_steps = [] | 87 flaky_steps = [] |
63 if test_options.flaky_steps: | 88 if test_options.flaky_steps: |
64 with file(test_options.flaky_steps, 'r') as f: | 89 with file(test_options.flaky_steps, 'r') as f: |
65 flaky_steps = json.load(f) | 90 flaky_steps = json.load(f) |
66 | 91 |
67 def TestRunnerFactory(device, shard_index): | 92 def TestRunnerFactory(device, shard_index): |
68 return test_runner.TestRunner( | 93 return test_runner.TestRunner( |
69 test_options, device, tests_dict, flaky_steps) | 94 test_options, device, tests_dict, flaky_steps) |
70 | 95 |
71 return (TestRunnerFactory, sorted_test_names) | 96 return (TestRunnerFactory, sorted_test_names) |
OLD | NEW |