blob: 5b41644df361b4967b6929ba6b98052c640da52e [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):
72 if env:
73 self.cross_compile = env.get('GYP_CROSSCOMPILE')
74 self.calls.append(cmd)
75 if self.cmds:
76 return self.cmds.pop(0)
77 return 0, '', ''
78
79 def Print(self, *args, **kwargs):
80 sep = kwargs.get('sep', ' ')
81 end = kwargs.get('end', '\n')
82 f = kwargs.get('file', sys.stdout)
83 if f == sys.stderr:
84 self.err += sep.join(args) + end
85 else:
86 self.out += sep.join(args) + end
87
88 def TempFile(self, mode='w'):
89 return FakeFile(self.files)
90
91 def RemoveFile(self, path):
92 del self.files[path]
93
94 def RemoveDirectory(self, path):
95 self.rmdirs.append(path)
96 files_to_delete = [f for f in self.files if f.startswith(path)]
97 for f in files_to_delete:
98 self.files[f] = None
99
100
101class FakeFile(object):
102 def __init__(self, files):
103 self.name = '/tmp/file'
104 self.buf = ''
105 self.files = files
106
107 def write(self, contents):
108 self.buf += contents
109
110 def close(self):
111 self.files[self.name] = self.buf
112
113
114TEST_CONFIG = """\
115{
116 'masters': {
117 'chromium': {},
118 'fake_master': {
119 'fake_builder': 'gyp_rel_bot',
120 'fake_gn_builder': 'gn_rel_bot',
121 'fake_gyp_crosscompile_builder': 'gyp_crosscompile',
122 'fake_gn_debug_builder': 'gn_debug_goma',
123 'fake_gyp_builder': 'gyp_debug',
124 'fake_gn_args_bot': '//build/args/bots/fake_master/fake_gn_args_bot.gn',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800125 'fake_memcheck_bot': 'gn_memcheck_bot',
kjellandera013a022016-11-14 05:54:22 -0800126 'fake_multi_phase': { 'phase_1': 'gn_phase_1', 'phase_2': 'gn_phase_2'},
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800127 'fake_android_bot': 'gn_android_bot',
kjellandera013a022016-11-14 05:54:22 -0800128 },
129 },
130 'configs': {
131 'gyp_rel_bot': ['gyp', 'rel', 'goma'],
132 'gn_debug_goma': ['gn', 'debug', 'goma'],
133 'gyp_debug': ['gyp', 'debug', 'fake_feature1'],
134 'gn_rel_bot': ['gn', 'rel', 'goma'],
135 'gyp_crosscompile': ['gyp', 'crosscompile'],
136 'gn_phase_1': ['gn', 'phase_1'],
137 'gn_phase_2': ['gn', 'phase_2'],
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800138 'gn_memcheck_bot': ['gn', 'memcheck'],
139 'gn_android_bot': ['gn', 'android'],
kjellandera013a022016-11-14 05:54:22 -0800140 },
141 'mixins': {
142 'crosscompile': {
143 'gyp_crosscompile': True,
144 },
145 'fake_feature1': {
146 'gn_args': 'enable_doom_melon=true',
147 'gyp_defines': 'doom_melon=1',
148 },
149 'gyp': {'type': 'gyp'},
150 'gn': {'type': 'gn'},
151 'goma': {
152 'gn_args': 'use_goma=true',
153 'gyp_defines': 'goma=1',
154 },
155 'phase_1': {
156 'gn_args': 'phase=1',
157 'gyp_args': 'phase=1',
158 },
159 'phase_2': {
160 'gn_args': 'phase=2',
161 'gyp_args': 'phase=2',
162 },
163 'rel': {
164 'gn_args': 'is_debug=false',
165 },
166 'debug': {
167 'gn_args': 'is_debug=true',
168 },
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800169 'memcheck': {
170 'gn_args': 'rtc_use_memcheck=true',
171 },
172 'android': {
173 'gn_args': 'target_os="android"',
174 }
kjellandera013a022016-11-14 05:54:22 -0800175 },
176}
177"""
178
kjellandera013a022016-11-14 05:54:22 -0800179GYP_HACKS_CONFIG = """\
180{
181 'masters': {
182 'chromium': {},
183 'fake_master': {
184 'fake_builder': 'fake_config',
185 },
186 },
187 'configs': {
188 'fake_config': ['fake_mixin'],
189 },
190 'mixins': {
191 'fake_mixin': {
192 'type': 'gyp',
193 'gn_args': '',
194 'gyp_defines':
195 ('foo=bar llvm_force_head_revision=1 '
196 'gyp_link_concurrency=1 baz=1'),
197 },
198 },
199}
200"""
201
202
203class UnitTest(unittest.TestCase):
204 def fake_mbw(self, files=None, win32=False):
205 mbw = FakeMBW(win32=win32)
206 mbw.files.setdefault(mbw.default_config, TEST_CONFIG)
207 mbw.files.setdefault(
208 mbw.ToAbsPath('//testing/buildbot/gn_isolate_map.pyl'),
209 '''{
210 "foo_unittests": {
211 "label": "//foo:foo_unittests",
212 "type": "console_test_launcher",
213 "args": [],
214 },
215 }''')
216 mbw.files.setdefault(
217 mbw.ToAbsPath('//build/args/bots/fake_master/fake_gn_args_bot.gn'),
218 'is_debug = false\n')
219 if files:
220 for path, contents in files.items():
221 mbw.files[path] = contents
222 return mbw
223
224 def check(self, args, mbw=None, files=None, out=None, err=None, ret=None):
225 if not mbw:
226 mbw = self.fake_mbw(files)
227
228 actual_ret = mbw.Main(args)
229
230 self.assertEqual(actual_ret, ret)
231 if out is not None:
232 self.assertEqual(mbw.out, out)
233 if err is not None:
234 self.assertEqual(mbw.err, err)
235 return mbw
236
237 def test_clobber(self):
238 files = {
239 '/fake_src/out/Debug': None,
240 '/fake_src/out/Debug/mb_type': None,
241 }
242 mbw = self.fake_mbw(files)
243
244 # The first time we run this, the build dir doesn't exist, so no clobber.
245 self.check(['gen', '-c', 'gn_debug_goma', '//out/Debug'], mbw=mbw, ret=0)
246 self.assertEqual(mbw.rmdirs, [])
247 self.assertEqual(mbw.files['/fake_src/out/Debug/mb_type'], 'gn')
248
249 # The second time we run this, the build dir exists and matches, so no
250 # clobber.
251 self.check(['gen', '-c', 'gn_debug_goma', '//out/Debug'], mbw=mbw, ret=0)
252 self.assertEqual(mbw.rmdirs, [])
253 self.assertEqual(mbw.files['/fake_src/out/Debug/mb_type'], 'gn')
254
255 # Now we switch build types; this should result in a clobber.
256 self.check(['gen', '-c', 'gyp_debug', '//out/Debug'], mbw=mbw, ret=0)
257 self.assertEqual(mbw.rmdirs, ['/fake_src/out/Debug'])
258 self.assertEqual(mbw.files['/fake_src/out/Debug/mb_type'], 'gyp')
259
260 # Now we delete mb_type; this checks the case where the build dir
261 # exists but wasn't populated by mb; this should also result in a clobber.
262 del mbw.files['/fake_src/out/Debug/mb_type']
263 self.check(['gen', '-c', 'gyp_debug', '//out/Debug'], mbw=mbw, ret=0)
264 self.assertEqual(mbw.rmdirs,
265 ['/fake_src/out/Debug', '/fake_src/out/Debug'])
266 self.assertEqual(mbw.files['/fake_src/out/Debug/mb_type'], 'gyp')
267
268 def test_gn_analyze(self):
269 files = {'/tmp/in.json': '''{\
270 "files": ["foo/foo_unittest.cc"],
271 "test_targets": ["foo_unittests"],
272 "additional_compile_targets": ["all"]
273 }''',
274 '/tmp/out.json.gn': '''{\
275 "status": "Found dependency",
276 "compile_targets": ["//foo:foo_unittests"],
277 "test_targets": ["//foo:foo_unittests"]
278 }'''}
279
280 mbw = self.fake_mbw(files)
281 mbw.Call = lambda cmd, env=None, buffer_output=True: (0, '', '')
282
283 self.check(['analyze', '-c', 'gn_debug_goma', '//out/Default',
284 '/tmp/in.json', '/tmp/out.json'], mbw=mbw, ret=0)
285 out = json.loads(mbw.files['/tmp/out.json'])
286 self.assertEqual(out, {
287 'status': 'Found dependency',
288 'compile_targets': ['foo:foo_unittests'],
289 'test_targets': ['foo_unittests']
290 })
291
292 def test_gn_gen(self):
293 mbw = self.fake_mbw()
294 self.check(['gen', '-c', 'gn_debug_goma', '//out/Default', '-g', '/goma'],
295 mbw=mbw, ret=0)
296 self.assertMultiLineEqual(mbw.files['/fake_src/out/Default/args.gn'],
297 ('goma_dir = "/goma"\n'
298 'is_debug = true\n'
299 'use_goma = true\n'))
300
301 # Make sure we log both what is written to args.gn and the command line.
302 self.assertIn('Writing """', mbw.out)
303 self.assertIn('/fake_src/buildtools/linux64/gn gen //out/Default --check',
304 mbw.out)
305
306 mbw = self.fake_mbw(win32=True)
307 self.check(['gen', '-c', 'gn_debug_goma', '-g', 'c:\\goma', '//out/Debug'],
308 mbw=mbw, ret=0)
309 self.assertMultiLineEqual(mbw.files['c:\\fake_src\\out\\Debug\\args.gn'],
310 ('goma_dir = "c:\\\\goma"\n'
311 'is_debug = true\n'
312 'use_goma = true\n'))
313 self.assertIn('c:\\fake_src\\buildtools\\win\\gn.exe gen //out/Debug '
314 '--check\n', mbw.out)
315
316 mbw = self.fake_mbw()
317 self.check(['gen', '-m', 'fake_master', '-b', 'fake_gn_args_bot',
318 '//out/Debug'],
319 mbw=mbw, ret=0)
320 self.assertEqual(
321 mbw.files['/fake_src/out/Debug/args.gn'],
322 'import("//build/args/bots/fake_master/fake_gn_args_bot.gn")\n')
323
324
325 def test_gn_gen_fails(self):
326 mbw = self.fake_mbw()
327 mbw.Call = lambda cmd, env=None, buffer_output=True: (1, '', '')
328 self.check(['gen', '-c', 'gn_debug_goma', '//out/Default'], mbw=mbw, ret=1)
329
330 def test_gn_gen_swarming(self):
331 files = {
kjellandera013a022016-11-14 05:54:22 -0800332 '/tmp/swarming_targets': 'cc_perftests\n',
333 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
334 "{'cc_perftests': {"
335 " 'label': '//cc:cc_perftests',"
ehmaldonadob2fcf6d2016-11-15 12:20:30 -0800336 " 'type': 'console_test_launcher',"
kjellandera013a022016-11-14 05:54:22 -0800337 "}}\n"
338 ),
339 'c:\\fake_src\out\Default\cc_perftests.exe.runtime_deps': (
340 "cc_perftests\n"
341 ),
342 }
343 mbw = self.fake_mbw(files=files, win32=True)
344 self.check(['gen',
345 '-c', 'gn_debug_goma',
346 '--swarming-targets-file', '/tmp/swarming_targets',
347 '--isolate-map-file',
348 '/fake_src/testing/buildbot/gn_isolate_map.pyl',
349 '//out/Default'], mbw=mbw, ret=0)
350 self.assertIn('c:\\fake_src\\out\\Default\\cc_perftests.isolate',
351 mbw.files)
352 self.assertIn('c:\\fake_src\\out\\Default\\cc_perftests.isolated.gen.json',
353 mbw.files)
354
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800355 def test_gn_gen_swarming_android(self):
356 test_files = {
357 '/tmp/swarming_targets': 'base_unittests\n',
358 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
359 "{'base_unittests': {"
360 " 'label': '//base:base_unittests',"
361 " 'type': 'additional_compile_target',"
362 "}}\n"
363 ),
364 '/fake_src/out/Default/base_unittests.runtime_deps': (
365 "base_unittests\n"
366 ),
367 }
368 mbw = self.check(['gen', '-c', 'gn_android_bot', '//out/Default',
369 '--swarming-targets-file', '/tmp/swarming_targets',
370 '--isolate-map-file',
371 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
372 files=test_files, ret=0)
373
374 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
375 isolate_file_contents = ast.literal_eval(isolate_file)
376 files = isolate_file_contents['variables']['files']
377 command = isolate_file_contents['variables']['command']
378
Patrik Höglund91861a52018-02-14 08:41:16 +0100379 self.assertEqual(files, ['../../.vpython', 'base_unittests'])
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800380 self.assertEqual(command, [
kjellanderf9e2a362017-03-24 12:17:33 -0700381 '../../build/android/test_wrapper/logdog_wrapper.py',
382 '--target', 'base_unittests',
383 '--logdog-bin-cmd', '../../bin/logdog_butler',
ehmaldonado34623ce2017-09-08 07:03:13 -0700384 '--logcat-output-file', '${ISOLATED_OUTDIR}/logcats',
385 '--store-tombstones',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800386 ])
387
388 def test_gn_gen_swarming_android_junit_test(self):
389 test_files = {
390 '/tmp/swarming_targets': 'base_unittests\n',
391 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
392 "{'base_unittests': {"
393 " 'label': '//base:base_unittests',"
394 " 'type': 'junit_test',"
395 "}}\n"
396 ),
397 '/fake_src/out/Default/base_unittests.runtime_deps': (
398 "base_unittests\n"
399 ),
400 }
401 mbw = self.check(['gen', '-c', 'gn_android_bot', '//out/Default',
402 '--swarming-targets-file', '/tmp/swarming_targets',
403 '--isolate-map-file',
404 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
405 files=test_files, ret=0)
406
407 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
408 isolate_file_contents = ast.literal_eval(isolate_file)
409 files = isolate_file_contents['variables']['files']
410 command = isolate_file_contents['variables']['command']
411
Patrik Höglund91861a52018-02-14 08:41:16 +0100412 self.assertEqual(files, ['../../.vpython', 'base_unittests'])
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800413 self.assertEqual(command, [
kjellanderf9e2a362017-03-24 12:17:33 -0700414 '../../build/android/test_wrapper/logdog_wrapper.py',
415 '--target', 'base_unittests',
416 '--logdog-bin-cmd', '../../bin/logdog_butler',
ehmaldonado34623ce2017-09-08 07:03:13 -0700417 '--logcat-output-file', '${ISOLATED_OUTDIR}/logcats',
418 '--store-tombstones',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800419 ])
420
Edward Lemurbeffdd42017-09-27 13:07:47 +0200421 def test_gn_gen_timeout(self):
422 test_files = {
423 '/tmp/swarming_targets': 'base_unittests\n',
424 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
425 "{'base_unittests': {"
426 " 'label': '//base:base_unittests',"
427 " 'type': 'non_parallel_console_test_launcher',"
428 " 'timeout': 500,"
429 "}}\n"
430 ),
431 '/fake_src/out/Default/base_unittests.runtime_deps': (
432 "base_unittests\n"
433 ),
434 }
435 mbw = self.check(['gen', '-c', 'gn_debug_goma', '//out/Default',
436 '--swarming-targets-file', '/tmp/swarming_targets',
437 '--isolate-map-file',
438 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
439 files=test_files, ret=0)
440
441 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
442 isolate_file_contents = ast.literal_eval(isolate_file)
443 files = isolate_file_contents['variables']['files']
444 command = isolate_file_contents['variables']['command']
445
446 self.assertEqual(files, [
447 '../../testing/test_env.py',
448 '../../third_party/gtest-parallel/gtest-parallel',
449 '../../third_party/gtest-parallel/gtest_parallel.py',
450 '../../tools_webrtc/gtest-parallel-wrapper.py',
451 'base_unittests',
452 ])
453 self.assertEqual(command, [
454 '../../testing/test_env.py',
455 '../../tools_webrtc/gtest-parallel-wrapper.py',
456 '--output_dir=${ISOLATED_OUTDIR}/test_logs',
457 '--gtest_color=no',
458 '--timeout=500',
459 '--retry_failed=3',
Edward Lemurbeffdd42017-09-27 13:07:47 +0200460 '--workers=1',
Edward Lemur2b67f5c2018-02-07 18:09:44 +0100461 './base_unittests',
Edward Lemurbeffdd42017-09-27 13:07:47 +0200462 '--',
463 '--asan=0',
464 '--lsan=0',
465 '--msan=0',
466 '--tsan=0',
467 ])
468
Edward Lemur20110752017-09-28 16:14:37 +0200469 def test_gn_gen_script(self):
470 test_files = {
471 '/tmp/swarming_targets': 'base_unittests_script\n',
472 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
473 "{'base_unittests_script': {"
474 " 'label': '//base:base_unittests',"
475 " 'type': 'script',"
476 " 'script': '//base/base_unittests_script.py',"
477 "}}\n"
478 ),
479 '/fake_src/out/Default/base_unittests.runtime_deps': (
480 "base_unittests\n"
481 "base_unittests_script.py\n"
482 ),
483 }
484 mbw = self.check(['gen', '-c', 'gn_debug_goma', '//out/Default',
485 '--swarming-targets-file', '/tmp/swarming_targets',
486 '--isolate-map-file',
487 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
488 files=test_files, ret=0)
489
490 isolate_file = (
491 mbw.files['/fake_src/out/Default/base_unittests_script.isolate'])
492 isolate_file_contents = ast.literal_eval(isolate_file)
493 files = isolate_file_contents['variables']['files']
494 command = isolate_file_contents['variables']['command']
495
496 self.assertEqual(files, [
Patrik Höglund91861a52018-02-14 08:41:16 +0100497 '../../.vpython',
Edward Lemur20110752017-09-28 16:14:37 +0200498 'base_unittests',
499 'base_unittests_script.py',
500 ])
501 self.assertEqual(command, [
502 '../../base/base_unittests_script.py',
503 ])
504
Edward Lemur2b67f5c2018-02-07 18:09:44 +0100505 def test_gn_gen_raw(self):
506 test_files = {
507 '/tmp/swarming_targets': 'base_unittests\n',
508 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
509 "{'base_unittests': {"
510 " 'label': '//base:base_unittests',"
511 " 'type': 'raw',"
512 "}}\n"
513 ),
514 '/fake_src/out/Default/base_unittests.runtime_deps': (
515 "base_unittests\n"
516 ),
517 }
518 mbw = self.check(['gen', '-c', 'gn_debug_goma', '//out/Default',
519 '--swarming-targets-file', '/tmp/swarming_targets',
520 '--isolate-map-file',
521 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
522 files=test_files, ret=0)
523
524 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
525 isolate_file_contents = ast.literal_eval(isolate_file)
526 files = isolate_file_contents['variables']['files']
527 command = isolate_file_contents['variables']['command']
528
529 self.assertEqual(files, [
530 '../../testing/test_env.py',
531 'base_unittests',
532 ])
533 self.assertEqual(command, [
534 '../../testing/test_env.py',
535 './base_unittests',
536 '--asan=0',
537 '--lsan=0',
538 '--msan=0',
539 '--tsan=0',
540 ])
541
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800542 def test_gn_gen_non_parallel_console_test_launcher(self):
543 test_files = {
544 '/tmp/swarming_targets': 'base_unittests\n',
545 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
546 "{'base_unittests': {"
547 " 'label': '//base:base_unittests',"
548 " 'type': 'non_parallel_console_test_launcher',"
549 "}}\n"
550 ),
551 '/fake_src/out/Default/base_unittests.runtime_deps': (
552 "base_unittests\n"
553 ),
554 }
555 mbw = self.check(['gen', '-c', 'gn_debug_goma', '//out/Default',
556 '--swarming-targets-file', '/tmp/swarming_targets',
557 '--isolate-map-file',
558 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
559 files=test_files, ret=0)
560
561 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
562 isolate_file_contents = ast.literal_eval(isolate_file)
563 files = isolate_file_contents['variables']['files']
564 command = isolate_file_contents['variables']['command']
565
566 self.assertEqual(files, [
567 '../../testing/test_env.py',
kjellander382f2b22017-04-11 04:07:01 -0700568 '../../third_party/gtest-parallel/gtest-parallel',
ehmaldonadoa7507eb2017-05-10 13:40:29 -0700569 '../../third_party/gtest-parallel/gtest_parallel.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200570 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800571 'base_unittests',
572 ])
573 self.assertEqual(command, [
574 '../../testing/test_env.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200575 '../../tools_webrtc/gtest-parallel-wrapper.py',
kjellander382f2b22017-04-11 04:07:01 -0700576 '--output_dir=${ISOLATED_OUTDIR}/test_logs',
ehmaldonado76e60e92017-05-04 06:18:26 -0700577 '--gtest_color=no',
578 '--timeout=900',
ehmaldonado2a280352017-05-05 04:33:57 -0700579 '--retry_failed=3',
kjellander382f2b22017-04-11 04:07:01 -0700580 '--workers=1',
Edward Lemur2b67f5c2018-02-07 18:09:44 +0100581 './base_unittests',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800582 '--',
583 '--asan=0',
kjellander461a5602017-05-05 06:39:16 -0700584 '--lsan=0',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800585 '--msan=0',
586 '--tsan=0',
587 ])
588
589 def test_gn_isolate_windowed_test_launcher_linux(self):
590 test_files = {
591 '/tmp/swarming_targets': 'base_unittests\n',
592 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
593 "{'base_unittests': {"
594 " 'label': '//base:base_unittests',"
595 " 'type': 'windowed_test_launcher',"
596 "}}\n"
597 ),
598 '/fake_src/out/Default/base_unittests.runtime_deps': (
599 "base_unittests\n"
600 "some_resource_file\n"
601 ),
602 }
603 mbw = self.check(['gen', '-c', 'gn_debug_goma', '//out/Default',
604 '--swarming-targets-file', '/tmp/swarming_targets',
605 '--isolate-map-file',
606 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
607 files=test_files, ret=0)
608
609 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
610 isolate_file_contents = ast.literal_eval(isolate_file)
611 files = isolate_file_contents['variables']['files']
612 command = isolate_file_contents['variables']['command']
613
614 self.assertEqual(files, [
615 '../../testing/test_env.py',
616 '../../testing/xvfb.py',
617 '../../third_party/gtest-parallel/gtest-parallel',
ehmaldonadoa7507eb2017-05-10 13:40:29 -0700618 '../../third_party/gtest-parallel/gtest_parallel.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200619 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800620 'base_unittests',
621 'some_resource_file',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800622 ])
623 self.assertEqual(command, [
624 '../../testing/xvfb.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200625 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonado55833842017-02-13 03:58:13 -0800626 '--output_dir=${ISOLATED_OUTDIR}/test_logs',
ehmaldonado76e60e92017-05-04 06:18:26 -0700627 '--gtest_color=no',
628 '--timeout=900',
ehmaldonado2a280352017-05-05 04:33:57 -0700629 '--retry_failed=3',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800630 './base_unittests',
631 '--',
632 '--asan=0',
kjellander461a5602017-05-05 06:39:16 -0700633 '--lsan=0',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800634 '--msan=0',
635 '--tsan=0',
636 ])
637
638 def test_gn_gen_windowed_test_launcher_win(self):
639 files = {
640 '/tmp/swarming_targets': 'unittests\n',
641 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
642 "{'unittests': {"
643 " 'label': '//somewhere:unittests',"
644 " 'type': 'windowed_test_launcher',"
645 "}}\n"
646 ),
647 r'c:\fake_src\out\Default\unittests.exe.runtime_deps': (
648 "unittests.exe\n"
649 "some_dependency\n"
650 ),
651 }
652 mbw = self.fake_mbw(files=files, win32=True)
653 self.check(['gen',
654 '-c', 'gn_debug_goma',
655 '--swarming-targets-file', '/tmp/swarming_targets',
656 '--isolate-map-file',
657 '/fake_src/testing/buildbot/gn_isolate_map.pyl',
658 '//out/Default'], mbw=mbw, ret=0)
659
660 isolate_file = mbw.files['c:\\fake_src\\out\\Default\\unittests.isolate']
661 isolate_file_contents = ast.literal_eval(isolate_file)
662 files = isolate_file_contents['variables']['files']
663 command = isolate_file_contents['variables']['command']
664
665 self.assertEqual(files, [
666 '../../testing/test_env.py',
667 '../../third_party/gtest-parallel/gtest-parallel',
ehmaldonadoa7507eb2017-05-10 13:40:29 -0700668 '../../third_party/gtest-parallel/gtest_parallel.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200669 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800670 'some_dependency',
671 'unittests.exe',
672 ])
673 self.assertEqual(command, [
674 '../../testing/test_env.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200675 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonado55833842017-02-13 03:58:13 -0800676 '--output_dir=${ISOLATED_OUTDIR}\\test_logs',
ehmaldonado76e60e92017-05-04 06:18:26 -0700677 '--gtest_color=no',
678 '--timeout=900',
ehmaldonado2a280352017-05-05 04:33:57 -0700679 '--retry_failed=3',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800680 r'.\unittests.exe',
681 '--',
682 '--asan=0',
kjellander461a5602017-05-05 06:39:16 -0700683 '--lsan=0',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800684 '--msan=0',
685 '--tsan=0',
686 ])
687
688 def test_gn_gen_console_test_launcher(self):
689 test_files = {
690 '/tmp/swarming_targets': 'base_unittests\n',
691 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
692 "{'base_unittests': {"
693 " 'label': '//base:base_unittests',"
694 " 'type': 'console_test_launcher',"
695 "}}\n"
696 ),
697 '/fake_src/out/Default/base_unittests.runtime_deps': (
698 "base_unittests\n"
699 ),
700 }
701 mbw = self.check(['gen', '-c', 'gn_debug_goma', '//out/Default',
702 '--swarming-targets-file', '/tmp/swarming_targets',
703 '--isolate-map-file',
704 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
705 files=test_files, ret=0)
706
707 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
708 isolate_file_contents = ast.literal_eval(isolate_file)
709 files = isolate_file_contents['variables']['files']
710 command = isolate_file_contents['variables']['command']
711
712 self.assertEqual(files, [
713 '../../testing/test_env.py',
714 '../../third_party/gtest-parallel/gtest-parallel',
ehmaldonadoa7507eb2017-05-10 13:40:29 -0700715 '../../third_party/gtest-parallel/gtest_parallel.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200716 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800717 'base_unittests',
718 ])
719 self.assertEqual(command, [
720 '../../testing/test_env.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200721 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonado55833842017-02-13 03:58:13 -0800722 '--output_dir=${ISOLATED_OUTDIR}/test_logs',
ehmaldonado76e60e92017-05-04 06:18:26 -0700723 '--gtest_color=no',
724 '--timeout=900',
ehmaldonado2a280352017-05-05 04:33:57 -0700725 '--retry_failed=3',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800726 './base_unittests',
727 '--',
728 '--asan=0',
kjellander461a5602017-05-05 06:39:16 -0700729 '--lsan=0',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800730 '--msan=0',
731 '--tsan=0',
732 ])
733
734 def test_gn_isolate_console_test_launcher_memcheck(self):
735 test_files = {
736 '/tmp/swarming_targets': 'base_unittests\n',
737 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
738 "{'base_unittests': {"
739 " 'label': '//base:base_unittests',"
740 " 'type': 'console_test_launcher',"
741 "}}\n"
742 ),
743 '/fake_src/out/Release/base_unittests.runtime_deps': (
744 "base_unittests\n"
745 "lots_of_memcheck_dependencies\n"
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200746 "../../tools_webrtc/valgrind/webrtc_tests.sh\n"
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800747 ),
748 }
749 mbw = self.check(['gen', '-c', 'gn_memcheck_bot', '//out/Release',
750 '--swarming-targets-file', '/tmp/swarming_targets',
751 '--isolate-map-file',
752 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
753 files=test_files, ret=0)
754
755 isolate_file = mbw.files['/fake_src/out/Release/base_unittests.isolate']
756 isolate_file_contents = ast.literal_eval(isolate_file)
757 files = isolate_file_contents['variables']['files']
758 command = isolate_file_contents['variables']['command']
759
760 self.assertEqual(files, [
761 '../../testing/test_env.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200762 '../../tools_webrtc/valgrind/webrtc_tests.sh',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800763 'base_unittests',
764 'lots_of_memcheck_dependencies',
765 ])
766 self.assertEqual(command, [
767 '../../testing/test_env.py',
768 'bash',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200769 '../../tools_webrtc/valgrind/webrtc_tests.sh',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800770 '--tool',
771 'memcheck',
772 '--target',
773 'Release',
774 '--build-dir',
775 '..',
776 '--test',
777 './base_unittests',
778 '--',
779 '--asan=0',
kjellander461a5602017-05-05 06:39:16 -0700780 '--lsan=0',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800781 '--msan=0',
782 '--tsan=0',
783 ])
kjellandera013a022016-11-14 05:54:22 -0800784
785 def test_gn_isolate(self):
786 files = {
787 '/fake_src/out/Default/toolchain.ninja': "",
788 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
789 "{'base_unittests': {"
790 " 'label': '//base:base_unittests',"
ehmaldonadob2fcf6d2016-11-15 12:20:30 -0800791 " 'type': 'non_parallel_console_test_launcher',"
kjellandera013a022016-11-14 05:54:22 -0800792 "}}\n"
793 ),
794 '/fake_src/out/Default/base_unittests.runtime_deps': (
795 "base_unittests\n"
796 ),
797 }
798 self.check(['isolate', '-c', 'gn_debug_goma', '//out/Default',
799 'base_unittests'], files=files, ret=0)
800
801 # test running isolate on an existing build_dir
802 files['/fake_src/out/Default/args.gn'] = 'is_debug = True\n'
803 self.check(['isolate', '//out/Default', 'base_unittests'],
804 files=files, ret=0)
kjellandera013a022016-11-14 05:54:22 -0800805 files['/fake_src/out/Default/mb_type'] = 'gn\n'
806 self.check(['isolate', '//out/Default', 'base_unittests'],
807 files=files, ret=0)
808
809 def test_gn_run(self):
810 files = {
811 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
812 "{'base_unittests': {"
813 " 'label': '//base:base_unittests',"
ehmaldonadob2fcf6d2016-11-15 12:20:30 -0800814 " 'type': 'windowed_test_launcher',"
kjellandera013a022016-11-14 05:54:22 -0800815 "}}\n"
816 ),
817 '/fake_src/out/Default/base_unittests.runtime_deps': (
818 "base_unittests\n"
819 ),
820 }
821 self.check(['run', '-c', 'gn_debug_goma', '//out/Default',
822 'base_unittests'], files=files, ret=0)
823
824 def test_gn_lookup(self):
825 self.check(['lookup', '-c', 'gn_debug_goma'], ret=0)
826
827 def test_gn_lookup_goma_dir_expansion(self):
828 self.check(['lookup', '-c', 'gn_rel_bot', '-g', '/foo'], ret=0,
829 out=('\n'
830 'Writing """\\\n'
831 'goma_dir = "/foo"\n'
832 'is_debug = false\n'
833 'use_goma = true\n'
834 '""" to _path_/args.gn.\n\n'
835 '/fake_src/buildtools/linux64/gn gen _path_\n'))
836
837 def test_gyp_analyze(self):
838 mbw = self.check(['analyze', '-c', 'gyp_rel_bot', '//out/Release',
839 '/tmp/in.json', '/tmp/out.json'], ret=0)
840 self.assertIn('analyzer', mbw.calls[0])
841
842 def test_gyp_crosscompile(self):
843 mbw = self.fake_mbw()
844 self.check(['gen', '-c', 'gyp_crosscompile', '//out/Release'],
845 mbw=mbw, ret=0)
846 self.assertTrue(mbw.cross_compile)
847
848 def test_gyp_gen(self):
849 self.check(['gen', '-c', 'gyp_rel_bot', '-g', '/goma', '//out/Release'],
850 ret=0,
851 out=("GYP_DEFINES='goma=1 gomadir=/goma'\n"
852 "python build/gyp_chromium -G output_dir=out\n"))
853
854 mbw = self.fake_mbw(win32=True)
855 self.check(['gen', '-c', 'gyp_rel_bot', '-g', 'c:\\goma', '//out/Release'],
856 mbw=mbw, ret=0,
857 out=("set GYP_DEFINES=goma=1 gomadir='c:\\goma'\n"
858 "python build\\gyp_chromium -G output_dir=out\n"))
859
860 def test_gyp_gen_fails(self):
861 mbw = self.fake_mbw()
862 mbw.Call = lambda cmd, env=None, buffer_output=True: (1, '', '')
863 self.check(['gen', '-c', 'gyp_rel_bot', '//out/Release'], mbw=mbw, ret=1)
864
865 def test_gyp_lookup_goma_dir_expansion(self):
866 self.check(['lookup', '-c', 'gyp_rel_bot', '-g', '/foo'], ret=0,
867 out=("GYP_DEFINES='goma=1 gomadir=/foo'\n"
868 "python build/gyp_chromium -G output_dir=_path_\n"))
869
870 def test_help(self):
871 orig_stdout = sys.stdout
872 try:
873 sys.stdout = StringIO.StringIO()
874 self.assertRaises(SystemExit, self.check, ['-h'])
875 self.assertRaises(SystemExit, self.check, ['help'])
876 self.assertRaises(SystemExit, self.check, ['help', 'gen'])
877 finally:
878 sys.stdout = orig_stdout
879
880 def test_multiple_phases(self):
881 # Check that not passing a --phase to a multi-phase builder fails.
882 mbw = self.check(['lookup', '-m', 'fake_master', '-b', 'fake_multi_phase'],
883 ret=1)
884 self.assertIn('Must specify a build --phase', mbw.out)
885
886 # Check that passing a --phase to a single-phase builder fails.
887 mbw = self.check(['lookup', '-m', 'fake_master', '-b', 'fake_gn_builder',
888 '--phase', 'phase_1'], ret=1)
889 self.assertIn('Must not specify a build --phase', mbw.out)
890
891 # Check that passing a wrong phase key to a multi-phase builder fails.
892 mbw = self.check(['lookup', '-m', 'fake_master', '-b', 'fake_multi_phase',
893 '--phase', 'wrong_phase'], ret=1)
894 self.assertIn('Phase wrong_phase doesn\'t exist', mbw.out)
895
896 # Check that passing a correct phase key to a multi-phase builder passes.
897 mbw = self.check(['lookup', '-m', 'fake_master', '-b', 'fake_multi_phase',
898 '--phase', 'phase_1'], ret=0)
899 self.assertIn('phase = 1', mbw.out)
900
901 mbw = self.check(['lookup', '-m', 'fake_master', '-b', 'fake_multi_phase',
902 '--phase', 'phase_2'], ret=0)
903 self.assertIn('phase = 2', mbw.out)
904
905 def test_validate(self):
906 mbw = self.fake_mbw()
907 self.check(['validate'], mbw=mbw, ret=0)
908
kjellandera013a022016-11-14 05:54:22 -0800909 def test_gyp_env_hacks(self):
910 mbw = self.fake_mbw()
911 mbw.files[mbw.default_config] = GYP_HACKS_CONFIG
912 self.check(['lookup', '-c', 'fake_config'], mbw=mbw,
913 ret=0,
914 out=("GYP_DEFINES='foo=bar baz=1'\n"
915 "GYP_LINK_CONCURRENCY=1\n"
916 "LLVM_FORCE_HEAD_REVISION=1\n"
917 "python build/gyp_chromium -G output_dir=_path_\n"))
918
919
920if __name__ == '__main__':
921 unittest.main()