blob: 6f24ff5f7a1790209fc36379fc4b124009a9bdc4 [file] [log] [blame]
Antoine Musso45dd2cb2014-01-29 17:17:43 +01001#!/usr/bin/env python
2
3# Copyright 2012 Hewlett-Packard Development Company, L.P.
4# Copyright 2014 Wikimedia Foundation Inc.
5#
6# Licensed under the Apache License, Version 2.0 (the "License"); you may
7# not use this file except in compliance with the License. You may obtain
8# a copy of the License at
9#
10# http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing, software
13# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15# License for the specific language governing permissions and limitations
16# under the License.
17
18import logging
19import os
20import shutil
21
22import git
23
24import zuul.lib.cloner
25
26from tests.base import ZuulTestCase
27from tests.base import FIXTURE_DIR
28
29logging.basicConfig(level=logging.DEBUG,
30 format='%(asctime)s %(name)-32s '
31 '%(levelname)-8s %(message)s')
32
33
34class TestCloner(ZuulTestCase):
35
36 log = logging.getLogger("zuul.test.cloner")
37 workspace_root = None
38
39 def setUp(self):
40 super(TestCloner, self).setUp()
41 self.workspace_root = os.path.join(self.test_root, 'workspace')
42
43 self.config.set('zuul', 'layout_config',
James E. Blair97d902e2014-08-21 13:25:56 -070044 'tests/fixtures/layout-cloner.yaml')
Antoine Musso45dd2cb2014-01-29 17:17:43 +010045 self.sched.reconfigure(self.config)
46 self.registerJobs()
47
James E. Blair97d902e2014-08-21 13:25:56 -070048 def getWorkspaceRepos(self, projects):
49 repos = {}
50 for project in projects:
51 repos[project] = git.Repo(
52 os.path.join(self.workspace_root, project))
53 return repos
54
55 def getUpstreamRepos(self, projects):
56 repos = {}
57 for project in projects:
58 repos[project] = git.Repo(
59 os.path.join(self.upstream_root, project))
60 return repos
61
62 def test_one_branch(self):
Antoine Musso45dd2cb2014-01-29 17:17:43 +010063 self.worker.hold_jobs_in_build = True
64
James E. Blair97d902e2014-08-21 13:25:56 -070065 projects = ['org/project1', 'org/project2']
Antoine Musso45dd2cb2014-01-29 17:17:43 +010066 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
67 B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
Antoine Musso45dd2cb2014-01-29 17:17:43 +010068 A.addApproval('CRVW', 2)
69 B.addApproval('CRVW', 2)
70 self.fake_gerrit.addEvent(A.addApproval('APRV', 1))
71 self.fake_gerrit.addEvent(B.addApproval('APRV', 1))
72
73 self.waitUntilSettled()
74
75 self.assertEquals(2, len(self.builds), "Two builds are running")
76
James E. Blair97d902e2014-08-21 13:25:56 -070077 upstream = self.getUpstreamRepos(projects)
78 states = [
79 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
80 'org/project2': str(upstream['org/project2'].commit('master')),
81 },
82 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
83 'org/project2': self.builds[1].parameters['ZUUL_COMMIT'],
84 },
85 ]
86
87 for number, build in enumerate(self.builds):
Antoine Musso45dd2cb2014-01-29 17:17:43 +010088 self.log.debug("Build parameters: %s", build.parameters)
Antoine Musso45dd2cb2014-01-29 17:17:43 +010089 cloner = zuul.lib.cloner.Cloner(
90 git_base_url=self.upstream_root,
James E. Blair97d902e2014-08-21 13:25:56 -070091 projects=projects,
Antoine Musso45dd2cb2014-01-29 17:17:43 +010092 workspace=self.workspace_root,
James E. Blair97d902e2014-08-21 13:25:56 -070093 zuul_branch=build.parameters['ZUUL_BRANCH'],
James E. Blair82318922014-08-21 11:05:32 -070094 zuul_ref=build.parameters['ZUUL_REF'],
Antoine Musso45dd2cb2014-01-29 17:17:43 +010095 zuul_url=self.git_root,
James E. Blair97d902e2014-08-21 13:25:56 -070096 )
Antoine Musso45dd2cb2014-01-29 17:17:43 +010097 cloner.execute()
James E. Blair97d902e2014-08-21 13:25:56 -070098 work = self.getWorkspaceRepos(projects)
99 state = states[number]
100
101 for project in projects:
102 self.assertEquals(state[project],
103 str(work[project].commit('HEAD')),
104 'Project %s commit for build %s should '
105 'be correct' % (project, number))
106
107 shutil.rmtree(self.workspace_root)
108
109 self.worker.hold_jobs_in_build = False
110 self.worker.release()
111 self.waitUntilSettled()
112
113 def test_multi_branch(self):
114 self.worker.hold_jobs_in_build = True
115 projects = ['org/project1', 'org/project2',
116 'org/project3', 'org/project4']
117
118 self.create_branch('org/project2', 'stable/havana')
119 self.create_branch('org/project4', 'stable/havana')
120 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
121 B = self.fake_gerrit.addFakeChange('org/project2', 'stable/havana', 'B')
122 C = self.fake_gerrit.addFakeChange('org/project3', 'master', 'C')
123 A.addApproval('CRVW', 2)
124 B.addApproval('CRVW', 2)
125 C.addApproval('CRVW', 2)
126 self.fake_gerrit.addEvent(A.addApproval('APRV', 1))
127 self.fake_gerrit.addEvent(B.addApproval('APRV', 1))
128 self.fake_gerrit.addEvent(C.addApproval('APRV', 1))
129
130 self.waitUntilSettled()
131
132 self.assertEquals(3, len(self.builds), "Three builds are running")
133
134 upstream = self.getUpstreamRepos(projects)
135 states = [
136 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
137 'org/project2': str(upstream['org/project2'].commit('master')),
138 'org/project3': str(upstream['org/project3'].commit('master')),
139 'org/project4': str(upstream['org/project4'].
140 commit('master')),
141 },
142 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
143 'org/project2': self.builds[1].parameters['ZUUL_COMMIT'],
144 'org/project3': str(upstream['org/project3'].commit('master')),
145 'org/project4': str(upstream['org/project4'].
146 commit('stable/havana')),
147 },
148 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
149 'org/project2': str(upstream['org/project2'].commit('master')),
150 'org/project3': self.builds[2].parameters['ZUUL_COMMIT'],
151 'org/project4': str(upstream['org/project4'].
152 commit('master')),
153 },
154 ]
155
156 for number, build in enumerate(self.builds):
157 self.log.debug("Build parameters: %s", build.parameters)
158 cloner = zuul.lib.cloner.Cloner(
159 git_base_url=self.upstream_root,
160 projects=projects,
161 workspace=self.workspace_root,
162 zuul_branch=build.parameters['ZUUL_BRANCH'],
163 zuul_ref=build.parameters['ZUUL_REF'],
164 zuul_url=self.git_root,
165 )
166 cloner.execute()
167 work = self.getWorkspaceRepos(projects)
168 state = states[number]
169
170 for project in projects:
171 self.assertEquals(state[project],
172 str(work[project].commit('HEAD')),
173 'Project %s commit for build %s should '
174 'be correct' % (project, number))
Antoine Musso45dd2cb2014-01-29 17:17:43 +0100175 shutil.rmtree(self.workspace_root)
James E. Blair82318922014-08-21 11:05:32 -0700176
177 self.worker.hold_jobs_in_build = False
178 self.worker.release()
179 self.waitUntilSettled()