OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 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 """Unit tests for owners.py.""" | 6 """Unit tests for owners.py.""" |
7 | 7 |
8 import os | 8 import os |
9 import sys | 9 import sys |
10 import unittest | 10 import unittest |
11 | 11 |
12 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | 12 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
13 | 13 |
14 from testing_support import filesystem_mock | 14 from testing_support import filesystem_mock |
15 | 15 |
16 import owners | 16 import owners |
17 | 17 |
18 ben = 'ben@example.com' | 18 ben = 'ben@example.com' |
19 brett = 'brett@example.com' | 19 brett = 'brett@example.com' |
20 darin = 'darin@example.com' | 20 darin = 'darin@example.com' |
21 john = 'john@example.com' | 21 john = 'john@example.com' |
22 ken = 'ken@example.com' | 22 ken = 'ken@example.com' |
23 peter = 'peter@example.com' | 23 peter = 'peter@example.com' |
| 24 tom = 'tom@example.com' |
| 25 |
24 | 26 |
25 def owners_file(*email_addresses, **kwargs): | 27 def owners_file(*email_addresses, **kwargs): |
26 s = '' | 28 s = '' |
27 if kwargs.get('comment'): | 29 if kwargs.get('comment'): |
28 s += '# %s\n' % kwargs.get('comment') | 30 s += '# %s\n' % kwargs.get('comment') |
29 if kwargs.get('noparent'): | 31 if kwargs.get('noparent'): |
30 s += 'set noparent\n' | 32 s += 'set noparent\n' |
| 33 s += '\n'.join(kwargs.get('lines', [])) + '\n' |
31 return s + '\n'.join(email_addresses) + '\n' | 34 return s + '\n'.join(email_addresses) + '\n' |
32 | 35 |
33 | 36 |
34 def test_repo(): | 37 def test_repo(): |
35 return filesystem_mock.MockFileSystem(files={ | 38 return filesystem_mock.MockFileSystem(files={ |
36 '/DEPS' : '', | 39 '/DEPS' : '', |
37 '/OWNERS': owners_file(owners.EVERYONE), | 40 '/OWNERS': owners_file(owners.EVERYONE), |
38 '/base/vlog.h': '', | 41 '/base/vlog.h': '', |
39 '/chrome/OWNERS': owners_file(ben, brett), | 42 '/chrome/OWNERS': owners_file(ben, brett), |
40 '/chrome/gpu/OWNERS': owners_file(ken), | 43 '/chrome/gpu/OWNERS': owners_file(ken), |
41 '/chrome/gpu/gpu_channel.h': '', | 44 '/chrome/gpu/gpu_channel.h': '', |
42 '/chrome/renderer/OWNERS': owners_file(peter), | 45 '/chrome/renderer/OWNERS': owners_file(peter), |
43 '/chrome/renderer/gpu/gpu_channel_host.h': '', | 46 '/chrome/renderer/gpu/gpu_channel_host.h': '', |
44 '/chrome/renderer/safe_browsing/scorer.h': '', | 47 '/chrome/renderer/safe_browsing/scorer.h': '', |
45 '/content/OWNERS': owners_file(john, darin, comment='foo', noparent=True), | 48 '/content/OWNERS': owners_file(john, darin, comment='foo', noparent=True), |
46 '/content/content.gyp': '', | 49 '/content/content.gyp': '', |
47 '/content/bar/foo.cc': '', | 50 '/content/bar/foo.cc': '', |
48 '/content/baz/OWNERS': owners_file(brett), | 51 '/content/baz/OWNERS': owners_file(brett), |
49 '/content/baz/froboz.h': '', | 52 '/content/baz/froboz.h': '', |
| 53 '/content/baz/ugly.cc': '', |
| 54 '/content/baz/ugly.h': '', |
50 '/content/views/OWNERS': owners_file(ben, john, owners.EVERYONE, | 55 '/content/views/OWNERS': owners_file(ben, john, owners.EVERYONE, |
51 noparent=True), | 56 noparent=True), |
52 '/content/views/pie.h': '', | 57 '/content/views/pie.h': '', |
53 }) | 58 }) |
54 | 59 |
55 | 60 |
56 class OwnersDatabaseTest(unittest.TestCase): | 61 class OwnersDatabaseTest(unittest.TestCase): |
57 def setUp(self): | 62 def setUp(self): |
58 self.repo = test_repo() | 63 self.repo = test_repo() |
59 self.files = self.repo.files | 64 self.files = self.repo.files |
60 self.root = '/' | 65 self.root = '/' |
61 self.fopen = self.repo.open_for_reading | 66 self.fopen = self.repo.open_for_reading |
| 67 self.glob = self.repo.glob |
62 | 68 |
63 def db(self, root=None, fopen=None, os_path=None): | 69 def db(self, root=None, fopen=None, os_path=None, glob=None): |
64 root = root or self.root | 70 root = root or self.root |
65 fopen = fopen or self.fopen | 71 fopen = fopen or self.fopen |
66 os_path = os_path or self.repo | 72 os_path = os_path or self.repo |
67 return owners.Database(root, fopen, os_path) | 73 glob = glob or self.glob |
| 74 return owners.Database(root, fopen, os_path, glob) |
68 | 75 |
69 def test_constructor(self): | 76 def test_constructor(self): |
70 self.assertNotEquals(self.db(), None) | 77 self.assertNotEquals(self.db(), None) |
71 | 78 |
72 def test_dirs_not_covered_by__valid_inputs(self): | 79 def test_dirs_not_covered_by__valid_inputs(self): |
73 db = self.db() | 80 db = self.db() |
74 | 81 |
75 # Check that we're passed in a sequence that isn't a string. | 82 # Check that we're passed in a sequence that isn't a string. |
76 self.assertRaises(AssertionError, db.directories_not_covered_by, 'foo', []) | 83 self.assertRaises(AssertionError, db.directories_not_covered_by, 'foo', []) |
77 if hasattr(owners.collections, 'Iterable'): | 84 if hasattr(owners.collections, 'Iterable'): |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 self.assert_dirs_not_covered_by( | 131 self.assert_dirs_not_covered_by( |
125 ['content/content.gyp', # Not covered | 132 ['content/content.gyp', # Not covered |
126 'content/bar/foo.cc', # Not covered (combines in) | 133 'content/bar/foo.cc', # Not covered (combines in) |
127 'content/baz/froboz.h', # Not covered | 134 'content/baz/froboz.h', # Not covered |
128 'chrome/gpu/gpu_channel.h', # Owned by ken | 135 'chrome/gpu/gpu_channel.h', # Owned by ken |
129 'chrome/renderer/gpu/gpu_channel_host.h' # Owned by * via parent | 136 'chrome/renderer/gpu/gpu_channel_host.h' # Owned by * via parent |
130 ], | 137 ], |
131 [ken], | 138 [ken], |
132 ['content', 'content/baz']) | 139 ['content', 'content/baz']) |
133 | 140 |
| 141 def test_per_file(self): |
| 142 # brett isn't allowed to approve ugly.cc |
| 143 self.files['/content/baz/OWNERS'] = owners_file(brett, |
| 144 lines=['per-file ugly.*=tom@example.com']) |
| 145 self.assert_dirs_not_covered_by(['content/baz/ugly.cc'], |
| 146 [brett], |
| 147 []) |
| 148 |
| 149 # tom is allowed to approve ugly.cc, but not froboz.h |
| 150 self.assert_dirs_not_covered_by(['content/baz/ugly.cc'], |
| 151 [tom], |
| 152 []) |
| 153 self.assert_dirs_not_covered_by(['content/baz/froboz.h'], |
| 154 [tom], |
| 155 ['content/baz']) |
| 156 |
| 157 def test_per_file__set_noparent(self): |
| 158 self.files['/content/baz/OWNERS'] = owners_file(brett, |
| 159 lines=['per-file ugly.*=tom@example.com', |
| 160 'per-file ugly.*=set noparent']) |
| 161 |
| 162 # brett isn't allowed to approve ugly.cc |
| 163 self.assert_dirs_not_covered_by(['content/baz/ugly.cc'], |
| 164 [brett], |
| 165 ['content/baz/ugly.cc']) |
| 166 |
| 167 # tom is allowed to approve ugly.cc, but not froboz.h |
| 168 self.assert_dirs_not_covered_by(['content/baz/ugly.cc'], |
| 169 [tom], |
| 170 []) |
| 171 |
| 172 self.assert_dirs_not_covered_by(['content/baz/froboz.h'], |
| 173 [tom], |
| 174 ['content/baz']) |
| 175 |
| 176 |
134 def assert_reviewers_for(self, files, expected_reviewers): | 177 def assert_reviewers_for(self, files, expected_reviewers): |
135 db = self.db() | 178 db = self.db() |
136 self.assertEquals(db.reviewers_for(set(files)), set(expected_reviewers)) | 179 self.assertEquals(db.reviewers_for(set(files)), set(expected_reviewers)) |
137 | 180 |
138 def test_reviewers_for__basic_functionality(self): | 181 def test_reviewers_for__basic_functionality(self): |
139 self.assert_reviewers_for(['chrome/gpu/gpu_channel.h'], | 182 self.assert_reviewers_for(['chrome/gpu/gpu_channel.h'], |
140 [brett]) | 183 [brett]) |
141 | 184 |
142 def test_reviewers_for__set_noparent_works(self): | 185 def test_reviewers_for__set_noparent_works(self): |
143 self.assert_reviewers_for(['content/content.gyp'], [darin]) | 186 self.assert_reviewers_for(['content/content.gyp'], [darin]) |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 | 240 |
198 def test_syntax_error__unknown_set(self): | 241 def test_syntax_error__unknown_set(self): |
199 self.assert_syntax_error('set myfatherisbillgates\n') | 242 self.assert_syntax_error('set myfatherisbillgates\n') |
200 | 243 |
201 def test_syntax_error__bad_email(self): | 244 def test_syntax_error__bad_email(self): |
202 self.assert_syntax_error('ben\n') | 245 self.assert_syntax_error('ben\n') |
203 | 246 |
204 | 247 |
205 if __name__ == '__main__': | 248 if __name__ == '__main__': |
206 unittest.main() | 249 unittest.main() |
OLD | NEW |