Merge "Fix NNFI bug with two failing changes at head"
This commit is contained in:
commit
11b6fa2f1f
|
@ -1501,6 +1501,111 @@ class TestScheduler(testtools.TestCase):
|
||||||
self.assertEqual(B.reported, 2)
|
self.assertEqual(B.reported, 2)
|
||||||
self.assertEqual(C.reported, 2)
|
self.assertEqual(C.reported, 2)
|
||||||
|
|
||||||
|
def test_two_failed_changes_at_head(self):
|
||||||
|
"Test that changes are reparented correctly if 2 fail at head"
|
||||||
|
|
||||||
|
self.worker.hold_jobs_in_build = True
|
||||||
|
A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
|
||||||
|
B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
|
||||||
|
C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
|
||||||
|
A.addApproval('CRVW', 2)
|
||||||
|
B.addApproval('CRVW', 2)
|
||||||
|
C.addApproval('CRVW', 2)
|
||||||
|
|
||||||
|
self.worker.addFailTest('project-test1', A)
|
||||||
|
self.worker.addFailTest('project-test1', B)
|
||||||
|
|
||||||
|
self.fake_gerrit.addEvent(A.addApproval('APRV', 1))
|
||||||
|
self.fake_gerrit.addEvent(B.addApproval('APRV', 1))
|
||||||
|
self.fake_gerrit.addEvent(C.addApproval('APRV', 1))
|
||||||
|
self.waitUntilSettled()
|
||||||
|
|
||||||
|
self.worker.release('.*-merge')
|
||||||
|
self.waitUntilSettled()
|
||||||
|
self.worker.release('.*-merge')
|
||||||
|
self.waitUntilSettled()
|
||||||
|
self.worker.release('.*-merge')
|
||||||
|
self.waitUntilSettled()
|
||||||
|
|
||||||
|
self.assertEqual(len(self.builds), 6)
|
||||||
|
self.assertEqual(self.builds[0].name, 'project-test1')
|
||||||
|
self.assertEqual(self.builds[1].name, 'project-test2')
|
||||||
|
self.assertEqual(self.builds[2].name, 'project-test1')
|
||||||
|
self.assertEqual(self.builds[3].name, 'project-test2')
|
||||||
|
self.assertEqual(self.builds[4].name, 'project-test1')
|
||||||
|
self.assertEqual(self.builds[5].name, 'project-test2')
|
||||||
|
|
||||||
|
self.assertTrue(self.job_has_changes(self.builds[0], A))
|
||||||
|
self.assertTrue(self.job_has_changes(self.builds[2], A))
|
||||||
|
self.assertTrue(self.job_has_changes(self.builds[2], B))
|
||||||
|
self.assertTrue(self.job_has_changes(self.builds[4], A))
|
||||||
|
self.assertTrue(self.job_has_changes(self.builds[4], B))
|
||||||
|
self.assertTrue(self.job_has_changes(self.builds[4], C))
|
||||||
|
|
||||||
|
# Fail change B first
|
||||||
|
self.release(self.builds[2])
|
||||||
|
self.waitUntilSettled()
|
||||||
|
|
||||||
|
# restart of C after B failure
|
||||||
|
self.worker.release('.*-merge')
|
||||||
|
self.waitUntilSettled()
|
||||||
|
|
||||||
|
self.assertEqual(len(self.builds), 5)
|
||||||
|
self.assertEqual(self.builds[0].name, 'project-test1')
|
||||||
|
self.assertEqual(self.builds[1].name, 'project-test2')
|
||||||
|
self.assertEqual(self.builds[2].name, 'project-test2')
|
||||||
|
self.assertEqual(self.builds[3].name, 'project-test1')
|
||||||
|
self.assertEqual(self.builds[4].name, 'project-test2')
|
||||||
|
|
||||||
|
self.assertTrue(self.job_has_changes(self.builds[1], A))
|
||||||
|
self.assertTrue(self.job_has_changes(self.builds[2], A))
|
||||||
|
self.assertTrue(self.job_has_changes(self.builds[2], B))
|
||||||
|
self.assertTrue(self.job_has_changes(self.builds[4], A))
|
||||||
|
self.assertFalse(self.job_has_changes(self.builds[4], B))
|
||||||
|
self.assertTrue(self.job_has_changes(self.builds[4], C))
|
||||||
|
|
||||||
|
# Finish running all passing jobs for change A
|
||||||
|
self.release(self.builds[1])
|
||||||
|
self.waitUntilSettled()
|
||||||
|
# Fail and report change A
|
||||||
|
self.release(self.builds[0])
|
||||||
|
self.waitUntilSettled()
|
||||||
|
|
||||||
|
# restart of B,C after A failure
|
||||||
|
self.worker.release('.*-merge')
|
||||||
|
self.waitUntilSettled()
|
||||||
|
self.worker.release('.*-merge')
|
||||||
|
self.waitUntilSettled()
|
||||||
|
|
||||||
|
self.assertEqual(len(self.builds), 4)
|
||||||
|
self.assertEqual(self.builds[0].name, 'project-test1') # B
|
||||||
|
self.assertEqual(self.builds[1].name, 'project-test2') # B
|
||||||
|
self.assertEqual(self.builds[2].name, 'project-test1') # C
|
||||||
|
self.assertEqual(self.builds[3].name, 'project-test2') # C
|
||||||
|
|
||||||
|
self.assertFalse(self.job_has_changes(self.builds[1], A))
|
||||||
|
self.assertTrue(self.job_has_changes(self.builds[1], B))
|
||||||
|
self.assertFalse(self.job_has_changes(self.builds[1], C))
|
||||||
|
|
||||||
|
self.assertFalse(self.job_has_changes(self.builds[2], A))
|
||||||
|
# After A failed and B and C restarted, B should be back in
|
||||||
|
# C's tests because it has not failed yet.
|
||||||
|
self.assertTrue(self.job_has_changes(self.builds[2], B))
|
||||||
|
self.assertTrue(self.job_has_changes(self.builds[2], C))
|
||||||
|
|
||||||
|
self.worker.hold_jobs_in_build = False
|
||||||
|
self.worker.release()
|
||||||
|
self.waitUntilSettled()
|
||||||
|
|
||||||
|
self.assertEqual(len(self.builds), 0)
|
||||||
|
self.assertEqual(len(self.history), 21)
|
||||||
|
self.assertEqual(A.data['status'], 'NEW')
|
||||||
|
self.assertEqual(B.data['status'], 'NEW')
|
||||||
|
self.assertEqual(C.data['status'], 'MERGED')
|
||||||
|
self.assertEqual(A.reported, 2)
|
||||||
|
self.assertEqual(B.reported, 2)
|
||||||
|
self.assertEqual(C.reported, 2)
|
||||||
|
|
||||||
def test_patch_order(self):
|
def test_patch_order(self):
|
||||||
"Test that dependent patches are tested in the right order"
|
"Test that dependent patches are tested in the right order"
|
||||||
A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
|
A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
|
||||||
|
|
|
@ -982,8 +982,11 @@ class BasePipelineManager(object):
|
||||||
failing_reasons.append('a needed change is failing')
|
failing_reasons.append('a needed change is failing')
|
||||||
self.cancelJobs(item, prime=False)
|
self.cancelJobs(item, prime=False)
|
||||||
else:
|
else:
|
||||||
if (item_ahead and item_ahead != nnfi and
|
item_ahead_merged = False
|
||||||
not item_ahead.change.is_merged):
|
if ((item_ahead and item_ahead.change.is_merged) or
|
||||||
|
not change_queue.dependent):
|
||||||
|
item_ahead_merged = True
|
||||||
|
if (item_ahead != nnfi and not item_ahead_merged):
|
||||||
# Our current base is different than what we expected,
|
# Our current base is different than what we expected,
|
||||||
# and it's not because our current base merged. Something
|
# and it's not because our current base merged. Something
|
||||||
# ahead must have failed.
|
# ahead must have failed.
|
||||||
|
|
Loading…
Reference in New Issue