forked from mozilla/gecko-dev
-
Notifications
You must be signed in to change notification settings - Fork 1
/
mach_commands.py
256 lines (215 loc) · 7.99 KB
/
mach_commands.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from __future__ import print_function, unicode_literals
import os
from mach.decorators import (
CommandArgument,
CommandProvider,
Command,
)
from mozbuild.base import MachCommandBase
HANDLE_FILE_ERROR = '''
%s is a file.
However, I do not yet know how to run tests from files. You'll need to run
the mach command for the test type you are trying to run. e.g.
$ mach xpcshell-test path/to/file
'''.strip()
HANDLE_DIR_ERROR = '''
%s is a directory.
However, I do not yet know how to run tests from directories. You can try
running the mach command for the tests in that directory. e.g.
$ mach xpcshell-test path/to/directory
'''.strip()
UNKNOWN_TEST = '''
I don't know how to run the test: %s
You need to specify a test suite name or abbreviation. It's possible I just
haven't been told about this test suite yet. If you suspect that's the issue,
please file a bug at https://bugzilla.mozilla.org/enter_bug.cgi?product=Testing&component=General
and request support be added.
'''.strip()
MOCHITEST_CHUNK_BY_DIR = 4
MOCHITEST_TOTAL_CHUNKS = 5
TEST_SUITES = {
'cppunittest': {
'aliases': ('Cpp', 'cpp'),
'mach_command': 'cppunittest',
'kwargs': {'test_file': None},
},
'crashtest': {
'aliases': ('C', 'Rc', 'RC', 'rc'),
'mach_command': 'crashtest',
'kwargs': {'test_file': None},
},
'crashtest-ipc': {
'aliases': ('Cipc', 'cipc'),
'mach_command': 'crashtest-ipc',
'kwargs': {'test_file': None},
},
'jetpack': {
'aliases': ('J',),
'mach_command': 'jetpack-test',
'kwargs': {},
},
'check-spidermonkey': {
'aliases': ('Sm', 'sm'),
'mach_command': 'check-spidermonkey',
'kwargs': {'valgrind': False},
},
'mochitest-a11y': {
'mach_command': 'mochitest-a11y',
'kwargs': {'test_file': None},
},
'mochitest-browser': {
'aliases': ('bc', 'BC', 'Bc'),
'mach_command': 'mochitest-browser',
'kwargs': {'test_file': None},
},
'mochitest-chrome': {
'mach_command': 'mochitest-chrome',
'kwargs': {'test_file': None},
},
'mochitest-devtools': {
'aliases': ('dt', 'DT', 'Dt'),
'mach_command': 'mochitest-browser --subsuite=devtools',
'kwargs': {'test_file': None},
},
'mochitest-ipcplugins': {
'make_target': 'mochitest-ipcplugins',
},
'mochitest-plain': {
'mach_command': 'mochitest-plain',
'kwargs': {'test_file': None},
},
'reftest': {
'aliases': ('RR', 'rr', 'Rr'),
'mach_command': 'reftest',
'kwargs': {'test_file': None},
},
'reftest-ipc': {
'aliases': ('Ripc',),
'mach_command': 'reftest-ipc',
'kwargs': {'test_file': None},
},
'valgrind': {
'aliases': ('V', 'v'),
'mach_command': 'valgrind-test',
'kwargs': {},
},
'xpcshell': {
'aliases': ('X', 'x'),
'mach_command': 'xpcshell-test',
'kwargs': {'test_file': 'all'},
},
}
for i in range(1, MOCHITEST_TOTAL_CHUNKS + 1):
TEST_SUITES['mochitest-%d' %i] = {
'aliases': ('M%d' % i, 'm%d' % i),
'mach_command': 'mochitest-plain',
'kwargs': {
'chunk_by_dir': MOCHITEST_CHUNK_BY_DIR,
'total_chunks': MOCHITEST_TOTAL_CHUNKS,
'this_chunk': i,
'test_file': None,
},
}
TEST_HELP = '''
Test or tests to run. Tests can be specified by test suite name or alias.
The following test suites and aliases are supported: %s
''' % ', '.join(sorted(TEST_SUITES))
TEST_HELP = TEST_HELP.strip()
@CommandProvider
class Test(MachCommandBase):
@Command('test', category='testing', description='Run tests.')
@CommandArgument('what', default=None, nargs='*', help=TEST_HELP)
def test(self, what):
status = None
for entry in what:
status = self._run_test(entry)
if status:
break
return status
def _run_test(self, what):
suite = None
if what in TEST_SUITES:
suite = TEST_SUITES[what]
else:
for v in TEST_SUITES.values():
if what in v.get('aliases', []):
suite = v
break
if suite:
if 'mach_command' in suite:
return self._mach_context.commands.dispatch(
suite['mach_command'], self._mach_context, **suite['kwargs'])
if 'make_target' in suite:
return self._run_make(target=suite['make_target'],
pass_thru=True)
raise Exception('Do not know how to run suite. This is a logic '
'error in this mach command.')
if os.path.isfile(what):
print(HANDLE_FILE_ERROR % what)
return 1
if os.path.isdir(what):
print(HANDLE_DIR_ERROR % what)
return 1
print(UNKNOWN_TEST % what)
return 1
@CommandProvider
class MachCommands(MachCommandBase):
@Command('cppunittest', category='testing',
description='Run cpp unit tests.')
@CommandArgument('test_files', nargs='*', metavar='N',
help='Test to run. Can be specified as one or more files or ' \
'directories, or omitted. If omitted, the entire test suite is ' \
'executed.')
def run_cppunit_test(self, **params):
import runcppunittests as cppunittests
import logging
if len(params['test_files']) == 0:
testdir = os.path.join(self.distdir, 'cppunittests')
progs = cppunittests.extract_unittests_from_args([testdir], None)
else:
progs = cppunittests.extract_unittests_from_args(params['test_files'], None)
# See if we have crash symbols
symbols_path = os.path.join(self.distdir, 'crashreporter-symbols')
if not os.path.isdir(symbols_path):
symbols_path = None
tester = cppunittests.CPPUnitTests()
try:
result = tester.run_tests(progs, self.bindir, symbols_path)
except Exception, e:
self.log(logging.ERROR, 'cppunittests',
{'exception': str(e)},
'Caught exception running cpp unit tests: {exception}')
result = False
return 0 if result else 1
@CommandProvider
class CheckSpiderMonkeyCommand(MachCommandBase):
@Command('check-spidermonkey', category='testing', description='Run SpiderMonkey tests.')
@CommandArgument('--valgrind', action='store_true', help='Run jit-test suite with valgrind flag')
def run_checkspidermonkey(self, **params):
import subprocess
import sys
bin_suffix = ''
if sys.platform.startswith('win'):
bin_suffix = '.exe'
js = os.path.join(self.bindir, 'js%s' % bin_suffix)
print('Running jit-tests')
jittest_cmd = [os.path.join(self.topsrcdir, 'js', 'src', 'jit-test', 'jit_test.py'),
js, '--no-slow', '--tbpl']
if params['valgrind']:
jittest_cmd.append('--valgrind')
jittest_result = subprocess.call(jittest_cmd)
print('running jstests')
jstest_cmd = [os.path.join(self.topsrcdir, 'js', 'src', 'tests', 'jstests.py'),
js, '--tbpl']
jstest_result = subprocess.call(jstest_cmd)
print('running jsapi-tests')
jsapi_tests_cmd = [os.path.join(self.bindir, 'jsapi-tests%s' % bin_suffix)]
jsapi_tests_result = subprocess.call(jsapi_tests_cmd)
print('running check-style')
check_style_cmd = [sys.executable, os.path.join(self.topsrcdir, 'config', 'check_spidermonkey_style.py')]
check_style_result = subprocess.call(check_style_cmd, cwd=os.path.join(self.topsrcdir, 'js', 'src'))
all_passed = jittest_result and jstest_result and jsapi_tests_result and check_style_result
return all_passed