Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(265)

Side by Side Diff: src/scripts/autotest.py

Issue 1595001: New autotest wrapper script and bash complete support. (Closed)
Patch Set: patch 6 Created 10 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/scripts/autotest ('k') | src/scripts/bash_completion » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4 #
5 # A python wrapper to call autotest ebuild.
6 #
7 # DO NOT CALL THIS SCRIPT DIRECTLY, CALL src/scripts/autotest INSTEAD.
8
9 import logging, optparse, os, subprocess, sys
10
11
12 def run(cmd):
13 return subprocess.call(cmd, stdout=sys.stdout, stderr=sys.stderr)
14
15
16 class MyOptionPaser(optparse.OptionParser):
17 """Override python's builtin OptionParser to accept any undefined args."""
18
19 help = False
20
21 def _process_args(self, largs, rargs, values):
22 # see /usr/lib64/python2.6/optparse.py line 1414-1463
23 while rargs:
24 arg = rargs[0]
25 # We handle bare "--" explicitly, and bare "-" is handled by the
26 # standard arg handler since the short arg case ensures that the
27 # len of the opt string is greater than 1.
28 if arg == "--":
29 del rargs[0]
30 return
31 elif arg[0:2] == "--":
32 # process a single long option (possibly with value(s))
33 try:
34 self._process_long_opt(rargs, values)
35 except optparse.BadOptionError:
36 largs.append(arg)
37 elif arg[:1] == "-" and len(arg) > 1:
38 # process a cluster of short options (possibly with
39 # value(s) for the last one only)
40 try:
41 self._process_short_opts(rargs, values)
42 except optparse.BadOptionError:
43 largs.append(arg)
44 elif self.allow_interspersed_args:
45 largs.append(arg)
46 del rargs[0]
47 else:
48 return # stop now, leave this arg in rargs
49
50 def print_help(self, file=None):
51 optparse.OptionParser.print_help(self, file)
52 MyOptionPaser.help = True
53
54
55 parser = MyOptionPaser()
56 parser.allow_interspersed_args = True
57
58 DEFAULT_BOARD = os.environ.get('DEFAULT_BOARD', '')
59
60 parser.add_option('--autox', dest='autox', action='store_true',
61 help='Build autox along with autotest.')
62 parser.add_option('--board', dest='board', action='store',
63 default=DEFAULT_BOARD,
64 help='The board for which you are building autotest.')
65 parser.add_option('--build', dest='build', action='store',
66 help='Only prebuild client tests, do not run.')
67 parser.add_option('--buildcheck', dest='buildcheck', action='store_true',
68 help='Fail if tests fail to build.')
69 parser.add_option('--jobs', dest='jobs', action='store', type=int,
70 default=-1,
71 help='How many packages to build in parallel at maximum.')
72 parser.add_option('--noprompt', dest='noprompt', action='store_true',
73 help='Prompt user when building all tests.')
74
75
76 AUTOSERV='../third_party/autotest/files/server/autoserv'
77 AUTOTEST_CLIENT='../third_party/autotest/files/client/bin/autotest_client'
78
79 def parse_args_and_help():
80
81 def nop(_):
82 pass
83
84 sys_exit = sys.exit
85 sys.exit = nop
86 options, args = parser.parse_args()
87 sys.exit = sys_exit
88
89 if MyOptionPaser.help:
90 if options.build:
91 print
92 print 'Options inherited from autotest_client, which is used in build',
93 print 'only mode.'
94 run([AUTOTEST_CLIENT, '--help'])
95 else:
96 print
97 print 'Options inherited from autoserv:'
98 run([AUTOSERV, '--help'])
99 sys.exit(-1)
100 return options, args
101
102
103 def build_autotest(options):
104 environ = os.environ
105 if options.jobs != -1:
106 emerge_jobs = '--jobs=%d' % options.jobs
107 else:
108 emerge_jobs = ''
109
110 # Decide on USE flags based on options
111 use_flag = environ.get('USE', '')
112 if not options.autox:
113 use_flag = use_flag + ' -autox'
114 if options.buildcheck:
115 use_flag = use_flag + ' buildcheck'
116
117 board_blacklist_file = ('%s/src/overlays/overlay-%s/autotest-blacklist' %
118 (os.environ['GCLIENT_ROOT'], options.board))
119 if os.path.exists(board_blacklist_file):
120 blacklist = [line.strip()
121 for line in open(board_blacklist_file).readlines()]
122 else:
123 blacklist = []
124
125 all_tests = 'compilebench,dbench,disktest,netperf2,ltp,unixbench'
126 site_tests = '../third_party/autotest/files/client/site_tests'
127 for site_test in os.listdir(site_tests):
128 test_path = os.path.join(site_tests, site_test)
129 if (os.path.exists(test_path) and os.path.isdir(test_path)
130 and site_test not in blacklist):
131 all_tests += ',' + site_test
132
133 if 'all' == options.build.lower():
134 if options.noprompt is not True:
135 print 'You want to pre-build all client tests and it may take a long',
136 print 'time to finish.'
137 print 'Are you sure you want to continue?(N/y)',
138 answer = sys.stdin.readline()
139 if 'y' != answer[0].lower():
140 print 'Use --build to specify tests you like to pre-compile. '
141 print 'E.g.: ./autotest --build=disktest,hardware_SAT'
142 sys.exit(0)
143 test_list = all_tests
144 else:
145 test_list = options.build
146
147 environ['FEATURES'] = ('%s -buildpkg -collision-protect' %
148 environ.get('FEATURES', ''))
149 environ['TEST_LIST'] = test_list
150 environ['USE'] = use_flag
151 emerge_cmd = ['emerge-%s' % options.board,
152 'chromeos-base/autotest']
153 if emerge_jobs:
154 emerge_cmd.append(emerge_jobs)
155 status = run(emerge_cmd)
156 if status:
157 print 'build_autotest failed.'
158 sys.exit(status)
159
160
161 def run_autoserv(board, args):
162 environ = os.environ
163 environ['AUTOSERV_ARGS'] = ' '.join(args)
164 environ['FEATURES'] = ('%s -buildpkg -digest noauto' %
165 environ.get('FEATURES', ''))
166 ebuild_cmd = ['ebuild-%s' % board,
167 '../third_party/chromiumos-overlay/chromeos-base/'
168 'autotest/autotest-0.0.1.ebuild',
169 'clean', 'unpack', 'test']
170 run(ebuild_cmd)
171
172
173 def main():
174 options, args = parse_args_and_help()
175 if options.build:
176 build_autotest(options)
177 else:
178 run_autoserv(options.board, args)
179
180
181 if __name__ == '__main__':
182 main()
183
OLDNEW
« no previous file with comments | « src/scripts/autotest ('k') | src/scripts/bash_completion » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698