#!/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)