blob: 3ae386986b5f912cf0b28806d5247b3fd60996c4 [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',
Oleh Prypinb708e932018-03-18 17:34:20 +0100120 'fake_multi_phase': { 'phase_1': 'phase_1', 'phase_2': 'phase_2'},
121 'fake_android_bot': 'android_bot',
kjellandera013a022016-11-14 05:54:22 -0800122 },
123 },
124 'configs': {
Oleh Prypinb708e932018-03-18 17:34:20 +0100125 'rel_bot': ['rel', 'goma', 'fake_feature1'],
126 'debug_goma': ['debug', 'goma'],
127 'phase_1': ['phase_1'],
128 'phase_2': ['phase_2'],
Oleh Prypinb708e932018-03-18 17:34:20 +0100129 'android_bot': ['android'],
kjellandera013a022016-11-14 05:54:22 -0800130 },
131 'mixins': {
kjellandera013a022016-11-14 05:54:22 -0800132 'fake_feature1': {
133 'gn_args': 'enable_doom_melon=true',
kjellandera013a022016-11-14 05:54:22 -0800134 },
kjellandera013a022016-11-14 05:54:22 -0800135 'goma': {
136 'gn_args': 'use_goma=true',
kjellandera013a022016-11-14 05:54:22 -0800137 },
138 'phase_1': {
139 'gn_args': 'phase=1',
kjellandera013a022016-11-14 05:54:22 -0800140 },
141 'phase_2': {
142 'gn_args': 'phase=2',
kjellandera013a022016-11-14 05:54:22 -0800143 },
144 'rel': {
145 'gn_args': 'is_debug=false',
146 },
147 'debug': {
148 'gn_args': 'is_debug=true',
149 },
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800150 'android': {
151 'gn_args': 'target_os="android"',
152 }
kjellandera013a022016-11-14 05:54:22 -0800153 },
154}
155"""
156
kjellandera013a022016-11-14 05:54:22 -0800157
158class UnitTest(unittest.TestCase):
159 def fake_mbw(self, files=None, win32=False):
160 mbw = FakeMBW(win32=win32)
161 mbw.files.setdefault(mbw.default_config, TEST_CONFIG)
162 mbw.files.setdefault(
163 mbw.ToAbsPath('//testing/buildbot/gn_isolate_map.pyl'),
164 '''{
165 "foo_unittests": {
166 "label": "//foo:foo_unittests",
167 "type": "console_test_launcher",
168 "args": [],
169 },
170 }''')
171 mbw.files.setdefault(
Oleh Prypinb708e932018-03-18 17:34:20 +0100172 mbw.ToAbsPath('//build/args/bots/fake_master/fake_args_bot.gn'),
kjellandera013a022016-11-14 05:54:22 -0800173 'is_debug = false\n')
174 if files:
175 for path, contents in files.items():
176 mbw.files[path] = contents
177 return mbw
178
179 def check(self, args, mbw=None, files=None, out=None, err=None, ret=None):
180 if not mbw:
181 mbw = self.fake_mbw(files)
182
183 actual_ret = mbw.Main(args)
184
185 self.assertEqual(actual_ret, ret)
186 if out is not None:
187 self.assertEqual(mbw.out, out)
188 if err is not None:
189 self.assertEqual(mbw.err, err)
190 return mbw
191
Oleh Prypinb708e932018-03-18 17:34:20 +0100192 def test_analyze(self):
kjellandera013a022016-11-14 05:54:22 -0800193 files = {'/tmp/in.json': '''{\
194 "files": ["foo/foo_unittest.cc"],
195 "test_targets": ["foo_unittests"],
196 "additional_compile_targets": ["all"]
197 }''',
198 '/tmp/out.json.gn': '''{\
199 "status": "Found dependency",
200 "compile_targets": ["//foo:foo_unittests"],
201 "test_targets": ["//foo:foo_unittests"]
202 }'''}
203
204 mbw = self.fake_mbw(files)
205 mbw.Call = lambda cmd, env=None, buffer_output=True: (0, '', '')
206
Oleh Prypinb708e932018-03-18 17:34:20 +0100207 self.check(['analyze', '-c', 'debug_goma', '//out/Default',
kjellandera013a022016-11-14 05:54:22 -0800208 '/tmp/in.json', '/tmp/out.json'], mbw=mbw, ret=0)
209 out = json.loads(mbw.files['/tmp/out.json'])
210 self.assertEqual(out, {
211 'status': 'Found dependency',
212 'compile_targets': ['foo:foo_unittests'],
213 'test_targets': ['foo_unittests']
214 })
215
Oleh Prypinb708e932018-03-18 17:34:20 +0100216 def test_gen(self):
kjellandera013a022016-11-14 05:54:22 -0800217 mbw = self.fake_mbw()
Oleh Prypinb708e932018-03-18 17:34:20 +0100218 self.check(['gen', '-c', 'debug_goma', '//out/Default', '-g', '/goma'],
kjellandera013a022016-11-14 05:54:22 -0800219 mbw=mbw, ret=0)
220 self.assertMultiLineEqual(mbw.files['/fake_src/out/Default/args.gn'],
221 ('goma_dir = "/goma"\n'
222 'is_debug = true\n'
223 'use_goma = true\n'))
224
225 # Make sure we log both what is written to args.gn and the command line.
226 self.assertIn('Writing """', mbw.out)
227 self.assertIn('/fake_src/buildtools/linux64/gn gen //out/Default --check',
228 mbw.out)
229
230 mbw = self.fake_mbw(win32=True)
Oleh Prypinb708e932018-03-18 17:34:20 +0100231 self.check(['gen', '-c', 'debug_goma', '-g', 'c:\\goma', '//out/Debug'],
kjellandera013a022016-11-14 05:54:22 -0800232 mbw=mbw, ret=0)
233 self.assertMultiLineEqual(mbw.files['c:\\fake_src\\out\\Debug\\args.gn'],
234 ('goma_dir = "c:\\\\goma"\n'
235 'is_debug = true\n'
236 'use_goma = true\n'))
237 self.assertIn('c:\\fake_src\\buildtools\\win\\gn.exe gen //out/Debug '
238 '--check\n', mbw.out)
239
240 mbw = self.fake_mbw()
Oleh Prypinb708e932018-03-18 17:34:20 +0100241 self.check(['gen', '-m', 'fake_master', '-b', 'fake_args_bot',
kjellandera013a022016-11-14 05:54:22 -0800242 '//out/Debug'],
243 mbw=mbw, ret=0)
244 self.assertEqual(
245 mbw.files['/fake_src/out/Debug/args.gn'],
Oleh Prypinb708e932018-03-18 17:34:20 +0100246 'import("//build/args/bots/fake_master/fake_args_bot.gn")\n')
kjellandera013a022016-11-14 05:54:22 -0800247
248
Oleh Prypinb708e932018-03-18 17:34:20 +0100249 def test_gen_fails(self):
kjellandera013a022016-11-14 05:54:22 -0800250 mbw = self.fake_mbw()
251 mbw.Call = lambda cmd, env=None, buffer_output=True: (1, '', '')
Oleh Prypinb708e932018-03-18 17:34:20 +0100252 self.check(['gen', '-c', 'debug_goma', '//out/Default'], mbw=mbw, ret=1)
kjellandera013a022016-11-14 05:54:22 -0800253
Oleh Prypinb708e932018-03-18 17:34:20 +0100254 def test_gen_swarming(self):
kjellandera013a022016-11-14 05:54:22 -0800255 files = {
Oleh Prypinb708e932018-03-18 17:34:20 +0100256 '/tmp/swarming_targets': 'base_unittests\n',
kjellandera013a022016-11-14 05:54:22 -0800257 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
Oleh Prypinb708e932018-03-18 17:34:20 +0100258 "{'base_unittests': {"
259 " 'label': '//base:base_unittests',"
260 " 'type': 'raw',"
261 " 'args': [],"
kjellandera013a022016-11-14 05:54:22 -0800262 "}}\n"
263 ),
Oleh Prypinb708e932018-03-18 17:34:20 +0100264 '/fake_src/out/Default/base_unittests.runtime_deps': (
265 "base_unittests\n"
kjellandera013a022016-11-14 05:54:22 -0800266 ),
267 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100268 mbw = self.fake_mbw(files)
kjellandera013a022016-11-14 05:54:22 -0800269 self.check(['gen',
Oleh Prypinb708e932018-03-18 17:34:20 +0100270 '-c', 'debug_goma',
kjellandera013a022016-11-14 05:54:22 -0800271 '--swarming-targets-file', '/tmp/swarming_targets',
kjellandera013a022016-11-14 05:54:22 -0800272 '//out/Default'], mbw=mbw, ret=0)
Oleh Prypinb708e932018-03-18 17:34:20 +0100273 self.assertIn('/fake_src/out/Default/base_unittests.isolate',
kjellandera013a022016-11-14 05:54:22 -0800274 mbw.files)
Oleh Prypinb708e932018-03-18 17:34:20 +0100275 self.assertIn('/fake_src/out/Default/base_unittests.isolated.gen.json',
kjellandera013a022016-11-14 05:54:22 -0800276 mbw.files)
277
Oleh Prypinb708e932018-03-18 17:34:20 +0100278 def test_gen_swarming_android(self):
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800279 test_files = {
280 '/tmp/swarming_targets': 'base_unittests\n',
281 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
282 "{'base_unittests': {"
283 " 'label': '//base:base_unittests',"
284 " 'type': 'additional_compile_target',"
285 "}}\n"
286 ),
287 '/fake_src/out/Default/base_unittests.runtime_deps': (
288 "base_unittests\n"
289 ),
290 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100291 mbw = self.check(['gen', '-c', 'android_bot', '//out/Default',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800292 '--swarming-targets-file', '/tmp/swarming_targets',
293 '--isolate-map-file',
294 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
295 files=test_files, ret=0)
296
297 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
298 isolate_file_contents = ast.literal_eval(isolate_file)
299 files = isolate_file_contents['variables']['files']
300 command = isolate_file_contents['variables']['command']
301
Oleh Prypinb708e932018-03-18 17:34:20 +0100302 self.assertEqual(files, ['../../.vpython', '../../testing/test_env.py',
303 'base_unittests'])
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800304 self.assertEqual(command, [
kjellanderf9e2a362017-03-24 12:17:33 -0700305 '../../build/android/test_wrapper/logdog_wrapper.py',
306 '--target', 'base_unittests',
Oleh Prypin5bb1afd2018-12-14 16:11:48 +0000307 '--logdog-bin-cmd', '../../bin/logdog_butler',
ehmaldonado34623ce2017-09-08 07:03:13 -0700308 '--logcat-output-file', '${ISOLATED_OUTDIR}/logcats',
309 '--store-tombstones',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800310 ])
311
Oleh Prypinb708e932018-03-18 17:34:20 +0100312 def test_gen_swarming_android_junit_test(self):
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800313 test_files = {
314 '/tmp/swarming_targets': 'base_unittests\n',
315 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
316 "{'base_unittests': {"
317 " 'label': '//base:base_unittests',"
318 " 'type': 'junit_test',"
319 "}}\n"
320 ),
321 '/fake_src/out/Default/base_unittests.runtime_deps': (
322 "base_unittests\n"
323 ),
324 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100325 mbw = self.check(['gen', '-c', 'android_bot', '//out/Default',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800326 '--swarming-targets-file', '/tmp/swarming_targets',
327 '--isolate-map-file',
328 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
329 files=test_files, ret=0)
330
331 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
332 isolate_file_contents = ast.literal_eval(isolate_file)
333 files = isolate_file_contents['variables']['files']
334 command = isolate_file_contents['variables']['command']
335
Oleh Prypinb708e932018-03-18 17:34:20 +0100336 self.assertEqual(files, ['../../.vpython', '../../testing/test_env.py',
337 'base_unittests'])
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800338 self.assertEqual(command, [
kjellanderf9e2a362017-03-24 12:17:33 -0700339 '../../build/android/test_wrapper/logdog_wrapper.py',
340 '--target', 'base_unittests',
Oleh Prypin5bb1afd2018-12-14 16:11:48 +0000341 '--logdog-bin-cmd', '../../bin/logdog_butler',
ehmaldonado34623ce2017-09-08 07:03:13 -0700342 '--logcat-output-file', '${ISOLATED_OUTDIR}/logcats',
343 '--store-tombstones',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800344 ])
345
Oleh Prypinb708e932018-03-18 17:34:20 +0100346 def test_gen_timeout(self):
Edward Lemurbeffdd42017-09-27 13:07:47 +0200347 test_files = {
348 '/tmp/swarming_targets': 'base_unittests\n',
349 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
350 "{'base_unittests': {"
351 " 'label': '//base:base_unittests',"
352 " 'type': 'non_parallel_console_test_launcher',"
353 " 'timeout': 500,"
354 "}}\n"
355 ),
356 '/fake_src/out/Default/base_unittests.runtime_deps': (
357 "base_unittests\n"
358 ),
359 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100360 mbw = self.check(['gen', '-c', 'debug_goma', '//out/Default',
Edward Lemurbeffdd42017-09-27 13:07:47 +0200361 '--swarming-targets-file', '/tmp/swarming_targets',
362 '--isolate-map-file',
363 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
364 files=test_files, ret=0)
365
366 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
367 isolate_file_contents = ast.literal_eval(isolate_file)
368 files = isolate_file_contents['variables']['files']
369 command = isolate_file_contents['variables']['command']
370
371 self.assertEqual(files, [
Oleh Prypin739b8162018-05-17 13:28:29 +0200372 '../../.vpython',
Edward Lemurbeffdd42017-09-27 13:07:47 +0200373 '../../testing/test_env.py',
374 '../../third_party/gtest-parallel/gtest-parallel',
375 '../../third_party/gtest-parallel/gtest_parallel.py',
376 '../../tools_webrtc/gtest-parallel-wrapper.py',
377 'base_unittests',
378 ])
379 self.assertEqual(command, [
380 '../../testing/test_env.py',
381 '../../tools_webrtc/gtest-parallel-wrapper.py',
382 '--output_dir=${ISOLATED_OUTDIR}/test_logs',
383 '--gtest_color=no',
384 '--timeout=500',
Edward Lemurbeffdd42017-09-27 13:07:47 +0200385 '--workers=1',
Yves Gerey2e0c6552018-10-08 21:59:25 +0200386 '--retry_failed=3',
Edward Lemur2b67f5c2018-02-07 18:09:44 +0100387 './base_unittests',
Edward Lemurbeffdd42017-09-27 13:07:47 +0200388 '--asan=0',
389 '--lsan=0',
390 '--msan=0',
391 '--tsan=0',
392 ])
393
Oleh Prypinb708e932018-03-18 17:34:20 +0100394 def test_gen_script(self):
Edward Lemur20110752017-09-28 16:14:37 +0200395 test_files = {
396 '/tmp/swarming_targets': 'base_unittests_script\n',
397 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
398 "{'base_unittests_script': {"
399 " 'label': '//base:base_unittests',"
400 " 'type': 'script',"
401 " 'script': '//base/base_unittests_script.py',"
402 "}}\n"
403 ),
404 '/fake_src/out/Default/base_unittests.runtime_deps': (
405 "base_unittests\n"
406 "base_unittests_script.py\n"
407 ),
408 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100409 mbw = self.check(['gen', '-c', 'debug_goma', '//out/Default',
Edward Lemur20110752017-09-28 16:14:37 +0200410 '--swarming-targets-file', '/tmp/swarming_targets',
411 '--isolate-map-file',
412 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
413 files=test_files, ret=0)
414
415 isolate_file = (
416 mbw.files['/fake_src/out/Default/base_unittests_script.isolate'])
417 isolate_file_contents = ast.literal_eval(isolate_file)
418 files = isolate_file_contents['variables']['files']
419 command = isolate_file_contents['variables']['command']
420
421 self.assertEqual(files, [
Oleh Prypinb708e932018-03-18 17:34:20 +0100422 '../../.vpython', '../../testing/test_env.py',
423 'base_unittests', 'base_unittests_script.py',
Edward Lemur20110752017-09-28 16:14:37 +0200424 ])
425 self.assertEqual(command, [
426 '../../base/base_unittests_script.py',
427 ])
428
Oleh Prypinb708e932018-03-18 17:34:20 +0100429 def test_gen_raw(self):
Edward Lemur2b67f5c2018-02-07 18:09:44 +0100430 test_files = {
431 '/tmp/swarming_targets': 'base_unittests\n',
432 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
433 "{'base_unittests': {"
434 " 'label': '//base:base_unittests',"
435 " 'type': 'raw',"
436 "}}\n"
437 ),
438 '/fake_src/out/Default/base_unittests.runtime_deps': (
439 "base_unittests\n"
440 ),
441 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100442 mbw = self.check(['gen', '-c', 'debug_goma', '//out/Default',
Edward Lemur2b67f5c2018-02-07 18:09:44 +0100443 '--swarming-targets-file', '/tmp/swarming_targets',
444 '--isolate-map-file',
445 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
446 files=test_files, ret=0)
447
448 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
449 isolate_file_contents = ast.literal_eval(isolate_file)
450 files = isolate_file_contents['variables']['files']
451 command = isolate_file_contents['variables']['command']
452
453 self.assertEqual(files, [
Oleh Prypin739b8162018-05-17 13:28:29 +0200454 '../../.vpython',
Edward Lemur2b67f5c2018-02-07 18:09:44 +0100455 '../../testing/test_env.py',
Oleh Prypin3a51b0e2019-07-17 15:17:53 +0200456 '../../tools_webrtc/flags_compatibility.py',
Edward Lemur2b67f5c2018-02-07 18:09:44 +0100457 'base_unittests',
458 ])
459 self.assertEqual(command, [
Oleh Prypin3a51b0e2019-07-17 15:17:53 +0200460 '../../tools_webrtc/flags_compatibility.py',
Edward Lemur2b67f5c2018-02-07 18:09:44 +0100461 '../../testing/test_env.py',
462 './base_unittests',
463 '--asan=0',
464 '--lsan=0',
465 '--msan=0',
466 '--tsan=0',
467 ])
468
Oleh Prypinb708e932018-03-18 17:34:20 +0100469 def test_gen_non_parallel_console_test_launcher(self):
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800470 test_files = {
471 '/tmp/swarming_targets': 'base_unittests\n',
472 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
473 "{'base_unittests': {"
474 " 'label': '//base:base_unittests',"
475 " 'type': 'non_parallel_console_test_launcher',"
476 "}}\n"
477 ),
478 '/fake_src/out/Default/base_unittests.runtime_deps': (
479 "base_unittests\n"
480 ),
481 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100482 mbw = self.check(['gen', '-c', 'debug_goma', '//out/Default',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800483 '--swarming-targets-file', '/tmp/swarming_targets',
484 '--isolate-map-file',
485 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
486 files=test_files, ret=0)
487
488 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
489 isolate_file_contents = ast.literal_eval(isolate_file)
490 files = isolate_file_contents['variables']['files']
491 command = isolate_file_contents['variables']['command']
492
493 self.assertEqual(files, [
Oleh Prypin739b8162018-05-17 13:28:29 +0200494 '../../.vpython',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800495 '../../testing/test_env.py',
kjellander382f2b22017-04-11 04:07:01 -0700496 '../../third_party/gtest-parallel/gtest-parallel',
ehmaldonadoa7507eb2017-05-10 13:40:29 -0700497 '../../third_party/gtest-parallel/gtest_parallel.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200498 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800499 'base_unittests',
500 ])
501 self.assertEqual(command, [
502 '../../testing/test_env.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200503 '../../tools_webrtc/gtest-parallel-wrapper.py',
kjellander382f2b22017-04-11 04:07:01 -0700504 '--output_dir=${ISOLATED_OUTDIR}/test_logs',
ehmaldonado76e60e92017-05-04 06:18:26 -0700505 '--gtest_color=no',
506 '--timeout=900',
kjellander382f2b22017-04-11 04:07:01 -0700507 '--workers=1',
Yves Gerey2e0c6552018-10-08 21:59:25 +0200508 '--retry_failed=3',
Edward Lemur2b67f5c2018-02-07 18:09:44 +0100509 './base_unittests',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800510 '--asan=0',
kjellander461a5602017-05-05 06:39:16 -0700511 '--lsan=0',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800512 '--msan=0',
513 '--tsan=0',
514 ])
515
Oleh Prypinb708e932018-03-18 17:34:20 +0100516 def test_isolate_windowed_test_launcher_linux(self):
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800517 test_files = {
518 '/tmp/swarming_targets': 'base_unittests\n',
519 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
520 "{'base_unittests': {"
521 " 'label': '//base:base_unittests',"
522 " 'type': 'windowed_test_launcher',"
523 "}}\n"
524 ),
525 '/fake_src/out/Default/base_unittests.runtime_deps': (
526 "base_unittests\n"
527 "some_resource_file\n"
528 ),
529 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100530 mbw = self.check(['gen', '-c', 'debug_goma', '//out/Default',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800531 '--swarming-targets-file', '/tmp/swarming_targets',
532 '--isolate-map-file',
533 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
534 files=test_files, ret=0)
535
536 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
537 isolate_file_contents = ast.literal_eval(isolate_file)
538 files = isolate_file_contents['variables']['files']
539 command = isolate_file_contents['variables']['command']
540
541 self.assertEqual(files, [
Oleh Prypin739b8162018-05-17 13:28:29 +0200542 '../../.vpython',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800543 '../../testing/test_env.py',
544 '../../testing/xvfb.py',
545 '../../third_party/gtest-parallel/gtest-parallel',
ehmaldonadoa7507eb2017-05-10 13:40:29 -0700546 '../../third_party/gtest-parallel/gtest_parallel.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200547 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800548 'base_unittests',
549 'some_resource_file',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800550 ])
551 self.assertEqual(command, [
552 '../../testing/xvfb.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200553 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonado55833842017-02-13 03:58:13 -0800554 '--output_dir=${ISOLATED_OUTDIR}/test_logs',
ehmaldonado76e60e92017-05-04 06:18:26 -0700555 '--gtest_color=no',
556 '--timeout=900',
ehmaldonado2a280352017-05-05 04:33:57 -0700557 '--retry_failed=3',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800558 './base_unittests',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800559 '--asan=0',
kjellander461a5602017-05-05 06:39:16 -0700560 '--lsan=0',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800561 '--msan=0',
562 '--tsan=0',
563 ])
564
Oleh Prypinb708e932018-03-18 17:34:20 +0100565 def test_gen_windowed_test_launcher_win(self):
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800566 files = {
567 '/tmp/swarming_targets': 'unittests\n',
568 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
569 "{'unittests': {"
570 " 'label': '//somewhere:unittests',"
571 " 'type': 'windowed_test_launcher',"
572 "}}\n"
573 ),
574 r'c:\fake_src\out\Default\unittests.exe.runtime_deps': (
575 "unittests.exe\n"
576 "some_dependency\n"
577 ),
578 }
579 mbw = self.fake_mbw(files=files, win32=True)
580 self.check(['gen',
Oleh Prypinb708e932018-03-18 17:34:20 +0100581 '-c', 'debug_goma',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800582 '--swarming-targets-file', '/tmp/swarming_targets',
583 '--isolate-map-file',
584 '/fake_src/testing/buildbot/gn_isolate_map.pyl',
585 '//out/Default'], mbw=mbw, ret=0)
586
587 isolate_file = mbw.files['c:\\fake_src\\out\\Default\\unittests.isolate']
588 isolate_file_contents = ast.literal_eval(isolate_file)
589 files = isolate_file_contents['variables']['files']
590 command = isolate_file_contents['variables']['command']
591
592 self.assertEqual(files, [
Oleh Prypin739b8162018-05-17 13:28:29 +0200593 '../../.vpython',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800594 '../../testing/test_env.py',
595 '../../third_party/gtest-parallel/gtest-parallel',
ehmaldonadoa7507eb2017-05-10 13:40:29 -0700596 '../../third_party/gtest-parallel/gtest_parallel.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200597 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800598 'some_dependency',
599 'unittests.exe',
600 ])
601 self.assertEqual(command, [
602 '../../testing/test_env.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200603 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonado55833842017-02-13 03:58:13 -0800604 '--output_dir=${ISOLATED_OUTDIR}\\test_logs',
ehmaldonado76e60e92017-05-04 06:18:26 -0700605 '--gtest_color=no',
606 '--timeout=900',
ehmaldonado2a280352017-05-05 04:33:57 -0700607 '--retry_failed=3',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800608 r'.\unittests.exe',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800609 '--asan=0',
kjellander461a5602017-05-05 06:39:16 -0700610 '--lsan=0',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800611 '--msan=0',
612 '--tsan=0',
613 ])
614
Oleh Prypinb708e932018-03-18 17:34:20 +0100615 def test_gen_console_test_launcher(self):
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800616 test_files = {
617 '/tmp/swarming_targets': 'base_unittests\n',
618 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
619 "{'base_unittests': {"
620 " 'label': '//base:base_unittests',"
621 " 'type': 'console_test_launcher',"
622 "}}\n"
623 ),
624 '/fake_src/out/Default/base_unittests.runtime_deps': (
625 "base_unittests\n"
626 ),
627 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100628 mbw = self.check(['gen', '-c', 'debug_goma', '//out/Default',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800629 '--swarming-targets-file', '/tmp/swarming_targets',
630 '--isolate-map-file',
631 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
632 files=test_files, ret=0)
633
634 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
635 isolate_file_contents = ast.literal_eval(isolate_file)
636 files = isolate_file_contents['variables']['files']
637 command = isolate_file_contents['variables']['command']
638
639 self.assertEqual(files, [
Oleh Prypin739b8162018-05-17 13:28:29 +0200640 '../../.vpython',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800641 '../../testing/test_env.py',
642 '../../third_party/gtest-parallel/gtest-parallel',
ehmaldonadoa7507eb2017-05-10 13:40:29 -0700643 '../../third_party/gtest-parallel/gtest_parallel.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200644 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800645 'base_unittests',
646 ])
647 self.assertEqual(command, [
648 '../../testing/test_env.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200649 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonado55833842017-02-13 03:58:13 -0800650 '--output_dir=${ISOLATED_OUTDIR}/test_logs',
ehmaldonado76e60e92017-05-04 06:18:26 -0700651 '--gtest_color=no',
652 '--timeout=900',
ehmaldonado2a280352017-05-05 04:33:57 -0700653 '--retry_failed=3',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800654 './base_unittests',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800655 '--asan=0',
kjellander461a5602017-05-05 06:39:16 -0700656 '--lsan=0',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800657 '--msan=0',
658 '--tsan=0',
659 ])
660
Oleh Prypin739b8162018-05-17 13:28:29 +0200661 def test_isolate_test_launcher_with_webcam(self):
662 test_files = {
663 '/tmp/swarming_targets': 'base_unittests\n',
664 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
665 "{'base_unittests': {"
666 " 'label': '//base:base_unittests',"
667 " 'type': 'console_test_launcher',"
668 " 'use_webcam': True,"
669 "}}\n"
670 ),
671 '/fake_src/out/Default/base_unittests.runtime_deps': (
672 "base_unittests\n"
673 "some_resource_file\n"
674 ),
675 }
676 mbw = self.check(['gen', '-c', 'debug_goma', '//out/Default',
677 '--swarming-targets-file', '/tmp/swarming_targets',
678 '--isolate-map-file',
679 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
680 files=test_files, ret=0)
681
682 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
683 isolate_file_contents = ast.literal_eval(isolate_file)
684 files = isolate_file_contents['variables']['files']
685 command = isolate_file_contents['variables']['command']
686
687 self.assertEqual(files, [
688 '../../.vpython',
689 '../../testing/test_env.py',
690 '../../third_party/gtest-parallel/gtest-parallel',
691 '../../third_party/gtest-parallel/gtest_parallel.py',
692 '../../tools_webrtc/ensure_webcam_is_running.py',
693 '../../tools_webrtc/gtest-parallel-wrapper.py',
694 'base_unittests',
695 'some_resource_file',
696 ])
697 self.assertEqual(command, [
698 '../../tools_webrtc/ensure_webcam_is_running.py',
699 '../../testing/test_env.py',
700 '../../tools_webrtc/gtest-parallel-wrapper.py',
701 '--output_dir=${ISOLATED_OUTDIR}/test_logs',
702 '--gtest_color=no',
703 '--timeout=900',
704 '--retry_failed=3',
705 './base_unittests',
Oleh Prypin739b8162018-05-17 13:28:29 +0200706 '--asan=0',
707 '--lsan=0',
708 '--msan=0',
709 '--tsan=0',
710 ])
711
Oleh Prypinb708e932018-03-18 17:34:20 +0100712 def test_isolate(self):
kjellandera013a022016-11-14 05:54:22 -0800713 files = {
714 '/fake_src/out/Default/toolchain.ninja': "",
715 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
716 "{'base_unittests': {"
717 " 'label': '//base:base_unittests',"
ehmaldonadob2fcf6d2016-11-15 12:20:30 -0800718 " 'type': 'non_parallel_console_test_launcher',"
kjellandera013a022016-11-14 05:54:22 -0800719 "}}\n"
720 ),
721 '/fake_src/out/Default/base_unittests.runtime_deps': (
722 "base_unittests\n"
723 ),
724 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100725 self.check(['isolate', '-c', 'debug_goma', '//out/Default',
kjellandera013a022016-11-14 05:54:22 -0800726 'base_unittests'], files=files, ret=0)
727
728 # test running isolate on an existing build_dir
729 files['/fake_src/out/Default/args.gn'] = 'is_debug = True\n'
730 self.check(['isolate', '//out/Default', 'base_unittests'],
731 files=files, ret=0)
kjellandera013a022016-11-14 05:54:22 -0800732 files['/fake_src/out/Default/mb_type'] = 'gn\n'
733 self.check(['isolate', '//out/Default', 'base_unittests'],
734 files=files, ret=0)
735
Oleh Prypinb708e932018-03-18 17:34:20 +0100736 def test_run(self):
kjellandera013a022016-11-14 05:54:22 -0800737 files = {
738 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
739 "{'base_unittests': {"
740 " 'label': '//base:base_unittests',"
ehmaldonadob2fcf6d2016-11-15 12:20:30 -0800741 " 'type': 'windowed_test_launcher',"
kjellandera013a022016-11-14 05:54:22 -0800742 "}}\n"
743 ),
744 '/fake_src/out/Default/base_unittests.runtime_deps': (
745 "base_unittests\n"
746 ),
747 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100748 self.check(['run', '-c', 'debug_goma', '//out/Default',
kjellandera013a022016-11-14 05:54:22 -0800749 'base_unittests'], files=files, ret=0)
750
Oleh Prypinb708e932018-03-18 17:34:20 +0100751 def test_run_swarmed(self):
752 files = {
753 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
754 "{'base_unittests': {"
755 " 'label': '//base:base_unittests',"
756 " 'type': 'raw',"
757 " 'args': [],"
758 "}}\n"
759 ),
760 '/fake_src/out/Default/base_unittests.runtime_deps': (
761 "base_unittests\n"
762 ),
763 }
kjellandera013a022016-11-14 05:54:22 -0800764
Oleh Prypinb708e932018-03-18 17:34:20 +0100765 def run_stub(cmd, **_kwargs):
766 if 'isolate.py' in cmd[1]:
767 return 0, 'fake_hash base_unittests', ''
768 else:
769 return 0, '', ''
770
771 mbw = self.fake_mbw(files=files)
772 mbw.Run = run_stub
773 self.check(['run', '-s', '-c', 'debug_goma', '//out/Default',
774 'base_unittests'], mbw=mbw, ret=0)
775 self.check(['run', '-s', '-c', 'debug_goma', '-d', 'os', 'Win7',
776 '//out/Default', 'base_unittests'], mbw=mbw, ret=0)
777
778 def test_lookup(self):
779 self.check(['lookup', '-c', 'debug_goma'], ret=0)
780
Oleh Prypind7e2fb32019-05-31 13:25:39 +0200781 def test_quiet_lookup(self):
782 self.check(['lookup', '-c', 'debug_goma', '--quiet'], ret=0,
783 out=('is_debug = true\n'
784 'use_goma = true\n'))
785
Oleh Prypinb708e932018-03-18 17:34:20 +0100786 def test_lookup_goma_dir_expansion(self):
787 self.check(['lookup', '-c', 'rel_bot', '-g', '/foo'], ret=0,
kjellandera013a022016-11-14 05:54:22 -0800788 out=('\n'
789 'Writing """\\\n'
Oleh Prypinb708e932018-03-18 17:34:20 +0100790 'enable_doom_melon = true\n'
kjellandera013a022016-11-14 05:54:22 -0800791 'goma_dir = "/foo"\n'
792 'is_debug = false\n'
793 'use_goma = true\n'
794 '""" to _path_/args.gn.\n\n'
795 '/fake_src/buildtools/linux64/gn gen _path_\n'))
796
kjellandera013a022016-11-14 05:54:22 -0800797 def test_help(self):
798 orig_stdout = sys.stdout
799 try:
800 sys.stdout = StringIO.StringIO()
801 self.assertRaises(SystemExit, self.check, ['-h'])
802 self.assertRaises(SystemExit, self.check, ['help'])
803 self.assertRaises(SystemExit, self.check, ['help', 'gen'])
804 finally:
805 sys.stdout = orig_stdout
806
807 def test_multiple_phases(self):
808 # Check that not passing a --phase to a multi-phase builder fails.
809 mbw = self.check(['lookup', '-m', 'fake_master', '-b', 'fake_multi_phase'],
810 ret=1)
811 self.assertIn('Must specify a build --phase', mbw.out)
812
813 # Check that passing a --phase to a single-phase builder fails.
Oleh Prypinb708e932018-03-18 17:34:20 +0100814 mbw = self.check(['lookup', '-m', 'fake_master', '-b', 'fake_builder',
kjellandera013a022016-11-14 05:54:22 -0800815 '--phase', 'phase_1'], ret=1)
816 self.assertIn('Must not specify a build --phase', mbw.out)
817
818 # Check that passing a wrong phase key to a multi-phase builder fails.
819 mbw = self.check(['lookup', '-m', 'fake_master', '-b', 'fake_multi_phase',
820 '--phase', 'wrong_phase'], ret=1)
821 self.assertIn('Phase wrong_phase doesn\'t exist', mbw.out)
822
823 # Check that passing a correct phase key to a multi-phase builder passes.
824 mbw = self.check(['lookup', '-m', 'fake_master', '-b', 'fake_multi_phase',
825 '--phase', 'phase_1'], ret=0)
826 self.assertIn('phase = 1', mbw.out)
827
828 mbw = self.check(['lookup', '-m', 'fake_master', '-b', 'fake_multi_phase',
829 '--phase', 'phase_2'], ret=0)
830 self.assertIn('phase = 2', mbw.out)
831
832 def test_validate(self):
833 mbw = self.fake_mbw()
834 self.check(['validate'], mbw=mbw, ret=0)
835
kjellandera013a022016-11-14 05:54:22 -0800836
837if __name__ == '__main__':
838 unittest.main()