setup.py revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved. 23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)# found in the LICENSE file. 43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)"""Generates test runner factory and tests for performance tests.""" 63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import json 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import fnmatch 93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import logging 103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import os 113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import psutil 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import signal 133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import time 143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)from pylib import android_commands 163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)from pylib import cmd_helper 1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)from pylib import constants 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)from pylib import forwarder 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)from pylib import ports 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import test_runner 223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)def _KillPendingServers(): 253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) for retry in range(5): 263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) for server in ['lighttpd', 'web-page-replay']: 273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) pids = [p.pid for p in psutil.process_iter() if server in p.name] 283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) for pid in pids: 293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) try: 303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) logging.warning('Killing %s %s', server, pid) 313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) os.kill(pid, signal.SIGQUIT) 323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) except Exception as e: 333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) logging.warning('Failed killing %s %s %s', server, pid, e) 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) # Restart the adb server with taskset to set a single CPU affinity. 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) cmd_helper.RunCmd(['adb', 'kill-server']) 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) cmd_helper.RunCmd(['taskset', '-c', '0', 'adb', 'start-server']) 373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) cmd_helper.RunCmd(['taskset', '-c', '0', 'adb', 'root']) 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) i = 1 393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) while not android_commands.GetAttachedDevices(): 403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) time.sleep(i) 413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) i *= 2 423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if i > 10: 433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) break 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) # Reset the test port allocation. It's important to do it before starting 453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) # to dispatch any step. 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if not ports.ResetTestServerPortAllocation(): 473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) raise Exception('Failed to reset test server port.') 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) forwarder.Forwarder.UseMultiprocessing() 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)def Setup(test_options): 533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) """Create and return the test runner factory and tests. 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Args: 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) test_options: A PerformanceOptions object. 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Returns: 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) A tuple of (TestRunnerFactory, tests). 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) """ 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if not os.path.exists(constants.PERF_OUTPUT_DIR): 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) os.makedirs(constants.PERF_OUTPUT_DIR) 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) # Before running the tests, kill any leftover server. 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) _KillPendingServers() 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) with file(test_options.steps, 'r') as f: 683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) tests = json.load(f) 693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) # The list is necessary to keep the steps order, but internally 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) # the format is squashed from a list of lists into a single dict: 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) # [["A", "cmd"], ["B", "cmd"]] into {"A": "cmd", "B": "cmd"} 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) sorted_test_names = [i[0] for i in tests] 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) tests_dict = dict(tests) 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if test_options.test_filter: 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) sorted_test_names = fnmatch.filter(sorted_test_names, 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) test_options.test_filter) 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) tests_dict = dict((k, v) for k, v in tests_dict.iteritems() 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if k in sorted_test_names) 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) flaky_steps = [] 833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if test_options.flaky_steps: 843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) with file(test_options.flaky_steps, 'r') as f: 853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) flaky_steps = json.load(f) 863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) def TestRunnerFactory(device, shard_index): 883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return test_runner.TestRunner( 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) test_options, device, tests_dict, flaky_steps) 903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return (TestRunnerFactory, sorted_test_names) 92