| 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 |  | 
| 18 from pylib import constants | 16 from pylib import constants | 
| 19 from pylib import forwarder | 17 from pylib import forwarder | 
| 20 from pylib import ports | 18 from pylib.utils import test_environment | 
| 21 | 19 | 
| 22 import test_runner | 20 import test_runner | 
| 23 | 21 | 
| 24 | 22 | 
| 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 |  | 
| 49 def Setup(test_options): | 23 def Setup(test_options): | 
| 50   """Create and return the test runner factory and tests. | 24   """Create and return the test runner factory and tests. | 
| 51 | 25 | 
| 52   Args: | 26   Args: | 
| 53     test_options: A PerformanceOptions object. | 27     test_options: A PerformanceOptions object. | 
| 54 | 28 | 
| 55   Returns: | 29   Returns: | 
| 56     A tuple of (TestRunnerFactory, tests). | 30     A tuple of (TestRunnerFactory, tests). | 
| 57   """ | 31   """ | 
| 58   # TODO(bulach): remove this once the bot side lands. BUG=318369 | 32   # TODO(bulach): remove this once the bot side lands. BUG=318369 | 
| 59   constants.SetBuildType('Release') | 33   constants.SetBuildType('Release') | 
| 60   if os.path.exists(constants.PERF_OUTPUT_DIR): | 34   if os.path.exists(constants.PERF_OUTPUT_DIR): | 
| 61     shutil.rmtree(constants.PERF_OUTPUT_DIR) | 35     shutil.rmtree(constants.PERF_OUTPUT_DIR) | 
| 62   os.makedirs(constants.PERF_OUTPUT_DIR) | 36   os.makedirs(constants.PERF_OUTPUT_DIR) | 
| 63 | 37 | 
| 64   # Before running the tests, kill any leftover server. | 38   # Before running the tests, kill any leftover server. | 
| 65   _KillPendingServers() | 39   test_environment.CleanupLeftoverProcesses() | 
|  | 40   forwarder.Forwarder.UseMultiprocessing() | 
| 66 | 41 | 
| 67   if test_options.single_step: | 42   if test_options.single_step: | 
| 68     # Running a single command, build the tests structure. | 43     # Running a single command, build the tests structure. | 
| 69     tests = [['single_step', test_options.single_step]] | 44     tests = [['single_step', test_options.single_step]] | 
| 70 | 45 | 
| 71   if test_options.steps: | 46   if test_options.steps: | 
| 72     with file(test_options.steps, 'r') as f: | 47     with file(test_options.steps, 'r') as f: | 
| 73       tests = json.load(f) | 48       tests = json.load(f) | 
| 74 | 49 | 
| 75   # The list is necessary to keep the steps order, but internally | 50   # The list is necessary to keep the steps order, but internally | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 87   flaky_steps = [] | 62   flaky_steps = [] | 
| 88   if test_options.flaky_steps: | 63   if test_options.flaky_steps: | 
| 89     with file(test_options.flaky_steps, 'r') as f: | 64     with file(test_options.flaky_steps, 'r') as f: | 
| 90       flaky_steps = json.load(f) | 65       flaky_steps = json.load(f) | 
| 91 | 66 | 
| 92   def TestRunnerFactory(device, shard_index): | 67   def TestRunnerFactory(device, shard_index): | 
| 93     return test_runner.TestRunner( | 68     return test_runner.TestRunner( | 
| 94         test_options, device, tests_dict, flaky_steps) | 69         test_options, device, tests_dict, flaky_steps) | 
| 95 | 70 | 
| 96   return (TestRunnerFactory, sorted_test_names) | 71   return (TestRunnerFactory, sorted_test_names) | 
| OLD | NEW | 
|---|