Index: tests/owners_unittest.py |
diff --git a/tests/owners_unittest.py b/tests/owners_unittest.py |
index f205aed697cf3bd6b74e1e62fcb3f246a1866c31..5cb177411c6d6061107299ce8fb85a8e2d9c650a 100755 |
--- a/tests/owners_unittest.py |
+++ b/tests/owners_unittest.py |
@@ -30,6 +30,8 @@ def owners_file(*email_addresses, **kwargs): |
s += '# %s\n' % kwargs.get('comment') |
if kwargs.get('noparent'): |
s += 'set noparent\n' |
+ if kwargs.get('file'): |
+ s += 'file:%s\n' % kwargs.get('file') |
s += '\n'.join(kwargs.get('lines', [])) + '\n' |
return s + '\n'.join(email_addresses) + '\n' |
@@ -54,6 +56,11 @@ def test_repo(): |
'/content/baz/froboz.h': '', |
'/content/baz/ugly.cc': '', |
'/content/baz/ugly.h': '', |
+ '/content/garply/OWNERS': owners_file(file='test/OWNERS'), |
+ '/content/garply/foo.cc': '', |
+ '/content/garply/test/OWNERS': owners_file(peter), |
+ '/content/qux/OWNERS': owners_file(peter, file='//content/baz/OWNERS'), |
+ '/content/qux/foo.cc': '', |
'/content/views/OWNERS': owners_file(ben, john, owners.EVERYONE, |
noparent=True), |
'/content/views/pie.h': '', |
@@ -209,6 +216,50 @@ class OwnersDatabaseTest(_BaseTestCase): |
self.assertRaises(owners.SyntaxErrorInOwnersFile, |
self.db().files_not_covered_by, ['DEPS'], [brett]) |
+ def test_file_include_absolute_path(self): |
+ self.assert_files_not_covered_by(['content/qux/foo.cc'], [brett], []) |
+ self.assert_files_not_covered_by(['content/qux/bar.cc'], [peter], []) |
+ self.assert_files_not_covered_by(['content/qux/baz.cc'], |
+ [tom], ['content/qux/baz.cc']) |
+ |
+ def test_file_include_relative_path(self): |
+ self.assert_files_not_covered_by(['content/garply/foo.cc'], [peter], []) |
+ self.assert_files_not_covered_by(['content/garply/bar.cc'], [darin], []) |
+ self.assert_files_not_covered_by(['content/garply/baz.cc'], |
+ [tom], ['content/garply/baz.cc']) |
+ |
+ def test_file_include_per_file_absolute_path(self): |
+ self.files['/content/qux/OWNERS'] = owners_file(peter, |
+ lines=['per-file foo.*=file://content/baz/OWNERS']) |
+ |
+ self.assert_files_not_covered_by(['content/qux/foo.cc'], [brett], []) |
+ self.assert_files_not_covered_by(['content/qux/baz.cc'], |
+ [brett], ['content/qux/baz.cc']) |
+ |
+ def test_file_include_per_file_relative_path(self): |
+ self.files['/content/garply/OWNERS'] = owners_file(brett, |
+ lines=['per-file foo.*=file:test/OWNERS']) |
+ |
+ self.assert_files_not_covered_by(['content/garply/foo.cc'], [peter], []) |
+ self.assert_files_not_covered_by(['content/garply/baz.cc'], |
+ [peter], ['content/garply/baz.cc']) |
+ |
+ def test_file_include_recursive(self): |
+ self.files['/content/baz/OWNERS'] = owners_file(file='//chrome/gpu/OWNERS') |
+ self.assert_files_not_covered_by(['content/qux/foo.cc'], [ken], []) |
+ |
+ def test_file_include_recursive_loop(self): |
+ self.files['/content/baz/OWNERS'] = owners_file(brett, |
+ file='//content/qux/OWNERS') |
+ self.test_file_include_absolute_path() |
+ |
+ def test_file_include_different_filename(self): |
+ self.files['/owners/garply'] = owners_file(peter) |
+ self.files['/content/garply/OWNERS'] = owners_file(john, |
+ lines=['per-file foo.*=file://owners/garply']) |
+ |
+ self.assert_files_not_covered_by(['content/garply/foo.cc'], [peter], []) |
+ |
def assert_syntax_error(self, owners_file_contents): |
db = self.db() |
self.files['/foo/OWNERS'] = owners_file_contents |
@@ -228,6 +279,12 @@ class OwnersDatabaseTest(_BaseTestCase): |
def test_syntax_error__bad_email(self): |
self.assert_syntax_error('ben\n') |
+ def test_syntax_error__invalid_absolute_file(self): |
+ self.assert_syntax_error('file://foo/bar/baz\n') |
+ |
+ def test_syntax_error__invalid_relative_file(self): |
+ self.assert_syntax_error('file:foo/bar/baz\n') |
+ |
class ReviewersForTest(_BaseTestCase): |
def assert_reviewers_for(self, files, potential_suggested_reviewers, |
@@ -322,6 +379,33 @@ class ReviewersForTest(_BaseTestCase): |
self.assert_reviewers_for(['chrome/gpu/gpu_channel.h'], |
[[ben], [brett]], author=ken) |
+ def test_reviewers_file_includes__absolute(self): |
+ self.assert_reviewers_for(['content/qux/foo.cc'], |
+ [[peter], [brett], [john], [darin]]) |
+ |
+ def test_reviewers_file_includes__relative(self): |
+ self.assert_reviewers_for(['content/garply/foo.cc'], |
+ [[peter], [john], [darin]]) |
+ |
+ def test_reviewers_file_includes__per_file(self): |
+ self.files['/content/garply/OWNERS'] = owners_file(brett, |
+ lines=['per-file foo.*=file:test/OWNERS']) |
+ |
+ self.assert_reviewers_for(['content/garply/foo.cc'], |
+ [[brett], [peter]]) |
+ self.assert_reviewers_for(['content/garply/bar.cc'], |
+ [[brett]]) |
+ |
+ def test_reviewers_file_includes__per_file_noparent(self): |
+ self.files['/content/garply/OWNERS'] = owners_file(brett, |
+ lines=['per-file foo.*=set noparent', |
+ 'per-file foo.*=file:test/OWNERS']) |
+ |
+ self.assert_reviewers_for(['content/garply/foo.cc'], |
+ [[peter]]) |
+ self.assert_reviewers_for(['content/garply/bar.cc'], |
+ [[brett]]) |
+ |
class LowestCostOwnersTest(_BaseTestCase): |
# Keep the data in the test_lowest_cost_owner* methods as consistent with |