diff options
author | Zuul <zuul@review.opendev.org> | 2022-03-23 01:00:06 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2022-03-23 01:00:06 +0000 |
commit | c0f9a606cc44860d555b00903cd4572875a23439 (patch) | |
tree | fd0ff164185827c65b06ca1f720a9a405205e73c /tests | |
parent | 91ee8776f0de6940581d0027e10d88a5a315fb5b (diff) | |
parent | 082ff730fef20fac8fce50d3ea237c05f52fbbf5 (diff) | |
download | zuul-c0f9a606cc44860d555b00903cd4572875a23439.tar.gz |
Merge "Dequeue items that can no longer merge"
Diffstat (limited to 'tests')
-rw-r--r-- | tests/unit/test_github_driver.py | 49 | ||||
-rw-r--r-- | tests/unit/test_model_upgrade.py | 52 | ||||
-rw-r--r-- | tests/unit/test_scheduler.py | 29 |
3 files changed, 130 insertions, 0 deletions
diff --git a/tests/unit/test_github_driver.py b/tests/unit/test_github_driver.py index 791edc43c..56c885b5b 100644 --- a/tests/unit/test_github_driver.py +++ b/tests/unit/test_github_driver.py @@ -1120,6 +1120,55 @@ class TestGithubDriver(ZuulTestCase): # the change should have entered the gate self.assertEqual(2, len(self.history)) + @simple_layout('layouts/gate-github.yaml', driver='github') + def test_status_checks_removal(self): + github = self.fake_github.getGithubClient() + repo = github.repo_from_project('org/project') + repo._set_branch_protection( + 'master', contexts=['something/check', 'tenant-one/gate']) + + A = self.fake_github.openFakePullRequest('org/project', 'master', 'A') + self.fake_github.emitEvent(A.getPullRequestOpenedEvent()) + self.waitUntilSettled() + + self.executor_server.hold_jobs_in_build = True + # Since the required status 'something/check' is not fulfilled, + # no job is expected + self.assertEqual(0, len(self.builds)) + self.assertEqual(0, len(self.history)) + + # Set the required status 'something/check' + repo.create_status(A.head_sha, 'success', 'example.com', 'description', + 'something/check') + + self.fake_github.emitEvent(A.getPullRequestOpenedEvent()) + self.waitUntilSettled() + self.assertEqual(2, len(self.builds)) + self.assertEqual(0, len(self.history)) + + # Remove it and verify the change is dequeued. + repo.create_status(A.head_sha, 'failed', 'example.com', 'description', + 'something/check') + self.fake_github.emitEvent(A.getCommitStatusEvent('something/check', + state='failed', + user='foo')) + self.waitUntilSettled() + + self.executor_server.hold_jobs_in_build = False + self.executor_server.release() + self.waitUntilSettled() + + # The change should be dequeued. + self.assertHistory([ + dict(name='project-test1', result='ABORTED'), + dict(name='project-test2', result='ABORTED'), + ], ordered=False) + self.assertEqual(1, len(A.comments)) + self.assertFalse(A.is_merged) + self.assertIn('This change is unable to merge ' + 'due to a missing requirement.', + A.comments[0]) + # This test case verifies that no reconfiguration happens if a branch was # deleted that didn't contain configuration. @simple_layout('layouts/basic-github.yaml', driver='github') diff --git a/tests/unit/test_model_upgrade.py b/tests/unit/test_model_upgrade.py index 94c2d307e..e8c84399b 100644 --- a/tests/unit/test_model_upgrade.py +++ b/tests/unit/test_model_upgrade.py @@ -193,3 +193,55 @@ class TestSemaphoreModelUpgrade(ZuulTestCase): self.assertEqual( len(tenant.semaphore_handler.semaphoreHolders("test-semaphore")), 0) + + +class TestGithubModelUpgrade(ZuulTestCase): + config_file = 'zuul-github-driver.conf' + scheduler_count = 1 + + @model_version(3) + @simple_layout('layouts/gate-github.yaml', driver='github') + def test_status_checks_removal(self): + # This tests the old behavior -- that changes are not dequeued + # once their required status checks are removed -- since the + # new behavior requires a flag in ZK. + # Contrast with test_status_checks_removal. + github = self.fake_github.getGithubClient() + repo = github.repo_from_project('org/project') + repo._set_branch_protection( + 'master', contexts=['something/check', 'tenant-one/gate']) + + A = self.fake_github.openFakePullRequest('org/project', 'master', 'A') + self.fake_github.emitEvent(A.getPullRequestOpenedEvent()) + self.waitUntilSettled() + + self.executor_server.hold_jobs_in_build = True + # Since the required status 'something/check' is not fulfilled, + # no job is expected + self.assertEqual(0, len(self.history)) + + # Set the required status 'something/check' + repo.create_status(A.head_sha, 'success', 'example.com', 'description', + 'something/check') + + self.fake_github.emitEvent(A.getPullRequestOpenedEvent()) + self.waitUntilSettled() + + # Remove it and verify the change is not dequeued (old behavior). + repo.create_status(A.head_sha, 'failed', 'example.com', 'description', + 'something/check') + self.fake_github.emitEvent(A.getCommitStatusEvent('something/check', + state='failed', + user='foo')) + self.waitUntilSettled() + + self.executor_server.hold_jobs_in_build = False + self.executor_server.release() + self.waitUntilSettled() + + # the change should have entered the gate + self.assertHistory([ + dict(name='project-test1', result='SUCCESS'), + dict(name='project-test2', result='SUCCESS'), + ], ordered=False) + self.assertTrue(A.is_merged) diff --git a/tests/unit/test_scheduler.py b/tests/unit/test_scheduler.py index a381486b2..4b84f7fda 100644 --- a/tests/unit/test_scheduler.py +++ b/tests/unit/test_scheduler.py @@ -1895,6 +1895,35 @@ class TestScheduler(ZuulTestCase): self.assertEqual(B.reported, 2) self.assertEqual(C.reported, 2) + def test_approval_removal(self): + # Test that we dequeue a change when it can not merge + self.executor_server.hold_jobs_in_build = True + A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A') + A.addApproval('Code-Review', 2) + self.fake_gerrit.addEvent(A.addApproval('Approved', 1)) + + self.waitUntilSettled() + self.assertEqual(1, len(self.builds)) + self.assertEqual(0, len(self.history)) + + # Remove the approval + self.fake_gerrit.addEvent(A.addApproval('Approved', 0)) + self.waitUntilSettled() + + self.executor_server.hold_jobs_in_build = False + self.executor_server.release() + self.waitUntilSettled() + + # The change should be dequeued. + self.assertHistory([ + dict(name='project-merge', result='ABORTED'), + ], ordered=False) + self.assertEqual(2, len(A.messages)) + self.assertEqual(A.data['status'], 'NEW') + self.assertIn('This change is unable to merge ' + 'due to a missing requirement.', + A.messages[1]) + @simple_layout('layouts/nonvoting-job-approval.yaml') def test_nonvoting_job_approval(self): "Test that non-voting jobs don't vote but leave approval" |