#!/usr/bin/python # # Copyright 2010 Google Inc. All Rights Reserved. """Script to run ChromeOS benchmarks Inputs: chromeos_root board [chromeos/cpu/|chromeos/browser/[pagecycler|sunspider]|chromeos/startup] hostname/IP of Chromeos machine chromeos/cpu/ - 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 """ __author__ = 'bjanakiraman@google.com (Bhaskar Janakiraman)' import optparse import os import re import sys import image_chromeos import run_tests from utils import command_executer from utils import logger 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: ' + message parser.print_help() sys.exit(0) def RunBrowserBenchmark(chromeos_root, board, bench, workdir, machine): """Run browser benchmarks. Args: chromeos_root: ChromeOS src dir board: Board being tested bench: Name of benchmark (chromeos/browser/*) workdir: Directory containing benchmark directory machine: name of chromeos machine """ benchname = re.split('/', bench)[2] benchdir = '%s/%s' % (workdir, benchname) benchname = name_map[benchname] retval = run_tests.RunRemoteTests(chromeos_root, machine, board, benchname) return retval def RunStartupBenchmark(chromeos_root, board, bench, workdir, machine): """Run browser benchmarks. Args: chromeos_root: ChromeOS src dir board: Board being tested bench: Name of benchmark (chromeos/browser/*) workdir: Directory containing benchmark directory machine: name of chromeos machine """ benchname = 'startup' benchdir = '%s/%s' % (workdir, benchname) benchname = name_map[benchname] retval = run_tests.RunRemoteTests(chromeos_root, machine, board, benchname) return retval def RunCpuBenchmark(chromeos_root, bench, workdir, machine): """Run CPU benchmark. Args: 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 retval = cmd_executer.CrosRunCommand(args, chromeos_root=chromeos_root, machine=machine) if retval: return retval # Copy benchmark directory. retval = cmd_executer.CopyFiles(benchdir, '/tmp/' + benchname, chromeos_root=chromeos_root, dest_machine=machine, dest_cros=True) if retval: return retval # 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 retval def Main(argv): """Build ChromeOS.""" # Common initializations parser = optparse.OptionParser() parser.add_option('-c', '--chromeos_root', dest='chromeos_root', help='Target directory for ChromeOS installation.') parser.add_option('-m', '--machine', dest='machine', help='The chromeos host machine.') parser.add_option('--workdir', dest='workdir', default='./perflab-bin', help='Work directory for perflab outputs.') parser.add_option('--board', dest='board', help='ChromeOS target board, e.g. x86-generic') (options, args) = parser.parse_args(argv[1:]) # validate args for arg in 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 retval = 0 for arg in args: # CPU benchmarks comps = re.split('/', arg) if re.match('chromeos/cpu', arg): benchname = comps[2] print 'RUNNING %s' % benchname retval = RunCpuBenchmark(options.chromeos_root, arg, options.workdir, options.machine) if not found_err: found_err = retval 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) retval = RunStartupBenchmark(options.chromeos_root, options.board, arg, options.workdir, options.machine) if not found_err: found_err = retval 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) retval = RunBrowserBenchmark(options.chromeos_root, options.board, arg, options.workdir, options.machine) if not found_err: found_err = retval return found_err if __name__ == '__main__': retval = Main(sys.argv) sys.exit(retval)