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