| 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 |