summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/fixtures/layouts/semaphore-multi-pipeline.yaml65
-rw-r--r--tests/unit/test_model_upgrade.py2
-rw-r--r--tests/unit/test_scheduler.py41
3 files changed, 107 insertions, 1 deletions
diff --git a/tests/fixtures/layouts/semaphore-multi-pipeline.yaml b/tests/fixtures/layouts/semaphore-multi-pipeline.yaml
new file mode 100644
index 000000000..2f582684c
--- /dev/null
+++ b/tests/fixtures/layouts/semaphore-multi-pipeline.yaml
@@ -0,0 +1,65 @@
+- pipeline:
+ name: check
+ manager: independent
+ trigger:
+ gerrit:
+ - event: patchset-created
+ success:
+ gerrit:
+ Verified: 1
+ failure:
+ gerrit:
+ Verified: -1
+
+- pipeline:
+ name: gate
+ manager: dependent
+ success-message: Build succeeded (gate).
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - Approved: 1
+ success:
+ gerrit:
+ Verified: 2
+ submit: true
+ failure:
+ gerrit:
+ Verified: -2
+ start:
+ gerrit:
+ Verified: 0
+ precedence: high
+
+- job:
+ name: base
+ parent: null
+ run: playbooks/base.yaml
+ nodeset:
+ nodes:
+ - label: ubuntu-xenial
+ name: controller
+
+- semaphore:
+ name: test-semaphore
+ max: 1
+
+- job:
+ name: check-job
+ run: playbooks/check.yaml
+ semaphores: test-semaphore
+
+- job:
+ name: gate-job
+ run: playbooks/gate.yaml
+ semaphores: test-semaphore
+
+- project:
+ name: org/project
+ check:
+ jobs:
+ - check-job
+ gate:
+ jobs:
+ - gate-job
diff --git a/tests/unit/test_model_upgrade.py b/tests/unit/test_model_upgrade.py
index 9bbaf12f7..94c2d307e 100644
--- a/tests/unit/test_model_upgrade.py
+++ b/tests/unit/test_model_upgrade.py
@@ -173,7 +173,7 @@ class TestSemaphoreModelUpgrade(ZuulTestCase):
1)
# Try to release the old-style semaphore after the model API upgrade.
- tenant.semaphore_handler.release(item, job)
+ tenant.semaphore_handler.release(self.scheds.first.sched, item, job)
self.assertEqual(
len(tenant.semaphore_handler.semaphoreHolders("test-semaphore")),
0)
diff --git a/tests/unit/test_scheduler.py b/tests/unit/test_scheduler.py
index 6c0c79bde..037a519b2 100644
--- a/tests/unit/test_scheduler.py
+++ b/tests/unit/test_scheduler.py
@@ -7727,6 +7727,47 @@ class TestSemaphore(ZuulTestCase):
# least one should be able to start on each pass through the
# loop).
+ @simple_layout('layouts/semaphore-multi-pipeline.yaml')
+ def test_semaphore_multi_pipeline(self):
+ "Test semaphores in multiple pipelines"
+ tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
+
+ self.executor_server.hold_jobs_in_build = True
+
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+ self.assertEqual(
+ len(tenant.semaphore_handler.semaphoreHolders("test-semaphore")),
+ 0)
+
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertEqual(len(self.builds), 1)
+ self.assertEqual(
+ len(tenant.semaphore_handler.semaphoreHolders("test-semaphore")),
+ 1)
+
+ # Start a second change in a different pipeline
+ B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
+ B.addApproval('Code-Review', 2)
+ self.fake_gerrit.addEvent(B.addApproval('Approved', 1))
+ self.waitUntilSettled()
+
+ # Still just the first change holds the lock
+ self.assertEqual(len(self.builds), 1)
+ self.assertEqual(
+ len(tenant.semaphore_handler.semaphoreHolders("test-semaphore")),
+ 1)
+
+ # Now the second should run
+ self.executor_server.hold_jobs_in_build = False
+ self.executor_server.release()
+ self.waitUntilSettled()
+ self.assertHistory([
+ dict(name='check-job', result='SUCCESS', changes='1,1'),
+ dict(name='gate-job', result='SUCCESS', changes='2,1'),
+ ])
+
class TestSemaphoreMultiTenant(ZuulTestCase):
tenant_config_file = 'config/multi-tenant-semaphore/main.yaml'