|
@@ -534,5 +534,104 @@ class CheckNoNewGitFilesAddedInDependenciesTest(unittest.TestCase):
|
|
|
self.assertEqual(0, len(results))
|
|
|
|
|
|
|
|
|
+class CheckNewDEPSHooksHasRequiredReviewersTest(unittest.TestCase):
|
|
|
+
|
|
|
+ def setUp(self):
|
|
|
+ self.input_api = MockInputApi()
|
|
|
+ self.input_api.change = MockChange([], issue=123)
|
|
|
+ self.input_api.files = [
|
|
|
+ MockAffectedFile('DEPS', 'content'),
|
|
|
+ ]
|
|
|
+
|
|
|
+ def test_no_gerrit_cl(self):
|
|
|
+ self.input_api.change = MockChange([], issue=None)
|
|
|
+ results = presubmit_canned_checks.CheckNewDEPSHooksHasRequiredReviewers(
|
|
|
+ self.input_api,
|
|
|
+ MockOutputApi(),
|
|
|
+ required_reviewers=['foo@chromium.org'])
|
|
|
+ self.assertEqual(0, len(results))
|
|
|
+
|
|
|
+ def test_no_deps_file_change(self):
|
|
|
+ self.input_api.files = [
|
|
|
+ MockAffectedFile('foo.py', 'content'),
|
|
|
+ ]
|
|
|
+ results = presubmit_canned_checks.CheckNewDEPSHooksHasRequiredReviewers(
|
|
|
+ self.input_api,
|
|
|
+ MockOutputApi(),
|
|
|
+ required_reviewers=['foo@chromium.org'])
|
|
|
+ self.assertEqual(0, len(results))
|
|
|
+
|
|
|
+ def test_new_deps_hook(self):
|
|
|
+ gerrit_mock = mock.Mock()
|
|
|
+ self.input_api.gerrit = gerrit_mock
|
|
|
+ test_cases = [
|
|
|
+ {
|
|
|
+ 'name': 'no new hooks',
|
|
|
+ 'old_contents': ['hooks = []'],
|
|
|
+ 'new_contents': ['hooks = []'],
|
|
|
+ 'reviewers': [],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ 'name':
|
|
|
+ 'add new hook but reviewer missing',
|
|
|
+ 'old_contents': ['hooks = [{"name": "old_hook"}]'],
|
|
|
+ 'new_contents': [
|
|
|
+ 'hooks = [{"name": "old_hook"}, {"name": "new_hook"}, {"name": "new_hook_2"}]'
|
|
|
+ ],
|
|
|
+ 'reviewers': [],
|
|
|
+ 'expected_error_msg':
|
|
|
+ 'New DEPS hooks (new_hook, new_hook_2) are found. Please add '
|
|
|
+ 'one of the following reviewers:\n * foo@chromium.org\n '
|
|
|
+ '* bar@chromium.org'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ 'name':
|
|
|
+ 'add new hook and reviewer is already added',
|
|
|
+ 'old_contents': ['hooks = [{"name": "old_hook"}]'],
|
|
|
+ 'new_contents': [
|
|
|
+ 'hooks = [{"name": "old_hook"}, {"name": "new_hook"}, {"name": "new_hook_2"}]'
|
|
|
+ ],
|
|
|
+ 'reviewers': ['foo@chromium.org'],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ 'name':
|
|
|
+ 'change existing hook',
|
|
|
+ 'old_contents': [
|
|
|
+ 'hooks = [{"name": "existing_hook", "action": ["run", "./test.sh"]}]'
|
|
|
+ ],
|
|
|
+ 'new_contents': [
|
|
|
+ 'hooks = [{"name": "existing_hook", "action": ["run", "./test_v2.sh"]}]'
|
|
|
+ ],
|
|
|
+ 'reviewers': [],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ 'name':
|
|
|
+ 'remove hook',
|
|
|
+ 'old_contents':
|
|
|
+ ['hooks = [{"name": "old_hook"}, {"name": "hook_to_remove"}]'],
|
|
|
+ 'new_contents': ['hooks = [{"name": "old_hook"}]'],
|
|
|
+ 'reviewers': [],
|
|
|
+ },
|
|
|
+ ]
|
|
|
+ for case in test_cases:
|
|
|
+ with self.subTest(case_name=case['name']):
|
|
|
+ self.input_api.files = [
|
|
|
+ MockAffectedFile('DEPS',
|
|
|
+ old_contents=case['old_contents'],
|
|
|
+ new_contents=case['new_contents']),
|
|
|
+ ]
|
|
|
+ gerrit_mock.GetChangeReviewers.return_value = case['reviewers']
|
|
|
+ results = presubmit_canned_checks.CheckNewDEPSHooksHasRequiredReviewers(
|
|
|
+ self.input_api,
|
|
|
+ MockOutputApi(),
|
|
|
+ required_reviewers=['foo@chromium.org', 'bar@chromium.org'])
|
|
|
+ if 'expected_error_msg' in case:
|
|
|
+ self.assertEqual(1, len(results))
|
|
|
+ self.assertEqual(case['expected_error_msg'],
|
|
|
+ results[0].message)
|
|
|
+ else:
|
|
|
+ self.assertEqual(0, len(results))
|
|
|
+
|
|
|
+
|
|
|
if __name__ == '__main__':
|
|
|
unittest.main()
|