#!/usr/bin/python2 # # 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 """ 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)