245 lines
7 KiB
Python
Executable file
245 lines
7 KiB
Python
Executable file
#!/usr/bin/python2
|
|
#
|
|
# Copyright 2010 Google Inc. All Rights Reserved.
|
|
"""Script to run ChromeOS benchmarks
|
|
|
|
Inputs:
|
|
chromeos_root
|
|
board
|
|
[chromeos/cpu/<benchname>|
|
|
chromeos/browser/[pagecycler|sunspider]|
|
|
chromeos/startup]
|
|
hostname/IP of Chromeos machine
|
|
|
|
chromeos/cpu/<benchname>
|
|
- Read run script rules from bench.mk perflab-bin, copy benchmark to
|
|
host, run
|
|
and return results.
|
|
|
|
chromeos/startup
|
|
- Re-image host with image in perflab-bin
|
|
- Call run_tests to run startup test, gather results.
|
|
- Restore host back to what it was.
|
|
|
|
chromeos/browser/*
|
|
- Call build_chromebrowser to build image with new browser
|
|
- Copy image to perflab-bin
|
|
|
|
"""
|
|
|
|
from __future__ import print_function
|
|
|
|
__author__ = 'bjanakiraman@google.com (Bhaskar Janakiraman)'
|
|
|
|
import argparse
|
|
import os
|
|
import re
|
|
import sys
|
|
|
|
import image_chromeos
|
|
import run_tests
|
|
from cros_utils import command_executer
|
|
from cros_utils import logger
|
|
|
|
# pylint: disable=anomalous-backslash-in-string
|
|
|
|
KNOWN_BENCHMARKS = [
|
|
'chromeos/startup', 'chromeos/browser/pagecycler',
|
|
'chromeos/browser/sunspider', 'chromeos/browser/v8bench',
|
|
'chromeos/cpu/bikjmp'
|
|
]
|
|
|
|
name_map = {
|
|
'pagecycler': 'Page',
|
|
'sunspider': 'SunSpider',
|
|
'v8bench': 'V8Bench',
|
|
'startup': 'BootPerfServer'
|
|
}
|
|
|
|
# Run command template
|
|
|
|
# Common initializations
|
|
cmd_executer = command_executer.GetCommandExecuter()
|
|
|
|
|
|
def Usage(parser, message):
|
|
print('ERROR: %s' % message)
|
|
parser.print_help()
|
|
sys.exit(0)
|
|
|
|
|
|
def RunBrowserBenchmark(chromeos_root, board, bench, machine):
|
|
"""Run browser benchmarks.
|
|
|
|
Args:
|
|
chromeos_root: ChromeOS src dir
|
|
board: Board being tested
|
|
bench: Name of benchmark (chromeos/browser/*)
|
|
machine: name of chromeos machine
|
|
"""
|
|
benchname = re.split('/', bench)[2]
|
|
benchname = name_map[benchname]
|
|
ret = run_tests.RunRemoteTests(chromeos_root, machine, board, benchname)
|
|
return ret
|
|
|
|
|
|
def RunStartupBenchmark(chromeos_root, board, machine):
|
|
"""Run browser benchmarks.
|
|
|
|
Args:
|
|
chromeos_root: ChromeOS src dir
|
|
board: Board being tested
|
|
machine: name of chromeos machine
|
|
"""
|
|
benchname = 'startup'
|
|
benchname = name_map[benchname]
|
|
ret = run_tests.RunRemoteTests(chromeos_root, machine, board, benchname)
|
|
return ret
|
|
|
|
|
|
def RunCpuBenchmark(chromeos_root, bench, workdir, machine):
|
|
"""Run CPU benchmark.
|
|
|
|
Args:
|
|
chromeos_root: ChromeOS src dir
|
|
bench: Name of benchmark
|
|
workdir: directory containing benchmark directory
|
|
machine: name of chromeos machine
|
|
|
|
Returns:
|
|
status: 0 on success
|
|
"""
|
|
|
|
benchname = re.split('/', bench)[2]
|
|
benchdir = '%s/%s' % (workdir, benchname)
|
|
|
|
# Delete any existing run directories on machine.
|
|
# Since this has exclusive access to the machine,
|
|
# we do not worry about duplicates.
|
|
args = 'rm -rf /tmp/%s' % benchname
|
|
retv = cmd_executer.CrosRunCommand(args,
|
|
chromeos_root=chromeos_root,
|
|
machine=machine)
|
|
if retv:
|
|
return retv
|
|
|
|
# Copy benchmark directory.
|
|
retv = cmd_executer.CopyFiles(benchdir,
|
|
'/tmp/' + benchname,
|
|
chromeos_root=chromeos_root,
|
|
dest_machine=machine,
|
|
dest_cros=True)
|
|
if retv:
|
|
return retv
|
|
|
|
# Parse bench.mk to extract run flags.
|
|
|
|
benchmk_file = open('%s/bench.mk' % benchdir, 'r')
|
|
for line in benchmk_file:
|
|
line.rstrip()
|
|
if re.match('^run_cmd', line):
|
|
line = re.sub('^run_cmd.*\${PERFLAB_PATH}', './out', line)
|
|
line = re.sub('\${PERFLAB_INPUT}', './data', line)
|
|
run_cmd = line
|
|
break
|
|
|
|
# Execute on remote machine
|
|
# Capture output and process it.
|
|
sshargs = "'cd /tmp/%s;" % benchname
|
|
sshargs += "time -p %s'" % run_cmd
|
|
cmd_executer.CrosRunCommand(sshargs,
|
|
chromeos_root=chromeos_root,
|
|
machine=machine)
|
|
|
|
return retv
|
|
|
|
|
|
def Main(argv):
|
|
"""Build ChromeOS."""
|
|
# Common initializations
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('-c',
|
|
'--chromeos_root',
|
|
dest='chromeos_root',
|
|
help='Target directory for ChromeOS installation.')
|
|
parser.add_argument('-m',
|
|
'--machine',
|
|
dest='machine',
|
|
help='The chromeos host machine.')
|
|
parser.add_argument('--workdir',
|
|
dest='workdir',
|
|
default='./perflab-bin',
|
|
help='Work directory for perflab outputs.')
|
|
parser.add_argument('--board',
|
|
dest='board',
|
|
help='ChromeOS target board, e.g. x86-generic')
|
|
parser.add_argumen('args', margs='+', help='Benchmarks to run.')
|
|
|
|
options = parser.parse_args(argv[1:])
|
|
|
|
# validate args
|
|
for arg in options.args:
|
|
if arg not in KNOWN_BENCHMARKS:
|
|
logger.GetLogger().LogFatal('Bad benchmark %s specified' % arg)
|
|
|
|
if options.chromeos_root is None:
|
|
Usage(parser, '--chromeos_root must be set')
|
|
|
|
if options.board is None:
|
|
Usage(parser, '--board must be set')
|
|
|
|
if options.machine is None:
|
|
Usage(parser, '--machine must be set')
|
|
|
|
found_err = 0
|
|
retv = 0
|
|
for arg in options.args:
|
|
# CPU benchmarks
|
|
comps = re.split('/', arg)
|
|
if re.match('chromeos/cpu', arg):
|
|
benchname = comps[2]
|
|
print('RUNNING %s' % benchname)
|
|
retv = RunCpuBenchmark(options.chromeos_root, arg, options.workdir,
|
|
options.machine)
|
|
if not found_err:
|
|
found_err = retv
|
|
elif re.match('chromeos/startup', arg):
|
|
benchname = comps[1]
|
|
image_args = [
|
|
os.path.dirname(os.path.abspath(__file__)) + '/image_chromeos.py',
|
|
'--chromeos_root=' + options.chromeos_root,
|
|
'--remote=' + options.machine, '--image=' + options.workdir + '/' +
|
|
benchname + '/chromiumos_image.bin'
|
|
]
|
|
logger.GetLogger().LogOutput('Reimaging machine %s' % options.machine)
|
|
image_chromeos.Main(image_args)
|
|
|
|
logger.GetLogger().LogOutput('Running %s' % arg)
|
|
retv = RunStartupBenchmark(options.chromeos_root, options.board,
|
|
options.machine)
|
|
if not found_err:
|
|
found_err = retv
|
|
elif re.match('chromeos/browser', arg):
|
|
benchname = comps[2]
|
|
image_args = [
|
|
os.path.dirname(os.path.abspath(__file__)) + '/image_chromeos.py',
|
|
'--chromeos_root=' + options.chromeos_root,
|
|
'--remote=' + options.machine, '--image=' + options.workdir + '/' +
|
|
benchname + '/chromiumos_image.bin'
|
|
]
|
|
logger.GetLogger().LogOutput('Reimaging machine %s' % options.machine)
|
|
image_chromeos.Main(image_args)
|
|
|
|
logger.GetLogger().LogOutput('Running %s' % arg)
|
|
retv = RunBrowserBenchmark(options.chromeos_root, options.board, arg,
|
|
options.machine)
|
|
if not found_err:
|
|
found_err = retv
|
|
|
|
return found_err
|
|
|
|
|
|
if __name__ == '__main__':
|
|
retval = Main(sys.argv)
|
|
sys.exit(retval)
|