OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright 2015 The Chromium Authors. All rights reserved. | 2 # Copyright 2015 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Tests for mb.py.""" | 6 """Tests for mb.py.""" |
7 | 7 |
8 import json | 8 import json |
9 import StringIO | 9 import StringIO |
| 10 import os |
10 import sys | 11 import sys |
11 import unittest | 12 import unittest |
12 | 13 |
13 import mb | 14 import mb |
14 | 15 |
15 | 16 |
16 class FakeMBW(mb.MetaBuildWrapper): | 17 class FakeMBW(mb.MetaBuildWrapper): |
17 def __init__(self): | 18 def __init__(self): |
18 super(FakeMBW, self).__init__() | 19 super(FakeMBW, self).__init__() |
| 20 |
| 21 # Override vars for test portability. |
| 22 self.chromium_src_dir = '/fake_src' |
| 23 self.default_config = '/fake_src/tools/mb/mb_config.pyl' |
| 24 self.executable = 'python' |
| 25 self.platform = 'linux2' |
| 26 self.sep = '/' |
| 27 |
19 self.files = {} | 28 self.files = {} |
20 self.calls = [] | 29 self.calls = [] |
21 self.cmds = [] | 30 self.cmds = [] |
22 self.cross_compile = None | 31 self.cross_compile = None |
23 self.out = '' | 32 self.out = '' |
24 self.err = '' | 33 self.err = '' |
25 self.platform = 'linux2' | |
26 self.chromium_src_dir = '/fake_src' | |
27 self.default_config = '/fake_src/tools/mb/mb_config.pyl' | |
28 self.rmdirs = [] | 34 self.rmdirs = [] |
29 | 35 |
30 def ExpandUser(self, path): | 36 def ExpandUser(self, path): |
31 return '$HOME/%s' % path | 37 return '$HOME/%s' % path |
32 | 38 |
33 def Exists(self, path): | 39 def Exists(self, path): |
34 return self.files.get(path) is not None | 40 return self.files.get(path) is not None |
35 | 41 |
36 def MaybeMakeDirectory(self, path): | 42 def MaybeMakeDirectory(self, path): |
37 self.files[path] = True | 43 self.files[path] = True |
38 | 44 |
| 45 def PathJoin(self, *comps): |
| 46 return self.sep.join(comps) |
| 47 |
39 def ReadFile(self, path): | 48 def ReadFile(self, path): |
40 return self.files[path] | 49 return self.files[path] |
41 | 50 |
42 def WriteFile(self, path, contents, force_verbose=False): | 51 def WriteFile(self, path, contents, force_verbose=False): |
43 self.files[path] = contents | 52 self.files[path] = contents |
44 | 53 |
45 def Call(self, cmd, env=None): | 54 def Call(self, cmd, env=None): |
46 if env: | 55 if env: |
47 self.cross_compile = env.get('GYP_CROSSCOMPILE') | 56 self.cross_compile = env.get('GYP_CROSSCOMPILE') |
48 self.calls.append(cmd) | 57 self.calls.append(cmd) |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 'gyp_defaults': 'doom_melon=0', | 123 'gyp_defaults': 'doom_melon=0', |
115 }, | 124 }, |
116 'gyp': {'type': 'gyp'}, | 125 'gyp': {'type': 'gyp'}, |
117 'gn': {'type': 'gn'}, | 126 'gn': {'type': 'gn'}, |
118 'goma': { | 127 'goma': { |
119 'gn_args': 'use_goma=true goma_dir="$(goma_dir)"', | 128 'gn_args': 'use_goma=true goma_dir="$(goma_dir)"', |
120 'gyp_defines': 'goma=1 gomadir="$(goma_dir)"', | 129 'gyp_defines': 'goma=1 gomadir="$(goma_dir)"', |
121 }, | 130 }, |
122 'rel': { | 131 'rel': { |
123 'gn_args': 'is_debug=false', | 132 'gn_args': 'is_debug=false', |
124 'gyp_config': 'Release', | |
125 }, | 133 }, |
126 'debug': { | 134 'debug': { |
127 'gn_args': 'is_debug=true', | 135 'gn_args': 'is_debug=true', |
128 'gyp_config': 'Debug', | |
129 }, | 136 }, |
130 }, | 137 }, |
131 'private_configs': ['private'], | 138 'private_configs': ['private'], |
132 'unsupported_configs': ['unsupported'], | 139 'unsupported_configs': ['unsupported'], |
133 } | 140 } |
134 """ | 141 """ |
135 | 142 |
136 | 143 |
137 class UnitTest(unittest.TestCase): | 144 class UnitTest(unittest.TestCase): |
138 def fake_mbw(self, files=None): | 145 def fake_mbw(self, files=None): |
(...skipping 20 matching lines...) Expand all Loading... |
159 def test_clobber(self): | 166 def test_clobber(self): |
160 files = { | 167 files = { |
161 '/fake_src/out/Debug': None, | 168 '/fake_src/out/Debug': None, |
162 '/fake_src/out/Debug/mb_type': None, | 169 '/fake_src/out/Debug/mb_type': None, |
163 } | 170 } |
164 mbw = self.fake_mbw(files) | 171 mbw = self.fake_mbw(files) |
165 | 172 |
166 # The first time we run this, the build dir doesn't exist, so no clobber. | 173 # The first time we run this, the build dir doesn't exist, so no clobber. |
167 self.check(['gen', '-c', 'gn_debug', '//out/Debug'], mbw=mbw, ret=0) | 174 self.check(['gen', '-c', 'gn_debug', '//out/Debug'], mbw=mbw, ret=0) |
168 self.assertEqual(mbw.rmdirs, []) | 175 self.assertEqual(mbw.rmdirs, []) |
169 self.assertTrue(mbw.files['/fake_src/out/Debug/mb_type'], 'gn') | 176 self.assertEqual(mbw.files['/fake_src/out/Debug/mb_type'], 'gn') |
170 | 177 |
171 # The second time we run this, the build dir exists and matches, so no | 178 # The second time we run this, the build dir exists and matches, so no |
172 # clobber. | 179 # clobber. |
173 self.check(['gen', '-c', 'gn_debug', '//out/Debug'], mbw=mbw, ret=0) | 180 self.check(['gen', '-c', 'gn_debug', '//out/Debug'], mbw=mbw, ret=0) |
174 self.assertEqual(mbw.rmdirs, []) | 181 self.assertEqual(mbw.rmdirs, []) |
175 self.assertEqual(mbw.files['/fake_src/out/Debug/mb_type'], 'gn') | 182 self.assertEqual(mbw.files['/fake_src/out/Debug/mb_type'], 'gn') |
176 | 183 |
177 # Now we switch build types; this should result in a clobber. | 184 # Now we switch build types; this should result in a clobber. |
178 self.check(['gen', '-c', 'gyp_debug', '//out/Debug'], mbw=mbw, ret=0) | 185 self.check(['gen', '-c', 'gyp_debug', '//out/Debug'], mbw=mbw, ret=0) |
179 self.assertEqual(mbw.rmdirs, ['/fake_src/out/Debug']) | 186 self.assertEqual(mbw.rmdirs, ['/fake_src/out/Debug']) |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 '/tmp/in.json', '/tmp/out.json'], | 294 '/tmp/in.json', '/tmp/out.json'], |
288 ret=0) | 295 ret=0) |
289 self.assertIn('analyzer', mbw.calls[0]) | 296 self.assertIn('analyzer', mbw.calls[0]) |
290 | 297 |
291 def test_gyp_crosscompile(self): | 298 def test_gyp_crosscompile(self): |
292 mbw = self.fake_mbw() | 299 mbw = self.fake_mbw() |
293 self.check(['gen', '-c', 'private', '//out/Release'], mbw=mbw) | 300 self.check(['gen', '-c', 'private', '//out/Release'], mbw=mbw) |
294 self.assertTrue(mbw.cross_compile) | 301 self.assertTrue(mbw.cross_compile) |
295 | 302 |
296 def test_gyp_gen(self): | 303 def test_gyp_gen(self): |
297 self.check(['gen', '-c', 'gyp_rel_bot', '//out/Release'], ret=0) | 304 self.check(['gen', '-c', 'gyp_rel_bot', '-g', '/goma', '//out/Release'], |
| 305 ret=0, |
| 306 out=("python build/gyp_chromium -G output_dir=out " |
| 307 "-D goma=1 -D gomadir=/goma\n")) |
| 308 |
| 309 # simulate win32 |
| 310 mbw = self.fake_mbw() |
| 311 mbw.sep = '\\' |
| 312 self.check(['gen', '-c', 'gyp_rel_bot', '-g', 'c:\\goma', '//out/Release'], |
| 313 mbw=mbw, ret=0, |
| 314 out=("python 'build\\gyp_chromium' -G output_dir=out " |
| 315 "-D goma=1 -D 'gomadir=c:\\goma'\n")) |
298 | 316 |
299 def test_gyp_gen_fails(self): | 317 def test_gyp_gen_fails(self): |
300 mbw = self.fake_mbw() | 318 mbw = self.fake_mbw() |
301 mbw.Call = lambda cmd, env=None: (1, '', '') | 319 mbw.Call = lambda cmd, env=None: (1, '', '') |
302 self.check(['gen', '-c', 'gyp_rel_bot', '//out/Release'], mbw=mbw, ret=1) | 320 self.check(['gen', '-c', 'gyp_rel_bot', '//out/Release'], mbw=mbw, ret=1) |
303 | 321 |
304 def test_gyp_lookup_goma_dir_expansion(self): | 322 def test_gyp_lookup_goma_dir_expansion(self): |
305 self.check(['lookup', '-c', 'gyp_rel_bot', '-g', '/foo'], ret=0, | 323 self.check(['lookup', '-c', 'gyp_rel_bot', '-g', '/foo'], ret=0, |
306 out=("python build/gyp_chromium -G 'output_dir=<path>' " | 324 out=("python build/gyp_chromium -G 'output_dir=<path>' " |
307 "-G config=Release -D goma=1 -D gomadir=/foo\n")) | 325 "-D goma=1 -D gomadir=/foo\n")) |
308 | 326 |
309 def test_help(self): | 327 def test_help(self): |
310 orig_stdout = sys.stdout | 328 orig_stdout = sys.stdout |
311 try: | 329 try: |
312 sys.stdout = StringIO.StringIO() | 330 sys.stdout = StringIO.StringIO() |
313 self.assertRaises(SystemExit, self.check, ['-h']) | 331 self.assertRaises(SystemExit, self.check, ['-h']) |
314 self.assertRaises(SystemExit, self.check, ['help']) | 332 self.assertRaises(SystemExit, self.check, ['help']) |
315 self.assertRaises(SystemExit, self.check, ['help', 'gen']) | 333 self.assertRaises(SystemExit, self.check, ['help', 'gen']) |
316 finally: | 334 finally: |
317 sys.stdout = orig_stdout | 335 sys.stdout = orig_stdout |
318 | 336 |
319 | 337 |
320 def test_validate(self): | 338 def test_validate(self): |
321 self.check(['validate'], ret=0) | 339 self.check(['validate'], ret=0) |
322 | 340 |
323 | 341 |
324 if __name__ == '__main__': | 342 if __name__ == '__main__': |
325 unittest.main() | 343 unittest.main() |
OLD | NEW |