Home | History | Annotate | Download | only in deprecated
      1 #!/usr/bin/python2
      2 #
      3 # Copyright 2010 Google Inc. All Rights Reserved.
      4 """Script to run ChromeOS benchmarks
      5 
      6 Inputs:
      7     chromeos_root
      8     board
      9     [chromeos/cpu/<benchname>|
     10      chromeos/browser/[pagecycler|sunspider]|
     11      chromeos/startup]
     12     hostname/IP of Chromeos machine
     13 
     14     chromeos/cpu/<benchname>
     15        - Read run script rules from bench.mk perflab-bin, copy benchmark to
     16        host, run
     17        and return results.
     18 
     19     chromeos/startup
     20        - Re-image host with image in perflab-bin
     21        - Call run_tests to run startup test, gather results.
     22        - Restore host back to what it was.
     23 
     24     chromeos/browser/*
     25        - Call build_chromebrowser to build image with new browser
     26        - Copy image to perflab-bin
     27 
     28 """
     29 
     30 from __future__ import print_function
     31 
     32 __author__ = 'bjanakiraman (at] google.com (Bhaskar Janakiraman)'
     33 
     34 import argparse
     35 import os
     36 import re
     37 import sys
     38 
     39 import image_chromeos
     40 import run_tests
     41 from cros_utils import command_executer
     42 from cros_utils import logger
     43 
     44 # pylint: disable=anomalous-backslash-in-string
     45 
     46 KNOWN_BENCHMARKS = [
     47     'chromeos/startup', 'chromeos/browser/pagecycler',
     48     'chromeos/browser/sunspider', 'chromeos/browser/v8bench',
     49     'chromeos/cpu/bikjmp'
     50 ]
     51 
     52 name_map = {
     53     'pagecycler': 'Page',
     54     'sunspider': 'SunSpider',
     55     'v8bench': 'V8Bench',
     56     'startup': 'BootPerfServer'
     57 }
     58 
     59 # Run command template
     60 
     61 # Common initializations
     62 cmd_executer = command_executer.GetCommandExecuter()
     63 
     64 
     65 def Usage(parser, message):
     66   print('ERROR: %s' % message)
     67   parser.print_help()
     68   sys.exit(0)
     69 
     70 
     71 def RunBrowserBenchmark(chromeos_root, board, bench, machine):
     72   """Run browser benchmarks.
     73 
     74   Args:
     75     chromeos_root: ChromeOS src dir
     76     board: Board being tested
     77     bench: Name of benchmark (chromeos/browser/*)
     78     machine: name of chromeos machine
     79   """
     80   benchname = re.split('/', bench)[2]
     81   benchname = name_map[benchname]
     82   ret = run_tests.RunRemoteTests(chromeos_root, machine, board, benchname)
     83   return ret
     84 
     85 
     86 def RunStartupBenchmark(chromeos_root, board, machine):
     87   """Run browser benchmarks.
     88 
     89   Args:
     90     chromeos_root: ChromeOS src dir
     91     board: Board being tested
     92     machine: name of chromeos machine
     93   """
     94   benchname = 'startup'
     95   benchname = name_map[benchname]
     96   ret = run_tests.RunRemoteTests(chromeos_root, machine, board, benchname)
     97   return ret
     98 
     99 
    100 def RunCpuBenchmark(chromeos_root, bench, workdir, machine):
    101   """Run CPU benchmark.
    102 
    103   Args:
    104     chromeos_root: ChromeOS src dir
    105     bench: Name of benchmark
    106     workdir: directory containing benchmark directory
    107     machine: name of chromeos machine
    108 
    109   Returns:
    110     status: 0 on success
    111   """
    112 
    113   benchname = re.split('/', bench)[2]
    114   benchdir = '%s/%s' % (workdir, benchname)
    115 
    116   # Delete any existing run directories on machine.
    117   # Since this has exclusive access to the machine,
    118   # we do not worry about duplicates.
    119   args = 'rm -rf /tmp/%s' % benchname
    120   retv = cmd_executer.CrosRunCommand(args,
    121                                      chromeos_root=chromeos_root,
    122                                      machine=machine)
    123   if retv:
    124     return retv
    125 
    126   # Copy benchmark directory.
    127   retv = cmd_executer.CopyFiles(benchdir,
    128                                 '/tmp/' + benchname,
    129                                 chromeos_root=chromeos_root,
    130                                 dest_machine=machine,
    131                                 dest_cros=True)
    132   if retv:
    133     return retv
    134 
    135   # Parse bench.mk to extract run flags.
    136 
    137   benchmk_file = open('%s/bench.mk' % benchdir, 'r')
    138   for line in benchmk_file:
    139     line.rstrip()
    140     if re.match('^run_cmd', line):
    141       line = re.sub('^run_cmd.*\${PERFLAB_PATH}', './out', line)
    142       line = re.sub('\${PERFLAB_INPUT}', './data', line)
    143       run_cmd = line
    144       break
    145 
    146   # Execute on remote machine
    147   # Capture output and process it.
    148   sshargs = "'cd /tmp/%s;" % benchname
    149   sshargs += "time -p %s'" % run_cmd
    150   cmd_executer.CrosRunCommand(sshargs,
    151                               chromeos_root=chromeos_root,
    152                               machine=machine)
    153 
    154   return retv
    155 
    156 
    157 def Main(argv):
    158   """Build ChromeOS."""
    159   # Common initializations
    160 
    161   parser = argparse.ArgumentParser()
    162   parser.add_argument('-c',
    163                       '--chromeos_root',
    164                       dest='chromeos_root',
    165                       help='Target directory for ChromeOS installation.')
    166   parser.add_argument('-m',
    167                       '--machine',
    168                       dest='machine',
    169                       help='The chromeos host machine.')
    170   parser.add_argument('--workdir',
    171                       dest='workdir',
    172                       default='./perflab-bin',
    173                       help='Work directory for perflab outputs.')
    174   parser.add_argument('--board',
    175                       dest='board',
    176                       help='ChromeOS target board, e.g. x86-generic')
    177   parser.add_argumen('args', margs='+', help='Benchmarks to run.')
    178 
    179   options = parser.parse_args(argv[1:])
    180 
    181   # validate args
    182   for arg in options.args:
    183     if arg not in KNOWN_BENCHMARKS:
    184       logger.GetLogger().LogFatal('Bad benchmark %s specified' % arg)
    185 
    186   if options.chromeos_root is None:
    187     Usage(parser, '--chromeos_root must be set')
    188 
    189   if options.board is None:
    190     Usage(parser, '--board must be set')
    191 
    192   if options.machine is None:
    193     Usage(parser, '--machine must be set')
    194 
    195   found_err = 0
    196   retv = 0
    197   for arg in options.args:
    198     # CPU benchmarks
    199     comps = re.split('/', arg)
    200     if re.match('chromeos/cpu', arg):
    201       benchname = comps[2]
    202       print('RUNNING %s' % benchname)
    203       retv = RunCpuBenchmark(options.chromeos_root, arg, options.workdir,
    204                              options.machine)
    205       if not found_err:
    206         found_err = retv
    207     elif re.match('chromeos/startup', arg):
    208       benchname = comps[1]
    209       image_args = [
    210           os.path.dirname(os.path.abspath(__file__)) + '/image_chromeos.py',
    211           '--chromeos_root=' + options.chromeos_root,
    212           '--remote=' + options.machine, '--image=' + options.workdir + '/' +
    213           benchname + '/chromiumos_image.bin'
    214       ]
    215       logger.GetLogger().LogOutput('Reimaging machine %s' % options.machine)
    216       image_chromeos.Main(image_args)
    217 
    218       logger.GetLogger().LogOutput('Running %s' % arg)
    219       retv = RunStartupBenchmark(options.chromeos_root, options.board,
    220                                  options.machine)
    221       if not found_err:
    222         found_err = retv
    223     elif re.match('chromeos/browser', arg):
    224       benchname = comps[2]
    225       image_args = [
    226           os.path.dirname(os.path.abspath(__file__)) + '/image_chromeos.py',
    227           '--chromeos_root=' + options.chromeos_root,
    228           '--remote=' + options.machine, '--image=' + options.workdir + '/' +
    229           benchname + '/chromiumos_image.bin'
    230       ]
    231       logger.GetLogger().LogOutput('Reimaging machine %s' % options.machine)
    232       image_chromeos.Main(image_args)
    233 
    234       logger.GetLogger().LogOutput('Running %s' % arg)
    235       retv = RunBrowserBenchmark(options.chromeos_root, options.board, arg,
    236                                  options.machine)
    237       if not found_err:
    238         found_err = retv
    239 
    240   return found_err
    241 
    242 
    243 if __name__ == '__main__':
    244   retval = Main(sys.argv)
    245   sys.exit(retval)
    246