Home | History | Annotate | Download | only in perf
      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
      3 # found in the LICENSE file.
      4 
      5 """Generates test runner factory and tests for performance tests."""
      6 
      7 import json
      8 import fnmatch
      9 import logging
     10 import os
     11 import shutil
     12 
     13 from pylib import android_commands
     14 from pylib import constants
     15 from pylib import forwarder
     16 from pylib.device import device_list
     17 from pylib.perf import test_runner
     18 from pylib.utils import test_environment
     19 
     20 
     21 def _GetAllDevices():
     22   devices_path = os.path.join(os.environ.get('CHROMIUM_OUT_DIR', 'out'),
     23                               device_list.LAST_DEVICES_FILENAME)
     24   try:
     25     devices = device_list.GetPersistentDeviceList(devices_path)
     26   except IOError as e:
     27     logging.error('Unable to find %s [%s]', devices_path, e)
     28     devices = android_commands.GetAttachedDevices()
     29   return sorted(devices)
     30 
     31 
     32 def _GetStepsDictFromSingleStep(test_options):
     33   # Running a single command, build the tests structure.
     34   steps_dict = {
     35     'version': 1,
     36     'steps': {
     37         'single_step': {
     38           'device_affinity': 0,
     39           'cmd': test_options.single_step
     40         },
     41     }
     42   }
     43   return steps_dict
     44 
     45 
     46 def _GetStepsDict(test_options):
     47   if test_options.single_step:
     48     return _GetStepsDictFromSingleStep(test_options)
     49   if test_options.steps:
     50     with file(test_options.steps, 'r') as f:
     51       steps = json.load(f)
     52 
     53       # Already using the new format.
     54       assert steps['version'] == 1
     55       return steps
     56 
     57 
     58 def Setup(test_options):
     59   """Create and return the test runner factory and tests.
     60 
     61   Args:
     62     test_options: A PerformanceOptions object.
     63 
     64   Returns:
     65     A tuple of (TestRunnerFactory, tests, devices).
     66   """
     67   # TODO(bulach): remove this once the bot side lands. BUG=318369
     68   constants.SetBuildType('Release')
     69   if os.path.exists(constants.PERF_OUTPUT_DIR):
     70     shutil.rmtree(constants.PERF_OUTPUT_DIR)
     71   os.makedirs(constants.PERF_OUTPUT_DIR)
     72 
     73   # Before running the tests, kill any leftover server.
     74   test_environment.CleanupLeftoverProcesses()
     75   forwarder.Forwarder.UseMultiprocessing()
     76 
     77   # We want to keep device affinity, so return all devices ever seen.
     78   all_devices = _GetAllDevices()
     79 
     80   steps_dict = _GetStepsDict(test_options)
     81   sorted_step_names = sorted(steps_dict['steps'].keys())
     82 
     83   if test_options.test_filter:
     84     sorted_step_names = fnmatch.filter(sorted_step_names,
     85                                        test_options.test_filter)
     86 
     87   flaky_steps = []
     88   if test_options.flaky_steps:
     89     with file(test_options.flaky_steps, 'r') as f:
     90       flaky_steps = json.load(f)
     91 
     92   def TestRunnerFactory(device, shard_index):
     93     return test_runner.TestRunner(
     94         test_options, device, shard_index, len(all_devices),
     95         steps_dict, flaky_steps)
     96 
     97   return (TestRunnerFactory, sorted_step_names, all_devices)
     98