| #!/usr/bin/python |
| |
| # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Unittests for GerritHelper.""" |
| |
| import mock |
| import os |
| import sys |
| sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname( |
| os.path.abspath(__file__))))) |
| |
| from chromite.buildbot import constants |
| from chromite.lib import cros_build_lib |
| from chromite.lib import cros_test_lib |
| from chromite.lib import gerrit |
| from chromite.lib import gob_util |
| |
| |
| # pylint: disable=W0212,R0904 |
| class GerritHelperTest(cros_test_lib.GerritTestCase): |
| |
| def _GetHelper(self, remote=constants.EXTERNAL_REMOTE): |
| return gerrit.GetGerritHelper(remote) |
| |
| def test001SimpleQuery(self): |
| """Create one independent and three dependent changes, then query them.""" |
| self.createProject('test001') |
| clone_path = self.cloneProject('test001') |
| (head_sha1, head_changeid) = self.createCommit(clone_path) |
| for idx in xrange(3): |
| cros_build_lib.RunCommandQuietly( |
| ['git', 'checkout', head_sha1], cwd=clone_path) |
| self.createCommit(clone_path, fn='test-file-%d.txt' % idx) |
| self.uploadChange(clone_path) |
| helper = self._GetHelper() |
| changes = helper.Query(owner='self') |
| self.assertEqual(len(changes), 4) |
| changes = helper.Query(head_changeid, project='test001', branch='master') |
| self.assertEqual(len(changes), 1) |
| self.assertEqual(changes[0].change_id, head_changeid) |
| self.assertEqual(changes[0].sha1, head_sha1) |
| change = helper.QuerySingleRecord( |
| head_changeid, project='test001', branch='master') |
| self.assertTrue(change) |
| self.assertEqual(change.change_id, head_changeid) |
| self.assertEqual(change.sha1, head_sha1) |
| change = helper.GrabPatchFromGerrit('test001', head_changeid, head_sha1) |
| self.assertTrue(change) |
| self.assertEqual(change.change_id, head_changeid) |
| self.assertEqual(change.sha1, head_sha1) |
| |
| @mock.patch.object(gerrit.GerritHelper, '_GERRIT_MAX_QUERY_RETURN', 20) |
| def test002GerritQueryTruncation(self): |
| """Verify that we detect gerrit truncating our query, and handle it.""" |
| self.createProject('test002') |
| clone_path = self.cloneProject('test002') |
| # Using a shell loop is markedly faster than running a python loop. |
| cmd = ('for ((i=0; i<84; i=i+1)); do ' |
| 'echo "Another day, another dollar." > test-file-$i.txt; ' |
| 'git add test-file-$i.txt; ' |
| 'git commit -m "Test commit $i."; done') |
| cros_build_lib.RunCommandQuietly(cmd, shell=True, cwd=clone_path) |
| self.uploadChange(clone_path) |
| helper = self._GetHelper() |
| changes = helper.Query(project='test002') |
| self.assertEqual(len(changes), 84) |
| |
| def test003IsChangeCommitted(self): |
| """Tests that we can parse a json to check if a change is committed.""" |
| self.createProject('test003') |
| clone_path = self.cloneProject('test003') |
| (_, changeid) = self.createCommit(clone_path) |
| self.uploadChange(clone_path) |
| helper = self._GetHelper() |
| gpatch = helper.QuerySingleRecord( |
| change=changeid, project='test003', branch='master') |
| self.assertEqual(gpatch.change_id, changeid) |
| helper.SetReview(gpatch.gerrit_number, labels={'Code-Review':'+2'}) |
| helper.SubmitChange(gpatch) |
| self.assertTrue(helper.IsChangeCommitted(gpatch.gerrit_number)) |
| |
| (_, changeid) = self.createCommit(clone_path) |
| self.uploadChange(clone_path) |
| gpatch = helper.QuerySingleRecord( |
| change=changeid, project='test003', branch='master') |
| self.assertEqual(gpatch.change_id, changeid) |
| self.assertFalse(helper.IsChangeCommitted(gpatch.gerrit_number)) |
| |
| def test004GetLatestSHA1ForBranch(self): |
| """Verifies that we can query the tip-of-tree commit in a git repository.""" |
| self.createProject('test004') |
| clone_path = self.cloneProject('test004') |
| for _ in xrange(5): |
| (master_sha1, _) = self.createCommit(clone_path) |
| self.pushBranch(clone_path, 'master') |
| for _ in xrange(5): |
| (testbranch_sha1, _) = self.createCommit(clone_path) |
| self.pushBranch(clone_path, 'testbranch') |
| helper = self._GetHelper() |
| self.assertEqual( |
| helper.GetLatestSHA1ForBranch('test004', 'master'), |
| master_sha1) |
| self.assertEqual( |
| helper.GetLatestSHA1ForBranch('test004', 'testbranch'), |
| testbranch_sha1) |
| |
| def test005SetReviewers(self): |
| """Verify that we can set reviewers on a CL.""" |
| self.createProject('test005') |
| clone_path = self.cloneProject('test005') |
| (_, changeid) = self.createCommit(clone_path) |
| self.uploadChange(clone_path) |
| helper = self._GetHelper() |
| gpatch = helper.QuerySingleRecord( |
| change=changeid, project='test005', branch='master') |
| self.assertEqual(gpatch.change_id, changeid) |
| self.createAccount(name='Test005 User 1', email='test005-user-1@test.org') |
| self.createAccount(name='Test005 User 2', email='test005-user-2@test.org') |
| helper = self._GetHelper() |
| helper.SetReviewers(gpatch.gerrit_number, add=( |
| 'test005-user-1@test.org', 'test005-user-2@test.org')) |
| reviewers = gob_util.GetReviewers(helper.host, gpatch.gerrit_number) |
| self.assertEqual(len(reviewers), 2) |
| self.assertItemsEqual( |
| [r['email'] for r in reviewers], |
| ['test005-user-1@test.org', 'test005-user-2@test.org']) |
| helper.SetReviewers(gpatch.gerrit_number, |
| remove=('test005-user-1@test.org',)) |
| reviewers = gob_util.GetReviewers(helper.host, gpatch.gerrit_number) |
| self.assertEqual(len(reviewers), 1) |
| self.assertEqual(reviewers[0]['email'], 'test005-user-2@test.org') |
| |
| def test006PatchNotFound(self): |
| """Test case where ChangeID isn't found on the server.""" |
| changeids = ['I' + ('deadbeef' * 5), 'I' + ('beadface' * 5)] |
| self.assertRaises(gerrit.GerritException, gerrit.GetGerritPatchInfo, |
| changeids) |
| self.assertRaises(gerrit.GerritException, gerrit.GetGerritPatchInfo, |
| ['*' + cid for cid in changeids]) |
| gerrit_numbers = ['12345', '54321'] |
| self.assertRaises(gerrit.GerritException, gerrit.GetGerritPatchInfo, |
| gerrit_numbers) |
| self.assertRaises(gerrit.GerritException, gerrit.GetGerritPatchInfo, |
| ['*' + num for num in gerrit_numbers]) |
| |
| def test007VagueQuery(self): |
| """Verify GerritHelper complains if an ID matches multiple changes.""" |
| self.createProject('test007') |
| clone_path = self.cloneProject('test007') |
| (sha1, _) = self.createCommit(clone_path) |
| (_, changeid) = self.createCommit(clone_path) |
| self.uploadChange(clone_path, 'master') |
| cros_build_lib.RunCommandQuietly( |
| ['git', 'checkout', sha1], cwd=clone_path) |
| self.createCommit(clone_path) |
| self.pushBranch(clone_path, 'testbranch') |
| self.createCommit( |
| clone_path, msg='Test commit.\n\nChange-Id: %s' % changeid) |
| self.uploadChange(clone_path, 'testbranch') |
| self.assertRaises(gerrit.GerritException, gerrit.GetGerritPatchInfo, |
| [changeid]) |
| |
| def test008Queries(self): |
| """Verify assorted query operations.""" |
| self.createProject('test008') |
| clone_path = self.cloneProject('test008') |
| (sha1, changeid) = self.createCommit(clone_path) |
| self.uploadChange(clone_path, 'master') |
| helper = self._GetHelper() |
| gpatch = helper.QuerySingleRecord( |
| change=changeid, project='test008', branch='master') |
| self.assertEqual(gpatch.change_id, changeid) |
| |
| # Multi-queries with one valid and one invalid term should raise. |
| self.assertRaises(gerrit.GerritException, gerrit.GetGerritPatchInfo, |
| ['Iab8e1d', changeid]) |
| self.assertRaises(gerrit.GerritException, gerrit.GetGerritPatchInfo, |
| [changeid, 'Iab8e1d']) |
| self.assertRaises(gerrit.GerritException, gerrit.GetGerritPatchInfo, |
| ['12345', gpatch.gerrit_number]) |
| self.assertRaises(gerrit.GerritException, gerrit.GetGerritPatchInfo, |
| [gpatch.gerrit_number, '12345']) |
| |
| # Simple query by project/changeid/sha1. |
| patch_info = helper.GrabPatchFromGerrit('test008', changeid, sha1) |
| self.assertEqual(patch_info.gerrit_number, gpatch.gerrit_number) |
| self.assertEqual(patch_info.remote, constants.EXTERNAL_REMOTE) |
| |
| # Simple query by gerrit number to external remote. |
| patch_info = gerrit.GetGerritPatchInfo([gpatch.gerrit_number]) |
| self.assertEqual(patch_info[0].gerrit_number, gpatch.gerrit_number) |
| self.assertEqual(patch_info[0].remote, constants.EXTERNAL_REMOTE) |
| |
| # Simple query by gerrit number to internal remote. |
| patch_info = gerrit.GetGerritPatchInfo(['*' + gpatch.gerrit_number]) |
| self.assertEqual(patch_info[0].gerrit_number, gpatch.gerrit_number) |
| self.assertEqual(patch_info[0].remote, constants.INTERNAL_REMOTE) |
| |
| # Query to external server by gerrit number and change-id which refer to |
| # the same change should return one result. |
| fq_changeid = '~'.join((gpatch.project, 'master', gpatch.change_id)) |
| patch_info = gerrit.GetGerritPatchInfo([gpatch.gerrit_number, fq_changeid]) |
| self.assertEqual(len(patch_info), 1) |
| self.assertEqual(patch_info[0].gerrit_number, gpatch.gerrit_number) |
| self.assertEqual(patch_info[0].remote, constants.EXTERNAL_REMOTE) |
| |
| # Query to internal server by gerrit number and change-id which refer to |
| # the same change should return one result. |
| patch_info = gerrit.GetGerritPatchInfo( |
| ['*' + gpatch.gerrit_number, '*' + fq_changeid]) |
| self.assertEqual(len(patch_info), 1) |
| self.assertEqual(patch_info[0].gerrit_number, gpatch.gerrit_number) |
| self.assertEqual(patch_info[0].remote, constants.INTERNAL_REMOTE) |
| |
| |
| if __name__ == '__main__': |
| cros_test_lib.main() |