blob: 51ac9a6676a37fe3f546d866f5a216f3a0aeff31 [file] [log] [blame]
bjanakiraman229d6262013-02-15 04:56:46 +00001#!/usr/bin/python2.6
2#
3# Copyright 2010 Google Inc. All Rights Reserved.
4
5"""Script to run ChromeOS benchmarks
6
7Inputs:
8 chromeos_root
bjanakiraman229d6262013-02-15 04:56:46 +00009 board
10 [chromeos/cpu/<benchname>|chromeos/browser/[pagecycler|sunspider]|chromeos/startup]
11 hostname/IP of Chromeos machine
12
13 chromeos/cpu/<benchname>
14 - Read run script rules from bench.mk perflab-bin, copy benchmark to host, run
15 and return results.
16
17 chromeos/startup
18 - Re-image host with image in perflab-bin
19 - Call run_tests to run startup test, gather results.
20 - Restore host back to what it was.
21
22 chromeos/browser/*
23 - Call build_chromebrowser to build image with new browser
24 - Copy image to perflab-bin
25
26"""
27
28__author__ = "bjanakiraman@google.com (Bhaskar Janakiraman)"
29
30import optparse
31import re
32import sys
bjanakiraman81a30d02013-02-15 04:57:20 +000033import run_tests
asharif8de2c732013-02-15 05:15:25 +000034import image_chromeos
bjanakiraman229d6262013-02-15 04:56:46 +000035from utils import command_executer
36from utils import utils
asharif8de2c732013-02-15 05:15:25 +000037from utils import logger
bjanakiraman229d6262013-02-15 04:56:46 +000038
39
40KNOWN_BENCHMARKS = [
41 "chromeos/startup",
42 "chromeos/browser/pagecycler",
43 "chromeos/browser/sunspider",
44 "chromeos/cpu/bikjmp"]
45
bjanakiraman81a30d02013-02-15 04:57:20 +000046name_map = {
47 "pagecycler" : "Page",
48 "sunspider" : "SunSpider",
49 "startup" : "BootPerfServer"}
50
51
bjanakiraman229d6262013-02-15 04:56:46 +000052# Run command template
53
54
55# Common initializations
56cmd_executer = command_executer.GetCommandExecuter()
57
58
59def Usage(parser, message):
60 print "ERROR: " + message
61 parser.print_help()
62 sys.exit(0)
63
64
bjanakiraman81a30d02013-02-15 04:57:20 +000065def RunBrowserBenchmark(chromeos_root, board, bench, workdir, machine):
bjanakiraman229d6262013-02-15 04:56:46 +000066 """Run browser benchmarks.
67
68 Args:
bjanakiraman81a30d02013-02-15 04:57:20 +000069 chromeos_root: ChromeOS src dir
70 board: Board being tested
bjanakiraman229d6262013-02-15 04:56:46 +000071 bench: Name of benchmark (chromeos/browser/*)
72 workdir: Directory containing benchmark directory
73 machine: name of chromeos machine
74 """
bjanakiraman81a30d02013-02-15 04:57:20 +000075 benchname = re.split('/', bench)[2]
76 benchdir = '%s/%s' % (workdir, benchname)
77 benchname = name_map[benchname]
78 retval = run_tests.RunRemoteTests(chromeos_root, machine, board, benchname)
79 return retval
bjanakiraman229d6262013-02-15 04:56:46 +000080
81
bjanakiraman81a30d02013-02-15 04:57:20 +000082def RunStartupBenchmark(chromeos_root, board, bench, workdir, machine):
bjanakiraman229d6262013-02-15 04:56:46 +000083 """Run browser benchmarks.
84
85 Args:
bjanakiraman81a30d02013-02-15 04:57:20 +000086 chromeos_root: ChromeOS src dir
87 board: Board being tested
bjanakiraman229d6262013-02-15 04:56:46 +000088 bench: Name of benchmark (chromeos/browser/*)
89 workdir: Directory containing benchmark directory
90 machine: name of chromeos machine
91 """
bjanakiraman81a30d02013-02-15 04:57:20 +000092 benchname = 'startup'
93 benchdir = '%s/%s' % (workdir, benchname)
94 benchname = name_map[benchname]
95 retval = run_tests.RunRemoteTests(chromeos_root, machine, board, benchname)
96 return retval
bjanakiraman229d6262013-02-15 04:56:46 +000097
98
asharif4d2b7162013-02-15 05:14:57 +000099def RunCpuBenchmark(chromeos_root, bench, workdir, machine):
bjanakiraman229d6262013-02-15 04:56:46 +0000100 """Run CPU benchmark.
101
102 Args:
103 bench: Name of benchmark
104 workdir: directory containing benchmark directory
105 machine: name of chromeos machine
106
107 Returns:
108 status: 0 on success
109 """
110
111 benchname = re.split('/', bench)[2]
112 benchdir = '%s/%s' % (workdir, benchname)
113
114 # Delete any existing run directories on machine.
115 # Since this has exclusive access to the machine,
116 # we do not worry about duplicates.
asharif4d2b7162013-02-15 05:14:57 +0000117 args = 'rm -rf /tmp/%s' % benchname
118 retval = cmd_executer.CrosRunCommand(args, chromeos_root=chromeos_root,
119 machine=machine)
bjanakiraman229d6262013-02-15 04:56:46 +0000120 if retval:
121 return retval
122
123 # Copy benchmark directory.
asharif4d2b7162013-02-15 05:14:57 +0000124 retval = cmd_executer.CopyFiles(benchdir, "/tmp",
125 chromeos_root=chromeos_root,
126 dest_machine=machine,
127 dest_cros=True)
bjanakiraman229d6262013-02-15 04:56:46 +0000128 if retval:
129 return retval
130
131 # Parse bench.mk to extract run flags.
132
133 benchmk_file = open('%s/bench.mk' % benchdir, 'r')
134 for line in benchmk_file:
135 line.rstrip()
136 if re.match('^run_cmd', line):
bjanakiraman4e8bdf22013-02-15 04:57:09 +0000137 line = re.sub('^run_cmd.*\${PERFLAB_PATH}', './out', line)
bjanakiraman229d6262013-02-15 04:56:46 +0000138 line = re.sub('\${PERFLAB_INPUT}', './data', line)
139 run_cmd = line
140 break
141
142 # Execute on remote machine
143 # Capture output and process it.
asharif4d2b7162013-02-15 05:14:57 +0000144 sshargs = "'cd /tmp/%s;" % benchname
145 sshargs += "time -p %s'" % run_cmd
146 cmd_executer.CrosRunCommand(sshargs, chromeos_root=chromeos_root,
147 machine=machine)
bjanakiraman229d6262013-02-15 04:56:46 +0000148
149 return retval
150
151
152def Main(argv):
153 """Build ChromeOS."""
154 # Common initializations
155
156 parser = optparse.OptionParser()
157 parser.add_option("-c", "--chromeos_root", dest="chromeos_root",
158 help="Target directory for ChromeOS installation.")
bjanakiraman229d6262013-02-15 04:56:46 +0000159 parser.add_option("-m", "--machine", dest="machine",
160 help="The chromeos host machine.")
161 parser.add_option("--workdir", dest="workdir", default="./perflab-bin",
162 help="Work directory for perflab outputs.")
163 parser.add_option("--board", dest="board",
164 help="ChromeOS target board, e.g. x86-generic")
165
166 (options, args) = parser.parse_args(argv[1:])
167
168 # validate args
169 for arg in args:
170 if arg not in KNOWN_BENCHMARKS:
171 utils.AssertExit(False, "Bad benchmark %s specified" % arg)
172
173
174 if options.chromeos_root is None:
175 Usage(parser, "--chromeos_root must be set")
176
bjanakiraman229d6262013-02-15 04:56:46 +0000177 if options.board is None:
178 Usage(parser, "--board must be set")
179
180 if options.machine is None:
181 Usage(parser, "--machine must be set")
182
183 found_err = 0
184 retval = 0
185 for arg in args:
186 # CPU benchmarks
187 if re.match('chromeos/cpu', arg):
188 comps = re.split('/', arg)
189 benchname = comps[2]
190 print "RUNNING %s" % benchname
asharif4d2b7162013-02-15 05:14:57 +0000191 retval = RunCpuBenchmark(options.chromeos_root,
192 arg, options.workdir, options.machine)
bjanakiraman229d6262013-02-15 04:56:46 +0000193 if not found_err:
194 found_err = retval
195 elif re.match('chromeos/startup', arg):
asharif8de2c732013-02-15 05:15:25 +0000196 image_args = [os.path.dirname(os.path.abspath(__file__)) +
197 "/image_chromeos.py",
198 "--remote=" + options.machine,
199 "--image=" + options.workdir + "/chromiumos_image.bin"
200 ]
201 logger.GetLogger().LogOutput("Reimaging machine %s" % options.machine)
202 image_chromeos.Main(image_args)
203
204 logger.GetLogger().LogOutput("Running %s" % arg)
bjanakiraman81a30d02013-02-15 04:57:20 +0000205 retval = RunStartupBenchmark(options.chromeos_root,
206 options.board,
207 arg, options.workdir, options.machine)
bjanakiraman229d6262013-02-15 04:56:46 +0000208 if not found_err:
209 found_err = retval
210 elif re.match('chromeos/browser', arg):
asharif8de2c732013-02-15 05:15:25 +0000211 image_args = [os.path.dirname(os.path.abspath(__file__)) +
212 "/image_chromeos.py",
213 "--remote=" + options.machine,
214 "--image=" + options.workdir + "/chromiumos_image.bin"
215 ]
216 logger.GetLogger().LogOutput("Reimaging machine %s" % options.machine)
217 image_chromeos.Main(image_args)
218
219 logger.GetLogger().LogOutput("Running %s" % arg)
bjanakiraman81a30d02013-02-15 04:57:20 +0000220 retval = RunBrowserBenchmark(options.chromeos_root,
221 options.board,
222 arg, options.workdir, options.machine)
bjanakiraman229d6262013-02-15 04:56:46 +0000223 if not found_err:
224 found_err = retval
225
226 return found_err
227
228if __name__ == "__main__":
229 Main(sys.argv)