blob: 03a7ca2c7f3a790042f60bd71fbc281f57848e0f [file] [log] [blame]
#!/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()