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