|
@@ -30,6 +30,8 @@ def owners_file(*email_addresses, **kwargs):
|
|
s += '# %s\n' % kwargs.get('comment')
|
|
s += '# %s\n' % kwargs.get('comment')
|
|
if kwargs.get('noparent'):
|
|
if kwargs.get('noparent'):
|
|
s += 'set noparent\n'
|
|
s += 'set noparent\n'
|
|
|
|
+ if kwargs.get('file'):
|
|
|
|
+ s += 'file:%s\n' % kwargs.get('file')
|
|
s += '\n'.join(kwargs.get('lines', [])) + '\n'
|
|
s += '\n'.join(kwargs.get('lines', [])) + '\n'
|
|
return s + '\n'.join(email_addresses) + '\n'
|
|
return s + '\n'.join(email_addresses) + '\n'
|
|
|
|
|
|
@@ -54,6 +56,11 @@ def test_repo():
|
|
'/content/baz/froboz.h': '',
|
|
'/content/baz/froboz.h': '',
|
|
'/content/baz/ugly.cc': '',
|
|
'/content/baz/ugly.cc': '',
|
|
'/content/baz/ugly.h': '',
|
|
'/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,
|
|
'/content/views/OWNERS': owners_file(ben, john, owners.EVERYONE,
|
|
noparent=True),
|
|
noparent=True),
|
|
'/content/views/pie.h': '',
|
|
'/content/views/pie.h': '',
|
|
@@ -209,6 +216,50 @@ class OwnersDatabaseTest(_BaseTestCase):
|
|
self.assertRaises(owners.SyntaxErrorInOwnersFile,
|
|
self.assertRaises(owners.SyntaxErrorInOwnersFile,
|
|
self.db().files_not_covered_by, ['DEPS'], [brett])
|
|
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):
|
|
def assert_syntax_error(self, owners_file_contents):
|
|
db = self.db()
|
|
db = self.db()
|
|
self.files['/foo/OWNERS'] = owners_file_contents
|
|
self.files['/foo/OWNERS'] = owners_file_contents
|
|
@@ -228,6 +279,12 @@ class OwnersDatabaseTest(_BaseTestCase):
|
|
def test_syntax_error__bad_email(self):
|
|
def test_syntax_error__bad_email(self):
|
|
self.assert_syntax_error('ben\n')
|
|
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):
|
|
class ReviewersForTest(_BaseTestCase):
|
|
def assert_reviewers_for(self, files, potential_suggested_reviewers,
|
|
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'],
|
|
self.assert_reviewers_for(['chrome/gpu/gpu_channel.h'],
|
|
[[ben], [brett]], author=ken)
|
|
[[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):
|
|
class LowestCostOwnersTest(_BaseTestCase):
|
|
# Keep the data in the test_lowest_cost_owner* methods as consistent with
|
|
# Keep the data in the test_lowest_cost_owner* methods as consistent with
|