Refactor test_zuul_refs and FakeBuild.hasChanges

In re-enabling test_zuul_refs and refactoring it to use
FakeBuild.hasChanges, a weakness was discovered in hasChanges where it
would not check the repositories of all the changes one is looking for.

After fixing that, the test passes and others should be able to be
refactored in the same way.

Change-Id: Iaf647412d2518c079c8b42ed670919f4e8ca0b63
Story: 2000773
Task: 3296
This commit is contained in:
Clint Byrum 2016-11-15 16:05:03 -08:00
parent debd7a7dbe
commit 3343e3e7b4
2 changed files with 36 additions and 47 deletions

View File

@ -41,7 +41,7 @@ import gear
import fixtures
import statsd
import testtools
from git import GitCommandError
from git.exc import NoSuchPathError
import zuul.connection.gerrit
import zuul.connection.smtp
@ -640,17 +640,20 @@ class FakeBuild(object):
:rtype: bool
"""
project = self.parameters['ZUUL_PROJECT']
path = os.path.join(self.jobdir.git_root, project)
repo = git.Repo(path)
ref = self.parameters['ZUUL_REF']
repo_messages = [c.message.strip() for c in repo.iter_commits(ref)]
commit_messages = ['%s-1' % change.subject for change in changes]
self.log.debug("Checking if build %s has changes; commit_messages %s;"
" repo_messages %s" % (self, commit_messages,
repo_messages))
for msg in commit_messages:
if msg not in repo_messages:
for change in changes:
path = os.path.join(self.jobdir.git_root, change.project)
try:
repo = git.Repo(path)
except NoSuchPathError as e:
self.log.debug('%s' % e)
return False
ref = self.parameters['ZUUL_REF']
repo_messages = [c.message.strip() for c in repo.iter_commits(ref)]
commit_message = '%s-1' % change.subject
self.log.debug("Checking if build %s has changes; commit_message "
"%s; repo_messages %s" % (self, commit_message,
repo_messages))
if commit_message not in repo_messages:
self.log.debug(" messages do not match")
return False
self.log.debug(" OK")
@ -1262,19 +1265,6 @@ class ZuulTestCase(BaseTestCase):
commit = repo.index.commit('Creating a fake commit')
return commit.hexsha
def ref_has_change(self, ref, change):
# TODOv3(jeblair): this should probably be removed in favor of
# build.hasChanges
path = os.path.join(self.git_root, change.project)
repo = git.Repo(path)
try:
for commit in repo.iter_commits(ref):
if commit.message.strip() == ('%s-1' % change.subject):
return True
except GitCommandError:
pass
return False
def orderedRelease(self):
# Run one build at a time to ensure non-race order:
while len(self.builds):

View File

@ -2045,7 +2045,6 @@ jobs:
self.assertEqual(len(self.history), 0)
@skip("Disabled for early v3 development")
def test_zuul_refs(self):
"Test that zuul refs exist and have the right changes"
self.launch_server.hold_jobs_in_build = True
@ -2078,15 +2077,22 @@ jobs:
self.waitUntilSettled()
a_zref = b_zref = c_zref = d_zref = None
a_build = b_build = c_build = d_build = None
for x in self.builds:
if x.parameters['ZUUL_CHANGE'] == '3':
a_zref = x.parameters['ZUUL_REF']
if x.parameters['ZUUL_CHANGE'] == '4':
a_build = x
elif x.parameters['ZUUL_CHANGE'] == '4':
b_zref = x.parameters['ZUUL_REF']
if x.parameters['ZUUL_CHANGE'] == '5':
b_build = x
elif x.parameters['ZUUL_CHANGE'] == '5':
c_zref = x.parameters['ZUUL_REF']
if x.parameters['ZUUL_CHANGE'] == '6':
c_build = x
elif x.parameters['ZUUL_CHANGE'] == '6':
d_zref = x.parameters['ZUUL_REF']
d_build = x
if a_build and b_build and c_build and d_build:
break
# There are... four... refs.
self.assertIsNotNone(a_zref)
@ -2098,27 +2104,20 @@ jobs:
refs = set([a_zref, b_zref, c_zref, d_zref])
self.assertEqual(len(refs), 4)
# a ref should have a, not b, and should not be in project2
self.assertTrue(self.ref_has_change(a_zref, A))
self.assertFalse(self.ref_has_change(a_zref, B))
self.assertFalse(self.ref_has_change(a_zref, M2))
# should have a, not b, and should not be in project2
self.assertTrue(a_build.hasChanges(A))
self.assertFalse(a_build.hasChanges(B, M2))
# b ref should have a and b, and should not be in project2
self.assertTrue(self.ref_has_change(b_zref, A))
self.assertTrue(self.ref_has_change(b_zref, B))
self.assertFalse(self.ref_has_change(b_zref, M2))
# should have a and b, and should not be in project2
self.assertTrue(b_build.hasChanges(A, B))
self.assertFalse(b_build.hasChanges(M2))
# c ref should have a and b in 1, c in 2
self.assertTrue(self.ref_has_change(c_zref, A))
self.assertTrue(self.ref_has_change(c_zref, B))
self.assertTrue(self.ref_has_change(c_zref, C))
self.assertFalse(self.ref_has_change(c_zref, D))
# should have a and b in 1, c in 2
self.assertTrue(c_build.hasChanges(A, B, C))
self.assertFalse(c_build.hasChanges(D))
# d ref should have a and b in 1, c and d in 2
self.assertTrue(self.ref_has_change(d_zref, A))
self.assertTrue(self.ref_has_change(d_zref, B))
self.assertTrue(self.ref_has_change(d_zref, C))
self.assertTrue(self.ref_has_change(d_zref, D))
# should have a and b in 1, c and d in 2
self.assertTrue(d_build.hasChanges(A, B, C, D))
self.launch_server.hold_jobs_in_build = False
self.launch_server.release()