| # Copyright 2013 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Generates test runner factory and tests for performance tests.""" |
| |
| import json |
| import logging |
| import os |
| import psutil |
| import signal |
| import time |
| |
| from pylib import android_commands |
| from pylib import cmd_helper |
| from pylib import forwarder |
| from pylib import ports |
| |
| import test_runner |
| |
| |
| def _KillPendingServers(): |
| for retry in range(5): |
| for server in ['lighttpd', 'web-page-replay']: |
| pids = [p.pid for p in psutil.process_iter() if server in p.name] |
| for pid in pids: |
| try: |
| logging.warning('Killing %s %s', server, pid) |
| os.kill(pid, signal.SIGQUIT) |
| except Exception as e: |
| logging.warning('Failed killing %s %s %s', server, pid, e) |
| # Restart the adb server with taskset to set a single CPU affinity. |
| cmd_helper.RunCmd(['adb', 'kill-server']) |
| cmd_helper.RunCmd(['taskset', '-c', '0', 'adb', 'start-server']) |
| cmd_helper.RunCmd(['taskset', '-c', '0', 'adb', 'root']) |
| i = 1 |
| while not android_commands.GetAttachedDevices(): |
| time.sleep(i) |
| i *= 2 |
| if i > 10: |
| break |
| # Reset the test port allocation. It's important to do it before starting |
| # to dispatch any step. |
| if not ports.ResetTestServerPortAllocation(): |
| raise Exception('Failed to reset test server port.') |
| |
| forwarder.Forwarder.UseMultiprocessing() |
| |
| |
| def Setup(test_options): |
| """Create and return the test runner factory and tests. |
| |
| Args: |
| test_options: A PerformanceOptions object. |
| |
| Returns: |
| A tuple of (TestRunnerFactory, tests). |
| """ |
| # Before running the tests, kill any leftover server. |
| _KillPendingServers() |
| |
| with file(test_options.steps, 'r') as f: |
| tests = json.load(f) |
| |
| flaky_steps = [] |
| if test_options.flaky_steps: |
| with file(test_options.flaky_steps, 'r') as f: |
| flaky_steps = json.load(f) |
| |
| def TestRunnerFactory(device, shard_index): |
| return test_runner.TestRunner( |
| test_options, device, tests, flaky_steps) |
| |
| return (TestRunnerFactory, sorted(tests.keys())) |