Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1161)

Side by Side Diff: tests/owners_unittest.py

Issue 11114005: implement per-file OWNERS support (Closed) Base URL: https://git.chromium.org/chromium/tools/depot_tools.git@master
Patch Set: update w/ more review feedback Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « testing_support/filesystem_mock.py ('k') | tests/presubmit_unittest.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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()
OLDNEW
« no previous file with comments | « testing_support/filesystem_mock.py ('k') | tests/presubmit_unittest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698