summaryrefslogtreecommitdiff
path: root/tests/unit
diff options
context:
space:
mode:
authorJames E. Blair <jeblair@redhat.com>2017-10-27 11:39:33 -0700
committerJames E. Blair <jeblair@redhat.com>2017-10-27 13:41:25 -0700
commit2a6645045295fbf5f2b69107e7fa4ce15df10a7b (patch)
treec47ac7b890ad284f1bdd59dafbf32af35f6e1624 /tests/unit
parent0029267403c627a45fe9b357f645d4893bc3d4af (diff)
downloadzuul-2a6645045295fbf5f2b69107e7fa4ce15df10a7b.tar.gz
Add multi-branch support for project-templates
Currently, to avoid confusion, we simply ignore project-template definitions after the first. However, a more intuitive approach would be, if the template appears on multiple branches, to have it reflect those branches. To that end, add implied branch matchers to templates in the same way that we do to jobs themselves. This should provide the same intuitive behavior where a template defined in zuul-jobs will apply to all branches, but one defined in a multi-branch repository will add jobs with implied branch matchers. When a template is defined more than once, combine them (in the same way that multiple project definitions are defined) so the resulting template contains all the jobs (likely with implied branch matchers). Allow a template to be defined multiple times (e.g., branches) within the same project, but do not allow it to be redefined in another project. Because the multiple project definitions in different branches may end up applying the same template (which will have all of the per-branch jobs) multiple times, detect duplicate job definitions when applying templates and filter them out. The test test_dynamic_template was originally written to verify that a project could not redefine a template defined in another project. Clarify that, and update it to support the newly reported error in that condition. Change-Id: I6613885a8c7ebf400e85041e0d68b2eb5ceb033f
Diffstat (limited to 'tests/unit')
-rwxr-xr-xtests/unit/test_v3.py98
1 files changed, 96 insertions, 2 deletions
diff --git a/tests/unit/test_v3.py b/tests/unit/test_v3.py
index 80e6ccc53..c04604d54 100755
--- a/tests/unit/test_v3.py
+++ b/tests/unit/test_v3.py
@@ -251,6 +251,94 @@ class TestBranchVariants(ZuulTestCase):
self.waitUntilSettled()
+class TestCentralJobs(ZuulTestCase):
+ tenant_config_file = 'config/central-jobs/main.yaml'
+
+ def setUp(self):
+ super(TestCentralJobs, self).setUp()
+ self.create_branch('org/project', 'stable')
+ self.fake_gerrit.addEvent(
+ self.fake_gerrit.getFakeBranchCreatedEvent(
+ 'org/project', 'stable'))
+ self.waitUntilSettled()
+
+ def _updateConfig(self, config, branch):
+ file_dict = {'.zuul.yaml': config}
+ C = self.fake_gerrit.addFakeChange('org/project', branch, 'C',
+ files=file_dict)
+ C.addApproval('Code-Review', 2)
+ self.fake_gerrit.addEvent(C.addApproval('Approved', 1))
+ self.waitUntilSettled()
+ self.fake_gerrit.addEvent(C.getChangeMergedEvent())
+ self.waitUntilSettled()
+
+ def _test_central_job_on_branch(self, branch, other_branch):
+ # Test that a job defined on a branchless repo only runs on
+ # the branch applied
+ config = textwrap.dedent(
+ """
+ - project:
+ name: org/project
+ check:
+ jobs:
+ - central-job
+ """)
+ self._updateConfig(config, branch)
+
+ A = self.fake_gerrit.addFakeChange('org/project', branch, 'A')
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertHistory([
+ dict(name='central-job', result='SUCCESS', changes='2,1')])
+
+ # No jobs should run for this change.
+ B = self.fake_gerrit.addFakeChange('org/project', other_branch, 'B')
+ self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertHistory([
+ dict(name='central-job', result='SUCCESS', changes='2,1')])
+
+ def test_central_job_on_stable(self):
+ self._test_central_job_on_branch('master', 'stable')
+
+ def test_central_job_on_master(self):
+ self._test_central_job_on_branch('stable', 'master')
+
+ def _test_central_template_on_branch(self, branch, other_branch):
+ # Test that a project-template defined on a branchless repo
+ # only runs on the branch applied
+ config = textwrap.dedent(
+ """
+ - project:
+ name: org/project
+ templates: ['central-jobs']
+ """)
+ self._updateConfig(config, branch)
+
+ A = self.fake_gerrit.addFakeChange('org/project', branch, 'A')
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertHistory([
+ dict(name='central-job', result='SUCCESS', changes='2,1')])
+
+ # No jobs should run for this change.
+ B = self.fake_gerrit.addFakeChange('org/project', other_branch, 'B')
+ self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ self.assertHistory([
+ dict(name='central-job', result='SUCCESS', changes='2,1')])
+
+ def test_central_template_on_stable(self):
+ self._test_central_template_on_branch('master', 'stable')
+
+ def test_central_template_on_master(self):
+ self._test_central_template_on_branch('stable', 'master')
+
+
class TestInRepoConfig(ZuulTestCase):
# A temporary class to hold new tests while others are disabled
@@ -357,6 +445,8 @@ class TestInRepoConfig(ZuulTestCase):
dict(name='project-test2', result='SUCCESS', changes='2,1')])
def test_dynamic_template(self):
+ # Tests that a project can't update a template in another
+ # project.
in_repo_conf = textwrap.dedent(
"""
- job:
@@ -378,8 +468,12 @@ class TestInRepoConfig(ZuulTestCase):
files=file_dict)
self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
self.waitUntilSettled()
- self.assertHistory([
- dict(name='template-job', result='SUCCESS', changes='1,1')])
+
+ self.assertEqual(A.patchsets[0]['approvals'][0]['value'], "-1")
+ self.assertIn('Project template common-config-template '
+ 'is already defined',
+ A.messages[0],
+ "A should have failed the check pipeline")
def test_dynamic_config_non_existing_job(self):
"""Test that requesting a non existent job fails"""