blob: c17800061a031f02974655fe43b431fb6b7af7e3 [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',
456 'base_unittests',
457 ])
458 self.assertEqual(command, [
459 '../../testing/test_env.py',
460 './base_unittests',
461 '--asan=0',
462 '--lsan=0',
463 '--msan=0',
464 '--tsan=0',
465 ])
466
Oleh Prypinb708e932018-03-18 17:34:20 +0100467 def test_gen_non_parallel_console_test_launcher(self):
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800468 test_files = {
469 '/tmp/swarming_targets': 'base_unittests\n',
470 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
471 "{'base_unittests': {"
472 " 'label': '//base:base_unittests',"
473 " 'type': 'non_parallel_console_test_launcher',"
474 "}}\n"
475 ),
476 '/fake_src/out/Default/base_unittests.runtime_deps': (
477 "base_unittests\n"
478 ),
479 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100480 mbw = self.check(['gen', '-c', 'debug_goma', '//out/Default',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800481 '--swarming-targets-file', '/tmp/swarming_targets',
482 '--isolate-map-file',
483 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
484 files=test_files, ret=0)
485
486 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
487 isolate_file_contents = ast.literal_eval(isolate_file)
488 files = isolate_file_contents['variables']['files']
489 command = isolate_file_contents['variables']['command']
490
491 self.assertEqual(files, [
Oleh Prypin739b8162018-05-17 13:28:29 +0200492 '../../.vpython',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800493 '../../testing/test_env.py',
kjellander382f2b22017-04-11 04:07:01 -0700494 '../../third_party/gtest-parallel/gtest-parallel',
ehmaldonadoa7507eb2017-05-10 13:40:29 -0700495 '../../third_party/gtest-parallel/gtest_parallel.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200496 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800497 'base_unittests',
498 ])
499 self.assertEqual(command, [
500 '../../testing/test_env.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200501 '../../tools_webrtc/gtest-parallel-wrapper.py',
kjellander382f2b22017-04-11 04:07:01 -0700502 '--output_dir=${ISOLATED_OUTDIR}/test_logs',
ehmaldonado76e60e92017-05-04 06:18:26 -0700503 '--gtest_color=no',
504 '--timeout=900',
kjellander382f2b22017-04-11 04:07:01 -0700505 '--workers=1',
Yves Gerey2e0c6552018-10-08 21:59:25 +0200506 '--retry_failed=3',
Edward Lemur2b67f5c2018-02-07 18:09:44 +0100507 './base_unittests',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800508 '--asan=0',
kjellander461a5602017-05-05 06:39:16 -0700509 '--lsan=0',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800510 '--msan=0',
511 '--tsan=0',
512 ])
513
Oleh Prypinb708e932018-03-18 17:34:20 +0100514 def test_isolate_windowed_test_launcher_linux(self):
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800515 test_files = {
516 '/tmp/swarming_targets': 'base_unittests\n',
517 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
518 "{'base_unittests': {"
519 " 'label': '//base:base_unittests',"
520 " 'type': 'windowed_test_launcher',"
521 "}}\n"
522 ),
523 '/fake_src/out/Default/base_unittests.runtime_deps': (
524 "base_unittests\n"
525 "some_resource_file\n"
526 ),
527 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100528 mbw = self.check(['gen', '-c', 'debug_goma', '//out/Default',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800529 '--swarming-targets-file', '/tmp/swarming_targets',
530 '--isolate-map-file',
531 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
532 files=test_files, ret=0)
533
534 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
535 isolate_file_contents = ast.literal_eval(isolate_file)
536 files = isolate_file_contents['variables']['files']
537 command = isolate_file_contents['variables']['command']
538
539 self.assertEqual(files, [
Oleh Prypin739b8162018-05-17 13:28:29 +0200540 '../../.vpython',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800541 '../../testing/test_env.py',
542 '../../testing/xvfb.py',
543 '../../third_party/gtest-parallel/gtest-parallel',
ehmaldonadoa7507eb2017-05-10 13:40:29 -0700544 '../../third_party/gtest-parallel/gtest_parallel.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200545 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800546 'base_unittests',
547 'some_resource_file',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800548 ])
549 self.assertEqual(command, [
550 '../../testing/xvfb.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200551 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonado55833842017-02-13 03:58:13 -0800552 '--output_dir=${ISOLATED_OUTDIR}/test_logs',
ehmaldonado76e60e92017-05-04 06:18:26 -0700553 '--gtest_color=no',
554 '--timeout=900',
ehmaldonado2a280352017-05-05 04:33:57 -0700555 '--retry_failed=3',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800556 './base_unittests',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800557 '--asan=0',
kjellander461a5602017-05-05 06:39:16 -0700558 '--lsan=0',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800559 '--msan=0',
560 '--tsan=0',
561 ])
562
Oleh Prypinb708e932018-03-18 17:34:20 +0100563 def test_gen_windowed_test_launcher_win(self):
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800564 files = {
565 '/tmp/swarming_targets': 'unittests\n',
566 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
567 "{'unittests': {"
568 " 'label': '//somewhere:unittests',"
569 " 'type': 'windowed_test_launcher',"
570 "}}\n"
571 ),
572 r'c:\fake_src\out\Default\unittests.exe.runtime_deps': (
573 "unittests.exe\n"
574 "some_dependency\n"
575 ),
576 }
577 mbw = self.fake_mbw(files=files, win32=True)
578 self.check(['gen',
Oleh Prypinb708e932018-03-18 17:34:20 +0100579 '-c', 'debug_goma',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800580 '--swarming-targets-file', '/tmp/swarming_targets',
581 '--isolate-map-file',
582 '/fake_src/testing/buildbot/gn_isolate_map.pyl',
583 '//out/Default'], mbw=mbw, ret=0)
584
585 isolate_file = mbw.files['c:\\fake_src\\out\\Default\\unittests.isolate']
586 isolate_file_contents = ast.literal_eval(isolate_file)
587 files = isolate_file_contents['variables']['files']
588 command = isolate_file_contents['variables']['command']
589
590 self.assertEqual(files, [
Oleh Prypin739b8162018-05-17 13:28:29 +0200591 '../../.vpython',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800592 '../../testing/test_env.py',
593 '../../third_party/gtest-parallel/gtest-parallel',
ehmaldonadoa7507eb2017-05-10 13:40:29 -0700594 '../../third_party/gtest-parallel/gtest_parallel.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200595 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800596 'some_dependency',
597 'unittests.exe',
598 ])
599 self.assertEqual(command, [
600 '../../testing/test_env.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200601 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonado55833842017-02-13 03:58:13 -0800602 '--output_dir=${ISOLATED_OUTDIR}\\test_logs',
ehmaldonado76e60e92017-05-04 06:18:26 -0700603 '--gtest_color=no',
604 '--timeout=900',
ehmaldonado2a280352017-05-05 04:33:57 -0700605 '--retry_failed=3',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800606 r'.\unittests.exe',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800607 '--asan=0',
kjellander461a5602017-05-05 06:39:16 -0700608 '--lsan=0',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800609 '--msan=0',
610 '--tsan=0',
611 ])
612
Oleh Prypinb708e932018-03-18 17:34:20 +0100613 def test_gen_console_test_launcher(self):
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800614 test_files = {
615 '/tmp/swarming_targets': 'base_unittests\n',
616 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
617 "{'base_unittests': {"
618 " 'label': '//base:base_unittests',"
619 " 'type': 'console_test_launcher',"
620 "}}\n"
621 ),
622 '/fake_src/out/Default/base_unittests.runtime_deps': (
623 "base_unittests\n"
624 ),
625 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100626 mbw = self.check(['gen', '-c', 'debug_goma', '//out/Default',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800627 '--swarming-targets-file', '/tmp/swarming_targets',
628 '--isolate-map-file',
629 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
630 files=test_files, ret=0)
631
632 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
633 isolate_file_contents = ast.literal_eval(isolate_file)
634 files = isolate_file_contents['variables']['files']
635 command = isolate_file_contents['variables']['command']
636
637 self.assertEqual(files, [
Oleh Prypin739b8162018-05-17 13:28:29 +0200638 '../../.vpython',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800639 '../../testing/test_env.py',
640 '../../third_party/gtest-parallel/gtest-parallel',
ehmaldonadoa7507eb2017-05-10 13:40:29 -0700641 '../../third_party/gtest-parallel/gtest_parallel.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200642 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800643 'base_unittests',
644 ])
645 self.assertEqual(command, [
646 '../../testing/test_env.py',
Henrik Kjellander90fd7d82017-05-09 08:30:10 +0200647 '../../tools_webrtc/gtest-parallel-wrapper.py',
ehmaldonado55833842017-02-13 03:58:13 -0800648 '--output_dir=${ISOLATED_OUTDIR}/test_logs',
ehmaldonado76e60e92017-05-04 06:18:26 -0700649 '--gtest_color=no',
650 '--timeout=900',
ehmaldonado2a280352017-05-05 04:33:57 -0700651 '--retry_failed=3',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800652 './base_unittests',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800653 '--asan=0',
kjellander461a5602017-05-05 06:39:16 -0700654 '--lsan=0',
ehmaldonadoed8c8ed2016-11-23 12:58:35 -0800655 '--msan=0',
656 '--tsan=0',
657 ])
658
Oleh Prypin739b8162018-05-17 13:28:29 +0200659 def test_isolate_test_launcher_with_webcam(self):
660 test_files = {
661 '/tmp/swarming_targets': 'base_unittests\n',
662 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
663 "{'base_unittests': {"
664 " 'label': '//base:base_unittests',"
665 " 'type': 'console_test_launcher',"
666 " 'use_webcam': True,"
667 "}}\n"
668 ),
669 '/fake_src/out/Default/base_unittests.runtime_deps': (
670 "base_unittests\n"
671 "some_resource_file\n"
672 ),
673 }
674 mbw = self.check(['gen', '-c', 'debug_goma', '//out/Default',
675 '--swarming-targets-file', '/tmp/swarming_targets',
676 '--isolate-map-file',
677 '/fake_src/testing/buildbot/gn_isolate_map.pyl'],
678 files=test_files, ret=0)
679
680 isolate_file = mbw.files['/fake_src/out/Default/base_unittests.isolate']
681 isolate_file_contents = ast.literal_eval(isolate_file)
682 files = isolate_file_contents['variables']['files']
683 command = isolate_file_contents['variables']['command']
684
685 self.assertEqual(files, [
686 '../../.vpython',
687 '../../testing/test_env.py',
688 '../../third_party/gtest-parallel/gtest-parallel',
689 '../../third_party/gtest-parallel/gtest_parallel.py',
690 '../../tools_webrtc/ensure_webcam_is_running.py',
691 '../../tools_webrtc/gtest-parallel-wrapper.py',
692 'base_unittests',
693 'some_resource_file',
694 ])
695 self.assertEqual(command, [
696 '../../tools_webrtc/ensure_webcam_is_running.py',
697 '../../testing/test_env.py',
698 '../../tools_webrtc/gtest-parallel-wrapper.py',
699 '--output_dir=${ISOLATED_OUTDIR}/test_logs',
700 '--gtest_color=no',
701 '--timeout=900',
702 '--retry_failed=3',
703 './base_unittests',
Oleh Prypin739b8162018-05-17 13:28:29 +0200704 '--asan=0',
705 '--lsan=0',
706 '--msan=0',
707 '--tsan=0',
708 ])
709
Oleh Prypinb708e932018-03-18 17:34:20 +0100710 def test_isolate(self):
kjellandera013a022016-11-14 05:54:22 -0800711 files = {
712 '/fake_src/out/Default/toolchain.ninja': "",
713 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
714 "{'base_unittests': {"
715 " 'label': '//base:base_unittests',"
ehmaldonadob2fcf6d2016-11-15 12:20:30 -0800716 " 'type': 'non_parallel_console_test_launcher',"
kjellandera013a022016-11-14 05:54:22 -0800717 "}}\n"
718 ),
719 '/fake_src/out/Default/base_unittests.runtime_deps': (
720 "base_unittests\n"
721 ),
722 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100723 self.check(['isolate', '-c', 'debug_goma', '//out/Default',
kjellandera013a022016-11-14 05:54:22 -0800724 'base_unittests'], files=files, ret=0)
725
726 # test running isolate on an existing build_dir
727 files['/fake_src/out/Default/args.gn'] = 'is_debug = True\n'
728 self.check(['isolate', '//out/Default', 'base_unittests'],
729 files=files, ret=0)
kjellandera013a022016-11-14 05:54:22 -0800730 files['/fake_src/out/Default/mb_type'] = 'gn\n'
731 self.check(['isolate', '//out/Default', 'base_unittests'],
732 files=files, ret=0)
733
Oleh Prypinb708e932018-03-18 17:34:20 +0100734 def test_run(self):
kjellandera013a022016-11-14 05:54:22 -0800735 files = {
736 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
737 "{'base_unittests': {"
738 " 'label': '//base:base_unittests',"
ehmaldonadob2fcf6d2016-11-15 12:20:30 -0800739 " 'type': 'windowed_test_launcher',"
kjellandera013a022016-11-14 05:54:22 -0800740 "}}\n"
741 ),
742 '/fake_src/out/Default/base_unittests.runtime_deps': (
743 "base_unittests\n"
744 ),
745 }
Oleh Prypinb708e932018-03-18 17:34:20 +0100746 self.check(['run', '-c', 'debug_goma', '//out/Default',
kjellandera013a022016-11-14 05:54:22 -0800747 'base_unittests'], files=files, ret=0)
748
Oleh Prypinb708e932018-03-18 17:34:20 +0100749 def test_run_swarmed(self):
750 files = {
751 '/fake_src/testing/buildbot/gn_isolate_map.pyl': (
752 "{'base_unittests': {"
753 " 'label': '//base:base_unittests',"
754 " 'type': 'raw',"
755 " 'args': [],"
756 "}}\n"
757 ),
758 '/fake_src/out/Default/base_unittests.runtime_deps': (
759 "base_unittests\n"
760 ),
761 }
kjellandera013a022016-11-14 05:54:22 -0800762
Oleh Prypinb708e932018-03-18 17:34:20 +0100763 def run_stub(cmd, **_kwargs):
764 if 'isolate.py' in cmd[1]:
765 return 0, 'fake_hash base_unittests', ''
766 else:
767 return 0, '', ''
768
769 mbw = self.fake_mbw(files=files)
770 mbw.Run = run_stub
771 self.check(['run', '-s', '-c', 'debug_goma', '//out/Default',
772 'base_unittests'], mbw=mbw, ret=0)
773 self.check(['run', '-s', '-c', 'debug_goma', '-d', 'os', 'Win7',
774 '//out/Default', 'base_unittests'], mbw=mbw, ret=0)
775
776 def test_lookup(self):
777 self.check(['lookup', '-c', 'debug_goma'], ret=0)
778
Oleh Prypind7e2fb32019-05-31 13:25:39 +0200779 def test_quiet_lookup(self):
780 self.check(['lookup', '-c', 'debug_goma', '--quiet'], ret=0,
781 out=('is_debug = true\n'
782 'use_goma = true\n'))
783
Oleh Prypinb708e932018-03-18 17:34:20 +0100784 def test_lookup_goma_dir_expansion(self):
785 self.check(['lookup', '-c', 'rel_bot', '-g', '/foo'], ret=0,
kjellandera013a022016-11-14 05:54:22 -0800786 out=('\n'
787 'Writing """\\\n'
Oleh Prypinb708e932018-03-18 17:34:20 +0100788 'enable_doom_melon = true\n'
kjellandera013a022016-11-14 05:54:22 -0800789 'goma_dir = "/foo"\n'
790 'is_debug = false\n'
791 'use_goma = true\n'
792 '""" to _path_/args.gn.\n\n'
793 '/fake_src/buildtools/linux64/gn gen _path_\n'))
794
kjellandera013a022016-11-14 05:54:22 -0800795 def test_help(self):
796 orig_stdout = sys.stdout
797 try:
798 sys.stdout = StringIO.StringIO()
799 self.assertRaises(SystemExit, self.check, ['-h'])
800 self.assertRaises(SystemExit, self.check, ['help'])
801 self.assertRaises(SystemExit, self.check, ['help', 'gen'])
802 finally:
803 sys.stdout = orig_stdout
804
805 def test_multiple_phases(self):
806 # Check that not passing a --phase to a multi-phase builder fails.
807 mbw = self.check(['lookup', '-m', 'fake_master', '-b', 'fake_multi_phase'],
808 ret=1)
809 self.assertIn('Must specify a build --phase', mbw.out)
810
811 # Check that passing a --phase to a single-phase builder fails.
Oleh Prypinb708e932018-03-18 17:34:20 +0100812 mbw = self.check(['lookup', '-m', 'fake_master', '-b', 'fake_builder',
kjellandera013a022016-11-14 05:54:22 -0800813 '--phase', 'phase_1'], ret=1)
814 self.assertIn('Must not specify a build --phase', mbw.out)
815
816 # Check that passing a wrong phase key to a multi-phase builder fails.
817 mbw = self.check(['lookup', '-m', 'fake_master', '-b', 'fake_multi_phase',
818 '--phase', 'wrong_phase'], ret=1)
819 self.assertIn('Phase wrong_phase doesn\'t exist', mbw.out)
820
821 # Check that passing a correct phase key to a multi-phase builder passes.
822 mbw = self.check(['lookup', '-m', 'fake_master', '-b', 'fake_multi_phase',
823 '--phase', 'phase_1'], ret=0)
824 self.assertIn('phase = 1', mbw.out)
825
826 mbw = self.check(['lookup', '-m', 'fake_master', '-b', 'fake_multi_phase',
827 '--phase', 'phase_2'], ret=0)
828 self.assertIn('phase = 2', mbw.out)
829
830 def test_validate(self):
831 mbw = self.fake_mbw()
832 self.check(['validate'], mbw=mbw, ret=0)
833
kjellandera013a022016-11-14 05:54:22 -0800834
835if __name__ == '__main__':
836 unittest.main()