mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
98 lines
2.8 KiB
Python
98 lines
2.8 KiB
Python
# 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 fnmatch
|
|
import logging
|
|
import os
|
|
import shutil
|
|
|
|
from pylib import constants
|
|
from pylib import forwarder
|
|
from pylib.device import device_list
|
|
from pylib.device import device_utils
|
|
from pylib.perf import test_runner
|
|
from pylib.utils import test_environment
|
|
|
|
|
|
def _GetAllDevices():
|
|
devices_path = os.path.join(os.environ.get('CHROMIUM_OUT_DIR', 'out'),
|
|
device_list.LAST_DEVICES_FILENAME)
|
|
try:
|
|
devices = [device_utils.DeviceUtils(s)
|
|
for s in device_list.GetPersistentDeviceList(devices_path)]
|
|
except IOError as e:
|
|
logging.error('Unable to find %s [%s]', devices_path, e)
|
|
devices = device_utils.DeviceUtils.HealthyDevices()
|
|
return sorted(devices)
|
|
|
|
|
|
def _GetStepsDictFromSingleStep(test_options):
|
|
# Running a single command, build the tests structure.
|
|
steps_dict = {
|
|
'version': 1,
|
|
'steps': {
|
|
'single_step': {
|
|
'device_affinity': 0,
|
|
'cmd': test_options.single_step
|
|
},
|
|
}
|
|
}
|
|
return steps_dict
|
|
|
|
|
|
def _GetStepsDict(test_options):
|
|
if test_options.single_step:
|
|
return _GetStepsDictFromSingleStep(test_options)
|
|
if test_options.steps:
|
|
with file(test_options.steps, 'r') as f:
|
|
steps = json.load(f)
|
|
|
|
# Already using the new format.
|
|
assert steps['version'] == 1
|
|
return steps
|
|
|
|
|
|
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, devices).
|
|
"""
|
|
# TODO(bulach): remove this once the bot side lands. BUG=318369
|
|
constants.SetBuildType('Release')
|
|
if os.path.exists(constants.PERF_OUTPUT_DIR):
|
|
shutil.rmtree(constants.PERF_OUTPUT_DIR)
|
|
os.makedirs(constants.PERF_OUTPUT_DIR)
|
|
|
|
# Before running the tests, kill any leftover server.
|
|
test_environment.CleanupLeftoverProcesses()
|
|
|
|
# We want to keep device affinity, so return all devices ever seen.
|
|
all_devices = _GetAllDevices()
|
|
|
|
steps_dict = _GetStepsDict(test_options)
|
|
sorted_step_names = sorted(steps_dict['steps'].keys())
|
|
|
|
if test_options.test_filter:
|
|
sorted_step_names = fnmatch.filter(sorted_step_names,
|
|
test_options.test_filter)
|
|
|
|
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, shard_index, len(all_devices),
|
|
steps_dict, flaky_steps)
|
|
|
|
return (TestRunnerFactory, sorted_step_names, all_devices)
|