blob: fa86b1fb688d1c2f85aa12dc93d51bb29f27555e [file] [log] [blame]
kjellandera013a022016-11-14 05:54:22 -08001#!/usr/bin/python
2# Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3#
4# Use of this source code is governed by a BSD-style license
5# that can be found in the LICENSE file in the root of the source
6# tree. An additional intellectual property rights grant can be found
7# in the file PATENTS. All contributing project authors may
8# be found in the AUTHORS file in the root of the source tree.
9
10"""Tests for mb.py."""
11
ehmaldonadoed8c8ed2016-11-23 12:58:35 -080012import ast
kjellandera013a022016-11-14 05:54:22 -080013import json
14import StringIO
15import os
16import sys
17import unittest
18
19import mb
20
21
22class FakeMBW(mb.MetaBuildWrapper):
23 def __init__(self, win32=False):
24 super(FakeMBW, self).__init__()
25
26 # Override vars for test portability.
27 if win32:
kjellander1c3548c2017-02-15 22:38:22 -080028 self.src_dir = 'c:\\fake_src'
Henrik Kjellander90fd7d82017-05-09 08:30:10 +020029 self.default_config = 'c:\\fake_src\\tools_webrtc\\mb\\mb_config.pyl'
kjellandera013a022016-11-14 05:54:22 -080030 self.default_isolate_map = ('c:\\fake_src\\testing\\buildbot\\'
31 'gn_isolate_map.pyl')
32 self.platform = 'win32'
33 self.executable = 'c:\\python\\python.exe'
34 self.sep = '\\'
35 else:
kjellander1c3548c2017-02-15 22:38:22 -080036 self.src_dir = '/fake_src'
Henrik Kjellander90fd7d82017-05-09 08:30:10 +020037 self.default_config = '/fake_src/tools_webrtc/mb/mb_config.pyl'
kjellandera013a022016-11-14 05:54:22 -080038 self.default_isolate_map = '/fake_src/testing/buildbot/gn_isolate_map.pyl'
39 self.executable = '/usr/bin/python'
40 self.platform = 'linux2'
41 self.sep = '/'
42
43 self.files = {}
44 self.calls = []
45 self.cmds = []
46 self.cross_compile = None
47 self.out = ''
48 self.err = ''
49 self.rmdirs = []
50
51 def ExpandUser(self, path):
52 return '$HOME/%s' % path
53
54 def Exists(self, path):
55 return self.files.get(path) is not None
56
57 def MaybeMakeDirectory(self, path):
58 self.files[path] = True
59
60 def PathJoin(self, *comps):
61 return self.sep.join(comps)
62
63 def ReadFile(self, path):
64 return self.files[path]
65
66 def WriteFile(self, path, contents, force_verbose=False):
67 if self.args.dryrun or self.args.verbose or force_verbose:
68 self.Print('\nWriting """\\\n%s""" to %s.\n' % (contents, path))
69 self.files[path] = contents
70
71 def Call(self, cmd, env=None, buffer_output=True):
kjellandera013a022016-11-14 05:54:22 -080072 self.calls.append(cmd)
73 if self.cmds:
74 return self.cmds.pop(0)
75 return 0, '', ''
76
77 def Print(self, *args, **kwargs):
78 sep = kwargs.get('sep', ' ')
79 end = kwargs.get('end', '\n')
80 f = kwargs.get('file', sys.stdout)
81 if f == sys.stderr:
82 self.err += sep.join(args) + end
83 else:
84 self.out += sep.join(args) + end
85
86 def TempFile(self, mode='w'):
87 return FakeFile(self.files)
88
89 def RemoveFile(self, path):
90 del self.files[path]
91
92 def RemoveDirectory(self, path):
93 self.rmdirs.append(path)
94 files_to_delete = [f for f in self.files if f.startswith(path)]
95 for f in files_to_delete:
96 self.files[f] = None
97
98
99class FakeFile(object):
100 def __init__(self, files):
101 self.name = '/tmp/file'
102 self.buf = ''
103 self.files = files
104
105 def write(self, contents):
106 self.buf += contents
107
108 def close(self):
109 self.files[self.name] = self.buf
110
111
112TEST_CONFIG = """\
113{
114 'masters': {
115 'chromium': {},
116 'fake_master': {
Oleh Prypinb708e932018-03-18 17:34:20 +0100117 'fake_builder': 'rel_bot',
118 'fake_debug_builder': 'debug_goma',
119 'fake_args_bot': '//build/args/bots/fake_master/fake_args_bot.gn',
120 'fake_memcheck_bot': 'memcheck_bot',
121 'fake_multi_phase': { 'phase_1': 'phase_1', 'phase_2': 'phase_2'},
122 'fake_android_bot': 'android_bot',
kjellandera013a022016-11-14 05:54:22 -0800123 },
124 },
125 'configs': {
Oleh Prypinb708e932018-03-18 17:34:20 +0100126 'rel_bot': ['rel', 'goma', 'fake_feature1'],
127 'debug_goma': ['debug', 'goma'],
128 'phase_1': ['phase_1'],
129 'phase_2': ['phase_2'],
130 'memcheck_bot': ['memcheck'],
131 'android_bot': ['android'],
kjellandera013a022016-11-14 05:54:22 -0800132 },
133 'mixins': {
kjellandera013a022016-11-14 05:54:22 -0800134 'fake_feature1': {
135 'gn_args': 'enable_doom_melon=true',
kjellandera013a022016-11-14 05:54:22 -0800136 },
kjellandera013a022016-11-14 05:54:22 -0800137 'goma': {
138 'gn_args': 'use_goma=true',
kjellandera013a022016-11-14 05:54:22 -0800139 },
140 'phase_1': {
141 'gn_args': 'phase=1',
kjellandera013a022016-11-14 05:54:22 -0800142 },
143 'phase_2': {
144 'gn_args': 'phase=2',
kjellandera013a022016-11-14 05:54:22 -0800145 },
146 'rel': {
147 'gn_args': 'is_debug=false',
148 },
149 'debug': {
150 'gn_args': 'is_debug=true',
151 },
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800152 'memcheck': {
153 'gn_args': 'rtc_use_memcheck=true',
154 },
155 'android': {
156 'gn_args': 'target_os="android"',
157 }
kjellandera013a022016-11-14 05:54:22 -0800158 },
159}
160"""
161
kjellandera013a022016-11-14 05:54:22 -0800162
163class UnitTest(unittest.TestCase):
164 def fake_mbw(self, files=None, win32=False):
165 mbw = FakeMBW(win32=win32)
166 mbw.files.setdefault(mbw.default_config, TEST_CONFIG)
167 mbw.files.setdefault(
168 mbw.ToAbsPath('//testing/buildbot/gn_isolate_map.pyl'),
169 '''{
170 "foo_unittests": {
171 "label": "//foo:foo_unittests",
172 "type": "console_test_launcher",
173 "args": [],
174 },
175 }''')
176 mbw.files.setdefault(
Oleh Prypinb708e932018-03-18 17:34:20 +0100177 mbw.ToAbsPath('//build/args/bots/fake_master/fake_args_bot.gn'),
kjellandera013a022016-11-14 05:54:22 -0800178 'is_debug = false\n')
179 if files:
180 for path, contents in files.items():
181 mbw.files[path] = contents
182 return mbw
183
184 def check(self, args, mbw=None, files=None, out=None, err=None, ret=None):
185 if not mbw:
186 mbw = self.fake_mbw(files)
187
188 actual_ret = mbw.Main(args)
189
190 self.assertEqual(actual_ret, ret)
191 if out is not None:
192 self.assertEqual(mbw.out, out)
193 if err is not None:
194 self.assertEqual(mbw.err, err)
195 return mbw
196
Oleh Prypinb708e932018-03-18 17:34:20 +0100197 def test_analyze(self):
kjellandera013a022016-11-14 05:54:22 -0800198 files = {'/tmp/in.json': '''{\
199 "files": ["foo/foo_unittest.cc"],
200 "test_targets": ["foo_unittests"],
201 "additional_compile_targets": ["all"]
202 }''',
203 '/tmp/out.json.gn': '''{\
204 "status": "Found dependency",
205 "compile_targets": ["//foo:foo_unittests"],
206 "test_targets": ["//foo:foo_unittests"]
207 }'''}
208
209 mbw = self.fake_mbw(files)
210 mbw.Call = lambda cmd, env=None, buffer_output=True: (0, '', '')
211
Oleh Prypinb708e932018-03-18 17:34:20 +0100212 self.check(['analyze', '-c', 'debug_goma', '//out/Default',
kjellandera013a022016-11-14 05:54:22 -0800213 '/tmp/in.json', '/tmp/out.json'], mbw=mbw, ret=0)
214 out = json.loads(mbw.files['/tmp/out.json'])
215 self.assertEqual(out, {
216 'status': 'Found dependency',
217 'compile_targets': ['foo:foo_unittests'],
218 'test_targets': ['foo_unittests']
219 })
220
Oleh Prypinb708e932018-03-18 17:34:20 +0100221 def test_gen(self):
kjellandera013a022016-11-14 05:54:22 -0800222 mbw = self.fake_mbw()
Oleh Prypinb708e932018-03-18 17:34:20 +0100223 self.check(['gen', '-c', 'debug_goma', '//out/Default', '-g', '/goma'],
kjellandera013a022016-11-14 05:54:22 -0800224 mbw=mbw, ret=0)
225 self.assertMultiLineEqual(mbw.files['/fake_src/out/Default/args.gn'],
226 ('goma_dir = "/goma"\n'
227 'is_debug = true\n'
228 'use_goma = true\n'))
229
230 # Make sure we log both what is written to args.gn and the command line.
231 self.assertIn('Writing """', mbw.out)
232 self.assertIn('/fake_src/buildtools/linux64/gn gen //out/Default --check',
233 mbw.out)
234
235 mbw = self.fake_mbw(win32=True)
Oleh Prypinb708e932018-03-18 17:34:20 +0100236 self.check(['gen', '-c', 'debug_goma', '-g', 'c:\\goma', '//out/Debug'],
kjellandera013a022016-11-14 05:54:22 -0800237 mbw=mbw, ret=0)
238 self.assertMultiLineEqual(mbw.files['c:\\fake_src\\out\\Debug\\args.gn'],
239 ('goma_dir = "c:\\\\goma"\n'
240 'is_debug = true\n'
241 'use_goma = true\n'))
242 self.assertIn('c:\\fake_src\\buildtools\\win\\gn.exe gen //out/Debug '
243 '--check\n', mbw.out)
244
245 mbw = self.fake_mbw()
Oleh Prypinb708e932018-03-18 17:34:20 +0100246 self.check(['gen', '-m', 'fake_master', '-b', 'fake_args_bot',
kjellandera013a022016-11-14 05:54:22 -0800247 '//out/Debug'],
248 mbw=mbw, ret=0)
249 self.assertEqual(
250 mbw.files['/fake_src/out/Debug/args.gn'],
Oleh Prypinb708e932018-03-18 17:34:20 +0100251 'import("//build/args/bots/fake_master/fake_args_bot.gn")\n')
kjellandera013a022016-11-14 05:54:22 -0800252
253
Oleh Prypinb708e932018-03-18 17:34:20 +0100254 def test_gen_fails(self):
kjellandera013a022016-11-14 05:54:22 -0800255 mbw = self.fake_mbw()
256 mbw.Call = lambda cmd, env=None, buffer_output=True: (1, '', '')
Oleh Prypinb708e932018-03-18 17:34:20 +0100257 self.check(['gen', '-c', 'debug_goma', '//out/Default'], mbw=mbw, ret=1)
kjellandera013a022016-11-14 05:54:22 -0800258
Oleh Prypinb708e932018-03-18 17:34:20 +0100259 def test_gen_swarming(self):
kjellandera013a022016-11-14 05:54:22 -0800260 files = {
Oleh Prypinb708e932018-03-18 17:34:20 +0100261 '/tmp/swarming_targets': 'base_unittests\n',
kjellandera013a022016-11-14 05:54:22 -0800262 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
Oleh Prypinb708e932018-03-18 17:34:20 +0100263 "{'base_unittests': {"
264 " 'label': '//base:base_unittests',"
265 " 'type': 'raw',"
266 " 'args': [],"
kjellandera013a022016-11-14 05:54:22 -0800267 "}}\n"
268 ),
Oleh Prypinb708e932018-03-18 17:34:20 +0100269 '/fake_src/out/Default/base_unittests.runtime_deps': (
270 "base_unittests\n"
kjellandera013a022016-11-14 05:54:22 -0800271 ),
272 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100273 mbw = self.fake_mbw(files)
kjellandera013a022016-11-14 05:54:22 -0800274 self.check(['gen',
Oleh Prypinb708e932018-03-18 17:34:20 +0100275 '-c', 'debug_goma',
kjellandera013a022016-11-14 05:54:22 -0800276 '--swarming-targets-file', '/tmp/swarming_targets',
kjellandera013a022016-11-14 05:54:22 -0800277 '//out/Default'], mbw=mbw, ret=0)
Oleh Prypinb708e932018-03-18 17:34:20 +0100278 self.assertIn('/fake_src/out/Default/base_unittests.isolate',
kjellandera013a022016-11-14 05:54:22 -0800279 mbw.files)
Oleh Prypinb708e932018-03-18 17:34:20 +0100280 self.assertIn('/fake_src/out/Default/base_unittests.isolated.gen.json',
kjellandera013a022016-11-14 05:54:22 -0800281 mbw.files)
282
Oleh Prypinb708e932018-03-18 17:34:20 +0100283 def test_gen_swarming_android(self):
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800284 test_files = {
285 '/tmp/swarming_targets': 'base_unittests\n',
286 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
287 "{'base_unittests': {"
288 " 'label': '//base:base_unittests',"
289 " 'type': 'additional_compile_target',"
290 "}}\n"
291 ),
292 '/fake_src/out/Default/base_unittests.runtime_deps': (
293 "base_unittests\n"
294 ),
295 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100296 mbw = self.check(['gen', '-c', 'android_bot', '//out/Default',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800297 '--swarming-targets-file', '/tmp/swarming_targets',
298 '--isolate-map-file',
299 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
300 files=test_files, ret=0)
301
302 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
303 isolate_file_contents = ast.literal_eval(isolate_file)
304 files = isolate_file_contents['variables']['files']
305 command = isolate_file_contents['variables']['command']
306
Oleh Prypinb708e932018-03-18 17:34:20 +0100307 self.assertEqual(files, ['../../.vpython', '../../testing/test_env.py',
308 'base_unittests'])
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800309 self.assertEqual(command, [
kjellanderf9e2a362017-03-24 12:17:33 -0700310 '../../build/android/test_wrapper/logdog_wrapper.py',
311 '--target', 'base_unittests',
312 '--logdog-bin-cmd', '../../bin/logdog_butler',
ehmaldonado34623ce2017-09-08 07:03:13 -0700313 '--logcat-output-file', '${ISOLATED_OUTDIR}/logcats',
314 '--store-tombstones',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800315 ])
316
Oleh Prypinb708e932018-03-18 17:34:20 +0100317 def test_gen_swarming_android_junit_test(self):
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800318 test_files = {
319 '/tmp/swarming_targets': 'base_unittests\n',
320 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
321 "{'base_unittests': {"
322 " 'label': '//base:base_unittests',"
323 " 'type': 'junit_test',"
324 "}}\n"
325 ),
326 '/fake_src/out/Default/base_unittests.runtime_deps': (
327 "base_unittests\n"
328 ),
329 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100330 mbw = self.check(['gen', '-c', 'android_bot', '//out/Default',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800331 '--swarming-targets-file', '/tmp/swarming_targets',
332 '--isolate-map-file',
333 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
334 files=test_files, ret=0)
335
336 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
337 isolate_file_contents = ast.literal_eval(isolate_file)
338 files = isolate_file_contents['variables']['files']
339 command = isolate_file_contents['variables']['command']
340
Oleh Prypinb708e932018-03-18 17:34:20 +0100341 self.assertEqual(files, ['../../.vpython', '../../testing/test_env.py',
342 'base_unittests'])
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800343 self.assertEqual(command, [
kjellanderf9e2a362017-03-24 12:17:33 -0700344 '../../build/android/test_wrapper/logdog_wrapper.py',
345 '--target', 'base_unittests',
346 '--logdog-bin-cmd', '../../bin/logdog_butler',
ehmaldonado34623ce2017-09-08 07:03:13 -0700347 '--logcat-output-file', '${ISOLATED_OUTDIR}/logcats',
348 '--store-tombstones',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800349 ])
350
Oleh Prypinb708e932018-03-18 17:34:20 +0100351 def test_gen_timeout(self):
Edward Lemurbeffdd42017-09-27 13:07:47 +0200352 test_files = {
353 '/tmp/swarming_targets': 'base_unittests\n',
354 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
355 "{'base_unittests': {"
356 " 'label': '//base:base_unittests',"
357 " 'type': 'non_parallel_console_test_launcher',"
358 " 'timeout': 500,"
359 "}}\n"
360 ),
361 '/fake_src/out/Default/base_unittests.runtime_deps': (
362 "base_unittests\n"
363 ),
364 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100365 mbw = self.check(['gen', '-c', 'debug_goma', '//out/Default',
Edward Lemurbeffdd42017-09-27 13:07:47 +0200366 '--swarming-targets-file', '/tmp/swarming_targets',
367 '--isolate-map-file',
368 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
369 files=test_files, ret=0)
370
371 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
372 isolate_file_contents = ast.literal_eval(isolate_file)
373 files = isolate_file_contents['variables']['files']
374 command = isolate_file_contents['variables']['command']
375
376 self.assertEqual(files, [
Oleh Prypin739b8162018-05-17 13:28:29 +0200377 '../../.vpython',
Edward Lemurbeffdd42017-09-27 13:07:47 +0200378 '../../testing/test_env.py',
379 '../../third_party/gtest-parallel/gtest-parallel',
380 '../../third_party/gtest-parallel/gtest_parallel.py',
381 '../../tools_webrtc/gtest-parallel-wrapper.py',
382 'base_unittests',
383 ])
384 self.assertEqual(command, [
385 '../../testing/test_env.py',
386 '../../tools_webrtc/gtest-parallel-wrapper.py',
387 '--output_dir=${ISOLATED_OUTDIR}/test_logs',
388 '--gtest_color=no',
389 '--timeout=500',
390 '--retry_failed=3',
Edward Lemurbeffdd42017-09-27 13:07:47 +0200391 '--workers=1',
Edward Lemur2b67f5c2018-02-07 18:09:44 +0100392 './base_unittests',
Edward Lemurbeffdd42017-09-27 13:07:47 +0200393 '--',
394 '--asan=0',
395 '--lsan=0',
396 '--msan=0',
397 '--tsan=0',
398 ])
399
Oleh Prypinb708e932018-03-18 17:34:20 +0100400 def test_gen_script(self):
Edward Lemur20110752017-09-28 16:14:37 +0200401 test_files = {
402 '/tmp/swarming_targets': 'base_unittests_script\n',
403 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
404 "{'base_unittests_script': {"
405 " 'label': '//base:base_unittests',"
406 " 'type': 'script',"
407 " 'script': '//base/base_unittests_script.py',"
408 "}}\n"
409 ),
410 '/fake_src/out/Default/base_unittests.runtime_deps': (
411 "base_unittests\n"
412 "base_unittests_script.py\n"
413 ),
414 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100415 mbw = self.check(['gen', '-c', 'debug_goma', '//out/Default',
Edward Lemur20110752017-09-28 16:14:37 +0200416 '--swarming-targets-file', '/tmp/swarming_targets',
417 '--isolate-map-file',
418 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
419 files=test_files, ret=0)
420
421 isolate_file = (
422 mbw.files['/fake_src/out/Default/base_unittests_script.isolate'])
423 isolate_file_contents = ast.literal_eval(isolate_file)
424 files = isolate_file_contents['variables']['files']
425 command = isolate_file_contents['variables']['command']
426
427 self.assertEqual(files, [
Oleh Prypinb708e932018-03-18 17:34:20 +0100428 '../../.vpython', '../../testing/test_env.py',
429 'base_unittests', 'base_unittests_script.py',
Edward Lemur20110752017-09-28 16:14:37 +0200430 ])
431 self.assertEqual(command, [
432 '../../base/base_unittests_script.py',
433 ])
434
Oleh Prypinb708e932018-03-18 17:34:20 +0100435 def test_gen_raw(self):
Edward Lemur2b67f5c2018-02-07 18:09:44 +0100436 test_files = {
437 '/tmp/swarming_targets': 'base_unittests\n',
438 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
439 "{'base_unittests': {"
440 " 'label': '//base:base_unittests',"
441 " 'type': 'raw',"
442 "}}\n"
443 ),
444 '/fake_src/out/Default/base_unittests.runtime_deps': (
445 "base_unittests\n"
446 ),
447 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100448 mbw = self.check(['gen', '-c', 'debug_goma', '//out/Default',
Edward Lemur2b67f5c2018-02-07 18:09:44 +0100449 '--swarming-targets-file', '/tmp/swarming_targets',
450 '--isolate-map-file',
451 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
452 files=test_files, ret=0)
453
454 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
455 isolate_file_contents = ast.literal_eval(isolate_file)
456 files = isolate_file_contents['variables']['files']
457 command = isolate_file_contents['variables']['command']
458
459 self.assertEqual(files, [
Oleh Prypin739b8162018-05-17 13:28:29 +0200460 '../../.vpython',
Edward Lemur2b67f5c2018-02-07 18:09:44 +0100461 '../../testing/test_env.py',
462 'base_unittests',
463 ])
464 self.assertEqual(command, [
465 '../../testing/test_env.py',
466 './base_unittests',
467 '--asan=0',
468 '--lsan=0',
469 '--msan=0',
470 '--tsan=0',
471 ])
472
Oleh Prypinb708e932018-03-18 17:34:20 +0100473 def test_gen_non_parallel_console_test_launcher(self):
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800474 test_files = {
475 '/tmp/swarming_targets': 'base_unittests\n',
476 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
477 "{'base_unittests': {"
478 " 'label': '//base:base_unittests',"
479 " 'type': 'non_parallel_console_test_launcher',"
480 "}}\n"
481 ),
482 '/fake_src/out/Default/base_unittests.runtime_deps': (
483 "base_unittests\n"
484 ),
485 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100486 mbw = self.check(['gen', '-c', 'debug_goma', '//out/Default',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800487 '--swarming-targets-file', '/tmp/swarming_targets',
488 '--isolate-map-file',
489 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
490 files=test_files, ret=0)
491
492 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
493 isolate_file_contents = ast.literal_eval(isolate_file)
494 files = isolate_file_contents['variables']['files']
495 command = isolate_file_contents['variables']['command']
496
497 self.assertEqual(files, [
Oleh Prypin739b8162018-05-17 13:28:29 +0200498 '../../.vpython',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800499 '../../testing/test_env.py',
kjellander382f2b22017-04-11 04:07:01 -0700500 '../../third_party/gtest-parallel/gtest-parallel',
ehmaldonadoa7507eb2017-05-10 13:40:29 -0700501 '../../third_party/gtest-parallel/gtest_parallel.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200502 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800503 'base_unittests',
504 ])
505 self.assertEqual(command, [
506 '../../testing/test_env.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200507 '../../tools_webrtc/gtest-parallel-wrapper.py',
kjellander382f2b22017-04-11 04:07:01 -0700508 '--output_dir=${ISOLATED_OUTDIR}/test_logs',
ehmaldonado76e60e92017-05-04 06:18:26 -0700509 '--gtest_color=no',
510 '--timeout=900',
ehmaldonado2a280352017-05-05 04:33:57 -0700511 '--retry_failed=3',
kjellander382f2b22017-04-11 04:07:01 -0700512 '--workers=1',
Edward Lemur2b67f5c2018-02-07 18:09:44 +0100513 './base_unittests',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800514 '--',
515 '--asan=0',
kjellander461a5602017-05-05 06:39:16 -0700516 '--lsan=0',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800517 '--msan=0',
518 '--tsan=0',
519 ])
520
Oleh Prypinb708e932018-03-18 17:34:20 +0100521 def test_isolate_windowed_test_launcher_linux(self):
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800522 test_files = {
523 '/tmp/swarming_targets': 'base_unittests\n',
524 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
525 "{'base_unittests': {"
526 " 'label': '//base:base_unittests',"
527 " 'type': 'windowed_test_launcher',"
528 "}}\n"
529 ),
530 '/fake_src/out/Default/base_unittests.runtime_deps': (
531 "base_unittests\n"
532 "some_resource_file\n"
533 ),
534 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100535 mbw = self.check(['gen', '-c', 'debug_goma', '//out/Default',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800536 '--swarming-targets-file', '/tmp/swarming_targets',
537 '--isolate-map-file',
538 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
539 files=test_files, ret=0)
540
541 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
542 isolate_file_contents = ast.literal_eval(isolate_file)
543 files = isolate_file_contents['variables']['files']
544 command = isolate_file_contents['variables']['command']
545
546 self.assertEqual(files, [
Oleh Prypin739b8162018-05-17 13:28:29 +0200547 '../../.vpython',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800548 '../../testing/test_env.py',
549 '../../testing/xvfb.py',
550 '../../third_party/gtest-parallel/gtest-parallel',
ehmaldonadoa7507eb2017-05-10 13:40:29 -0700551 '../../third_party/gtest-parallel/gtest_parallel.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200552 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800553 'base_unittests',
554 'some_resource_file',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800555 ])
556 self.assertEqual(command, [
557 '../../testing/xvfb.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200558 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonado55833842017-02-13 03:58:13 -0800559 '--output_dir=${ISOLATED_OUTDIR}/test_logs',
ehmaldonado76e60e92017-05-04 06:18:26 -0700560 '--gtest_color=no',
561 '--timeout=900',
ehmaldonado2a280352017-05-05 04:33:57 -0700562 '--retry_failed=3',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800563 './base_unittests',
564 '--',
565 '--asan=0',
kjellander461a5602017-05-05 06:39:16 -0700566 '--lsan=0',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800567 '--msan=0',
568 '--tsan=0',
569 ])
570
Oleh Prypinb708e932018-03-18 17:34:20 +0100571 def test_gen_windowed_test_launcher_win(self):
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800572 files = {
573 '/tmp/swarming_targets': 'unittests\n',
574 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
575 "{'unittests': {"
576 " 'label': '//somewhere:unittests',"
577 " 'type': 'windowed_test_launcher',"
578 "}}\n"
579 ),
580 r'c:\fake_src\out\Default\unittests.exe.runtime_deps': (
581 "unittests.exe\n"
582 "some_dependency\n"
583 ),
584 }
585 mbw = self.fake_mbw(files=files, win32=True)
586 self.check(['gen',
Oleh Prypinb708e932018-03-18 17:34:20 +0100587 '-c', 'debug_goma',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800588 '--swarming-targets-file', '/tmp/swarming_targets',
589 '--isolate-map-file',
590 '/fake_src/testing/buildbot/gn_isolate_map.pyl',
591 '//out/Default'], mbw=mbw, ret=0)
592
593 isolate_file = mbw.files['c:\\fake_src\\out\\Default\\unittests.isolate']
594 isolate_file_contents = ast.literal_eval(isolate_file)
595 files = isolate_file_contents['variables']['files']
596 command = isolate_file_contents['variables']['command']
597
598 self.assertEqual(files, [
Oleh Prypin739b8162018-05-17 13:28:29 +0200599 '../../.vpython',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800600 '../../testing/test_env.py',
601 '../../third_party/gtest-parallel/gtest-parallel',
ehmaldonadoa7507eb2017-05-10 13:40:29 -0700602 '../../third_party/gtest-parallel/gtest_parallel.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200603 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800604 'some_dependency',
605 'unittests.exe',
606 ])
607 self.assertEqual(command, [
608 '../../testing/test_env.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200609 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonado55833842017-02-13 03:58:13 -0800610 '--output_dir=${ISOLATED_OUTDIR}\\test_logs',
ehmaldonado76e60e92017-05-04 06:18:26 -0700611 '--gtest_color=no',
612 '--timeout=900',
ehmaldonado2a280352017-05-05 04:33:57 -0700613 '--retry_failed=3',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800614 r'.\unittests.exe',
615 '--',
616 '--asan=0',
kjellander461a5602017-05-05 06:39:16 -0700617 '--lsan=0',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800618 '--msan=0',
619 '--tsan=0',
620 ])
621
Oleh Prypinb708e932018-03-18 17:34:20 +0100622 def test_gen_console_test_launcher(self):
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800623 test_files = {
624 '/tmp/swarming_targets': 'base_unittests\n',
625 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
626 "{'base_unittests': {"
627 " 'label': '//base:base_unittests',"
628 " 'type': 'console_test_launcher',"
629 "}}\n"
630 ),
631 '/fake_src/out/Default/base_unittests.runtime_deps': (
632 "base_unittests\n"
633 ),
634 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100635 mbw = self.check(['gen', '-c', 'debug_goma', '//out/Default',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800636 '--swarming-targets-file', '/tmp/swarming_targets',
637 '--isolate-map-file',
638 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
639 files=test_files, ret=0)
640
641 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
642 isolate_file_contents = ast.literal_eval(isolate_file)
643 files = isolate_file_contents['variables']['files']
644 command = isolate_file_contents['variables']['command']
645
646 self.assertEqual(files, [
Oleh Prypin739b8162018-05-17 13:28:29 +0200647 '../../.vpython',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800648 '../../testing/test_env.py',
649 '../../third_party/gtest-parallel/gtest-parallel',
ehmaldonadoa7507eb2017-05-10 13:40:29 -0700650 '../../third_party/gtest-parallel/gtest_parallel.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200651 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800652 'base_unittests',
653 ])
654 self.assertEqual(command, [
655 '../../testing/test_env.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200656 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonado55833842017-02-13 03:58:13 -0800657 '--output_dir=${ISOLATED_OUTDIR}/test_logs',
ehmaldonado76e60e92017-05-04 06:18:26 -0700658 '--gtest_color=no',
659 '--timeout=900',
ehmaldonado2a280352017-05-05 04:33:57 -0700660 '--retry_failed=3',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800661 './base_unittests',
662 '--',
663 '--asan=0',
kjellander461a5602017-05-05 06:39:16 -0700664 '--lsan=0',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800665 '--msan=0',
666 '--tsan=0',
667 ])
668
Oleh Prypinb708e932018-03-18 17:34:20 +0100669 def test_isolate_console_test_launcher_memcheck(self):
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800670 test_files = {
671 '/tmp/swarming_targets': 'base_unittests\n',
672 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
673 "{'base_unittests': {"
674 " 'label': '//base:base_unittests',"
675 " 'type': 'console_test_launcher',"
676 "}}\n"
677 ),
678 '/fake_src/out/Release/base_unittests.runtime_deps': (
679 "base_unittests\n"
680 "lots_of_memcheck_dependencies\n"
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200681 "../../tools_webrtc/valgrind/webrtc_tests.sh\n"
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800682 ),
683 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100684 mbw = self.check(['gen', '-c', 'memcheck_bot', '//out/Release',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800685 '--swarming-targets-file', '/tmp/swarming_targets',
686 '--isolate-map-file',
687 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
688 files=test_files, ret=0)
689
690 isolate_file = mbw.files['/fake_src/out/Release/base_unittests.isolate']
691 isolate_file_contents = ast.literal_eval(isolate_file)
692 files = isolate_file_contents['variables']['files']
693 command = isolate_file_contents['variables']['command']
694
695 self.assertEqual(files, [
Oleh Prypin739b8162018-05-17 13:28:29 +0200696 '../../.vpython',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800697 '../../testing/test_env.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200698 '../../tools_webrtc/valgrind/webrtc_tests.sh',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800699 'base_unittests',
700 'lots_of_memcheck_dependencies',
701 ])
702 self.assertEqual(command, [
703 '../../testing/test_env.py',
704 'bash',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200705 '../../tools_webrtc/valgrind/webrtc_tests.sh',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800706 '--tool',
707 'memcheck',
708 '--target',
709 'Release',
710 '--build-dir',
711 '..',
712 '--test',
713 './base_unittests',
714 '--',
715 '--asan=0',
kjellander461a5602017-05-05 06:39:16 -0700716 '--lsan=0',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800717 '--msan=0',
718 '--tsan=0',
719 ])
kjellandera013a022016-11-14 05:54:22 -0800720
Oleh Prypin739b8162018-05-17 13:28:29 +0200721 def test_isolate_test_launcher_with_webcam(self):
722 test_files = {
723 '/tmp/swarming_targets': 'base_unittests\n',
724 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
725 "{'base_unittests': {"
726 " 'label': '//base:base_unittests',"
727 " 'type': 'console_test_launcher',"
728 " 'use_webcam': True,"
729 "}}\n"
730 ),
731 '/fake_src/out/Default/base_unittests.runtime_deps': (
732 "base_unittests\n"
733 "some_resource_file\n"
734 ),
735 }
736 mbw = self.check(['gen', '-c', 'debug_goma', '//out/Default',
737 '--swarming-targets-file', '/tmp/swarming_targets',
738 '--isolate-map-file',
739 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
740 files=test_files, ret=0)
741
742 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
743 isolate_file_contents = ast.literal_eval(isolate_file)
744 files = isolate_file_contents['variables']['files']
745 command = isolate_file_contents['variables']['command']
746
747 self.assertEqual(files, [
748 '../../.vpython',
749 '../../testing/test_env.py',
750 '../../third_party/gtest-parallel/gtest-parallel',
751 '../../third_party/gtest-parallel/gtest_parallel.py',
752 '../../tools_webrtc/ensure_webcam_is_running.py',
753 '../../tools_webrtc/gtest-parallel-wrapper.py',
754 'base_unittests',
755 'some_resource_file',
756 ])
757 self.assertEqual(command, [
758 '../../tools_webrtc/ensure_webcam_is_running.py',
759 '../../testing/test_env.py',
760 '../../tools_webrtc/gtest-parallel-wrapper.py',
761 '--output_dir=${ISOLATED_OUTDIR}/test_logs',
762 '--gtest_color=no',
763 '--timeout=900',
764 '--retry_failed=3',
765 './base_unittests',
766 '--',
767 '--asan=0',
768 '--lsan=0',
769 '--msan=0',
770 '--tsan=0',
771 ])
772
Oleh Prypinb708e932018-03-18 17:34:20 +0100773 def test_isolate(self):
kjellandera013a022016-11-14 05:54:22 -0800774 files = {
775 '/fake_src/out/Default/toolchain.ninja': "",
776 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
777 "{'base_unittests': {"
778 " 'label': '//base:base_unittests',"
ehmaldonadob2fcf6d2016-11-15 12:20:30 -0800779 " 'type': 'non_parallel_console_test_launcher',"
kjellandera013a022016-11-14 05:54:22 -0800780 "}}\n"
781 ),
782 '/fake_src/out/Default/base_unittests.runtime_deps': (
783 "base_unittests\n"
784 ),
785 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100786 self.check(['isolate', '-c', 'debug_goma', '//out/Default',
kjellandera013a022016-11-14 05:54:22 -0800787 'base_unittests'], files=files, ret=0)
788
789 # test running isolate on an existing build_dir
790 files['/fake_src/out/Default/args.gn'] = 'is_debug = True\n'
791 self.check(['isolate', '//out/Default', 'base_unittests'],
792 files=files, ret=0)
kjellandera013a022016-11-14 05:54:22 -0800793 files['/fake_src/out/Default/mb_type'] = 'gn\n'
794 self.check(['isolate', '//out/Default', 'base_unittests'],
795 files=files, ret=0)
796
Oleh Prypinb708e932018-03-18 17:34:20 +0100797 def test_run(self):
kjellandera013a022016-11-14 05:54:22 -0800798 files = {
799 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
800 "{'base_unittests': {"
801 " 'label': '//base:base_unittests',"
ehmaldonadob2fcf6d2016-11-15 12:20:30 -0800802 " 'type': 'windowed_test_launcher',"
kjellandera013a022016-11-14 05:54:22 -0800803 "}}\n"
804 ),
805 '/fake_src/out/Default/base_unittests.runtime_deps': (
806 "base_unittests\n"
807 ),
808 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100809 self.check(['run', '-c', 'debug_goma', '//out/Default',
kjellandera013a022016-11-14 05:54:22 -0800810 'base_unittests'], files=files, ret=0)
811
Oleh Prypinb708e932018-03-18 17:34:20 +0100812 def test_run_swarmed(self):
813 files = {
814 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
815 "{'base_unittests': {"
816 " 'label': '//base:base_unittests',"
817 " 'type': 'raw',"
818 " 'args': [],"
819 "}}\n"
820 ),
821 '/fake_src/out/Default/base_unittests.runtime_deps': (
822 "base_unittests\n"
823 ),
824 }
kjellandera013a022016-11-14 05:54:22 -0800825
Oleh Prypinb708e932018-03-18 17:34:20 +0100826 def run_stub(cmd, **_kwargs):
827 if 'isolate.py' in cmd[1]:
828 return 0, 'fake_hash base_unittests', ''
829 else:
830 return 0, '', ''
831
832 mbw = self.fake_mbw(files=files)
833 mbw.Run = run_stub
834 self.check(['run', '-s', '-c', 'debug_goma', '//out/Default',
835 'base_unittests'], mbw=mbw, ret=0)
836 self.check(['run', '-s', '-c', 'debug_goma', '-d', 'os', 'Win7',
837 '//out/Default', 'base_unittests'], mbw=mbw, ret=0)
838
839 def test_lookup(self):
840 self.check(['lookup', '-c', 'debug_goma'], ret=0)
841
842 def test_lookup_goma_dir_expansion(self):
843 self.check(['lookup', '-c', 'rel_bot', '-g', '/foo'], ret=0,
kjellandera013a022016-11-14 05:54:22 -0800844 out=('\n'
845 'Writing """\\\n'
Oleh Prypinb708e932018-03-18 17:34:20 +0100846 'enable_doom_melon = true\n'
kjellandera013a022016-11-14 05:54:22 -0800847 'goma_dir = "/foo"\n'
848 'is_debug = false\n'
849 'use_goma = true\n'
850 '""" to _path_/args.gn.\n\n'
851 '/fake_src/buildtools/linux64/gn gen _path_\n'))
852
kjellandera013a022016-11-14 05:54:22 -0800853 def test_help(self):
854 orig_stdout = sys.stdout
855 try:
856 sys.stdout = StringIO.StringIO()
857 self.assertRaises(SystemExit, self.check, ['-h'])
858 self.assertRaises(SystemExit, self.check, ['help'])
859 self.assertRaises(SystemExit, self.check, ['help', 'gen'])
860 finally:
861 sys.stdout = orig_stdout
862
863 def test_multiple_phases(self):
864 # Check that not passing a --phase to a multi-phase builder fails.
865 mbw = self.check(['lookup', '-m', 'fake_master', '-b', 'fake_multi_phase'],
866 ret=1)
867 self.assertIn('Must specify a build --phase', mbw.out)
868
869 # Check that passing a --phase to a single-phase builder fails.
Oleh Prypinb708e932018-03-18 17:34:20 +0100870 mbw = self.check(['lookup', '-m', 'fake_master', '-b', 'fake_builder',
kjellandera013a022016-11-14 05:54:22 -0800871 '--phase', 'phase_1'], ret=1)
872 self.assertIn('Must not specify a build --phase', mbw.out)
873
874 # Check that passing a wrong phase key to a multi-phase builder fails.
875 mbw = self.check(['lookup', '-m', 'fake_master', '-b', 'fake_multi_phase',
876 '--phase', 'wrong_phase'], ret=1)
877 self.assertIn('Phase wrong_phase doesn\'t exist', mbw.out)
878
879 # Check that passing a correct phase key to a multi-phase builder passes.
880 mbw = self.check(['lookup', '-m', 'fake_master', '-b', 'fake_multi_phase',
881 '--phase', 'phase_1'], ret=0)
882 self.assertIn('phase = 1', mbw.out)
883
884 mbw = self.check(['lookup', '-m', 'fake_master', '-b', 'fake_multi_phase',
885 '--phase', 'phase_2'], ret=0)
886 self.assertIn('phase = 2', mbw.out)
887
888 def test_validate(self):
889 mbw = self.fake_mbw()
890 self.check(['validate'], mbw=mbw, ret=0)
891
kjellandera013a022016-11-14 05:54:22 -0800892
893if __name__ == '__main__':
894 unittest.main()