summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2022-03-23 01:00:06 +0000
committerGerrit Code Review <review@openstack.org>2022-03-23 01:00:06 +0000
commitc0f9a606cc44860d555b00903cd4572875a23439 (patch)
treefd0ff164185827c65b06ca1f720a9a405205e73c /tests
parent91ee8776f0de6940581d0027e10d88a5a315fb5b (diff)
parent082ff730fef20fac8fce50d3ea237c05f52fbbf5 (diff)
downloadzuul-c0f9a606cc44860d555b00903cd4572875a23439.tar.gz
Merge "Dequeue items that can no longer merge"
Diffstat (limited to 'tests')
-rw-r--r--tests/unit/test_github_driver.py49
-rw-r--r--tests/unit/test_model_upgrade.py52
-rw-r--r--tests/unit/test_scheduler.py29
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"