| OLD | NEW |
| 1 # Copyright 2015 The Chromium Authors. All rights reserved. | 1 # Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 """Tests for mb.py.""" | 5 """Tests for mb.py.""" |
| 6 | 6 |
| 7 import json |
| 7 import sys | 8 import sys |
| 8 import unittest | 9 import unittest |
| 9 | 10 |
| 10 import mb | 11 import mb |
| 11 | 12 |
| 12 | 13 |
| 13 class FakeMB(mb.MetaBuildWrapper): | 14 class FakeMBW(mb.MetaBuildWrapper): |
| 14 def __init__(self): | 15 def __init__(self): |
| 15 super(FakeMB, self).__init__() | 16 super(FakeMBW, self).__init__() |
| 16 self.files = {} | 17 self.files = {} |
| 17 self.calls = [] | 18 self.calls = [] |
| 18 self.out = [] | 19 self.out = '' |
| 19 self.err = [] | 20 self.err = '' |
| 20 self.chromium_src_dir = '/fake_src' | 21 self.chromium_src_dir = '/fake_src' |
| 21 self.default_config = '/fake_src/tools/mb/mb_config.pyl' | 22 self.default_config = '/fake_src/tools/mb/mb_config.pyl' |
| 22 | 23 |
| 23 def ExpandUser(self, path): | 24 def ExpandUser(self, path): |
| 24 return '$HOME/%s' % path | 25 return '$HOME/%s' % path |
| 25 | 26 |
| 26 def Exists(self, path): | 27 def Exists(self, path): |
| 27 return self.files.get(path) is not None | 28 return self.files.get(path) is not None |
| 28 | 29 |
| 29 def ReadFile(self, path): | 30 def ReadFile(self, path): |
| 30 return self.files[path] | 31 return self.files[path] |
| 31 | 32 |
| 32 def WriteFile(self, path, contents): | 33 def WriteFile(self, path, contents): |
| 33 self.files[path] = contents | 34 self.files[path] = contents |
| 34 | 35 |
| 35 def Call(self, cmd): | 36 def Call(self, cmd): |
| 36 self.calls.append(cmd) | 37 self.calls.append(cmd) |
| 37 return 0, '', '' | 38 return 0, '', '' |
| 38 | 39 |
| 39 def Print(self, *args, **kwargs): | 40 def Print(self, *args, **kwargs): |
| 40 sep = kwargs.get('sep', ' ') | 41 sep = kwargs.get('sep', ' ') |
| 41 end = kwargs.get('end', '\n') | 42 end = kwargs.get('end', '\n') |
| 42 f = kwargs.get('file', sys.stdout) | 43 f = kwargs.get('file', sys.stdout) |
| 43 if f == sys.stderr: | 44 if f == sys.stderr: |
| 44 self.err.append(sep.join(args) + end) | 45 self.err += sep.join(args) + end |
| 45 else: | 46 else: |
| 46 self.out.append(sep.join(args) + end) | 47 self.out += sep.join(args) + end |
| 47 | 48 |
| 48 class IntegrationTest(unittest.TestCase): | 49 class IntegrationTest(unittest.TestCase): |
| 49 def test_validate(self): | 50 def test_validate(self): |
| 50 # Note that this validates that the actual mb_config.pyl is valid. | 51 # Note that this validates that the actual mb_config.pyl is valid. |
| 51 ret = mb.main(['validate', '--quiet']) | 52 ret = mb.main(['validate', '--quiet']) |
| 52 self.assertEqual(ret, 0) | 53 self.assertEqual(ret, 0) |
| 53 | 54 |
| 54 | 55 |
| 55 TEST_CONFIG = """\ | 56 TEST_CONFIG = """\ |
| 56 { | 57 { |
| 57 'common_dev_configs': ['gn_debug'], | 58 'common_dev_configs': ['gn_debug'], |
| 58 'configs': { | 59 'configs': { |
| 59 'gyp_rel_bot': ['gyp', 'rel', 'goma'], | 60 'gyp_rel_bot': ['gyp', 'rel', 'goma'], |
| 60 'gn_debug': ['gn', 'debug'], | 61 'gn_debug': ['gn', 'debug'], |
| 62 'gn_rel_bot': ['gn', 'rel', 'goma'], |
| 61 'private': ['gyp', 'fake_feature1'], | 63 'private': ['gyp', 'fake_feature1'], |
| 62 'unsupported': ['gn', 'fake_feature2'], | 64 'unsupported': ['gn', 'fake_feature2'], |
| 63 }, | 65 }, |
| 64 'masters': { | 66 'masters': { |
| 65 'fake_master': { | 67 'fake_master': { |
| 66 'fake_builder': 'gyp_rel_bot', | 68 'fake_builder': 'gyp_rel_bot', |
| 69 'fake_gn_builder': 'gn_rel_bot', |
| 67 }, | 70 }, |
| 68 }, | 71 }, |
| 69 'mixins': { | 72 'mixins': { |
| 70 'fake_feature1': { | 73 'fake_feature1': { |
| 71 'gn_args': 'enable_doom_melon=true', | 74 'gn_args': 'enable_doom_melon=true', |
| 72 'gyp_defines': 'doom_melon=1', | 75 'gyp_defines': 'doom_melon=1', |
| 73 }, | 76 }, |
| 74 'fake_feature2': { | 77 'fake_feature2': { |
| 75 'gn_args': 'enable_doom_melon=false', | 78 'gn_args': 'enable_doom_melon=false', |
| 76 'gyp_defaults': 'doom_melon=0', | 79 'gyp_defaults': 'doom_melon=0', |
| (...skipping 12 matching lines...) Expand all Loading... |
| 89 'gn_args': 'is_debug=true', | 92 'gn_args': 'is_debug=true', |
| 90 }, | 93 }, |
| 91 }, | 94 }, |
| 92 'private_configs': ['private'], | 95 'private_configs': ['private'], |
| 93 'unsupported_configs': ['unsupported'], | 96 'unsupported_configs': ['unsupported'], |
| 94 } | 97 } |
| 95 """ | 98 """ |
| 96 | 99 |
| 97 | 100 |
| 98 class UnitTest(unittest.TestCase): | 101 class UnitTest(unittest.TestCase): |
| 99 def check(self, args, files=None, cmds=None, out=None, err=None, ret=None): | 102 def fake_mbw(self, files): |
| 100 m = FakeMB() | 103 mbw = FakeMBW() |
| 101 if files: | 104 if files: |
| 102 for path, contents in files.items(): | 105 for path, contents in files.items(): |
| 103 m.files[path] = contents | 106 mbw.files[path] = contents |
| 104 m.files.setdefault(mb.default_config, TEST_CONFIG) | 107 mbw.files.setdefault(mbw.default_config, TEST_CONFIG) |
| 105 m.ParseArgs(args) | 108 return mbw |
| 106 actual_ret = m.args.func() | 109 |
| 110 def check(self, args, mbw=None, files=None, out=None, err=None, ret=None): |
| 111 if not mbw: |
| 112 mbw = self.fake_mbw(files) |
| 113 mbw.ParseArgs(args) |
| 114 actual_ret = mbw.args.func() |
| 107 if ret is not None: | 115 if ret is not None: |
| 108 self.assertEqual(actual_ret, ret) | 116 self.assertEqual(actual_ret, ret) |
| 109 if out is not None: | 117 if out is not None: |
| 110 self.assertEqual(m.out, out) | 118 self.assertEqual(mbw.out, out) |
| 111 if err is not None: | 119 if err is not None: |
| 112 self.assertEqual(m.err, err) | 120 self.assertEqual(mbw.err, err) |
| 113 if cmds is not None: | 121 return mbw |
| 114 self.assertEqual(m.cmds, cmds) | |
| 115 | 122 |
| 116 def test_analyze(self): | 123 def test_gn_analyze(self): |
| 117 files = {'/tmp/in.json': '{"files": [], "targets": []}'} | 124 files = {'/tmp/in.json': """{\ |
| 125 "files": ["foo/foo_unittest.cc"], |
| 126 "targets": ["foo_unittests", "bar_unittests"] |
| 127 }"""} |
| 128 mbw = self.fake_mbw(files) |
| 129 mbw.Call = lambda cmd: (0, 'out/Default/foo_unittests\n', '') |
| 130 |
| 118 self.check(['analyze', '-c', 'gn_debug', '//out/Default', | 131 self.check(['analyze', '-c', 'gn_debug', '//out/Default', |
| 119 '/tmp/in.json', '/tmp/out.json'], | 132 '/tmp/in.json', '/tmp/out.json'], mbw=mbw, ret=0) |
| 120 files=files, ret=0) | 133 out = json.loads(mbw.files['/tmp/out.json']) |
| 134 self.assertEqual(out, { |
| 135 'status': 'Found dependency', |
| 136 'targets': ['foo_unittests'], |
| 137 'build_targets': ['foo_unittests'] |
| 138 }) |
| 139 |
| 140 def test_gyp_analyze(self): |
| 121 self.check(['analyze', '-c', 'gyp_rel_bot', '//out/Release', | 141 self.check(['analyze', '-c', 'gyp_rel_bot', '//out/Release', |
| 122 '/tmp/in.json', '/tmp/out.json'], | 142 '/tmp/in.json', '/tmp/out.json'], |
| 123 ret=0) | 143 ret=0) |
| 124 | 144 |
| 125 def test_gen(self): | 145 def test_gen(self): |
| 126 self.check(['gen', '-c', 'gn_debug', '//out/Default'], ret=0) | 146 self.check(['gen', '-c', 'gn_debug', '//out/Default'], ret=0) |
| 127 self.check(['gen', '-c', 'gyp_rel_bot', '//out/Release'], ret=0) | 147 self.check(['gen', '-c', 'gyp_rel_bot', '//out/Release'], ret=0) |
| 128 | 148 |
| 149 def test_goma_dir_expansion(self): |
| 150 self.check(['lookup', '-c', 'gyp_rel_bot', '-g', '/foo'], ret=0, |
| 151 out=("python build/gyp_chromium -G 'output_dir=<path>' " |
| 152 "-G config=Release -D goma=1 -D gomadir=/foo\n")) |
| 153 self.check(['lookup', '-c', 'gn_rel_bot', '-g', '/foo'], ret=0, |
| 154 out=("gn gen '<path>' '--args=is_debug=false use_goma=true " |
| 155 "goma_dir=\"/foo\"'\n" )) |
| 156 |
| 129 def test_help(self): | 157 def test_help(self): |
| 130 self.assertRaises(SystemExit, self.check, ['-h']) | 158 self.assertRaises(SystemExit, self.check, ['-h']) |
| 131 self.assertRaises(SystemExit, self.check, ['help']) | 159 self.assertRaises(SystemExit, self.check, ['help']) |
| 132 self.assertRaises(SystemExit, self.check, ['help', 'gen']) | 160 self.assertRaises(SystemExit, self.check, ['help', 'gen']) |
| 133 | 161 |
| 134 def test_lookup(self): | 162 def test_lookup(self): |
| 135 self.check(['lookup', '-c', 'gn_debug'], ret=0) | 163 self.check(['lookup', '-c', 'gn_debug'], ret=0) |
| 136 | 164 |
| 137 def test_validate(self): | 165 def test_validate(self): |
| 138 self.check(['validate'], ret=0) | 166 self.check(['validate'], ret=0) |
| 139 | 167 |
| 140 | 168 |
| 141 if __name__ == '__main__': | 169 if __name__ == '__main__': |
| 142 unittest.main() | 170 unittest.main() |
| OLD | NEW |