import argparse import collections import contextlib import functools import json import logging import os import sys import time import urllib import yaml BenchmarkMeta = collections.namedtuple('BenchmarkMeta', ( 'description', 'owners', 'timeout', 'enabled', 'disable_reason', )) ALL_BENCHMARKS = {} def benchmark(name, description, owners, timeout, enabled=True, disable_reason=None): def outer_wrapper(fn): @functools.wraps(fn) def inner_wrapper(args): return fn(args.device, args.repeat, args.output) assert name not in ALL_BENCHMARKS, \ '{} is already defined as a benchmark'.format(name) meta = BenchmarkMeta(description, owners, timeout, enabled, disable_reason) ALL_BENCHMARKS[name] = (meta, inner_wrapper) return inner_wrapper return outer_wrapper def print_metadata(args): all_meta = [ {'name': name, 'description': meta.description, 'owners': meta.owners, 'timeout': meta.timeout, 'enabled': meta.enabled, 'disable_reason': meta.disable_reason} for name, (meta, fn) in ALL_BENCHMARKS.iteritems() ] yaml.dump(all_meta, sys.stdout) def run_benchmark(args): meta, fn = ALL_BENCHMARKS[args.NAME] fn(args) @contextlib.contextmanager def modified_path(path): try: sys.path.insert(0, path) yield path finally: if path == sys.path[0]: sys.path.pop(0) else: logging.warning('Expected {} in path, found {}'.format( path, sys.path[0])) @contextlib.contextmanager def modified_env(key, value): try: old_value = os.environ.pop(key, None) os.environ[key] = value yield finally: final_value = os.environ.pop(key) assert value == final_value, \ 'Expected {} in env for {}, found {}'.format( value, key, final_value) if old_value is not None: os.environ[key] = old_value @contextlib.contextmanager def initialized_libs(): third_party = os.path.join(os.path.dirname(__file__), 'third_party') devil_dir = os.path.join(third_party, 'catapult', 'devil') with modified_path(devil_dir): try: from devil.android import device_utils # noqa except ImportError: logging.exception( 'Failed to import some third_party perf dependencies. ' 'You may need to run scripts/devperf/download_deps.py before' 'running a benchmark.') raise yield @contextlib.contextmanager def high_perf_mode(device): from devil.android.perf import perf_control pc = perf_control.PerfControl(device) try: pc.SetHighPerfMode() yield finally: pc.SetDefaultPerfMode() @contextlib.contextmanager def started_app(device, package, activity): from devil.android.sdk import intent try: device.StartActivity( intent.Intent(action=None, package=package, activity=activity), force_stop=True) yield finally: device.ForceStop(package) def extract_histograms(monitor, names, timeout_in_seconds=10): for name in names: regex = (r'AliceKitHistograms:\s+{}:\s+(?P