blob: e3a7552e57665d13d77890d73c00465a69bef3df [file] [log] [blame]
James E. Blairb0fcae42012-07-17 11:12:10 -07001#!/usr/bin/env python
2
3# Copyright 2012 Hewlett-Packard Development Company, L.P.
4#
5# Licensed under the Apache License, Version 2.0 (the "License"); you may
6# not use this file except in compliance with the License. You may obtain
7# a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14# License for the specific language governing permissions and limitations
15# under the License.
16
James E. Blairb0fcae42012-07-17 11:12:10 -070017import json
Monty Taylorbc758832013-06-17 17:22:42 -040018import logging
19import os
James E. Blairb0fcae42012-07-17 11:12:10 -070020import re
James E. Blair4886cc12012-07-18 15:39:41 -070021import shutil
Monty Taylorbc758832013-06-17 17:22:42 -040022import time
Maru Newby3fe5f852015-01-13 04:22:14 +000023import yaml
James E. Blairec056492016-07-22 09:45:56 -070024from unittest import skip
Monty Taylorbc758832013-06-17 17:22:42 -040025
James E. Blair4886cc12012-07-18 15:39:41 -070026import git
Morgan Fainberg293f7f82016-05-30 14:01:22 -070027from six.moves import urllib
Monty Taylorbc758832013-06-17 17:22:42 -040028import testtools
James E. Blairb0fcae42012-07-17 11:12:10 -070029
Maru Newby3fe5f852015-01-13 04:22:14 +000030import zuul.change_matcher
James E. Blairb0fcae42012-07-17 11:12:10 -070031import zuul.scheduler
James E. Blairad28e912013-11-27 10:43:22 -080032import zuul.rpcclient
Joshua Hesketh1879cf72013-08-19 14:13:15 +100033import zuul.reporter.gerrit
Joshua Hesketh5fea8672013-08-19 17:32:01 +100034import zuul.reporter.smtp
James E. Blairb0fcae42012-07-17 11:12:10 -070035
Maru Newby3fe5f852015-01-13 04:22:14 +000036from tests.base import (
Maru Newby3fe5f852015-01-13 04:22:14 +000037 ZuulTestCase,
38 repack_repo,
39)
James E. Blairb0fcae42012-07-17 11:12:10 -070040
James E. Blair1f4c2bb2013-04-26 08:40:46 -070041logging.basicConfig(level=logging.DEBUG,
42 format='%(asctime)s %(name)-32s '
43 '%(levelname)-8s %(message)s')
James E. Blairb0fcae42012-07-17 11:12:10 -070044
45
Clark Boylanb640e052014-04-03 16:41:46 -070046class TestScheduler(ZuulTestCase):
James E. Blair552b54f2016-07-22 13:55:32 -070047 tenant_config_file = 'config/single-tenant/main.yaml'
Antoine Mussobd86a312014-01-08 14:51:33 +010048
James E. Blairb0fcae42012-07-17 11:12:10 -070049 def test_jobs_launched(self):
50 "Test that jobs are launched and a change is merged"
James E. Blair1f4c2bb2013-04-26 08:40:46 -070051
James E. Blairb0fcae42012-07-17 11:12:10 -070052 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -070053 A.addApproval('code-review', 2)
54 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blairb0fcae42012-07-17 11:12:10 -070055 self.waitUntilSettled()
Monty Taylor98f0f3e2013-07-06 16:02:31 -040056 self.assertEqual(self.getJobFromHistory('project-merge').result,
57 'SUCCESS')
58 self.assertEqual(self.getJobFromHistory('project-test1').result,
59 'SUCCESS')
60 self.assertEqual(self.getJobFromHistory('project-test2').result,
61 'SUCCESS')
62 self.assertEqual(A.data['status'], 'MERGED')
63 self.assertEqual(A.reported, 2)
James E. Blair34776ee2016-08-25 13:53:54 -070064 self.assertEqual(self.getJobFromHistory('project-test1').node,
65 'image1')
James E. Blairb0fcae42012-07-17 11:12:10 -070066
James E. Blair552b54f2016-07-22 13:55:32 -070067 # TODOv3(jeblair): we may want to report stats by tenant (also?).
James E. Blair66eeebf2013-07-27 17:44:32 -070068 self.assertReportedStat('gerrit.event.comment-added', value='1|c')
69 self.assertReportedStat('zuul.pipeline.gate.current_changes',
70 value='1|g')
71 self.assertReportedStat('zuul.pipeline.gate.job.project-merge.SUCCESS',
72 kind='ms')
73 self.assertReportedStat('zuul.pipeline.gate.job.project-merge.SUCCESS',
74 value='1|c')
75 self.assertReportedStat('zuul.pipeline.gate.resident_time', kind='ms')
76 self.assertReportedStat('zuul.pipeline.gate.total_changes',
77 value='1|c')
James E. Blair412e5582013-04-22 15:50:12 -070078 self.assertReportedStat(
James E. Blair66eeebf2013-07-27 17:44:32 -070079 'zuul.pipeline.gate.org.project.resident_time', kind='ms')
James E. Blair412e5582013-04-22 15:50:12 -070080 self.assertReportedStat(
James E. Blair66eeebf2013-07-27 17:44:32 -070081 'zuul.pipeline.gate.org.project.total_changes', value='1|c')
James E. Blair412e5582013-04-22 15:50:12 -070082
James E. Blair5821bd92015-09-16 08:48:15 -070083 for build in self.builds:
84 self.assertEqual(build.parameters['ZUUL_VOTING'], '1')
85
James E. Blair3cb10702013-08-24 08:56:03 -070086 def test_initial_pipeline_gauges(self):
87 "Test that each pipeline reported its length on start"
James E. Blair7da51b72016-07-25 15:29:43 -070088 self.assertReportedStat('zuul.pipeline.gate.current_changes',
89 value='0|g')
90 self.assertReportedStat('zuul.pipeline.check.current_changes',
91 value='0|g')
James E. Blair3cb10702013-08-24 08:56:03 -070092
James E. Blair34776ee2016-08-25 13:53:54 -070093 def test_job_branch(self):
94 "Test the correct variant of a job runs on a branch"
95 self.create_branch('org/project', 'stable')
96 A = self.fake_gerrit.addFakeChange('org/project', 'stable', 'A')
97 A.addApproval('code-review', 2)
98 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
99 self.waitUntilSettled()
100 self.assertEqual(self.getJobFromHistory('project-test1').result,
101 'SUCCESS')
102 self.assertEqual(self.getJobFromHistory('project-test2').result,
103 'SUCCESS')
104 self.assertEqual(A.data['status'], 'MERGED')
105 self.assertEqual(A.reported, 2,
106 "A should report start and success")
107 self.assertIn('gate', A.messages[1],
108 "A should transit gate")
109 self.assertEqual(self.getJobFromHistory('project-test1').node,
110 'image2')
111
James E. Blairec056492016-07-22 09:45:56 -0700112 @skip("Disabled for early v3 development")
James E. Blair42f74822013-05-14 15:18:03 -0700113 def test_duplicate_pipelines(self):
114 "Test that a change matching multiple pipelines works"
James E. Blair1b4d9722013-05-21 10:32:04 -0700115
James E. Blair42f74822013-05-14 15:18:03 -0700116 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
117 self.fake_gerrit.addEvent(A.getChangeRestoredEvent())
118 self.waitUntilSettled()
James E. Blair42f74822013-05-14 15:18:03 -0700119
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400120 self.assertEqual(len(self.history), 2)
Monty Taylor6bef8ef2013-06-02 08:17:12 -0400121 self.history[0].name == 'project-test1'
122 self.history[1].name == 'project-test1'
James E. Blair42f74822013-05-14 15:18:03 -0700123
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400124 self.assertEqual(len(A.messages), 2)
James E. Blair42f74822013-05-14 15:18:03 -0700125 if 'dup1/project-test1' in A.messages[0]:
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400126 self.assertIn('dup1/project-test1', A.messages[0])
127 self.assertNotIn('dup2/project-test1', A.messages[0])
128 self.assertNotIn('dup1/project-test1', A.messages[1])
129 self.assertIn('dup2/project-test1', A.messages[1])
James E. Blair42f74822013-05-14 15:18:03 -0700130 else:
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400131 self.assertIn('dup1/project-test1', A.messages[1])
132 self.assertNotIn('dup2/project-test1', A.messages[1])
133 self.assertNotIn('dup1/project-test1', A.messages[0])
134 self.assertIn('dup2/project-test1', A.messages[0])
James E. Blair42f74822013-05-14 15:18:03 -0700135
James E. Blairb0fcae42012-07-17 11:12:10 -0700136 def test_parallel_changes(self):
137 "Test that changes are tested in parallel and merged in series"
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700138
James E. Blair791b5392016-08-03 11:25:56 -0700139 self.launch_server.hold_jobs_in_build = True
James E. Blairb0fcae42012-07-17 11:12:10 -0700140 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
141 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
142 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
James E. Blair8b5408c2016-08-08 15:37:46 -0700143 A.addApproval('code-review', 2)
144 B.addApproval('code-review', 2)
145 C.addApproval('code-review', 2)
James E. Blairb0fcae42012-07-17 11:12:10 -0700146
James E. Blair8b5408c2016-08-08 15:37:46 -0700147 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
148 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
149 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
James E. Blairb0fcae42012-07-17 11:12:10 -0700150
151 self.waitUntilSettled()
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400152 self.assertEqual(len(self.builds), 1)
153 self.assertEqual(self.builds[0].name, 'project-merge')
James E. Blair791b5392016-08-03 11:25:56 -0700154 self.assertTrue(self.builds[0].hasChanges(A))
James E. Blairb0fcae42012-07-17 11:12:10 -0700155
James E. Blair791b5392016-08-03 11:25:56 -0700156 self.launch_server.release('.*-merge')
James E. Blairb0fcae42012-07-17 11:12:10 -0700157 self.waitUntilSettled()
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400158 self.assertEqual(len(self.builds), 3)
159 self.assertEqual(self.builds[0].name, 'project-test1')
James E. Blair791b5392016-08-03 11:25:56 -0700160 self.assertTrue(self.builds[0].hasChanges(A))
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400161 self.assertEqual(self.builds[1].name, 'project-test2')
James E. Blair791b5392016-08-03 11:25:56 -0700162 self.assertTrue(self.builds[1].hasChanges(A))
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400163 self.assertEqual(self.builds[2].name, 'project-merge')
James E. Blair791b5392016-08-03 11:25:56 -0700164 self.assertTrue(self.builds[2].hasChanges(A, B))
James E. Blairb0fcae42012-07-17 11:12:10 -0700165
James E. Blair791b5392016-08-03 11:25:56 -0700166 self.launch_server.release('.*-merge')
James E. Blairb0fcae42012-07-17 11:12:10 -0700167 self.waitUntilSettled()
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400168 self.assertEqual(len(self.builds), 5)
169 self.assertEqual(self.builds[0].name, 'project-test1')
James E. Blair791b5392016-08-03 11:25:56 -0700170 self.assertTrue(self.builds[0].hasChanges(A))
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400171 self.assertEqual(self.builds[1].name, 'project-test2')
James E. Blair791b5392016-08-03 11:25:56 -0700172 self.assertTrue(self.builds[1].hasChanges(A))
James E. Blairb0fcae42012-07-17 11:12:10 -0700173
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400174 self.assertEqual(self.builds[2].name, 'project-test1')
James E. Blair791b5392016-08-03 11:25:56 -0700175 self.assertTrue(self.builds[2].hasChanges(A, B))
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400176 self.assertEqual(self.builds[3].name, 'project-test2')
James E. Blair791b5392016-08-03 11:25:56 -0700177 self.assertTrue(self.builds[3].hasChanges(A, B))
James E. Blairb0fcae42012-07-17 11:12:10 -0700178
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400179 self.assertEqual(self.builds[4].name, 'project-merge')
James E. Blair791b5392016-08-03 11:25:56 -0700180 self.assertTrue(self.builds[4].hasChanges(A, B, C))
James E. Blairb0fcae42012-07-17 11:12:10 -0700181
James E. Blair791b5392016-08-03 11:25:56 -0700182 self.launch_server.release('.*-merge')
James E. Blairb0fcae42012-07-17 11:12:10 -0700183 self.waitUntilSettled()
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400184 self.assertEqual(len(self.builds), 6)
185 self.assertEqual(self.builds[0].name, 'project-test1')
James E. Blair791b5392016-08-03 11:25:56 -0700186 self.assertTrue(self.builds[0].hasChanges(A))
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400187 self.assertEqual(self.builds[1].name, 'project-test2')
James E. Blair791b5392016-08-03 11:25:56 -0700188 self.assertTrue(self.builds[1].hasChanges(A))
James E. Blairb0fcae42012-07-17 11:12:10 -0700189
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400190 self.assertEqual(self.builds[2].name, 'project-test1')
James E. Blair791b5392016-08-03 11:25:56 -0700191 self.assertTrue(self.builds[2].hasChanges(A, B))
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400192 self.assertEqual(self.builds[3].name, 'project-test2')
James E. Blair791b5392016-08-03 11:25:56 -0700193 self.assertTrue(self.builds[3].hasChanges(A, B))
James E. Blairb0fcae42012-07-17 11:12:10 -0700194
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400195 self.assertEqual(self.builds[4].name, 'project-test1')
James E. Blair791b5392016-08-03 11:25:56 -0700196 self.assertTrue(self.builds[4].hasChanges(A, B, C))
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400197 self.assertEqual(self.builds[5].name, 'project-test2')
James E. Blair791b5392016-08-03 11:25:56 -0700198 self.assertTrue(self.builds[5].hasChanges(A, B, C))
James E. Blairb0fcae42012-07-17 11:12:10 -0700199
James E. Blair791b5392016-08-03 11:25:56 -0700200 self.launch_server.hold_jobs_in_build = False
201 self.launch_server.release()
James E. Blairb0fcae42012-07-17 11:12:10 -0700202 self.waitUntilSettled()
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400203 self.assertEqual(len(self.builds), 0)
James E. Blairb0fcae42012-07-17 11:12:10 -0700204
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400205 self.assertEqual(len(self.history), 9)
206 self.assertEqual(A.data['status'], 'MERGED')
207 self.assertEqual(B.data['status'], 'MERGED')
208 self.assertEqual(C.data['status'], 'MERGED')
209 self.assertEqual(A.reported, 2)
210 self.assertEqual(B.reported, 2)
211 self.assertEqual(C.reported, 2)
James E. Blairb02a3bb2012-07-30 17:49:55 -0700212
213 def test_failed_changes(self):
214 "Test that a change behind a failed change is retested"
James E. Blair08d19992016-08-10 15:25:31 -0700215 self.launch_server.hold_jobs_in_build = True
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700216
James E. Blairb02a3bb2012-07-30 17:49:55 -0700217 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
218 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
James E. Blair8b5408c2016-08-08 15:37:46 -0700219 A.addApproval('code-review', 2)
220 B.addApproval('code-review', 2)
James E. Blairb02a3bb2012-07-30 17:49:55 -0700221
James E. Blair08d19992016-08-10 15:25:31 -0700222 self.launch_server.failJob('project-test1', A)
James E. Blairb02a3bb2012-07-30 17:49:55 -0700223
James E. Blair8b5408c2016-08-08 15:37:46 -0700224 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
225 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
James E. Blairb02a3bb2012-07-30 17:49:55 -0700226 self.waitUntilSettled()
James E. Blair2b2a8ab2016-08-11 14:39:11 -0700227 self.assertBuilds([dict(name='project-merge', changes='1,1')])
James E. Blaire2819012013-06-28 17:17:26 -0400228
James E. Blair08d19992016-08-10 15:25:31 -0700229 self.launch_server.release('.*-merge')
James E. Blaire2819012013-06-28 17:17:26 -0400230 self.waitUntilSettled()
James E. Blair2b2a8ab2016-08-11 14:39:11 -0700231 # A/project-merge is complete
232 self.assertBuilds([
233 dict(name='project-test1', changes='1,1'),
234 dict(name='project-test2', changes='1,1'),
235 dict(name='project-merge', changes='1,1 2,1'),
236 ])
James E. Blaire2819012013-06-28 17:17:26 -0400237
James E. Blair2b2a8ab2016-08-11 14:39:11 -0700238 self.launch_server.release('.*-merge')
James E. Blaire2819012013-06-28 17:17:26 -0400239 self.waitUntilSettled()
James E. Blair2b2a8ab2016-08-11 14:39:11 -0700240 # A/project-merge is complete
241 # B/project-merge is complete
242 self.assertBuilds([
243 dict(name='project-test1', changes='1,1'),
244 dict(name='project-test2', changes='1,1'),
245 dict(name='project-test1', changes='1,1 2,1'),
246 dict(name='project-test2', changes='1,1 2,1'),
247 ])
248
249 # Release project-test1 for A which will fail. This will
250 # abort both running B jobs and relaunch project-merge for B.
251 self.builds[0].release()
252 self.waitUntilSettled()
253
254 self.orderedRelease()
255 self.assertHistory([
256 dict(name='project-merge', result='SUCCESS', changes='1,1'),
257 dict(name='project-merge', result='SUCCESS', changes='1,1 2,1'),
258 dict(name='project-test1', result='FAILURE', changes='1,1'),
259 dict(name='project-test1', result='ABORTED', changes='1,1 2,1'),
260 dict(name='project-test2', result='ABORTED', changes='1,1 2,1'),
261 dict(name='project-test2', result='SUCCESS', changes='1,1'),
262 dict(name='project-merge', result='SUCCESS', changes='2,1'),
263 dict(name='project-test1', result='SUCCESS', changes='2,1'),
264 dict(name='project-test2', result='SUCCESS', changes='2,1'),
James E. Blairb536ecc2016-08-31 10:11:42 -0700265 ], ordered=False)
James E. Blair2b2a8ab2016-08-11 14:39:11 -0700266
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400267 self.assertEqual(A.data['status'], 'NEW')
268 self.assertEqual(B.data['status'], 'MERGED')
269 self.assertEqual(A.reported, 2)
270 self.assertEqual(B.reported, 2)
James E. Blairb02a3bb2012-07-30 17:49:55 -0700271
272 def test_independent_queues(self):
273 "Test that changes end up in the right queues"
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700274
James E. Blair08d19992016-08-10 15:25:31 -0700275 self.launch_server.hold_jobs_in_build = True
Zhongyue Luo5d556072012-09-21 02:00:47 +0900276 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blairb02a3bb2012-07-30 17:49:55 -0700277 B = self.fake_gerrit.addFakeChange('org/project1', 'master', 'B')
278 C = self.fake_gerrit.addFakeChange('org/project2', 'master', 'C')
James E. Blair8b5408c2016-08-08 15:37:46 -0700279 A.addApproval('code-review', 2)
280 B.addApproval('code-review', 2)
281 C.addApproval('code-review', 2)
James E. Blairb02a3bb2012-07-30 17:49:55 -0700282
James E. Blair8b5408c2016-08-08 15:37:46 -0700283 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
284 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
285 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
James E. Blairb02a3bb2012-07-30 17:49:55 -0700286
James E. Blairb02a3bb2012-07-30 17:49:55 -0700287 self.waitUntilSettled()
288
289 # There should be one merge job at the head of each queue running
James E. Blair5f0d49e2016-08-19 09:36:50 -0700290 self.assertBuilds([
291 dict(name='project-merge', changes='1,1'),
292 dict(name='project-merge', changes='2,1'),
293 ])
James E. Blairb02a3bb2012-07-30 17:49:55 -0700294
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700295 # Release the current merge builds
James E. Blair5f0d49e2016-08-19 09:36:50 -0700296 self.builds[0].release()
297 self.waitUntilSettled()
298 self.builds[0].release()
James E. Blairb02a3bb2012-07-30 17:49:55 -0700299 self.waitUntilSettled()
300 # Release the merge job for project2 which is behind project1
James E. Blair08d19992016-08-10 15:25:31 -0700301 self.launch_server.release('.*-merge')
James E. Blairb02a3bb2012-07-30 17:49:55 -0700302 self.waitUntilSettled()
303
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700304 # All the test builds should be running:
James E. Blair5f0d49e2016-08-19 09:36:50 -0700305 self.assertBuilds([
306 dict(name='project-test1', changes='1,1'),
307 dict(name='project-test2', changes='1,1'),
308 dict(name='project-test1', changes='2,1'),
309 dict(name='project-test2', changes='2,1'),
310 dict(name='project-test1', changes='2,1 3,1'),
311 dict(name='project-test2', changes='2,1 3,1'),
312 ])
James E. Blairb02a3bb2012-07-30 17:49:55 -0700313
James E. Blair5f0d49e2016-08-19 09:36:50 -0700314 self.orderedRelease()
315 self.assertHistory([
316 dict(name='project-merge', result='SUCCESS', changes='1,1'),
317 dict(name='project-merge', result='SUCCESS', changes='2,1'),
318 dict(name='project-merge', result='SUCCESS', changes='2,1 3,1'),
319 dict(name='project-test1', result='SUCCESS', changes='1,1'),
320 dict(name='project-test2', result='SUCCESS', changes='1,1'),
321 dict(name='project-test1', result='SUCCESS', changes='2,1'),
322 dict(name='project-test2', result='SUCCESS', changes='2,1'),
323 dict(name='project-test1', result='SUCCESS', changes='2,1 3,1'),
324 dict(name='project-test2', result='SUCCESS', changes='2,1 3,1'),
325 ])
James E. Blairb02a3bb2012-07-30 17:49:55 -0700326
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400327 self.assertEqual(A.data['status'], 'MERGED')
328 self.assertEqual(B.data['status'], 'MERGED')
329 self.assertEqual(C.data['status'], 'MERGED')
330 self.assertEqual(A.reported, 2)
331 self.assertEqual(B.reported, 2)
332 self.assertEqual(C.reported, 2)
James E. Blaird466dc42012-07-31 10:42:56 -0700333
334 def test_failed_change_at_head(self):
335 "Test that if a change at the head fails, jobs behind it are canceled"
James E. Blaird466dc42012-07-31 10:42:56 -0700336
James E. Blair08d19992016-08-10 15:25:31 -0700337 self.launch_server.hold_jobs_in_build = True
James E. Blaird466dc42012-07-31 10:42:56 -0700338 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
339 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
340 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
James E. Blair8b5408c2016-08-08 15:37:46 -0700341 A.addApproval('code-review', 2)
342 B.addApproval('code-review', 2)
343 C.addApproval('code-review', 2)
James E. Blaird466dc42012-07-31 10:42:56 -0700344
James E. Blair08d19992016-08-10 15:25:31 -0700345 self.launch_server.failJob('project-test1', A)
James E. Blaird466dc42012-07-31 10:42:56 -0700346
James E. Blair8b5408c2016-08-08 15:37:46 -0700347 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
348 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
349 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
James E. Blaird466dc42012-07-31 10:42:56 -0700350
351 self.waitUntilSettled()
James E. Blaird466dc42012-07-31 10:42:56 -0700352
James E. Blairb536ecc2016-08-31 10:11:42 -0700353 self.assertBuilds([
354 dict(name='project-merge', changes='1,1'),
355 ])
James E. Blaird466dc42012-07-31 10:42:56 -0700356
James E. Blair08d19992016-08-10 15:25:31 -0700357 self.launch_server.release('.*-merge')
James E. Blaird466dc42012-07-31 10:42:56 -0700358 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -0700359 self.launch_server.release('.*-merge')
James E. Blaird466dc42012-07-31 10:42:56 -0700360 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -0700361 self.launch_server.release('.*-merge')
James E. Blaird466dc42012-07-31 10:42:56 -0700362 self.waitUntilSettled()
363
James E. Blairb536ecc2016-08-31 10:11:42 -0700364 self.assertBuilds([
365 dict(name='project-test1', changes='1,1'),
366 dict(name='project-test2', changes='1,1'),
367 dict(name='project-test1', changes='1,1 2,1'),
368 dict(name='project-test2', changes='1,1 2,1'),
369 dict(name='project-test1', changes='1,1 2,1 3,1'),
370 dict(name='project-test2', changes='1,1 2,1 3,1'),
371 ])
James E. Blaird466dc42012-07-31 10:42:56 -0700372
Monty Taylor6bef8ef2013-06-02 08:17:12 -0400373 self.release(self.builds[0])
James E. Blaird466dc42012-07-31 10:42:56 -0700374 self.waitUntilSettled()
375
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400376 # project-test2, project-merge for B
James E. Blairb536ecc2016-08-31 10:11:42 -0700377 self.assertBuilds([
378 dict(name='project-test2', changes='1,1'),
379 dict(name='project-merge', changes='2,1'),
380 ])
381 # Unordered history comparison because the aborts can finish
382 # in any order.
383 self.assertHistory([
384 dict(name='project-merge', result='SUCCESS',
385 changes='1,1'),
386 dict(name='project-merge', result='SUCCESS',
387 changes='1,1 2,1'),
388 dict(name='project-merge', result='SUCCESS',
389 changes='1,1 2,1 3,1'),
390 dict(name='project-test1', result='FAILURE',
391 changes='1,1'),
392 dict(name='project-test1', result='ABORTED',
393 changes='1,1 2,1'),
394 dict(name='project-test2', result='ABORTED',
395 changes='1,1 2,1'),
396 dict(name='project-test1', result='ABORTED',
397 changes='1,1 2,1 3,1'),
398 dict(name='project-test2', result='ABORTED',
399 changes='1,1 2,1 3,1'),
400 ], ordered=False)
James E. Blaird466dc42012-07-31 10:42:56 -0700401
James E. Blairb536ecc2016-08-31 10:11:42 -0700402 self.launch_server.release('.*-merge')
James E. Blaird466dc42012-07-31 10:42:56 -0700403 self.waitUntilSettled()
James E. Blairb536ecc2016-08-31 10:11:42 -0700404 self.launch_server.release('.*-merge')
405 self.waitUntilSettled()
406 self.orderedRelease()
James E. Blaird466dc42012-07-31 10:42:56 -0700407
James E. Blairb536ecc2016-08-31 10:11:42 -0700408 self.assertBuilds([])
409 self.assertHistory([
410 dict(name='project-merge', result='SUCCESS',
411 changes='1,1'),
412 dict(name='project-merge', result='SUCCESS',
413 changes='1,1 2,1'),
414 dict(name='project-merge', result='SUCCESS',
415 changes='1,1 2,1 3,1'),
416 dict(name='project-test1', result='FAILURE',
417 changes='1,1'),
418 dict(name='project-test1', result='ABORTED',
419 changes='1,1 2,1'),
420 dict(name='project-test2', result='ABORTED',
421 changes='1,1 2,1'),
422 dict(name='project-test1', result='ABORTED',
423 changes='1,1 2,1 3,1'),
424 dict(name='project-test2', result='ABORTED',
425 changes='1,1 2,1 3,1'),
426 dict(name='project-merge', result='SUCCESS',
427 changes='2,1'),
428 dict(name='project-merge', result='SUCCESS',
429 changes='2,1 3,1'),
430 dict(name='project-test2', result='SUCCESS',
431 changes='1,1'),
432 dict(name='project-test1', result='SUCCESS',
433 changes='2,1'),
434 dict(name='project-test2', result='SUCCESS',
435 changes='2,1'),
436 dict(name='project-test1', result='SUCCESS',
437 changes='2,1 3,1'),
438 dict(name='project-test2', result='SUCCESS',
439 changes='2,1 3,1'),
440 ], ordered=False)
441
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400442 self.assertEqual(A.data['status'], 'NEW')
443 self.assertEqual(B.data['status'], 'MERGED')
444 self.assertEqual(C.data['status'], 'MERGED')
445 self.assertEqual(A.reported, 2)
446 self.assertEqual(B.reported, 2)
447 self.assertEqual(C.reported, 2)
James E. Blaird466dc42012-07-31 10:42:56 -0700448
James E. Blairec056492016-07-22 09:45:56 -0700449 @skip("Disabled for early v3 development")
James E. Blair0aac4872013-08-23 14:02:38 -0700450 def test_failed_change_in_middle(self):
451 "Test a failed change in the middle of the queue"
452
James E. Blair08d19992016-08-10 15:25:31 -0700453 self.launch_server.hold_jobs_in_build = True
James E. Blair0aac4872013-08-23 14:02:38 -0700454 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
455 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
456 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
James E. Blair8b5408c2016-08-08 15:37:46 -0700457 A.addApproval('code-review', 2)
458 B.addApproval('code-review', 2)
459 C.addApproval('code-review', 2)
James E. Blair0aac4872013-08-23 14:02:38 -0700460
James E. Blair08d19992016-08-10 15:25:31 -0700461 self.launch_server.failJob('project-test1', B)
James E. Blair0aac4872013-08-23 14:02:38 -0700462
James E. Blair8b5408c2016-08-08 15:37:46 -0700463 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
464 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
465 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
James E. Blair0aac4872013-08-23 14:02:38 -0700466
467 self.waitUntilSettled()
468
James E. Blair08d19992016-08-10 15:25:31 -0700469 self.launch_server.release('.*-merge')
James E. Blair0aac4872013-08-23 14:02:38 -0700470 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -0700471 self.launch_server.release('.*-merge')
James E. Blair0aac4872013-08-23 14:02:38 -0700472 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -0700473 self.launch_server.release('.*-merge')
James E. Blair0aac4872013-08-23 14:02:38 -0700474 self.waitUntilSettled()
475
476 self.assertEqual(len(self.builds), 6)
477 self.assertEqual(self.builds[0].name, 'project-test1')
478 self.assertEqual(self.builds[1].name, 'project-test2')
479 self.assertEqual(self.builds[2].name, 'project-test1')
480 self.assertEqual(self.builds[3].name, 'project-test2')
481 self.assertEqual(self.builds[4].name, 'project-test1')
482 self.assertEqual(self.builds[5].name, 'project-test2')
483
484 self.release(self.builds[2])
485 self.waitUntilSettled()
486
James E. Blair972e3c72013-08-29 12:04:55 -0700487 # project-test1 and project-test2 for A
488 # project-test2 for B
489 # project-merge for C (without B)
490 self.assertEqual(len(self.builds), 4)
James E. Blair0aac4872013-08-23 14:02:38 -0700491 self.assertEqual(self.countJobResults(self.history, 'ABORTED'), 2)
492
James E. Blair08d19992016-08-10 15:25:31 -0700493 self.launch_server.release('.*-merge')
James E. Blair972e3c72013-08-29 12:04:55 -0700494 self.waitUntilSettled()
495
496 # project-test1 and project-test2 for A
497 # project-test2 for B
498 # project-test1 and project-test2 for C
499 self.assertEqual(len(self.builds), 5)
500
James E. Blair0aac4872013-08-23 14:02:38 -0700501 items = self.sched.layout.pipelines['gate'].getAllItems()
502 builds = items[0].current_build_set.getBuilds()
503 self.assertEqual(self.countJobResults(builds, 'SUCCESS'), 1)
504 self.assertEqual(self.countJobResults(builds, None), 2)
505 builds = items[1].current_build_set.getBuilds()
506 self.assertEqual(self.countJobResults(builds, 'SUCCESS'), 1)
507 self.assertEqual(self.countJobResults(builds, 'FAILURE'), 1)
508 self.assertEqual(self.countJobResults(builds, None), 1)
509 builds = items[2].current_build_set.getBuilds()
510 self.assertEqual(self.countJobResults(builds, 'SUCCESS'), 1)
James E. Blair972e3c72013-08-29 12:04:55 -0700511 self.assertEqual(self.countJobResults(builds, None), 2)
James E. Blair0aac4872013-08-23 14:02:38 -0700512
James E. Blair08d19992016-08-10 15:25:31 -0700513 self.launch_server.hold_jobs_in_build = False
514 self.launch_server.release()
James E. Blair0aac4872013-08-23 14:02:38 -0700515 self.waitUntilSettled()
516
517 self.assertEqual(len(self.builds), 0)
518 self.assertEqual(len(self.history), 12)
519 self.assertEqual(A.data['status'], 'MERGED')
520 self.assertEqual(B.data['status'], 'NEW')
521 self.assertEqual(C.data['status'], 'MERGED')
522 self.assertEqual(A.reported, 2)
523 self.assertEqual(B.reported, 2)
524 self.assertEqual(C.reported, 2)
525
James E. Blairec056492016-07-22 09:45:56 -0700526 @skip("Disabled for early v3 development")
James E. Blaird466dc42012-07-31 10:42:56 -0700527 def test_failed_change_at_head_with_queue(self):
528 "Test that if a change at the head fails, queued jobs are canceled"
James E. Blaird466dc42012-07-31 10:42:56 -0700529
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700530 self.gearman_server.hold_jobs_in_queue = True
James E. Blaird466dc42012-07-31 10:42:56 -0700531 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
532 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
533 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
James E. Blair8b5408c2016-08-08 15:37:46 -0700534 A.addApproval('code-review', 2)
535 B.addApproval('code-review', 2)
536 C.addApproval('code-review', 2)
James E. Blaird466dc42012-07-31 10:42:56 -0700537
James E. Blair08d19992016-08-10 15:25:31 -0700538 self.launch_server.failJob('project-test1', A)
James E. Blaird466dc42012-07-31 10:42:56 -0700539
James E. Blair8b5408c2016-08-08 15:37:46 -0700540 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
541 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
542 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
James E. Blaird466dc42012-07-31 10:42:56 -0700543
544 self.waitUntilSettled()
James E. Blair701c5b42013-06-06 09:34:59 -0700545 queue = self.gearman_server.getQueue()
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400546 self.assertEqual(len(self.builds), 0)
547 self.assertEqual(len(queue), 1)
548 self.assertEqual(queue[0].name, 'build:project-merge')
549 self.assertTrue(self.job_has_changes(queue[0], A))
James E. Blaird466dc42012-07-31 10:42:56 -0700550
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700551 self.gearman_server.release('.*-merge')
James E. Blaird466dc42012-07-31 10:42:56 -0700552 self.waitUntilSettled()
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700553 self.gearman_server.release('.*-merge')
James E. Blaird466dc42012-07-31 10:42:56 -0700554 self.waitUntilSettled()
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700555 self.gearman_server.release('.*-merge')
James E. Blaird466dc42012-07-31 10:42:56 -0700556 self.waitUntilSettled()
James E. Blair701c5b42013-06-06 09:34:59 -0700557 queue = self.gearman_server.getQueue()
James E. Blaird466dc42012-07-31 10:42:56 -0700558
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400559 self.assertEqual(len(self.builds), 0)
560 self.assertEqual(len(queue), 6)
561 self.assertEqual(queue[0].name, 'build:project-test1')
562 self.assertEqual(queue[1].name, 'build:project-test2')
563 self.assertEqual(queue[2].name, 'build:project-test1')
564 self.assertEqual(queue[3].name, 'build:project-test2')
565 self.assertEqual(queue[4].name, 'build:project-test1')
566 self.assertEqual(queue[5].name, 'build:project-test2')
James E. Blaird466dc42012-07-31 10:42:56 -0700567
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700568 self.release(queue[0])
James E. Blaird466dc42012-07-31 10:42:56 -0700569 self.waitUntilSettled()
570
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400571 self.assertEqual(len(self.builds), 0)
James E. Blair701c5b42013-06-06 09:34:59 -0700572 queue = self.gearman_server.getQueue()
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400573 self.assertEqual(len(queue), 2) # project-test2, project-merge for B
574 self.assertEqual(self.countJobResults(self.history, 'ABORTED'), 0)
James E. Blaird466dc42012-07-31 10:42:56 -0700575
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700576 self.gearman_server.hold_jobs_in_queue = False
577 self.gearman_server.release()
James E. Blaird466dc42012-07-31 10:42:56 -0700578 self.waitUntilSettled()
579
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400580 self.assertEqual(len(self.builds), 0)
581 self.assertEqual(len(self.history), 11)
582 self.assertEqual(A.data['status'], 'NEW')
583 self.assertEqual(B.data['status'], 'MERGED')
584 self.assertEqual(C.data['status'], 'MERGED')
585 self.assertEqual(A.reported, 2)
586 self.assertEqual(B.reported, 2)
587 self.assertEqual(C.reported, 2)
James E. Blair8c803f82012-07-31 16:25:42 -0700588
James E. Blairec056492016-07-22 09:45:56 -0700589 @skip("Disabled for early v3 development")
James E. Blairce8a2132016-05-19 15:21:52 -0700590 def _test_time_database(self, iteration):
James E. Blair08d19992016-08-10 15:25:31 -0700591 self.launch_server.hold_jobs_in_build = True
James E. Blairce8a2132016-05-19 15:21:52 -0700592 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -0700593 A.addApproval('code-review', 2)
594 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blairce8a2132016-05-19 15:21:52 -0700595 self.waitUntilSettled()
596 time.sleep(2)
597
598 data = json.loads(self.sched.formatStatusJSON())
599 found_job = None
600 for pipeline in data['pipelines']:
601 if pipeline['name'] != 'gate':
602 continue
603 for queue in pipeline['change_queues']:
604 for head in queue['heads']:
605 for item in head:
606 for job in item['jobs']:
607 if job['name'] == 'project-merge':
608 found_job = job
609 break
610
611 self.assertIsNotNone(found_job)
612 if iteration == 1:
613 self.assertIsNotNone(found_job['estimated_time'])
614 self.assertIsNone(found_job['remaining_time'])
615 else:
616 self.assertIsNotNone(found_job['estimated_time'])
617 self.assertTrue(found_job['estimated_time'] >= 2)
618 self.assertIsNotNone(found_job['remaining_time'])
619
James E. Blair08d19992016-08-10 15:25:31 -0700620 self.launch_server.hold_jobs_in_build = False
621 self.launch_server.release()
James E. Blairce8a2132016-05-19 15:21:52 -0700622 self.waitUntilSettled()
623
James E. Blairec056492016-07-22 09:45:56 -0700624 @skip("Disabled for early v3 development")
James E. Blairce8a2132016-05-19 15:21:52 -0700625 def test_time_database(self):
626 "Test the time database"
627
628 self._test_time_database(1)
629 self._test_time_database(2)
630
James E. Blairec056492016-07-22 09:45:56 -0700631 @skip("Disabled for early v3 development")
James E. Blairfef71632013-09-23 11:15:47 -0700632 def test_two_failed_changes_at_head(self):
633 "Test that changes are reparented correctly if 2 fail at head"
634
James E. Blair08d19992016-08-10 15:25:31 -0700635 self.launch_server.hold_jobs_in_build = True
James E. Blairfef71632013-09-23 11:15:47 -0700636 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
637 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
638 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
James E. Blair8b5408c2016-08-08 15:37:46 -0700639 A.addApproval('code-review', 2)
640 B.addApproval('code-review', 2)
641 C.addApproval('code-review', 2)
James E. Blairfef71632013-09-23 11:15:47 -0700642
James E. Blair08d19992016-08-10 15:25:31 -0700643 self.launch_server.failJob('project-test1', A)
644 self.launch_server.failJob('project-test1', B)
James E. Blairfef71632013-09-23 11:15:47 -0700645
James E. Blair8b5408c2016-08-08 15:37:46 -0700646 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
647 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
648 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
James E. Blairfef71632013-09-23 11:15:47 -0700649 self.waitUntilSettled()
650
James E. Blair08d19992016-08-10 15:25:31 -0700651 self.launch_server.release('.*-merge')
James E. Blairfef71632013-09-23 11:15:47 -0700652 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -0700653 self.launch_server.release('.*-merge')
James E. Blairfef71632013-09-23 11:15:47 -0700654 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -0700655 self.launch_server.release('.*-merge')
James E. Blairfef71632013-09-23 11:15:47 -0700656 self.waitUntilSettled()
657
658 self.assertEqual(len(self.builds), 6)
659 self.assertEqual(self.builds[0].name, 'project-test1')
660 self.assertEqual(self.builds[1].name, 'project-test2')
661 self.assertEqual(self.builds[2].name, 'project-test1')
662 self.assertEqual(self.builds[3].name, 'project-test2')
663 self.assertEqual(self.builds[4].name, 'project-test1')
664 self.assertEqual(self.builds[5].name, 'project-test2')
665
666 self.assertTrue(self.job_has_changes(self.builds[0], A))
667 self.assertTrue(self.job_has_changes(self.builds[2], A))
668 self.assertTrue(self.job_has_changes(self.builds[2], B))
669 self.assertTrue(self.job_has_changes(self.builds[4], A))
670 self.assertTrue(self.job_has_changes(self.builds[4], B))
671 self.assertTrue(self.job_has_changes(self.builds[4], C))
672
673 # Fail change B first
674 self.release(self.builds[2])
675 self.waitUntilSettled()
676
677 # restart of C after B failure
James E. Blair08d19992016-08-10 15:25:31 -0700678 self.launch_server.release('.*-merge')
James E. Blairfef71632013-09-23 11:15:47 -0700679 self.waitUntilSettled()
680
681 self.assertEqual(len(self.builds), 5)
682 self.assertEqual(self.builds[0].name, 'project-test1')
683 self.assertEqual(self.builds[1].name, 'project-test2')
684 self.assertEqual(self.builds[2].name, 'project-test2')
685 self.assertEqual(self.builds[3].name, 'project-test1')
686 self.assertEqual(self.builds[4].name, 'project-test2')
687
688 self.assertTrue(self.job_has_changes(self.builds[1], A))
689 self.assertTrue(self.job_has_changes(self.builds[2], A))
690 self.assertTrue(self.job_has_changes(self.builds[2], B))
691 self.assertTrue(self.job_has_changes(self.builds[4], A))
692 self.assertFalse(self.job_has_changes(self.builds[4], B))
693 self.assertTrue(self.job_has_changes(self.builds[4], C))
694
695 # Finish running all passing jobs for change A
696 self.release(self.builds[1])
697 self.waitUntilSettled()
698 # Fail and report change A
699 self.release(self.builds[0])
700 self.waitUntilSettled()
701
702 # restart of B,C after A failure
James E. Blair08d19992016-08-10 15:25:31 -0700703 self.launch_server.release('.*-merge')
James E. Blairfef71632013-09-23 11:15:47 -0700704 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -0700705 self.launch_server.release('.*-merge')
James E. Blairfef71632013-09-23 11:15:47 -0700706 self.waitUntilSettled()
707
708 self.assertEqual(len(self.builds), 4)
709 self.assertEqual(self.builds[0].name, 'project-test1') # B
710 self.assertEqual(self.builds[1].name, 'project-test2') # B
711 self.assertEqual(self.builds[2].name, 'project-test1') # C
712 self.assertEqual(self.builds[3].name, 'project-test2') # C
713
714 self.assertFalse(self.job_has_changes(self.builds[1], A))
715 self.assertTrue(self.job_has_changes(self.builds[1], B))
716 self.assertFalse(self.job_has_changes(self.builds[1], C))
717
718 self.assertFalse(self.job_has_changes(self.builds[2], A))
719 # After A failed and B and C restarted, B should be back in
720 # C's tests because it has not failed yet.
721 self.assertTrue(self.job_has_changes(self.builds[2], B))
722 self.assertTrue(self.job_has_changes(self.builds[2], C))
723
James E. Blair08d19992016-08-10 15:25:31 -0700724 self.launch_server.hold_jobs_in_build = False
725 self.launch_server.release()
James E. Blairfef71632013-09-23 11:15:47 -0700726 self.waitUntilSettled()
727
728 self.assertEqual(len(self.builds), 0)
729 self.assertEqual(len(self.history), 21)
730 self.assertEqual(A.data['status'], 'NEW')
731 self.assertEqual(B.data['status'], 'NEW')
732 self.assertEqual(C.data['status'], 'MERGED')
733 self.assertEqual(A.reported, 2)
734 self.assertEqual(B.reported, 2)
735 self.assertEqual(C.reported, 2)
736
James E. Blairec056492016-07-22 09:45:56 -0700737 @skip("Disabled for early v3 development")
James E. Blairce8a2132016-05-19 15:21:52 -0700738 def test_parse_skip_if(self):
739 job_yaml = """
740jobs:
741 - name: job_name
742 skip-if:
743 - project: ^project_name$
744 branch: ^stable/icehouse$
745 all-files-match-any:
746 - ^filename$
747 - project: ^project2_name$
748 all-files-match-any:
749 - ^filename2$
750 """.strip()
751 data = yaml.load(job_yaml)
752 config_job = data.get('jobs')[0]
753 cm = zuul.change_matcher
754 expected = cm.MatchAny([
755 cm.MatchAll([
756 cm.ProjectMatcher('^project_name$'),
757 cm.BranchMatcher('^stable/icehouse$'),
758 cm.MatchAllFiles([cm.FileMatcher('^filename$')]),
759 ]),
760 cm.MatchAll([
761 cm.ProjectMatcher('^project2_name$'),
762 cm.MatchAllFiles([cm.FileMatcher('^filename2$')]),
763 ]),
764 ])
765 matcher = self.sched._parseSkipIf(config_job)
766 self.assertEqual(expected, matcher)
767
James E. Blair8c803f82012-07-31 16:25:42 -0700768 def test_patch_order(self):
769 "Test that dependent patches are tested in the right order"
770 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
771 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
772 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
James E. Blair8b5408c2016-08-08 15:37:46 -0700773 A.addApproval('code-review', 2)
774 B.addApproval('code-review', 2)
775 C.addApproval('code-review', 2)
James E. Blair8c803f82012-07-31 16:25:42 -0700776
777 M2 = self.fake_gerrit.addFakeChange('org/project', 'master', 'M2')
778 M1 = self.fake_gerrit.addFakeChange('org/project', 'master', 'M1')
779 M2.setMerged()
780 M1.setMerged()
781
782 # C -> B -> A -> M1 -> M2
783 # M2 is here to make sure it is never queried. If it is, it
784 # means zuul is walking down the entire history of merged
785 # changes.
786
787 C.setDependsOn(B, 1)
788 B.setDependsOn(A, 1)
789 A.setDependsOn(M1, 1)
790 M1.setDependsOn(M2, 1)
791
James E. Blair8b5408c2016-08-08 15:37:46 -0700792 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
James E. Blair8c803f82012-07-31 16:25:42 -0700793
794 self.waitUntilSettled()
795
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400796 self.assertEqual(A.data['status'], 'NEW')
797 self.assertEqual(B.data['status'], 'NEW')
798 self.assertEqual(C.data['status'], 'NEW')
James E. Blair8c803f82012-07-31 16:25:42 -0700799
James E. Blair8b5408c2016-08-08 15:37:46 -0700800 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
801 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair8c803f82012-07-31 16:25:42 -0700802
803 self.waitUntilSettled()
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400804 self.assertEqual(M2.queried, 0)
805 self.assertEqual(A.data['status'], 'MERGED')
806 self.assertEqual(B.data['status'], 'MERGED')
807 self.assertEqual(C.data['status'], 'MERGED')
808 self.assertEqual(A.reported, 2)
809 self.assertEqual(B.reported, 2)
810 self.assertEqual(C.reported, 2)
James E. Blair8c803f82012-07-31 16:25:42 -0700811
James E. Blairec056492016-07-22 09:45:56 -0700812 @skip("Disabled for early v3 development")
James E. Blair063672f2015-01-29 13:09:12 -0800813 def test_needed_changes_enqueue(self):
814 "Test that a needed change is enqueued ahead"
815 # A Given a git tree like this, if we enqueue
816 # / \ change C, we should walk up and down the tree
817 # B G and enqueue changes in the order ABCDEFG.
818 # /|\ This is also the order that you would get if
819 # *C E F you enqueued changes in the order ABCDEFG, so
820 # / the ordering is stable across re-enqueue events.
821 # D
822
823 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
824 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
825 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
826 D = self.fake_gerrit.addFakeChange('org/project', 'master', 'D')
827 E = self.fake_gerrit.addFakeChange('org/project', 'master', 'E')
828 F = self.fake_gerrit.addFakeChange('org/project', 'master', 'F')
829 G = self.fake_gerrit.addFakeChange('org/project', 'master', 'G')
830 B.setDependsOn(A, 1)
831 C.setDependsOn(B, 1)
832 D.setDependsOn(C, 1)
833 E.setDependsOn(B, 1)
834 F.setDependsOn(B, 1)
835 G.setDependsOn(A, 1)
836
James E. Blair8b5408c2016-08-08 15:37:46 -0700837 A.addApproval('code-review', 2)
838 B.addApproval('code-review', 2)
839 C.addApproval('code-review', 2)
840 D.addApproval('code-review', 2)
841 E.addApproval('code-review', 2)
842 F.addApproval('code-review', 2)
843 G.addApproval('code-review', 2)
844 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
James E. Blair063672f2015-01-29 13:09:12 -0800845
846 self.waitUntilSettled()
847
848 self.assertEqual(A.data['status'], 'NEW')
849 self.assertEqual(B.data['status'], 'NEW')
850 self.assertEqual(C.data['status'], 'NEW')
851 self.assertEqual(D.data['status'], 'NEW')
852 self.assertEqual(E.data['status'], 'NEW')
853 self.assertEqual(F.data['status'], 'NEW')
854 self.assertEqual(G.data['status'], 'NEW')
855
856 # We're about to add approvals to changes without adding the
857 # triggering events to Zuul, so that we can be sure that it is
858 # enqueing the changes based on dependencies, not because of
859 # triggering events. Since it will have the changes cached
860 # already (without approvals), we need to clear the cache
861 # first.
Joshua Hesketh4bd7da32016-02-17 20:58:47 +1100862 for connection in self.connections.values():
863 connection.maintainCache([])
James E. Blair063672f2015-01-29 13:09:12 -0800864
James E. Blair08d19992016-08-10 15:25:31 -0700865 self.launch_server.hold_jobs_in_build = True
James E. Blair8b5408c2016-08-08 15:37:46 -0700866 A.addApproval('approved', 1)
867 B.addApproval('approved', 1)
868 D.addApproval('approved', 1)
869 E.addApproval('approved', 1)
870 F.addApproval('approved', 1)
871 G.addApproval('approved', 1)
872 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
James E. Blair063672f2015-01-29 13:09:12 -0800873
874 for x in range(8):
James E. Blair08d19992016-08-10 15:25:31 -0700875 self.launch_server.release('.*-merge')
James E. Blair063672f2015-01-29 13:09:12 -0800876 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -0700877 self.launch_server.hold_jobs_in_build = False
878 self.launch_server.release()
James E. Blair063672f2015-01-29 13:09:12 -0800879 self.waitUntilSettled()
880
881 self.assertEqual(A.data['status'], 'MERGED')
882 self.assertEqual(B.data['status'], 'MERGED')
883 self.assertEqual(C.data['status'], 'MERGED')
884 self.assertEqual(D.data['status'], 'MERGED')
885 self.assertEqual(E.data['status'], 'MERGED')
886 self.assertEqual(F.data['status'], 'MERGED')
887 self.assertEqual(G.data['status'], 'MERGED')
888 self.assertEqual(A.reported, 2)
889 self.assertEqual(B.reported, 2)
890 self.assertEqual(C.reported, 2)
891 self.assertEqual(D.reported, 2)
892 self.assertEqual(E.reported, 2)
893 self.assertEqual(F.reported, 2)
894 self.assertEqual(G.reported, 2)
895 self.assertEqual(self.history[6].changes,
896 '1,1 2,1 3,1 4,1 5,1 6,1 7,1')
897
James E. Blairec056492016-07-22 09:45:56 -0700898 @skip("Disabled for early v3 development")
Joshua Hesketh850ccb62014-11-27 11:31:02 +1100899 def test_source_cache(self):
900 "Test that the source cache operates correctly"
James E. Blair08d19992016-08-10 15:25:31 -0700901 self.launch_server.hold_jobs_in_build = True
James E. Blair0e933c52013-07-11 10:18:52 -0700902
903 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
904 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
905 X = self.fake_gerrit.addFakeChange('org/project', 'master', 'X')
James E. Blair8b5408c2016-08-08 15:37:46 -0700906 A.addApproval('code-review', 2)
907 B.addApproval('code-review', 2)
James E. Blair0e933c52013-07-11 10:18:52 -0700908
909 M1 = self.fake_gerrit.addFakeChange('org/project', 'master', 'M1')
910 M1.setMerged()
911
912 B.setDependsOn(A, 1)
913 A.setDependsOn(M1, 1)
914
James E. Blair8b5408c2016-08-08 15:37:46 -0700915 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair0e933c52013-07-11 10:18:52 -0700916 self.fake_gerrit.addEvent(X.getPatchsetCreatedEvent(1))
917
918 self.waitUntilSettled()
919
920 for build in self.builds:
921 if build.parameters['ZUUL_PIPELINE'] == 'check':
922 build.release()
923 self.waitUntilSettled()
924 for build in self.builds:
925 if build.parameters['ZUUL_PIPELINE'] == 'check':
926 build.release()
927 self.waitUntilSettled()
928
James E. Blair8b5408c2016-08-08 15:37:46 -0700929 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
James E. Blair0e933c52013-07-11 10:18:52 -0700930 self.waitUntilSettled()
931
Joshua Hesketh352264b2015-08-11 23:42:08 +1000932 self.log.debug("len %s" % self.fake_gerrit._change_cache.keys())
James E. Blair0e933c52013-07-11 10:18:52 -0700933 # there should still be changes in the cache
Joshua Hesketh352264b2015-08-11 23:42:08 +1000934 self.assertNotEqual(len(self.fake_gerrit._change_cache.keys()), 0)
James E. Blair0e933c52013-07-11 10:18:52 -0700935
James E. Blair08d19992016-08-10 15:25:31 -0700936 self.launch_server.hold_jobs_in_build = False
937 self.launch_server.release()
James E. Blair0e933c52013-07-11 10:18:52 -0700938 self.waitUntilSettled()
939
940 self.assertEqual(A.data['status'], 'MERGED')
941 self.assertEqual(B.data['status'], 'MERGED')
942 self.assertEqual(A.queried, 2) # Initial and isMerged
943 self.assertEqual(B.queried, 3) # Initial A, refresh from B, isMerged
944
James E. Blairec056492016-07-22 09:45:56 -0700945 @skip("Disabled for early v3 development")
James E. Blair8c803f82012-07-31 16:25:42 -0700946 def test_can_merge(self):
James E. Blair4886cc12012-07-18 15:39:41 -0700947 "Test whether a change is ready to merge"
James E. Blair8c803f82012-07-31 16:25:42 -0700948 # TODO: move to test_gerrit (this is a unit test!)
949 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blairc0dedf82014-08-06 09:37:52 -0700950 source = self.sched.layout.pipelines['gate'].source
951 a = source._getChange(1, 2)
James E. Blaireff88162013-07-01 12:44:14 -0400952 mgr = self.sched.layout.pipelines['gate'].manager
James E. Blairc0dedf82014-08-06 09:37:52 -0700953 self.assertFalse(source.canMerge(a, mgr.getSubmitAllowNeeds()))
James E. Blair8c803f82012-07-31 16:25:42 -0700954
James E. Blair8b5408c2016-08-08 15:37:46 -0700955 A.addApproval('code-review', 2)
James E. Blairc0dedf82014-08-06 09:37:52 -0700956 a = source._getChange(1, 2, refresh=True)
957 self.assertFalse(source.canMerge(a, mgr.getSubmitAllowNeeds()))
James E. Blair8c803f82012-07-31 16:25:42 -0700958
James E. Blair8b5408c2016-08-08 15:37:46 -0700959 A.addApproval('approved', 1)
James E. Blairc0dedf82014-08-06 09:37:52 -0700960 a = source._getChange(1, 2, refresh=True)
961 self.assertTrue(source.canMerge(a, mgr.getSubmitAllowNeeds()))
James E. Blair4886cc12012-07-18 15:39:41 -0700962
James E. Blairec056492016-07-22 09:45:56 -0700963 @skip("Disabled for early v3 development")
James E. Blair4886cc12012-07-18 15:39:41 -0700964 def test_build_configuration(self):
965 "Test that zuul merges the right commits for testing"
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700966
967 self.gearman_server.hold_jobs_in_queue = True
James E. Blair4886cc12012-07-18 15:39:41 -0700968 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
969 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
970 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
James E. Blair8b5408c2016-08-08 15:37:46 -0700971 A.addApproval('code-review', 2)
972 B.addApproval('code-review', 2)
973 C.addApproval('code-review', 2)
974 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
975 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
976 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
James E. Blair4886cc12012-07-18 15:39:41 -0700977 self.waitUntilSettled()
978
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700979 self.gearman_server.release('.*-merge')
James E. Blair4886cc12012-07-18 15:39:41 -0700980 self.waitUntilSettled()
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700981 self.gearman_server.release('.*-merge')
James E. Blair4886cc12012-07-18 15:39:41 -0700982 self.waitUntilSettled()
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700983 self.gearman_server.release('.*-merge')
James E. Blair4886cc12012-07-18 15:39:41 -0700984 self.waitUntilSettled()
James E. Blair701c5b42013-06-06 09:34:59 -0700985 queue = self.gearman_server.getQueue()
James E. Blair1f4c2bb2013-04-26 08:40:46 -0700986 ref = self.getParameter(queue[-1], 'ZUUL_REF')
987 self.gearman_server.hold_jobs_in_queue = False
988 self.gearman_server.release()
James E. Blair973721f2012-08-15 10:19:43 -0700989 self.waitUntilSettled()
James E. Blair4886cc12012-07-18 15:39:41 -0700990
Monty Taylorbc758832013-06-17 17:22:42 -0400991 path = os.path.join(self.git_root, "org/project")
James E. Blair4886cc12012-07-18 15:39:41 -0700992 repo = git.Repo(path)
993 repo_messages = [c.message.strip() for c in repo.iter_commits(ref)]
994 repo_messages.reverse()
James E. Blair4886cc12012-07-18 15:39:41 -0700995 correct_messages = ['initial commit', 'A-1', 'B-1', 'C-1']
Monty Taylor98f0f3e2013-07-06 16:02:31 -0400996 self.assertEqual(repo_messages, correct_messages)
James E. Blair973721f2012-08-15 10:19:43 -0700997
James E. Blairec056492016-07-22 09:45:56 -0700998 @skip("Disabled for early v3 development")
James E. Blair973721f2012-08-15 10:19:43 -0700999 def test_build_configuration_conflict(self):
1000 "Test that merge conflicts are handled"
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001001
1002 self.gearman_server.hold_jobs_in_queue = True
James E. Blair6736beb2013-07-11 15:18:15 -07001003 A = self.fake_gerrit.addFakeChange('org/conflict-project',
1004 'master', 'A')
James E. Blair973721f2012-08-15 10:19:43 -07001005 A.addPatchset(['conflict'])
James E. Blair6736beb2013-07-11 15:18:15 -07001006 B = self.fake_gerrit.addFakeChange('org/conflict-project',
1007 'master', 'B')
James E. Blair973721f2012-08-15 10:19:43 -07001008 B.addPatchset(['conflict'])
James E. Blair6736beb2013-07-11 15:18:15 -07001009 C = self.fake_gerrit.addFakeChange('org/conflict-project',
1010 'master', 'C')
James E. Blair8b5408c2016-08-08 15:37:46 -07001011 A.addApproval('code-review', 2)
1012 B.addApproval('code-review', 2)
1013 C.addApproval('code-review', 2)
1014 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
1015 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
1016 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
James E. Blair973721f2012-08-15 10:19:43 -07001017 self.waitUntilSettled()
1018
James E. Blair6736beb2013-07-11 15:18:15 -07001019 self.assertEqual(A.reported, 1)
1020 self.assertEqual(B.reported, 1)
1021 self.assertEqual(C.reported, 1)
1022
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001023 self.gearman_server.release('.*-merge')
James E. Blair973721f2012-08-15 10:19:43 -07001024 self.waitUntilSettled()
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001025 self.gearman_server.release('.*-merge')
James E. Blair973721f2012-08-15 10:19:43 -07001026 self.waitUntilSettled()
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001027 self.gearman_server.release('.*-merge')
James E. Blair973721f2012-08-15 10:19:43 -07001028 self.waitUntilSettled()
James E. Blair972e3c72013-08-29 12:04:55 -07001029
1030 self.assertEqual(len(self.history), 2) # A and C merge jobs
1031
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001032 self.gearman_server.hold_jobs_in_queue = False
1033 self.gearman_server.release()
James E. Blair973721f2012-08-15 10:19:43 -07001034 self.waitUntilSettled()
1035
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001036 self.assertEqual(A.data['status'], 'MERGED')
1037 self.assertEqual(B.data['status'], 'NEW')
1038 self.assertEqual(C.data['status'], 'MERGED')
1039 self.assertEqual(A.reported, 2)
1040 self.assertEqual(B.reported, 2)
1041 self.assertEqual(C.reported, 2)
James E. Blair972e3c72013-08-29 12:04:55 -07001042 self.assertEqual(len(self.history), 6)
James E. Blair6736beb2013-07-11 15:18:15 -07001043
James E. Blairec056492016-07-22 09:45:56 -07001044 @skip("Disabled for early v3 development")
James E. Blairdaabed22012-08-15 15:38:57 -07001045 def test_post(self):
1046 "Test that post jobs run"
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001047
Zhongyue Luo5d556072012-09-21 02:00:47 +09001048 e = {
1049 "type": "ref-updated",
1050 "submitter": {
1051 "name": "User Name",
1052 },
1053 "refUpdate": {
1054 "oldRev": "90f173846e3af9154517b88543ffbd1691f31366",
1055 "newRev": "d479a0bfcb34da57a31adb2a595c0cf687812543",
1056 "refName": "master",
1057 "project": "org/project",
1058 }
1059 }
James E. Blairdaabed22012-08-15 15:38:57 -07001060 self.fake_gerrit.addEvent(e)
1061 self.waitUntilSettled()
1062
Monty Taylor6bef8ef2013-06-02 08:17:12 -04001063 job_names = [x.name for x in self.history]
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001064 self.assertEqual(len(self.history), 1)
1065 self.assertIn('project-post', job_names)
James E. Blairc6294a52012-08-17 10:19:48 -07001066
James E. Blairec056492016-07-22 09:45:56 -07001067 @skip("Disabled for early v3 development")
K Jonathan Harkerf95e7232015-04-29 13:33:16 -07001068 def test_post_ignore_deletes(self):
1069 "Test that deleting refs does not trigger post jobs"
1070
1071 e = {
1072 "type": "ref-updated",
1073 "submitter": {
1074 "name": "User Name",
1075 },
1076 "refUpdate": {
1077 "oldRev": "90f173846e3af9154517b88543ffbd1691f31366",
1078 "newRev": "0000000000000000000000000000000000000000",
1079 "refName": "master",
1080 "project": "org/project",
1081 }
1082 }
1083 self.fake_gerrit.addEvent(e)
1084 self.waitUntilSettled()
1085
1086 job_names = [x.name for x in self.history]
1087 self.assertEqual(len(self.history), 0)
1088 self.assertNotIn('project-post', job_names)
1089
James E. Blairec056492016-07-22 09:45:56 -07001090 @skip("Disabled for early v3 development")
K Jonathan Harkerf95e7232015-04-29 13:33:16 -07001091 def test_post_ignore_deletes_negative(self):
1092 "Test that deleting refs does trigger post jobs"
1093
James E. Blairf84026c2015-12-08 16:11:46 -08001094 self.updateConfigLayout(
1095 'tests/fixtures/layout-dont-ignore-deletes.yaml')
K Jonathan Harkerf95e7232015-04-29 13:33:16 -07001096 self.sched.reconfigure(self.config)
1097
1098 e = {
1099 "type": "ref-updated",
1100 "submitter": {
1101 "name": "User Name",
1102 },
1103 "refUpdate": {
1104 "oldRev": "90f173846e3af9154517b88543ffbd1691f31366",
1105 "newRev": "0000000000000000000000000000000000000000",
1106 "refName": "master",
1107 "project": "org/project",
1108 }
1109 }
1110 self.fake_gerrit.addEvent(e)
1111 self.waitUntilSettled()
1112
1113 job_names = [x.name for x in self.history]
1114 self.assertEqual(len(self.history), 1)
1115 self.assertIn('project-post', job_names)
1116
James E. Blairec056492016-07-22 09:45:56 -07001117 @skip("Disabled for early v3 development")
James E. Blairc6294a52012-08-17 10:19:48 -07001118 def test_build_configuration_branch(self):
1119 "Test that the right commits are on alternate branches"
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001120
1121 self.gearman_server.hold_jobs_in_queue = True
James E. Blairc6294a52012-08-17 10:19:48 -07001122 A = self.fake_gerrit.addFakeChange('org/project', 'mp', 'A')
1123 B = self.fake_gerrit.addFakeChange('org/project', 'mp', 'B')
1124 C = self.fake_gerrit.addFakeChange('org/project', 'mp', 'C')
James E. Blair8b5408c2016-08-08 15:37:46 -07001125 A.addApproval('code-review', 2)
1126 B.addApproval('code-review', 2)
1127 C.addApproval('code-review', 2)
1128 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
1129 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
1130 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
James E. Blairc6294a52012-08-17 10:19:48 -07001131 self.waitUntilSettled()
1132
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001133 self.gearman_server.release('.*-merge')
James E. Blairc6294a52012-08-17 10:19:48 -07001134 self.waitUntilSettled()
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001135 self.gearman_server.release('.*-merge')
James E. Blairc6294a52012-08-17 10:19:48 -07001136 self.waitUntilSettled()
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001137 self.gearman_server.release('.*-merge')
James E. Blairc6294a52012-08-17 10:19:48 -07001138 self.waitUntilSettled()
James E. Blair701c5b42013-06-06 09:34:59 -07001139 queue = self.gearman_server.getQueue()
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001140 ref = self.getParameter(queue[-1], 'ZUUL_REF')
1141 self.gearman_server.hold_jobs_in_queue = False
1142 self.gearman_server.release()
James E. Blairc6294a52012-08-17 10:19:48 -07001143 self.waitUntilSettled()
1144
Monty Taylorbc758832013-06-17 17:22:42 -04001145 path = os.path.join(self.git_root, "org/project")
James E. Blairc6294a52012-08-17 10:19:48 -07001146 repo = git.Repo(path)
1147 repo_messages = [c.message.strip() for c in repo.iter_commits(ref)]
1148 repo_messages.reverse()
James E. Blairc6294a52012-08-17 10:19:48 -07001149 correct_messages = ['initial commit', 'mp commit', 'A-1', 'B-1', 'C-1']
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001150 self.assertEqual(repo_messages, correct_messages)
James E. Blairc6294a52012-08-17 10:19:48 -07001151
James E. Blairec056492016-07-22 09:45:56 -07001152 @skip("Disabled for early v3 development")
James E. Blairc6294a52012-08-17 10:19:48 -07001153 def test_build_configuration_branch_interaction(self):
1154 "Test that switching between branches works"
1155 self.test_build_configuration()
1156 self.test_build_configuration_branch()
1157 # C has been merged, undo that
Monty Taylorbc758832013-06-17 17:22:42 -04001158 path = os.path.join(self.upstream_root, "org/project")
James E. Blairc6294a52012-08-17 10:19:48 -07001159 repo = git.Repo(path)
1160 repo.heads.master.commit = repo.commit('init')
1161 self.test_build_configuration()
1162
James E. Blairec056492016-07-22 09:45:56 -07001163 @skip("Disabled for early v3 development")
James E. Blairc6294a52012-08-17 10:19:48 -07001164 def test_build_configuration_multi_branch(self):
1165 "Test that dependent changes on multiple branches are merged"
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001166
1167 self.gearman_server.hold_jobs_in_queue = True
James E. Blairc6294a52012-08-17 10:19:48 -07001168 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
1169 B = self.fake_gerrit.addFakeChange('org/project', 'mp', 'B')
1170 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
James E. Blair8b5408c2016-08-08 15:37:46 -07001171 A.addApproval('code-review', 2)
1172 B.addApproval('code-review', 2)
1173 C.addApproval('code-review', 2)
1174 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
1175 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
1176 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
James E. Blairc6294a52012-08-17 10:19:48 -07001177 self.waitUntilSettled()
James E. Blairbb1fe502014-03-04 10:15:06 -08001178 queue = self.gearman_server.getQueue()
1179 job_A = None
1180 for job in queue:
1181 if 'project-merge' in job.name:
1182 job_A = job
1183 ref_A = self.getParameter(job_A, 'ZUUL_REF')
1184 commit_A = self.getParameter(job_A, 'ZUUL_COMMIT')
1185 self.log.debug("Got Zuul ref for change A: %s" % ref_A)
1186 self.log.debug("Got Zuul commit for change A: %s" % commit_A)
James E. Blairc6294a52012-08-17 10:19:48 -07001187
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001188 self.gearman_server.release('.*-merge')
James E. Blairc6294a52012-08-17 10:19:48 -07001189 self.waitUntilSettled()
James E. Blair701c5b42013-06-06 09:34:59 -07001190 queue = self.gearman_server.getQueue()
James E. Blaird320d7e2013-07-30 16:36:20 -07001191 job_B = None
1192 for job in queue:
1193 if 'project-merge' in job.name:
1194 job_B = job
1195 ref_B = self.getParameter(job_B, 'ZUUL_REF')
James E. Blairbb1fe502014-03-04 10:15:06 -08001196 commit_B = self.getParameter(job_B, 'ZUUL_COMMIT')
James E. Blairf750aa02013-07-15 14:11:24 -07001197 self.log.debug("Got Zuul ref for change B: %s" % ref_B)
James E. Blairbb1fe502014-03-04 10:15:06 -08001198 self.log.debug("Got Zuul commit for change B: %s" % commit_B)
1199
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001200 self.gearman_server.release('.*-merge')
James E. Blairc6294a52012-08-17 10:19:48 -07001201 self.waitUntilSettled()
James E. Blair701c5b42013-06-06 09:34:59 -07001202 queue = self.gearman_server.getQueue()
James E. Blaird320d7e2013-07-30 16:36:20 -07001203 for job in queue:
1204 if 'project-merge' in job.name:
1205 job_C = job
1206 ref_C = self.getParameter(job_C, 'ZUUL_REF')
James E. Blairbb1fe502014-03-04 10:15:06 -08001207 commit_C = self.getParameter(job_C, 'ZUUL_COMMIT')
James E. Blairf750aa02013-07-15 14:11:24 -07001208 self.log.debug("Got Zuul ref for change C: %s" % ref_C)
James E. Blairbb1fe502014-03-04 10:15:06 -08001209 self.log.debug("Got Zuul commit for change C: %s" % commit_C)
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001210 self.gearman_server.hold_jobs_in_queue = False
1211 self.gearman_server.release()
James E. Blairc6294a52012-08-17 10:19:48 -07001212 self.waitUntilSettled()
1213
Monty Taylorbc758832013-06-17 17:22:42 -04001214 path = os.path.join(self.git_root, "org/project")
James E. Blairc6294a52012-08-17 10:19:48 -07001215 repo = git.Repo(path)
1216
1217 repo_messages = [c.message.strip()
James E. Blairf750aa02013-07-15 14:11:24 -07001218 for c in repo.iter_commits(ref_C)]
James E. Blairbb1fe502014-03-04 10:15:06 -08001219 repo_shas = [c.hexsha for c in repo.iter_commits(ref_C)]
James E. Blairc6294a52012-08-17 10:19:48 -07001220 repo_messages.reverse()
James E. Blairc6294a52012-08-17 10:19:48 -07001221 correct_messages = ['initial commit', 'A-1', 'C-1']
James E. Blairbb1fe502014-03-04 10:15:06 -08001222 # Ensure the right commits are in the history for this ref
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001223 self.assertEqual(repo_messages, correct_messages)
James E. Blairbb1fe502014-03-04 10:15:06 -08001224 # Ensure ZUUL_REF -> ZUUL_COMMIT
1225 self.assertEqual(repo_shas[0], commit_C)
James E. Blairc6294a52012-08-17 10:19:48 -07001226
1227 repo_messages = [c.message.strip()
James E. Blairf750aa02013-07-15 14:11:24 -07001228 for c in repo.iter_commits(ref_B)]
James E. Blairbb1fe502014-03-04 10:15:06 -08001229 repo_shas = [c.hexsha for c in repo.iter_commits(ref_B)]
James E. Blairc6294a52012-08-17 10:19:48 -07001230 repo_messages.reverse()
James E. Blairc6294a52012-08-17 10:19:48 -07001231 correct_messages = ['initial commit', 'mp commit', 'B-1']
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001232 self.assertEqual(repo_messages, correct_messages)
James E. Blairbb1fe502014-03-04 10:15:06 -08001233 self.assertEqual(repo_shas[0], commit_B)
1234
1235 repo_messages = [c.message.strip()
1236 for c in repo.iter_commits(ref_A)]
1237 repo_shas = [c.hexsha for c in repo.iter_commits(ref_A)]
1238 repo_messages.reverse()
1239 correct_messages = ['initial commit', 'A-1']
1240 self.assertEqual(repo_messages, correct_messages)
1241 self.assertEqual(repo_shas[0], commit_A)
1242
1243 self.assertNotEqual(ref_A, ref_B, ref_C)
1244 self.assertNotEqual(commit_A, commit_B, commit_C)
James E. Blair7f71c802012-08-22 13:04:32 -07001245
James E. Blairec056492016-07-22 09:45:56 -07001246 @skip("Disabled for early v3 development")
James E. Blair7f71c802012-08-22 13:04:32 -07001247 def test_one_job_project(self):
1248 "Test that queueing works with one job"
1249 A = self.fake_gerrit.addFakeChange('org/one-job-project',
1250 'master', 'A')
1251 B = self.fake_gerrit.addFakeChange('org/one-job-project',
1252 'master', 'B')
James E. Blair8b5408c2016-08-08 15:37:46 -07001253 A.addApproval('code-review', 2)
1254 B.addApproval('code-review', 2)
1255 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
1256 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
James E. Blair7f71c802012-08-22 13:04:32 -07001257 self.waitUntilSettled()
1258
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001259 self.assertEqual(A.data['status'], 'MERGED')
1260 self.assertEqual(A.reported, 2)
1261 self.assertEqual(B.data['status'], 'MERGED')
1262 self.assertEqual(B.reported, 2)
James E. Blaircaec0c52012-08-22 14:52:22 -07001263
James E. Blairec056492016-07-22 09:45:56 -07001264 @skip("Disabled for early v3 development")
Antoine Musso80edd5a2013-02-13 15:37:53 +01001265 def test_job_from_templates_launched(self):
1266 "Test whether a job generated via a template can be launched"
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001267
Antoine Musso80edd5a2013-02-13 15:37:53 +01001268 A = self.fake_gerrit.addFakeChange(
1269 'org/templated-project', 'master', 'A')
1270 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
1271 self.waitUntilSettled()
Antoine Musso80edd5a2013-02-13 15:37:53 +01001272
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001273 self.assertEqual(self.getJobFromHistory('project-test1').result,
1274 'SUCCESS')
1275 self.assertEqual(self.getJobFromHistory('project-test2').result,
1276 'SUCCESS')
Antoine Musso80edd5a2013-02-13 15:37:53 +01001277
James E. Blairec056492016-07-22 09:45:56 -07001278 @skip("Disabled for early v3 development")
James E. Blair3e98c022013-12-16 15:25:38 -08001279 def test_layered_templates(self):
1280 "Test whether a job generated via a template can be launched"
1281
1282 A = self.fake_gerrit.addFakeChange(
1283 'org/layered-project', 'master', 'A')
1284 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
1285 self.waitUntilSettled()
1286
1287 self.assertEqual(self.getJobFromHistory('project-test1').result,
1288 'SUCCESS')
1289 self.assertEqual(self.getJobFromHistory('project-test2').result,
1290 'SUCCESS')
James E. Blairaea6cf62013-12-16 15:38:12 -08001291 self.assertEqual(self.getJobFromHistory('layered-project-test3'
1292 ).result, 'SUCCESS')
1293 self.assertEqual(self.getJobFromHistory('layered-project-test4'
1294 ).result, 'SUCCESS')
James E. Blair12a92b12014-03-26 11:54:53 -07001295 self.assertEqual(self.getJobFromHistory('layered-project-foo-test5'
1296 ).result, 'SUCCESS')
James E. Blair3e98c022013-12-16 15:25:38 -08001297 self.assertEqual(self.getJobFromHistory('project-test6').result,
1298 'SUCCESS')
1299
James E. Blaircaec0c52012-08-22 14:52:22 -07001300 def test_dependent_changes_dequeue(self):
1301 "Test that dependent patches are not needlessly tested"
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001302
James E. Blaircaec0c52012-08-22 14:52:22 -07001303 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
1304 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
1305 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
James E. Blair8b5408c2016-08-08 15:37:46 -07001306 A.addApproval('code-review', 2)
1307 B.addApproval('code-review', 2)
1308 C.addApproval('code-review', 2)
James E. Blaircaec0c52012-08-22 14:52:22 -07001309
1310 M1 = self.fake_gerrit.addFakeChange('org/project', 'master', 'M1')
1311 M1.setMerged()
1312
1313 # C -> B -> A -> M1
1314
1315 C.setDependsOn(B, 1)
1316 B.setDependsOn(A, 1)
1317 A.setDependsOn(M1, 1)
1318
James E. Blair08d19992016-08-10 15:25:31 -07001319 self.launch_server.failJob('project-merge', A)
James E. Blaircaec0c52012-08-22 14:52:22 -07001320
James E. Blair8b5408c2016-08-08 15:37:46 -07001321 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
1322 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
1323 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blaircaec0c52012-08-22 14:52:22 -07001324
1325 self.waitUntilSettled()
1326
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001327 self.assertEqual(A.data['status'], 'NEW')
1328 self.assertEqual(A.reported, 2)
1329 self.assertEqual(B.data['status'], 'NEW')
1330 self.assertEqual(B.reported, 2)
1331 self.assertEqual(C.data['status'], 'NEW')
1332 self.assertEqual(C.reported, 2)
1333 self.assertEqual(len(self.history), 1)
James E. Blairec590122012-08-22 15:19:31 -07001334
James E. Blair972e3c72013-08-29 12:04:55 -07001335 def test_failing_dependent_changes(self):
1336 "Test that failing dependent patches are taken out of stream"
James E. Blair08d19992016-08-10 15:25:31 -07001337 self.launch_server.hold_jobs_in_build = True
James E. Blair972e3c72013-08-29 12:04:55 -07001338 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
1339 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
1340 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
1341 D = self.fake_gerrit.addFakeChange('org/project', 'master', 'D')
1342 E = self.fake_gerrit.addFakeChange('org/project', 'master', 'E')
James E. Blair8b5408c2016-08-08 15:37:46 -07001343 A.addApproval('code-review', 2)
1344 B.addApproval('code-review', 2)
1345 C.addApproval('code-review', 2)
1346 D.addApproval('code-review', 2)
1347 E.addApproval('code-review', 2)
James E. Blair972e3c72013-08-29 12:04:55 -07001348
1349 # E, D -> C -> B, A
1350
1351 D.setDependsOn(C, 1)
1352 C.setDependsOn(B, 1)
1353
James E. Blair08d19992016-08-10 15:25:31 -07001354 self.launch_server.failJob('project-test1', B)
James E. Blair972e3c72013-08-29 12:04:55 -07001355
James E. Blair8b5408c2016-08-08 15:37:46 -07001356 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
1357 self.fake_gerrit.addEvent(D.addApproval('approved', 1))
1358 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
1359 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
1360 self.fake_gerrit.addEvent(E.addApproval('approved', 1))
James E. Blair972e3c72013-08-29 12:04:55 -07001361
1362 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07001363 self.launch_server.release('.*-merge')
James E. Blair972e3c72013-08-29 12:04:55 -07001364 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07001365 self.launch_server.release('.*-merge')
James E. Blair972e3c72013-08-29 12:04:55 -07001366 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07001367 self.launch_server.release('.*-merge')
James E. Blair972e3c72013-08-29 12:04:55 -07001368 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07001369 self.launch_server.release('.*-merge')
James E. Blair972e3c72013-08-29 12:04:55 -07001370 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07001371 self.launch_server.release('.*-merge')
James E. Blair972e3c72013-08-29 12:04:55 -07001372 self.waitUntilSettled()
1373
James E. Blair08d19992016-08-10 15:25:31 -07001374 self.launch_server.hold_jobs_in_build = False
James E. Blair972e3c72013-08-29 12:04:55 -07001375 for build in self.builds:
1376 if build.parameters['ZUUL_CHANGE'] != '1':
1377 build.release()
1378 self.waitUntilSettled()
1379
James E. Blair08d19992016-08-10 15:25:31 -07001380 self.launch_server.release()
James E. Blair972e3c72013-08-29 12:04:55 -07001381 self.waitUntilSettled()
1382
1383 self.assertEqual(A.data['status'], 'MERGED')
1384 self.assertEqual(A.reported, 2)
Jeremy Stanley10837132014-08-02 16:10:56 +00001385 self.assertIn('Build succeeded', A.messages[1])
James E. Blair972e3c72013-08-29 12:04:55 -07001386 self.assertEqual(B.data['status'], 'NEW')
1387 self.assertEqual(B.reported, 2)
Jeremy Stanley10837132014-08-02 16:10:56 +00001388 self.assertIn('Build failed', B.messages[1])
James E. Blair972e3c72013-08-29 12:04:55 -07001389 self.assertEqual(C.data['status'], 'NEW')
1390 self.assertEqual(C.reported, 2)
Jeremy Stanley10837132014-08-02 16:10:56 +00001391 self.assertIn('depends on a change', C.messages[1])
James E. Blair972e3c72013-08-29 12:04:55 -07001392 self.assertEqual(D.data['status'], 'NEW')
1393 self.assertEqual(D.reported, 2)
Jeremy Stanley10837132014-08-02 16:10:56 +00001394 self.assertIn('depends on a change', D.messages[1])
James E. Blair972e3c72013-08-29 12:04:55 -07001395 self.assertEqual(E.data['status'], 'MERGED')
1396 self.assertEqual(E.reported, 2)
Jeremy Stanley10837132014-08-02 16:10:56 +00001397 self.assertIn('Build succeeded', E.messages[1])
James E. Blair972e3c72013-08-29 12:04:55 -07001398 self.assertEqual(len(self.history), 18)
1399
James E. Blairec056492016-07-22 09:45:56 -07001400 @skip("Disabled for early v3 development")
James E. Blairec590122012-08-22 15:19:31 -07001401 def test_head_is_dequeued_once(self):
James E. Blair2fa50962013-01-30 21:50:41 -08001402 "Test that if a change at the head fails it is dequeued only once"
James E. Blairec590122012-08-22 15:19:31 -07001403 # If it's dequeued more than once, we should see extra
1404 # aborted jobs.
James E. Blairec590122012-08-22 15:19:31 -07001405
James E. Blair08d19992016-08-10 15:25:31 -07001406 self.launch_server.hold_jobs_in_build = True
James E. Blairec590122012-08-22 15:19:31 -07001407 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
1408 B = self.fake_gerrit.addFakeChange('org/project1', 'master', 'B')
1409 C = self.fake_gerrit.addFakeChange('org/project1', 'master', 'C')
James E. Blair8b5408c2016-08-08 15:37:46 -07001410 A.addApproval('code-review', 2)
1411 B.addApproval('code-review', 2)
1412 C.addApproval('code-review', 2)
James E. Blairec590122012-08-22 15:19:31 -07001413
James E. Blair08d19992016-08-10 15:25:31 -07001414 self.launch_server.failJob('project1-test1', A)
1415 self.launch_server.failJob('project1-test2', A)
1416 self.launch_server.failJob('project1-project2-integration', A)
James E. Blairec590122012-08-22 15:19:31 -07001417
James E. Blair8b5408c2016-08-08 15:37:46 -07001418 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
1419 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
1420 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
James E. Blairec590122012-08-22 15:19:31 -07001421
1422 self.waitUntilSettled()
James E. Blairec590122012-08-22 15:19:31 -07001423
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001424 self.assertEqual(len(self.builds), 1)
1425 self.assertEqual(self.builds[0].name, 'project1-merge')
1426 self.assertTrue(self.job_has_changes(self.builds[0], A))
James E. Blairec590122012-08-22 15:19:31 -07001427
James E. Blair08d19992016-08-10 15:25:31 -07001428 self.launch_server.release('.*-merge')
James E. Blairec590122012-08-22 15:19:31 -07001429 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07001430 self.launch_server.release('.*-merge')
James E. Blairec590122012-08-22 15:19:31 -07001431 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07001432 self.launch_server.release('.*-merge')
James E. Blairec590122012-08-22 15:19:31 -07001433 self.waitUntilSettled()
1434
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001435 self.assertEqual(len(self.builds), 9)
1436 self.assertEqual(self.builds[0].name, 'project1-test1')
1437 self.assertEqual(self.builds[1].name, 'project1-test2')
1438 self.assertEqual(self.builds[2].name, 'project1-project2-integration')
1439 self.assertEqual(self.builds[3].name, 'project1-test1')
1440 self.assertEqual(self.builds[4].name, 'project1-test2')
1441 self.assertEqual(self.builds[5].name, 'project1-project2-integration')
1442 self.assertEqual(self.builds[6].name, 'project1-test1')
1443 self.assertEqual(self.builds[7].name, 'project1-test2')
1444 self.assertEqual(self.builds[8].name, 'project1-project2-integration')
James E. Blairec590122012-08-22 15:19:31 -07001445
Monty Taylor6bef8ef2013-06-02 08:17:12 -04001446 self.release(self.builds[0])
James E. Blairec590122012-08-22 15:19:31 -07001447 self.waitUntilSettled()
1448
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001449 self.assertEqual(len(self.builds), 3) # test2,integration, merge for B
1450 self.assertEqual(self.countJobResults(self.history, 'ABORTED'), 6)
James E. Blairec590122012-08-22 15:19:31 -07001451
James E. Blair08d19992016-08-10 15:25:31 -07001452 self.launch_server.hold_jobs_in_build = False
1453 self.launch_server.release()
James E. Blairec590122012-08-22 15:19:31 -07001454 self.waitUntilSettled()
1455
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001456 self.assertEqual(len(self.builds), 0)
1457 self.assertEqual(len(self.history), 20)
James E. Blaircaec0c52012-08-22 14:52:22 -07001458
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001459 self.assertEqual(A.data['status'], 'NEW')
1460 self.assertEqual(B.data['status'], 'MERGED')
1461 self.assertEqual(C.data['status'], 'MERGED')
1462 self.assertEqual(A.reported, 2)
1463 self.assertEqual(B.reported, 2)
1464 self.assertEqual(C.reported, 2)
James E. Blair4ec821f2012-08-23 15:28:28 -07001465
James E. Blairec056492016-07-22 09:45:56 -07001466 @skip("Disabled for early v3 development")
James E. Blair4ec821f2012-08-23 15:28:28 -07001467 def test_nonvoting_job(self):
1468 "Test that non-voting jobs don't vote."
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001469
James E. Blair4ec821f2012-08-23 15:28:28 -07001470 A = self.fake_gerrit.addFakeChange('org/nonvoting-project',
1471 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -07001472 A.addApproval('code-review', 2)
James E. Blair08d19992016-08-10 15:25:31 -07001473 self.launch_server.failJob('nonvoting-project-test2', A)
James E. Blair8b5408c2016-08-08 15:37:46 -07001474 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair4ec821f2012-08-23 15:28:28 -07001475
1476 self.waitUntilSettled()
James E. Blair4ec821f2012-08-23 15:28:28 -07001477
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001478 self.assertEqual(A.data['status'], 'MERGED')
1479 self.assertEqual(A.reported, 2)
1480 self.assertEqual(
1481 self.getJobFromHistory('nonvoting-project-merge').result,
1482 'SUCCESS')
1483 self.assertEqual(
1484 self.getJobFromHistory('nonvoting-project-test1').result,
1485 'SUCCESS')
1486 self.assertEqual(
1487 self.getJobFromHistory('nonvoting-project-test2').result,
1488 'FAILURE')
James E. Blaire0487072012-08-29 17:38:31 -07001489
James E. Blair5821bd92015-09-16 08:48:15 -07001490 for build in self.builds:
1491 self.assertEqual(build.parameters['ZUUL_VOTING'], '0')
1492
James E. Blairec056492016-07-22 09:45:56 -07001493 @skip("Disabled for early v3 development")
James E. Blaire0487072012-08-29 17:38:31 -07001494 def test_check_queue_success(self):
1495 "Test successful check queue jobs."
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001496
James E. Blaire0487072012-08-29 17:38:31 -07001497 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
1498 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
1499
1500 self.waitUntilSettled()
James E. Blaire0487072012-08-29 17:38:31 -07001501
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001502 self.assertEqual(A.data['status'], 'NEW')
1503 self.assertEqual(A.reported, 1)
1504 self.assertEqual(self.getJobFromHistory('project-merge').result,
1505 'SUCCESS')
1506 self.assertEqual(self.getJobFromHistory('project-test1').result,
1507 'SUCCESS')
1508 self.assertEqual(self.getJobFromHistory('project-test2').result,
1509 'SUCCESS')
James E. Blaire0487072012-08-29 17:38:31 -07001510
James E. Blairec056492016-07-22 09:45:56 -07001511 @skip("Disabled for early v3 development")
James E. Blaire0487072012-08-29 17:38:31 -07001512 def test_check_queue_failure(self):
1513 "Test failed check queue jobs."
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001514
James E. Blaire0487072012-08-29 17:38:31 -07001515 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blair08d19992016-08-10 15:25:31 -07001516 self.launch_server.failJob('project-test2', A)
James E. Blaire0487072012-08-29 17:38:31 -07001517 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
1518
1519 self.waitUntilSettled()
James E. Blaire0487072012-08-29 17:38:31 -07001520
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001521 self.assertEqual(A.data['status'], 'NEW')
1522 self.assertEqual(A.reported, 1)
1523 self.assertEqual(self.getJobFromHistory('project-merge').result,
James E. Blair78e31b32013-07-09 09:11:34 -07001524 'SUCCESS')
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001525 self.assertEqual(self.getJobFromHistory('project-test1').result,
1526 'SUCCESS')
1527 self.assertEqual(self.getJobFromHistory('project-test2').result,
1528 'FAILURE')
James E. Blair127bc182012-08-28 15:55:15 -07001529
James E. Blairec056492016-07-22 09:45:56 -07001530 @skip("Disabled for early v3 development")
James E. Blair127bc182012-08-28 15:55:15 -07001531 def test_dependent_behind_dequeue(self):
1532 "test that dependent changes behind dequeued changes work"
1533 # This complicated test is a reproduction of a real life bug
1534 self.sched.reconfigure(self.config)
James E. Blair127bc182012-08-28 15:55:15 -07001535
James E. Blair08d19992016-08-10 15:25:31 -07001536 self.launch_server.hold_jobs_in_build = True
James E. Blair127bc182012-08-28 15:55:15 -07001537 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
1538 B = self.fake_gerrit.addFakeChange('org/project1', 'master', 'B')
1539 C = self.fake_gerrit.addFakeChange('org/project2', 'master', 'C')
1540 D = self.fake_gerrit.addFakeChange('org/project2', 'master', 'D')
1541 E = self.fake_gerrit.addFakeChange('org/project2', 'master', 'E')
1542 F = self.fake_gerrit.addFakeChange('org/project3', 'master', 'F')
1543 D.setDependsOn(C, 1)
1544 E.setDependsOn(D, 1)
James E. Blair8b5408c2016-08-08 15:37:46 -07001545 A.addApproval('code-review', 2)
1546 B.addApproval('code-review', 2)
1547 C.addApproval('code-review', 2)
1548 D.addApproval('code-review', 2)
1549 E.addApproval('code-review', 2)
1550 F.addApproval('code-review', 2)
James E. Blair127bc182012-08-28 15:55:15 -07001551
1552 A.fail_merge = True
James E. Blair127bc182012-08-28 15:55:15 -07001553
1554 # Change object re-use in the gerrit trigger is hidden if
1555 # changes are added in quick succession; waiting makes it more
1556 # like real life.
James E. Blair8b5408c2016-08-08 15:37:46 -07001557 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair127bc182012-08-28 15:55:15 -07001558 self.waitUntilSettled()
James E. Blair8b5408c2016-08-08 15:37:46 -07001559 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
James E. Blair127bc182012-08-28 15:55:15 -07001560 self.waitUntilSettled()
1561
James E. Blair08d19992016-08-10 15:25:31 -07001562 self.launch_server.release('.*-merge')
James E. Blair127bc182012-08-28 15:55:15 -07001563 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07001564 self.launch_server.release('.*-merge')
James E. Blair127bc182012-08-28 15:55:15 -07001565 self.waitUntilSettled()
1566
James E. Blair8b5408c2016-08-08 15:37:46 -07001567 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
James E. Blair127bc182012-08-28 15:55:15 -07001568 self.waitUntilSettled()
James E. Blair8b5408c2016-08-08 15:37:46 -07001569 self.fake_gerrit.addEvent(D.addApproval('approved', 1))
James E. Blair127bc182012-08-28 15:55:15 -07001570 self.waitUntilSettled()
James E. Blair8b5408c2016-08-08 15:37:46 -07001571 self.fake_gerrit.addEvent(E.addApproval('approved', 1))
James E. Blair127bc182012-08-28 15:55:15 -07001572 self.waitUntilSettled()
James E. Blair8b5408c2016-08-08 15:37:46 -07001573 self.fake_gerrit.addEvent(F.addApproval('approved', 1))
James E. Blair127bc182012-08-28 15:55:15 -07001574 self.waitUntilSettled()
1575
James E. Blair08d19992016-08-10 15:25:31 -07001576 self.launch_server.release('.*-merge')
James E. Blair127bc182012-08-28 15:55:15 -07001577 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07001578 self.launch_server.release('.*-merge')
James E. Blair127bc182012-08-28 15:55:15 -07001579 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07001580 self.launch_server.release('.*-merge')
James E. Blair127bc182012-08-28 15:55:15 -07001581 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07001582 self.launch_server.release('.*-merge')
James E. Blair127bc182012-08-28 15:55:15 -07001583 self.waitUntilSettled()
1584
1585 # all jobs running
James E. Blaire955e062012-10-08 09:49:03 -07001586
1587 # Grab pointers to the jobs we want to release before
1588 # releasing any, because list indexes may change as
1589 # the jobs complete.
Monty Taylor6bef8ef2013-06-02 08:17:12 -04001590 a, b, c = self.builds[:3]
James E. Blaire955e062012-10-08 09:49:03 -07001591 a.release()
1592 b.release()
1593 c.release()
James E. Blair127bc182012-08-28 15:55:15 -07001594 self.waitUntilSettled()
1595
James E. Blair08d19992016-08-10 15:25:31 -07001596 self.launch_server.hold_jobs_in_build = False
1597 self.launch_server.release()
James E. Blair127bc182012-08-28 15:55:15 -07001598 self.waitUntilSettled()
1599
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001600 self.assertEqual(A.data['status'], 'NEW')
1601 self.assertEqual(B.data['status'], 'MERGED')
1602 self.assertEqual(C.data['status'], 'MERGED')
1603 self.assertEqual(D.data['status'], 'MERGED')
1604 self.assertEqual(E.data['status'], 'MERGED')
1605 self.assertEqual(F.data['status'], 'MERGED')
James E. Blair127bc182012-08-28 15:55:15 -07001606
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001607 self.assertEqual(A.reported, 2)
1608 self.assertEqual(B.reported, 2)
1609 self.assertEqual(C.reported, 2)
1610 self.assertEqual(D.reported, 2)
1611 self.assertEqual(E.reported, 2)
1612 self.assertEqual(F.reported, 2)
James E. Blair127bc182012-08-28 15:55:15 -07001613
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001614 self.assertEqual(self.countJobResults(self.history, 'ABORTED'), 15)
1615 self.assertEqual(len(self.history), 44)
James E. Blair05fed602012-09-07 12:45:24 -07001616
James E. Blairec056492016-07-22 09:45:56 -07001617 @skip("Disabled for early v3 development")
James E. Blair05fed602012-09-07 12:45:24 -07001618 def test_merger_repack(self):
1619 "Test that the merger works after a repack"
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001620
James E. Blair05fed602012-09-07 12:45:24 -07001621 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -07001622 A.addApproval('code-review', 2)
1623 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair05fed602012-09-07 12:45:24 -07001624 self.waitUntilSettled()
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001625 self.assertEqual(self.getJobFromHistory('project-merge').result,
1626 'SUCCESS')
1627 self.assertEqual(self.getJobFromHistory('project-test1').result,
1628 'SUCCESS')
1629 self.assertEqual(self.getJobFromHistory('project-test2').result,
1630 'SUCCESS')
1631 self.assertEqual(A.data['status'], 'MERGED')
1632 self.assertEqual(A.reported, 2)
James E. Blair05fed602012-09-07 12:45:24 -07001633 self.assertEmptyQueues()
James E. Blair4ca985f2013-05-30 12:27:43 -07001634 self.worker.build_history = []
James E. Blair05fed602012-09-07 12:45:24 -07001635
Monty Taylorbc758832013-06-17 17:22:42 -04001636 path = os.path.join(self.git_root, "org/project")
Morgan Fainberg4c6a7742016-05-27 08:42:17 -07001637 print(repack_repo(path))
James E. Blair05fed602012-09-07 12:45:24 -07001638
1639 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -07001640 A.addApproval('code-review', 2)
1641 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair05fed602012-09-07 12:45:24 -07001642 self.waitUntilSettled()
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001643 self.assertEqual(self.getJobFromHistory('project-merge').result,
1644 'SUCCESS')
1645 self.assertEqual(self.getJobFromHistory('project-test1').result,
1646 'SUCCESS')
1647 self.assertEqual(self.getJobFromHistory('project-test2').result,
1648 'SUCCESS')
1649 self.assertEqual(A.data['status'], 'MERGED')
1650 self.assertEqual(A.reported, 2)
James E. Blair7ee88a22012-09-12 18:59:31 +02001651
James E. Blairec056492016-07-22 09:45:56 -07001652 @skip("Disabled for early v3 development")
James E. Blair4886f282012-11-15 09:27:33 -08001653 def test_merger_repack_large_change(self):
1654 "Test that the merger works with large changes after a repack"
1655 # https://bugs.launchpad.net/zuul/+bug/1078946
James E. Blairac2c3242014-01-24 13:38:51 -08001656 # This test assumes the repo is already cloned; make sure it is
Joshua Hesketh352264b2015-08-11 23:42:08 +10001657 url = self.fake_gerrit.getGitUrl(
James E. Blairac2c3242014-01-24 13:38:51 -08001658 self.sched.layout.projects['org/project1'])
James E. Blair4076e2b2014-01-28 12:42:20 -08001659 self.merge_server.merger.addProject('org/project1', url)
James E. Blair4886f282012-11-15 09:27:33 -08001660 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
1661 A.addPatchset(large=True)
Monty Taylorbc758832013-06-17 17:22:42 -04001662 path = os.path.join(self.upstream_root, "org/project1")
Morgan Fainberg4c6a7742016-05-27 08:42:17 -07001663 print(repack_repo(path))
Monty Taylorbc758832013-06-17 17:22:42 -04001664 path = os.path.join(self.git_root, "org/project1")
Morgan Fainberg4c6a7742016-05-27 08:42:17 -07001665 print(repack_repo(path))
James E. Blair4886f282012-11-15 09:27:33 -08001666
James E. Blair8b5408c2016-08-08 15:37:46 -07001667 A.addApproval('code-review', 2)
1668 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair4886f282012-11-15 09:27:33 -08001669 self.waitUntilSettled()
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001670 self.assertEqual(self.getJobFromHistory('project1-merge').result,
1671 'SUCCESS')
1672 self.assertEqual(self.getJobFromHistory('project1-test1').result,
1673 'SUCCESS')
1674 self.assertEqual(self.getJobFromHistory('project1-test2').result,
1675 'SUCCESS')
1676 self.assertEqual(A.data['status'], 'MERGED')
1677 self.assertEqual(A.reported, 2)
James E. Blair4886f282012-11-15 09:27:33 -08001678
James E. Blairec056492016-07-22 09:45:56 -07001679 @skip("Disabled for early v3 development")
James E. Blair7ee88a22012-09-12 18:59:31 +02001680 def test_nonexistent_job(self):
1681 "Test launching a job that doesn't exist"
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001682 # Set to the state immediately after a restart
1683 self.resetGearmanServer()
1684 self.launcher.negative_function_cache_ttl = 0
James E. Blair7ee88a22012-09-12 18:59:31 +02001685
1686 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -07001687 A.addApproval('code-review', 2)
1688 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair7ee88a22012-09-12 18:59:31 +02001689 # There may be a thread about to report a lost change
1690 while A.reported < 2:
1691 self.waitUntilSettled()
Monty Taylor6bef8ef2013-06-02 08:17:12 -04001692 job_names = [x.name for x in self.history]
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001693 self.assertFalse(job_names)
1694 self.assertEqual(A.data['status'], 'NEW')
1695 self.assertEqual(A.reported, 2)
James E. Blair7ee88a22012-09-12 18:59:31 +02001696 self.assertEmptyQueues()
1697
1698 # Make sure things still work:
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001699 self.registerJobs()
James E. Blair7ee88a22012-09-12 18:59:31 +02001700 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -07001701 A.addApproval('code-review', 2)
1702 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair7ee88a22012-09-12 18:59:31 +02001703 self.waitUntilSettled()
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001704 self.assertEqual(self.getJobFromHistory('project-merge').result,
1705 'SUCCESS')
1706 self.assertEqual(self.getJobFromHistory('project-test1').result,
1707 'SUCCESS')
1708 self.assertEqual(self.getJobFromHistory('project-test2').result,
1709 'SUCCESS')
1710 self.assertEqual(A.data['status'], 'MERGED')
1711 self.assertEqual(A.reported, 2)
James E. Blairf62d4282012-12-31 17:01:50 -08001712
James E. Blairec056492016-07-22 09:45:56 -07001713 @skip("Disabled for early v3 development")
James E. Blairf62d4282012-12-31 17:01:50 -08001714 def test_single_nonexistent_post_job(self):
1715 "Test launching a single post job that doesn't exist"
James E. Blairf62d4282012-12-31 17:01:50 -08001716 e = {
1717 "type": "ref-updated",
1718 "submitter": {
1719 "name": "User Name",
1720 },
1721 "refUpdate": {
1722 "oldRev": "90f173846e3af9154517b88543ffbd1691f31366",
1723 "newRev": "d479a0bfcb34da57a31adb2a595c0cf687812543",
1724 "refName": "master",
1725 "project": "org/project",
1726 }
1727 }
James E. Blair1f4c2bb2013-04-26 08:40:46 -07001728 # Set to the state immediately after a restart
1729 self.resetGearmanServer()
1730 self.launcher.negative_function_cache_ttl = 0
1731
James E. Blairf62d4282012-12-31 17:01:50 -08001732 self.fake_gerrit.addEvent(e)
1733 self.waitUntilSettled()
1734
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001735 self.assertEqual(len(self.history), 0)
James E. Blair2fa50962013-01-30 21:50:41 -08001736
James E. Blairec056492016-07-22 09:45:56 -07001737 @skip("Disabled for early v3 development")
James E. Blair2fa50962013-01-30 21:50:41 -08001738 def test_new_patchset_dequeues_old(self):
1739 "Test that a new patchset causes the old to be dequeued"
1740 # D -> C (depends on B) -> B (depends on A) -> A -> M
James E. Blair08d19992016-08-10 15:25:31 -07001741 self.launch_server.hold_jobs_in_build = True
James E. Blair2fa50962013-01-30 21:50:41 -08001742 M = self.fake_gerrit.addFakeChange('org/project', 'master', 'M')
1743 M.setMerged()
1744
1745 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
1746 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
1747 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
1748 D = self.fake_gerrit.addFakeChange('org/project', 'master', 'D')
James E. Blair8b5408c2016-08-08 15:37:46 -07001749 A.addApproval('code-review', 2)
1750 B.addApproval('code-review', 2)
1751 C.addApproval('code-review', 2)
1752 D.addApproval('code-review', 2)
James E. Blair2fa50962013-01-30 21:50:41 -08001753
1754 C.setDependsOn(B, 1)
1755 B.setDependsOn(A, 1)
1756 A.setDependsOn(M, 1)
1757
James E. Blair8b5408c2016-08-08 15:37:46 -07001758 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
1759 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
1760 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
1761 self.fake_gerrit.addEvent(D.addApproval('approved', 1))
James E. Blair2fa50962013-01-30 21:50:41 -08001762 self.waitUntilSettled()
1763
1764 B.addPatchset()
1765 self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(2))
1766 self.waitUntilSettled()
1767
James E. Blair08d19992016-08-10 15:25:31 -07001768 self.launch_server.hold_jobs_in_build = False
1769 self.launch_server.release()
James E. Blair2fa50962013-01-30 21:50:41 -08001770 self.waitUntilSettled()
1771
Monty Taylor98f0f3e2013-07-06 16:02:31 -04001772 self.assertEqual(A.data['status'], 'MERGED')
1773 self.assertEqual(A.reported, 2)
1774 self.assertEqual(B.data['status'], 'NEW')
1775 self.assertEqual(B.reported, 2)
1776 self.assertEqual(C.data['status'], 'NEW')
1777 self.assertEqual(C.reported, 2)
1778 self.assertEqual(D.data['status'], 'MERGED')
1779 self.assertEqual(D.reported, 2)
1780 self.assertEqual(len(self.history), 9) # 3 each for A, B, D.
James E. Blair2fa50962013-01-30 21:50:41 -08001781
James E. Blairec056492016-07-22 09:45:56 -07001782 @skip("Disabled for early v3 development")
James E. Blairba437362015-02-07 11:41:52 -08001783 def test_new_patchset_check(self):
1784 "Test a new patchset in check"
Antoine Mussobd86a312014-01-08 14:51:33 +01001785
James E. Blair08d19992016-08-10 15:25:31 -07001786 self.launch_server.hold_jobs_in_build = True
Antoine Mussobd86a312014-01-08 14:51:33 +01001787
1788 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blairba437362015-02-07 11:41:52 -08001789 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
1790 check_pipeline = self.sched.layout.pipelines['check']
1791
1792 # Add two git-dependent changes
1793 B.setDependsOn(A, 1)
1794 self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
1795 self.waitUntilSettled()
Antoine Mussobd86a312014-01-08 14:51:33 +01001796 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
1797 self.waitUntilSettled()
James E. Blairba437362015-02-07 11:41:52 -08001798
1799 # A live item, and a non-live/live pair
1800 items = check_pipeline.getAllItems()
1801 self.assertEqual(len(items), 3)
1802
1803 self.assertEqual(items[0].change.number, '1')
1804 self.assertEqual(items[0].change.patchset, '1')
1805 self.assertFalse(items[0].live)
1806
1807 self.assertEqual(items[1].change.number, '2')
1808 self.assertEqual(items[1].change.patchset, '1')
1809 self.assertTrue(items[1].live)
1810
1811 self.assertEqual(items[2].change.number, '1')
1812 self.assertEqual(items[2].change.patchset, '1')
1813 self.assertTrue(items[2].live)
1814
1815 # Add a new patchset to A
1816 A.addPatchset()
1817 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(2))
1818 self.waitUntilSettled()
1819
1820 # The live copy of A,1 should be gone, but the non-live and B
1821 # should continue, and we should have a new A,2
1822 items = check_pipeline.getAllItems()
1823 self.assertEqual(len(items), 3)
1824
1825 self.assertEqual(items[0].change.number, '1')
1826 self.assertEqual(items[0].change.patchset, '1')
1827 self.assertFalse(items[0].live)
1828
1829 self.assertEqual(items[1].change.number, '2')
1830 self.assertEqual(items[1].change.patchset, '1')
1831 self.assertTrue(items[1].live)
1832
1833 self.assertEqual(items[2].change.number, '1')
1834 self.assertEqual(items[2].change.patchset, '2')
1835 self.assertTrue(items[2].live)
1836
1837 # Add a new patchset to B
1838 B.addPatchset()
1839 self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(2))
1840 self.waitUntilSettled()
1841
1842 # The live copy of B,1 should be gone, and it's non-live copy of A,1
1843 # but we should have a new B,2 (still based on A,1)
1844 items = check_pipeline.getAllItems()
1845 self.assertEqual(len(items), 3)
1846
1847 self.assertEqual(items[0].change.number, '1')
1848 self.assertEqual(items[0].change.patchset, '2')
1849 self.assertTrue(items[0].live)
1850
1851 self.assertEqual(items[1].change.number, '1')
1852 self.assertEqual(items[1].change.patchset, '1')
1853 self.assertFalse(items[1].live)
1854
1855 self.assertEqual(items[2].change.number, '2')
1856 self.assertEqual(items[2].change.patchset, '2')
1857 self.assertTrue(items[2].live)
1858
1859 self.builds[0].release()
1860 self.waitUntilSettled()
1861 self.builds[0].release()
1862 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07001863 self.launch_server.hold_jobs_in_build = False
1864 self.launch_server.release()
James E. Blairba437362015-02-07 11:41:52 -08001865 self.waitUntilSettled()
1866
1867 self.assertEqual(A.reported, 1)
1868 self.assertEqual(B.reported, 1)
1869 self.assertEqual(self.history[0].result, 'ABORTED')
1870 self.assertEqual(self.history[0].changes, '1,1')
1871 self.assertEqual(self.history[1].result, 'ABORTED')
1872 self.assertEqual(self.history[1].changes, '1,1 2,1')
1873 self.assertEqual(self.history[2].result, 'SUCCESS')
1874 self.assertEqual(self.history[2].changes, '1,2')
1875 self.assertEqual(self.history[3].result, 'SUCCESS')
1876 self.assertEqual(self.history[3].changes, '1,1 2,2')
1877
1878 def test_abandoned_gate(self):
1879 "Test that an abandoned change is dequeued from gate"
1880
James E. Blair08d19992016-08-10 15:25:31 -07001881 self.launch_server.hold_jobs_in_build = True
James E. Blairba437362015-02-07 11:41:52 -08001882
1883 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -07001884 A.addApproval('code-review', 2)
1885 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blairba437362015-02-07 11:41:52 -08001886 self.waitUntilSettled()
Antoine Mussobd86a312014-01-08 14:51:33 +01001887 self.assertEqual(len(self.builds), 1, "One job being built (on hold)")
1888 self.assertEqual(self.builds[0].name, 'project-merge')
1889
1890 self.fake_gerrit.addEvent(A.getChangeAbandonedEvent())
1891 self.waitUntilSettled()
1892
James E. Blair08d19992016-08-10 15:25:31 -07001893 self.launch_server.release('.*-merge')
Antoine Mussobd86a312014-01-08 14:51:33 +01001894 self.waitUntilSettled()
1895
Arie5b4048c2016-10-05 16:12:06 +03001896 self.assertBuilds([])
1897 self.assertHistory([
1898 dict(name='project-merge', result='ABORTED', changes='1,1')],
1899 ordered=False)
James E. Blairba437362015-02-07 11:41:52 -08001900 self.assertEqual(A.reported, 1,
1901 "Abandoned gate change should report only start")
1902
James E. Blairec056492016-07-22 09:45:56 -07001903 @skip("Disabled for early v3 development")
James E. Blairba437362015-02-07 11:41:52 -08001904 def test_abandoned_check(self):
1905 "Test that an abandoned change is dequeued from check"
1906
James E. Blair08d19992016-08-10 15:25:31 -07001907 self.launch_server.hold_jobs_in_build = True
James E. Blairba437362015-02-07 11:41:52 -08001908
1909 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
1910 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
1911 check_pipeline = self.sched.layout.pipelines['check']
1912
1913 # Add two git-dependent changes
1914 B.setDependsOn(A, 1)
1915 self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
1916 self.waitUntilSettled()
1917 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
1918 self.waitUntilSettled()
1919 # A live item, and a non-live/live pair
1920 items = check_pipeline.getAllItems()
1921 self.assertEqual(len(items), 3)
1922
1923 self.assertEqual(items[0].change.number, '1')
1924 self.assertFalse(items[0].live)
1925
1926 self.assertEqual(items[1].change.number, '2')
1927 self.assertTrue(items[1].live)
1928
1929 self.assertEqual(items[2].change.number, '1')
1930 self.assertTrue(items[2].live)
1931
1932 # Abandon A
1933 self.fake_gerrit.addEvent(A.getChangeAbandonedEvent())
1934 self.waitUntilSettled()
1935
1936 # The live copy of A should be gone, but the non-live and B
1937 # should continue
1938 items = check_pipeline.getAllItems()
1939 self.assertEqual(len(items), 2)
1940
1941 self.assertEqual(items[0].change.number, '1')
1942 self.assertFalse(items[0].live)
1943
1944 self.assertEqual(items[1].change.number, '2')
1945 self.assertTrue(items[1].live)
1946
James E. Blair08d19992016-08-10 15:25:31 -07001947 self.launch_server.hold_jobs_in_build = False
1948 self.launch_server.release()
James E. Blairba437362015-02-07 11:41:52 -08001949 self.waitUntilSettled()
1950
1951 self.assertEqual(len(self.history), 4)
1952 self.assertEqual(self.history[0].result, 'ABORTED',
Antoine Mussobd86a312014-01-08 14:51:33 +01001953 'Build should have been aborted')
1954 self.assertEqual(A.reported, 0, "Abandoned change should not report")
James E. Blairba437362015-02-07 11:41:52 -08001955 self.assertEqual(B.reported, 1, "Change should report")
Antoine Mussobd86a312014-01-08 14:51:33 +01001956
James E. Blairec056492016-07-22 09:45:56 -07001957 @skip("Disabled for early v3 development")
Steve Varnau7b78b312015-04-03 14:49:46 -07001958 def test_abandoned_not_timer(self):
1959 "Test that an abandoned change does not cancel timer jobs"
1960
James E. Blair08d19992016-08-10 15:25:31 -07001961 self.launch_server.hold_jobs_in_build = True
Steve Varnau7b78b312015-04-03 14:49:46 -07001962
1963 # Start timer trigger - also org/project
James E. Blairf84026c2015-12-08 16:11:46 -08001964 self.updateConfigLayout(
1965 'tests/fixtures/layout-idle.yaml')
Steve Varnau7b78b312015-04-03 14:49:46 -07001966 self.sched.reconfigure(self.config)
1967 self.registerJobs()
1968 # The pipeline triggers every second, so we should have seen
1969 # several by now.
1970 time.sleep(5)
1971 self.waitUntilSettled()
1972 # Stop queuing timer triggered jobs so that the assertions
1973 # below don't race against more jobs being queued.
James E. Blairf84026c2015-12-08 16:11:46 -08001974 self.updateConfigLayout(
1975 'tests/fixtures/layout-no-timer.yaml')
Steve Varnau7b78b312015-04-03 14:49:46 -07001976 self.sched.reconfigure(self.config)
1977 self.registerJobs()
1978 self.assertEqual(len(self.builds), 2, "Two timer jobs")
1979
1980 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
1981 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
1982 self.waitUntilSettled()
1983 self.assertEqual(len(self.builds), 3, "One change plus two timer jobs")
1984
1985 self.fake_gerrit.addEvent(A.getChangeAbandonedEvent())
1986 self.waitUntilSettled()
1987
1988 self.assertEqual(len(self.builds), 2, "Two timer jobs remain")
1989
James E. Blair08d19992016-08-10 15:25:31 -07001990 self.launch_server.release()
Steve Varnau7b78b312015-04-03 14:49:46 -07001991 self.waitUntilSettled()
1992
James E. Blairec056492016-07-22 09:45:56 -07001993 @skip("Disabled for early v3 development")
Arx Cruzb1b010d2013-10-28 19:49:59 -02001994 def test_zuul_url_return(self):
1995 "Test if ZUUL_URL is returning when zuul_url is set in zuul.conf"
James E. Blair4076e2b2014-01-28 12:42:20 -08001996 self.assertTrue(self.sched.config.has_option('merger', 'zuul_url'))
James E. Blair08d19992016-08-10 15:25:31 -07001997 self.launch_server.hold_jobs_in_build = True
Arx Cruzb1b010d2013-10-28 19:49:59 -02001998
1999 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -07002000 A.addApproval('code-review', 2)
2001 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
Arx Cruzb1b010d2013-10-28 19:49:59 -02002002 self.waitUntilSettled()
2003
2004 self.assertEqual(len(self.builds), 1)
2005 for build in self.builds:
2006 self.assertTrue('ZUUL_URL' in build.parameters)
2007
James E. Blair08d19992016-08-10 15:25:31 -07002008 self.launch_server.hold_jobs_in_build = False
2009 self.launch_server.release()
Arx Cruzb1b010d2013-10-28 19:49:59 -02002010 self.waitUntilSettled()
2011
James E. Blairec056492016-07-22 09:45:56 -07002012 @skip("Disabled for early v3 development")
James E. Blair2fa50962013-01-30 21:50:41 -08002013 def test_new_patchset_dequeues_old_on_head(self):
2014 "Test that a new patchset causes the old to be dequeued (at head)"
2015 # D -> C (depends on B) -> B (depends on A) -> A -> M
James E. Blair08d19992016-08-10 15:25:31 -07002016 self.launch_server.hold_jobs_in_build = True
James E. Blair2fa50962013-01-30 21:50:41 -08002017 M = self.fake_gerrit.addFakeChange('org/project', 'master', 'M')
2018 M.setMerged()
2019 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
2020 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
2021 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
2022 D = self.fake_gerrit.addFakeChange('org/project', 'master', 'D')
James E. Blair8b5408c2016-08-08 15:37:46 -07002023 A.addApproval('code-review', 2)
2024 B.addApproval('code-review', 2)
2025 C.addApproval('code-review', 2)
2026 D.addApproval('code-review', 2)
James E. Blair2fa50962013-01-30 21:50:41 -08002027
2028 C.setDependsOn(B, 1)
2029 B.setDependsOn(A, 1)
2030 A.setDependsOn(M, 1)
2031
James E. Blair8b5408c2016-08-08 15:37:46 -07002032 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
2033 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
2034 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
2035 self.fake_gerrit.addEvent(D.addApproval('approved', 1))
James E. Blair2fa50962013-01-30 21:50:41 -08002036 self.waitUntilSettled()
2037
2038 A.addPatchset()
2039 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(2))
2040 self.waitUntilSettled()
2041
James E. Blair08d19992016-08-10 15:25:31 -07002042 self.launch_server.hold_jobs_in_build = False
2043 self.launch_server.release()
James E. Blair2fa50962013-01-30 21:50:41 -08002044 self.waitUntilSettled()
2045
Monty Taylor98f0f3e2013-07-06 16:02:31 -04002046 self.assertEqual(A.data['status'], 'NEW')
2047 self.assertEqual(A.reported, 2)
2048 self.assertEqual(B.data['status'], 'NEW')
2049 self.assertEqual(B.reported, 2)
2050 self.assertEqual(C.data['status'], 'NEW')
2051 self.assertEqual(C.reported, 2)
2052 self.assertEqual(D.data['status'], 'MERGED')
2053 self.assertEqual(D.reported, 2)
2054 self.assertEqual(len(self.history), 7)
James E. Blair2fa50962013-01-30 21:50:41 -08002055
James E. Blairec056492016-07-22 09:45:56 -07002056 @skip("Disabled for early v3 development")
James E. Blair2fa50962013-01-30 21:50:41 -08002057 def test_new_patchset_dequeues_old_without_dependents(self):
2058 "Test that a new patchset causes only the old to be dequeued"
James E. Blair08d19992016-08-10 15:25:31 -07002059 self.launch_server.hold_jobs_in_build = True
James E. Blair2fa50962013-01-30 21:50:41 -08002060 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
2061 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
2062 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
James E. Blair8b5408c2016-08-08 15:37:46 -07002063 A.addApproval('code-review', 2)
2064 B.addApproval('code-review', 2)
2065 C.addApproval('code-review', 2)
James E. Blair2fa50962013-01-30 21:50:41 -08002066
James E. Blair8b5408c2016-08-08 15:37:46 -07002067 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
2068 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
2069 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair2fa50962013-01-30 21:50:41 -08002070 self.waitUntilSettled()
2071
2072 B.addPatchset()
2073 self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(2))
2074 self.waitUntilSettled()
2075
James E. Blair08d19992016-08-10 15:25:31 -07002076 self.launch_server.hold_jobs_in_build = False
2077 self.launch_server.release()
James E. Blair2fa50962013-01-30 21:50:41 -08002078 self.waitUntilSettled()
2079
Monty Taylor98f0f3e2013-07-06 16:02:31 -04002080 self.assertEqual(A.data['status'], 'MERGED')
2081 self.assertEqual(A.reported, 2)
2082 self.assertEqual(B.data['status'], 'NEW')
2083 self.assertEqual(B.reported, 2)
2084 self.assertEqual(C.data['status'], 'MERGED')
2085 self.assertEqual(C.reported, 2)
2086 self.assertEqual(len(self.history), 9)
James E. Blair2fa50962013-01-30 21:50:41 -08002087
James E. Blairec056492016-07-22 09:45:56 -07002088 @skip("Disabled for early v3 development")
James E. Blair2fa50962013-01-30 21:50:41 -08002089 def test_new_patchset_dequeues_old_independent_queue(self):
2090 "Test that a new patchset causes the old to be dequeued (independent)"
James E. Blair08d19992016-08-10 15:25:31 -07002091 self.launch_server.hold_jobs_in_build = True
James E. Blair2fa50962013-01-30 21:50:41 -08002092 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
2093 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
2094 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
2095 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
2096 self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
2097 self.fake_gerrit.addEvent(C.getPatchsetCreatedEvent(1))
2098 self.waitUntilSettled()
2099
2100 B.addPatchset()
2101 self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(2))
2102 self.waitUntilSettled()
2103
James E. Blair08d19992016-08-10 15:25:31 -07002104 self.launch_server.hold_jobs_in_build = False
2105 self.launch_server.release()
James E. Blair2fa50962013-01-30 21:50:41 -08002106 self.waitUntilSettled()
2107
Monty Taylor98f0f3e2013-07-06 16:02:31 -04002108 self.assertEqual(A.data['status'], 'NEW')
2109 self.assertEqual(A.reported, 1)
2110 self.assertEqual(B.data['status'], 'NEW')
2111 self.assertEqual(B.reported, 1)
2112 self.assertEqual(C.data['status'], 'NEW')
2113 self.assertEqual(C.reported, 1)
2114 self.assertEqual(len(self.history), 10)
2115 self.assertEqual(self.countJobResults(self.history, 'ABORTED'), 1)
James E. Blair7d0dedc2013-02-21 17:26:09 -08002116
James E. Blairec056492016-07-22 09:45:56 -07002117 @skip("Disabled for early v3 development")
James E. Blair18c64442014-03-18 10:14:45 -07002118 def test_noop_job(self):
2119 "Test that the internal noop job works"
2120 A = self.fake_gerrit.addFakeChange('org/noop-project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -07002121 A.addApproval('code-review', 2)
2122 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair18c64442014-03-18 10:14:45 -07002123 self.waitUntilSettled()
2124
2125 self.assertEqual(len(self.gearman_server.getQueue()), 0)
2126 self.assertTrue(self.sched._areAllBuildsComplete())
2127 self.assertEqual(len(self.history), 0)
2128 self.assertEqual(A.data['status'], 'MERGED')
2129 self.assertEqual(A.reported, 2)
2130
James E. Blairec056492016-07-22 09:45:56 -07002131 @skip("Disabled for early v3 development")
Evgeny Antyshevd6e546c2015-06-11 15:13:57 +00002132 def test_no_job_project(self):
2133 "Test that reports with no jobs don't get sent"
2134 A = self.fake_gerrit.addFakeChange('org/no-jobs-project',
2135 'master', 'A')
2136 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
2137 self.waitUntilSettled()
2138
2139 # Change wasn't reported to
2140 self.assertEqual(A.reported, False)
2141
2142 # Check queue is empty afterwards
2143 check_pipeline = self.sched.layout.pipelines['check']
2144 items = check_pipeline.getAllItems()
2145 self.assertEqual(len(items), 0)
2146
2147 self.assertEqual(len(self.history), 0)
2148
James E. Blairec056492016-07-22 09:45:56 -07002149 @skip("Disabled for early v3 development")
James E. Blair7d0dedc2013-02-21 17:26:09 -08002150 def test_zuul_refs(self):
2151 "Test that zuul refs exist and have the right changes"
James E. Blair08d19992016-08-10 15:25:31 -07002152 self.launch_server.hold_jobs_in_build = True
James E. Blair7d0dedc2013-02-21 17:26:09 -08002153 M1 = self.fake_gerrit.addFakeChange('org/project1', 'master', 'M1')
2154 M1.setMerged()
2155 M2 = self.fake_gerrit.addFakeChange('org/project2', 'master', 'M2')
2156 M2.setMerged()
2157
2158 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
2159 B = self.fake_gerrit.addFakeChange('org/project1', 'master', 'B')
2160 C = self.fake_gerrit.addFakeChange('org/project2', 'master', 'C')
2161 D = self.fake_gerrit.addFakeChange('org/project2', 'master', 'D')
James E. Blair8b5408c2016-08-08 15:37:46 -07002162 A.addApproval('code-review', 2)
2163 B.addApproval('code-review', 2)
2164 C.addApproval('code-review', 2)
2165 D.addApproval('code-review', 2)
2166 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
2167 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
2168 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
2169 self.fake_gerrit.addEvent(D.addApproval('approved', 1))
James E. Blair7d0dedc2013-02-21 17:26:09 -08002170
2171 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07002172 self.launch_server.release('.*-merge')
James E. Blair7d0dedc2013-02-21 17:26:09 -08002173 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07002174 self.launch_server.release('.*-merge')
James E. Blair7d0dedc2013-02-21 17:26:09 -08002175 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07002176 self.launch_server.release('.*-merge')
James E. Blair7d0dedc2013-02-21 17:26:09 -08002177 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07002178 self.launch_server.release('.*-merge')
James E. Blair7d0dedc2013-02-21 17:26:09 -08002179 self.waitUntilSettled()
2180
James E. Blair7d0dedc2013-02-21 17:26:09 -08002181 a_zref = b_zref = c_zref = d_zref = None
Monty Taylor6bef8ef2013-06-02 08:17:12 -04002182 for x in self.builds:
James E. Blair7d0dedc2013-02-21 17:26:09 -08002183 if x.parameters['ZUUL_CHANGE'] == '3':
2184 a_zref = x.parameters['ZUUL_REF']
2185 if x.parameters['ZUUL_CHANGE'] == '4':
2186 b_zref = x.parameters['ZUUL_REF']
2187 if x.parameters['ZUUL_CHANGE'] == '5':
2188 c_zref = x.parameters['ZUUL_REF']
2189 if x.parameters['ZUUL_CHANGE'] == '6':
2190 d_zref = x.parameters['ZUUL_REF']
2191
2192 # There are... four... refs.
Monty Taylor98f0f3e2013-07-06 16:02:31 -04002193 self.assertIsNotNone(a_zref)
2194 self.assertIsNotNone(b_zref)
2195 self.assertIsNotNone(c_zref)
2196 self.assertIsNotNone(d_zref)
James E. Blair7d0dedc2013-02-21 17:26:09 -08002197
2198 # And they should all be different
2199 refs = set([a_zref, b_zref, c_zref, d_zref])
Monty Taylor98f0f3e2013-07-06 16:02:31 -04002200 self.assertEqual(len(refs), 4)
James E. Blair7d0dedc2013-02-21 17:26:09 -08002201
2202 # a ref should have a, not b, and should not be in project2
Monty Taylor98f0f3e2013-07-06 16:02:31 -04002203 self.assertTrue(self.ref_has_change(a_zref, A))
2204 self.assertFalse(self.ref_has_change(a_zref, B))
2205 self.assertFalse(self.ref_has_change(a_zref, M2))
James E. Blair7d0dedc2013-02-21 17:26:09 -08002206
2207 # b ref should have a and b, and should not be in project2
Monty Taylor98f0f3e2013-07-06 16:02:31 -04002208 self.assertTrue(self.ref_has_change(b_zref, A))
2209 self.assertTrue(self.ref_has_change(b_zref, B))
2210 self.assertFalse(self.ref_has_change(b_zref, M2))
James E. Blair7d0dedc2013-02-21 17:26:09 -08002211
2212 # c ref should have a and b in 1, c in 2
Monty Taylor98f0f3e2013-07-06 16:02:31 -04002213 self.assertTrue(self.ref_has_change(c_zref, A))
2214 self.assertTrue(self.ref_has_change(c_zref, B))
2215 self.assertTrue(self.ref_has_change(c_zref, C))
2216 self.assertFalse(self.ref_has_change(c_zref, D))
James E. Blair7d0dedc2013-02-21 17:26:09 -08002217
2218 # d ref should have a and b in 1, c and d in 2
Monty Taylor98f0f3e2013-07-06 16:02:31 -04002219 self.assertTrue(self.ref_has_change(d_zref, A))
2220 self.assertTrue(self.ref_has_change(d_zref, B))
2221 self.assertTrue(self.ref_has_change(d_zref, C))
2222 self.assertTrue(self.ref_has_change(d_zref, D))
James E. Blair7d0dedc2013-02-21 17:26:09 -08002223
James E. Blair08d19992016-08-10 15:25:31 -07002224 self.launch_server.hold_jobs_in_build = False
2225 self.launch_server.release()
James E. Blair7d0dedc2013-02-21 17:26:09 -08002226 self.waitUntilSettled()
2227
Monty Taylor98f0f3e2013-07-06 16:02:31 -04002228 self.assertEqual(A.data['status'], 'MERGED')
2229 self.assertEqual(A.reported, 2)
2230 self.assertEqual(B.data['status'], 'MERGED')
2231 self.assertEqual(B.reported, 2)
2232 self.assertEqual(C.data['status'], 'MERGED')
2233 self.assertEqual(C.reported, 2)
2234 self.assertEqual(D.data['status'], 'MERGED')
2235 self.assertEqual(D.reported, 2)
James E. Blair70c71582013-03-06 08:50:50 -08002236
James E. Blairec056492016-07-22 09:45:56 -07002237 @skip("Disabled for early v3 development")
James E. Blair4a28a882013-08-23 15:17:33 -07002238 def test_rerun_on_error(self):
2239 "Test that if a worker fails to run a job, it is run again"
James E. Blair08d19992016-08-10 15:25:31 -07002240 self.launch_server.hold_jobs_in_build = True
James E. Blair4a28a882013-08-23 15:17:33 -07002241 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -07002242 A.addApproval('code-review', 2)
2243 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair4a28a882013-08-23 15:17:33 -07002244 self.waitUntilSettled()
2245
2246 self.builds[0].run_error = True
James E. Blair08d19992016-08-10 15:25:31 -07002247 self.launch_server.hold_jobs_in_build = False
2248 self.launch_server.release()
James E. Blair4a28a882013-08-23 15:17:33 -07002249 self.waitUntilSettled()
2250 self.assertEqual(self.countJobResults(self.history, 'RUN_ERROR'), 1)
2251 self.assertEqual(self.countJobResults(self.history, 'SUCCESS'), 3)
2252
James E. Blairec056492016-07-22 09:45:56 -07002253 @skip("Disabled for early v3 development")
James E. Blair412e5582013-04-22 15:50:12 -07002254 def test_statsd(self):
2255 "Test each of the statsd methods used in the scheduler"
2256 import extras
2257 statsd = extras.try_import('statsd.statsd')
2258 statsd.incr('test-incr')
2259 statsd.timing('test-timing', 3)
Alex Gaynor813d39b2014-05-17 16:17:16 -07002260 statsd.gauge('test-gauge', 12)
James E. Blair412e5582013-04-22 15:50:12 -07002261 self.assertReportedStat('test-incr', '1|c')
2262 self.assertReportedStat('test-timing', '3|ms')
Alex Gaynor813d39b2014-05-17 16:17:16 -07002263 self.assertReportedStat('test-gauge', '12|g')
James E. Blair412e5582013-04-22 15:50:12 -07002264
James E. Blairec056492016-07-22 09:45:56 -07002265 @skip("Disabled for early v3 development")
James E. Blairdad52252014-02-07 16:59:17 -08002266 def test_stuck_job_cleanup(self):
2267 "Test that pending jobs are cleaned up if removed from layout"
James E. Blair18c64442014-03-18 10:14:45 -07002268 # This job won't be registered at startup because it is not in
2269 # the standard layout, but we need it to already be registerd
2270 # for when we reconfigure, as that is when Zuul will attempt
2271 # to run the new job.
2272 self.worker.registerFunction('build:gate-noop')
James E. Blairdad52252014-02-07 16:59:17 -08002273 self.gearman_server.hold_jobs_in_queue = True
2274 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -07002275 A.addApproval('code-review', 2)
2276 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blairdad52252014-02-07 16:59:17 -08002277 self.waitUntilSettled()
2278 self.assertEqual(len(self.gearman_server.getQueue()), 1)
2279
James E. Blairf84026c2015-12-08 16:11:46 -08002280 self.updateConfigLayout(
2281 'tests/fixtures/layout-no-jobs.yaml')
James E. Blairdad52252014-02-07 16:59:17 -08002282 self.sched.reconfigure(self.config)
2283 self.waitUntilSettled()
2284
James E. Blair18c64442014-03-18 10:14:45 -07002285 self.gearman_server.release('gate-noop')
James E. Blairdad52252014-02-07 16:59:17 -08002286 self.waitUntilSettled()
2287 self.assertEqual(len(self.gearman_server.getQueue()), 0)
2288 self.assertTrue(self.sched._areAllBuildsComplete())
2289
2290 self.assertEqual(len(self.history), 1)
James E. Blair18c64442014-03-18 10:14:45 -07002291 self.assertEqual(self.history[0].name, 'gate-noop')
James E. Blairdad52252014-02-07 16:59:17 -08002292 self.assertEqual(self.history[0].result, 'SUCCESS')
2293
James E. Blairec056492016-07-22 09:45:56 -07002294 @skip("Disabled for early v3 development")
James E. Blair879dafb2015-07-17 14:04:49 -07002295 def test_file_head(self):
2296 # This is a regression test for an observed bug. A change
2297 # with a file named "HEAD" in the root directory of the repo
2298 # was processed by a merger. It then was unable to reset the
2299 # repo because of:
2300 # GitCommandError: 'git reset --hard HEAD' returned
2301 # with exit code 128
2302 # stderr: 'fatal: ambiguous argument 'HEAD': both revision
2303 # and filename
2304 # Use '--' to separate filenames from revisions'
2305
2306 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
2307 A.addPatchset(['HEAD'])
2308 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
2309
2310 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(2))
2311 self.waitUntilSettled()
2312
2313 self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
2314 self.waitUntilSettled()
2315
2316 self.assertIn('Build succeeded', A.messages[0])
2317 self.assertIn('Build succeeded', B.messages[0])
2318
James E. Blairec056492016-07-22 09:45:56 -07002319 @skip("Disabled for early v3 development")
James E. Blair70c71582013-03-06 08:50:50 -08002320 def test_file_jobs(self):
2321 "Test that file jobs run only when appropriate"
2322 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
2323 A.addPatchset(['pip-requires'])
2324 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
James E. Blair8b5408c2016-08-08 15:37:46 -07002325 A.addApproval('code-review', 2)
2326 B.addApproval('code-review', 2)
2327 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
2328 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
James E. Blair70c71582013-03-06 08:50:50 -08002329 self.waitUntilSettled()
2330
Monty Taylor6bef8ef2013-06-02 08:17:12 -04002331 testfile_jobs = [x for x in self.history
James E. Blair70c71582013-03-06 08:50:50 -08002332 if x.name == 'project-testfile']
2333
Monty Taylor98f0f3e2013-07-06 16:02:31 -04002334 self.assertEqual(len(testfile_jobs), 1)
2335 self.assertEqual(testfile_jobs[0].changes, '1,2')
2336 self.assertEqual(A.data['status'], 'MERGED')
2337 self.assertEqual(A.reported, 2)
2338 self.assertEqual(B.data['status'], 'MERGED')
2339 self.assertEqual(B.reported, 2)
James E. Blair3c5e5b52013-04-26 11:17:03 -07002340
James E. Blairec056492016-07-22 09:45:56 -07002341 @skip("Disabled for early v3 development")
Maru Newby3fe5f852015-01-13 04:22:14 +00002342 def _test_skip_if_jobs(self, branch, should_skip):
2343 "Test that jobs with a skip-if filter run only when appropriate"
James E. Blairf84026c2015-12-08 16:11:46 -08002344 self.updateConfigLayout(
2345 'tests/fixtures/layout-skip-if.yaml')
Maru Newby3fe5f852015-01-13 04:22:14 +00002346 self.sched.reconfigure(self.config)
2347 self.registerJobs()
2348
2349 change = self.fake_gerrit.addFakeChange('org/project',
2350 branch,
2351 'test skip-if')
2352 self.fake_gerrit.addEvent(change.getPatchsetCreatedEvent(1))
2353 self.waitUntilSettled()
2354
2355 tested_change_ids = [x.changes[0] for x in self.history
2356 if x.name == 'project-test-skip-if']
2357
2358 if should_skip:
2359 self.assertEqual([], tested_change_ids)
2360 else:
2361 self.assertIn(change.data['number'], tested_change_ids)
2362
James E. Blairec056492016-07-22 09:45:56 -07002363 @skip("Disabled for early v3 development")
Maru Newby3fe5f852015-01-13 04:22:14 +00002364 def test_skip_if_match_skips_job(self):
2365 self._test_skip_if_jobs(branch='master', should_skip=True)
2366
James E. Blairec056492016-07-22 09:45:56 -07002367 @skip("Disabled for early v3 development")
Maru Newby3fe5f852015-01-13 04:22:14 +00002368 def test_skip_if_no_match_runs_job(self):
2369 self._test_skip_if_jobs(branch='mp', should_skip=False)
2370
James E. Blairec056492016-07-22 09:45:56 -07002371 @skip("Disabled for early v3 development")
James E. Blair3c5e5b52013-04-26 11:17:03 -07002372 def test_test_config(self):
2373 "Test that we can test the config"
James E. Blairf84026c2015-12-08 16:11:46 -08002374 self.sched.testConfig(self.config.get('zuul', 'tenant_config'),
Joshua Hesketh352264b2015-08-11 23:42:08 +10002375 self.connections)
James E. Blair1f4c2bb2013-04-26 08:40:46 -07002376
James E. Blairec056492016-07-22 09:45:56 -07002377 @skip("Disabled for early v3 development")
James E. Blairc8a1e052014-02-25 09:29:26 -08002378 def test_queue_names(self):
2379 "Test shared change queue names"
2380 project1 = self.sched.layout.projects['org/project1']
2381 project2 = self.sched.layout.projects['org/project2']
2382 q1 = self.sched.layout.pipelines['gate'].getQueue(project1)
2383 q2 = self.sched.layout.pipelines['gate'].getQueue(project2)
2384 self.assertEqual(q1.name, 'integration')
2385 self.assertEqual(q2.name, 'integration')
2386
James E. Blairf84026c2015-12-08 16:11:46 -08002387 self.updateConfigLayout(
2388 'tests/fixtures/layout-bad-queue.yaml')
James E. Blairc8a1e052014-02-25 09:29:26 -08002389 with testtools.ExpectedException(
2390 Exception, "More than one name assigned to change queue"):
2391 self.sched.reconfigure(self.config)
2392
James E. Blairec056492016-07-22 09:45:56 -07002393 @skip("Disabled for early v3 development")
James E. Blair64ed6f22013-07-10 14:07:23 -07002394 def test_queue_precedence(self):
2395 "Test that queue precedence works"
2396
2397 self.gearman_server.hold_jobs_in_queue = True
James E. Blair08d19992016-08-10 15:25:31 -07002398 self.launch_server.hold_jobs_in_build = True
James E. Blair64ed6f22013-07-10 14:07:23 -07002399 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
2400 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
James E. Blair8b5408c2016-08-08 15:37:46 -07002401 A.addApproval('code-review', 2)
2402 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair64ed6f22013-07-10 14:07:23 -07002403
2404 self.waitUntilSettled()
2405 self.gearman_server.hold_jobs_in_queue = False
2406 self.gearman_server.release()
2407 self.waitUntilSettled()
2408
James E. Blair8de58bd2013-07-18 16:23:33 -07002409 # Run one build at a time to ensure non-race order:
James E. Blairb8c16472015-05-05 14:55:26 -07002410 self.orderedRelease()
James E. Blair08d19992016-08-10 15:25:31 -07002411 self.launch_server.hold_jobs_in_build = False
James E. Blair8de58bd2013-07-18 16:23:33 -07002412 self.waitUntilSettled()
2413
James E. Blair64ed6f22013-07-10 14:07:23 -07002414 self.log.debug(self.history)
2415 self.assertEqual(self.history[0].pipeline, 'gate')
2416 self.assertEqual(self.history[1].pipeline, 'check')
2417 self.assertEqual(self.history[2].pipeline, 'gate')
2418 self.assertEqual(self.history[3].pipeline, 'gate')
2419 self.assertEqual(self.history[4].pipeline, 'check')
2420 self.assertEqual(self.history[5].pipeline, 'check')
2421
James E. Blairec056492016-07-22 09:45:56 -07002422 @skip("Disabled for early v3 development")
Clark Boylana5edbe42014-06-03 16:39:10 -07002423 def test_json_status(self):
James E. Blair1843a552013-07-03 14:19:52 -07002424 "Test that we can retrieve JSON status info"
James E. Blair08d19992016-08-10 15:25:31 -07002425 self.launch_server.hold_jobs_in_build = True
James E. Blair1843a552013-07-03 14:19:52 -07002426 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -07002427 A.addApproval('code-review', 2)
2428 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair1843a552013-07-03 14:19:52 -07002429 self.waitUntilSettled()
2430
James E. Blair08d19992016-08-10 15:25:31 -07002431 self.launch_server.release('project-merge')
James E. Blairb7273ef2016-04-19 08:58:51 -07002432 self.waitUntilSettled()
2433
James E. Blair1843a552013-07-03 14:19:52 -07002434 port = self.webapp.server.socket.getsockname()[1]
2435
Morgan Fainberg293f7f82016-05-30 14:01:22 -07002436 req = urllib.request.Request("http://localhost:%s/status.json" % port)
2437 f = urllib.request.urlopen(req)
Clark Boylanaa4f2e72014-06-03 21:22:40 -07002438 headers = f.info()
2439 self.assertIn('Content-Length', headers)
2440 self.assertIn('Content-Type', headers)
Sachi Kingdc963fc2016-03-23 16:00:33 +11002441 self.assertIsNotNone(re.match('^application/json(; charset=UTF-8)?$',
2442 headers['Content-Type']))
Timo Tijhof0ebd2932015-04-02 12:11:21 +01002443 self.assertIn('Access-Control-Allow-Origin', headers)
2444 self.assertIn('Cache-Control', headers)
Clark Boylanaa4f2e72014-06-03 21:22:40 -07002445 self.assertIn('Last-Modified', headers)
Timo Tijhof0ebd2932015-04-02 12:11:21 +01002446 self.assertIn('Expires', headers)
James E. Blair1843a552013-07-03 14:19:52 -07002447 data = f.read()
2448
James E. Blair08d19992016-08-10 15:25:31 -07002449 self.launch_server.hold_jobs_in_build = False
2450 self.launch_server.release()
James E. Blair1843a552013-07-03 14:19:52 -07002451 self.waitUntilSettled()
2452
2453 data = json.loads(data)
James E. Blairb7273ef2016-04-19 08:58:51 -07002454 status_jobs = []
James E. Blair1843a552013-07-03 14:19:52 -07002455 for p in data['pipelines']:
2456 for q in p['change_queues']:
James E. Blairbfb8e042014-12-30 17:01:44 -08002457 if p['name'] in ['gate', 'conflict']:
Clark Boylanaf2476f2014-01-23 14:47:36 -08002458 self.assertEqual(q['window'], 20)
2459 else:
2460 self.assertEqual(q['window'], 0)
James E. Blair1843a552013-07-03 14:19:52 -07002461 for head in q['heads']:
2462 for change in head:
Clark Boylanaf2476f2014-01-23 14:47:36 -08002463 self.assertTrue(change['active'])
Monty Taylor98f0f3e2013-07-06 16:02:31 -04002464 self.assertEqual(change['id'], '1,1')
James E. Blair1843a552013-07-03 14:19:52 -07002465 for job in change['jobs']:
James E. Blairb7273ef2016-04-19 08:58:51 -07002466 status_jobs.append(job)
2467 self.assertEqual('project-merge', status_jobs[0]['name'])
2468 self.assertEqual('https://server/job/project-merge/0/',
2469 status_jobs[0]['url'])
2470 self.assertEqual('http://logs.example.com/1/1/gate/project-merge/0',
2471 status_jobs[0]['report_url'])
2472
2473 self.assertEqual('project-test1', status_jobs[1]['name'])
2474 self.assertEqual('https://server/job/project-test1/1/',
2475 status_jobs[1]['url'])
2476 self.assertEqual('http://logs.example.com/1/1/gate/project-test1/1',
2477 status_jobs[1]['report_url'])
2478
2479 self.assertEqual('project-test2', status_jobs[2]['name'])
2480 self.assertEqual('https://server/job/project-test2/2/',
2481 status_jobs[2]['url'])
2482 self.assertEqual('http://logs.example.com/1/1/gate/project-test2/2',
2483 status_jobs[2]['report_url'])
James E. Blair1843a552013-07-03 14:19:52 -07002484
James E. Blairec056492016-07-22 09:45:56 -07002485 @skip("Disabled for early v3 development")
James E. Blairc3d428e2013-12-03 15:06:48 -08002486 def test_merging_queues(self):
2487 "Test that transitively-connected change queues are merged"
James E. Blairf84026c2015-12-08 16:11:46 -08002488 self.updateConfigLayout(
2489 'tests/fixtures/layout-merge-queues.yaml')
James E. Blairc3d428e2013-12-03 15:06:48 -08002490 self.sched.reconfigure(self.config)
2491 self.assertEqual(len(self.sched.layout.pipelines['gate'].queues), 1)
2492
James E. Blairec056492016-07-22 09:45:56 -07002493 @skip("Disabled for early v3 development")
James E. Blairaf17a972016-02-03 15:07:18 -08002494 def test_mutex(self):
2495 "Test job mutexes"
2496 self.config.set('zuul', 'layout_config',
2497 'tests/fixtures/layout-mutex.yaml')
2498 self.sched.reconfigure(self.config)
2499
James E. Blair08d19992016-08-10 15:25:31 -07002500 self.launch_server.hold_jobs_in_build = True
James E. Blairaf17a972016-02-03 15:07:18 -08002501 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
2502 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
2503 self.assertFalse('test-mutex' in self.sched.mutex.mutexes)
2504
2505 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
2506 self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
2507 self.waitUntilSettled()
2508 self.assertEqual(len(self.builds), 3)
2509 self.assertEqual(self.builds[0].name, 'project-test1')
2510 self.assertEqual(self.builds[1].name, 'mutex-one')
2511 self.assertEqual(self.builds[2].name, 'project-test1')
2512
James E. Blair08d19992016-08-10 15:25:31 -07002513 self.launch_server.release('mutex-one')
James E. Blairaf17a972016-02-03 15:07:18 -08002514 self.waitUntilSettled()
2515
2516 self.assertEqual(len(self.builds), 3)
2517 self.assertEqual(self.builds[0].name, 'project-test1')
2518 self.assertEqual(self.builds[1].name, 'project-test1')
2519 self.assertEqual(self.builds[2].name, 'mutex-two')
2520 self.assertTrue('test-mutex' in self.sched.mutex.mutexes)
2521
James E. Blair08d19992016-08-10 15:25:31 -07002522 self.launch_server.release('mutex-two')
James E. Blairaf17a972016-02-03 15:07:18 -08002523 self.waitUntilSettled()
2524
2525 self.assertEqual(len(self.builds), 3)
2526 self.assertEqual(self.builds[0].name, 'project-test1')
2527 self.assertEqual(self.builds[1].name, 'project-test1')
2528 self.assertEqual(self.builds[2].name, 'mutex-one')
2529 self.assertTrue('test-mutex' in self.sched.mutex.mutexes)
2530
James E. Blair08d19992016-08-10 15:25:31 -07002531 self.launch_server.release('mutex-one')
James E. Blairaf17a972016-02-03 15:07:18 -08002532 self.waitUntilSettled()
2533
2534 self.assertEqual(len(self.builds), 3)
2535 self.assertEqual(self.builds[0].name, 'project-test1')
2536 self.assertEqual(self.builds[1].name, 'project-test1')
2537 self.assertEqual(self.builds[2].name, 'mutex-two')
2538 self.assertTrue('test-mutex' in self.sched.mutex.mutexes)
2539
James E. Blair08d19992016-08-10 15:25:31 -07002540 self.launch_server.release('mutex-two')
James E. Blairaf17a972016-02-03 15:07:18 -08002541 self.waitUntilSettled()
2542
2543 self.assertEqual(len(self.builds), 2)
2544 self.assertEqual(self.builds[0].name, 'project-test1')
2545 self.assertEqual(self.builds[1].name, 'project-test1')
2546 self.assertFalse('test-mutex' in self.sched.mutex.mutexes)
2547
James E. Blair08d19992016-08-10 15:25:31 -07002548 self.launch_server.hold_jobs_in_build = False
2549 self.launch_server.release()
James E. Blairaf17a972016-02-03 15:07:18 -08002550
2551 self.waitUntilSettled()
2552 self.assertEqual(len(self.builds), 0)
2553
2554 self.assertEqual(A.reported, 1)
2555 self.assertEqual(B.reported, 1)
2556 self.assertFalse('test-mutex' in self.sched.mutex.mutexes)
2557
James E. Blairec056492016-07-22 09:45:56 -07002558 @skip("Disabled for early v3 development")
James E. Blair1f4c2bb2013-04-26 08:40:46 -07002559 def test_node_label(self):
2560 "Test that a job runs on a specific node label"
James E. Blair1f4c2bb2013-04-26 08:40:46 -07002561 self.worker.registerFunction('build:node-project-test1:debian')
2562
2563 A = self.fake_gerrit.addFakeChange('org/node-project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -07002564 A.addApproval('code-review', 2)
2565 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair1f4c2bb2013-04-26 08:40:46 -07002566 self.waitUntilSettled()
James E. Blair4ca985f2013-05-30 12:27:43 -07002567
Monty Taylor98f0f3e2013-07-06 16:02:31 -04002568 self.assertIsNone(self.getJobFromHistory('node-project-merge').node)
2569 self.assertEqual(self.getJobFromHistory('node-project-test1').node,
2570 'debian')
2571 self.assertIsNone(self.getJobFromHistory('node-project-test2').node)
James E. Blaircdccd972013-07-01 12:10:22 -07002572
James E. Blairec056492016-07-22 09:45:56 -07002573 @skip("Disabled for early v3 development")
James E. Blaircdccd972013-07-01 12:10:22 -07002574 def test_live_reconfiguration(self):
2575 "Test that live reconfiguration works"
James E. Blair08d19992016-08-10 15:25:31 -07002576 self.launch_server.hold_jobs_in_build = True
James E. Blaircdccd972013-07-01 12:10:22 -07002577 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -07002578 A.addApproval('code-review', 2)
2579 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blaircdccd972013-07-01 12:10:22 -07002580 self.waitUntilSettled()
2581
2582 self.sched.reconfigure(self.config)
2583
James E. Blair08d19992016-08-10 15:25:31 -07002584 self.launch_server.hold_jobs_in_build = False
2585 self.launch_server.release()
James E. Blaircdccd972013-07-01 12:10:22 -07002586 self.waitUntilSettled()
Monty Taylor98f0f3e2013-07-06 16:02:31 -04002587 self.assertEqual(self.getJobFromHistory('project-merge').result,
2588 'SUCCESS')
2589 self.assertEqual(self.getJobFromHistory('project-test1').result,
2590 'SUCCESS')
2591 self.assertEqual(self.getJobFromHistory('project-test2').result,
2592 'SUCCESS')
2593 self.assertEqual(A.data['status'], 'MERGED')
2594 self.assertEqual(A.reported, 2)
James E. Blair287c06d2013-07-24 10:39:30 -07002595
James E. Blairec056492016-07-22 09:45:56 -07002596 @skip("Disabled for early v3 development")
James E. Blair6bc782d2015-07-17 16:20:21 -07002597 def test_live_reconfiguration_merge_conflict(self):
2598 # A real-world bug: a change in a gate queue has a merge
2599 # conflict and a job is added to its project while it's
2600 # sitting in the queue. The job gets added to the change and
2601 # enqueued and the change gets stuck.
2602 self.worker.registerFunction('build:project-test3')
James E. Blair08d19992016-08-10 15:25:31 -07002603 self.launch_server.hold_jobs_in_build = True
James E. Blair6bc782d2015-07-17 16:20:21 -07002604
2605 # This change is fine. It's here to stop the queue long
2606 # enough for the next change to be subject to the
2607 # reconfiguration, as well as to provide a conflict for the
2608 # next change. This change will succeed and merge.
2609 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
2610 A.addPatchset(['conflict'])
James E. Blair8b5408c2016-08-08 15:37:46 -07002611 A.addApproval('code-review', 2)
James E. Blair6bc782d2015-07-17 16:20:21 -07002612
2613 # This change will be in merge conflict. During the
2614 # reconfiguration, we will add a job. We want to make sure
2615 # that doesn't cause it to get stuck.
2616 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
2617 B.addPatchset(['conflict'])
James E. Blair8b5408c2016-08-08 15:37:46 -07002618 B.addApproval('code-review', 2)
James E. Blair4eb21fa2015-07-27 14:56:47 -07002619
James E. Blair8b5408c2016-08-08 15:37:46 -07002620 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
2621 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
James E. Blair6bc782d2015-07-17 16:20:21 -07002622
2623 self.waitUntilSettled()
2624
2625 # No jobs have run yet
2626 self.assertEqual(A.data['status'], 'NEW')
2627 self.assertEqual(A.reported, 1)
2628 self.assertEqual(B.data['status'], 'NEW')
2629 self.assertEqual(B.reported, 1)
2630 self.assertEqual(len(self.history), 0)
2631
2632 # Add the "project-test3" job.
James E. Blairf84026c2015-12-08 16:11:46 -08002633 self.updateConfigLayout(
2634 'tests/fixtures/layout-live-reconfiguration-add-job.yaml')
James E. Blair6bc782d2015-07-17 16:20:21 -07002635 self.sched.reconfigure(self.config)
2636 self.waitUntilSettled()
2637
James E. Blair08d19992016-08-10 15:25:31 -07002638 self.launch_server.hold_jobs_in_build = False
2639 self.launch_server.release()
James E. Blair6bc782d2015-07-17 16:20:21 -07002640 self.waitUntilSettled()
2641
2642 self.assertEqual(A.data['status'], 'MERGED')
2643 self.assertEqual(A.reported, 2)
2644 self.assertEqual(B.data['status'], 'NEW')
2645 self.assertEqual(B.reported, 2)
2646 self.assertEqual(self.getJobFromHistory('project-merge').result,
2647 'SUCCESS')
2648 self.assertEqual(self.getJobFromHistory('project-test1').result,
2649 'SUCCESS')
2650 self.assertEqual(self.getJobFromHistory('project-test2').result,
2651 'SUCCESS')
2652 self.assertEqual(self.getJobFromHistory('project-test3').result,
2653 'SUCCESS')
2654 self.assertEqual(len(self.history), 4)
2655
James E. Blairec056492016-07-22 09:45:56 -07002656 @skip("Disabled for early v3 development")
James E. Blair400e8fd2015-07-30 17:44:45 -07002657 def test_live_reconfiguration_failed_root(self):
James E. Blair6bc782d2015-07-17 16:20:21 -07002658 # An extrapolation of test_live_reconfiguration_merge_conflict
2659 # that tests a job added to a job tree with a failed root does
2660 # not run.
2661 self.worker.registerFunction('build:project-test3')
James E. Blair08d19992016-08-10 15:25:31 -07002662 self.launch_server.hold_jobs_in_build = True
James E. Blair6bc782d2015-07-17 16:20:21 -07002663
2664 # This change is fine. It's here to stop the queue long
2665 # enough for the next change to be subject to the
2666 # reconfiguration. This change will succeed and merge.
2667 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
2668 A.addPatchset(['conflict'])
James E. Blair8b5408c2016-08-08 15:37:46 -07002669 A.addApproval('code-review', 2)
2670 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair6bc782d2015-07-17 16:20:21 -07002671 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07002672 self.launch_server.release('.*-merge')
James E. Blair6bc782d2015-07-17 16:20:21 -07002673 self.waitUntilSettled()
2674
2675 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
James E. Blair08d19992016-08-10 15:25:31 -07002676 self.launch_server.failJob('project-merge', B)
James E. Blair8b5408c2016-08-08 15:37:46 -07002677 B.addApproval('code-review', 2)
2678 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
James E. Blair6bc782d2015-07-17 16:20:21 -07002679 self.waitUntilSettled()
2680
James E. Blair08d19992016-08-10 15:25:31 -07002681 self.launch_server.release('.*-merge')
James E. Blair6bc782d2015-07-17 16:20:21 -07002682 self.waitUntilSettled()
2683
2684 # Both -merge jobs have run, but no others.
2685 self.assertEqual(A.data['status'], 'NEW')
2686 self.assertEqual(A.reported, 1)
2687 self.assertEqual(B.data['status'], 'NEW')
2688 self.assertEqual(B.reported, 1)
2689 self.assertEqual(self.history[0].result, 'SUCCESS')
2690 self.assertEqual(self.history[0].name, 'project-merge')
2691 self.assertEqual(self.history[1].result, 'FAILURE')
2692 self.assertEqual(self.history[1].name, 'project-merge')
2693 self.assertEqual(len(self.history), 2)
2694
2695 # Add the "project-test3" job.
James E. Blairf84026c2015-12-08 16:11:46 -08002696 self.updateConfigLayout(
2697 'tests/fixtures/layout-live-reconfiguration-add-job.yaml')
James E. Blair6bc782d2015-07-17 16:20:21 -07002698 self.sched.reconfigure(self.config)
2699 self.waitUntilSettled()
2700
James E. Blair08d19992016-08-10 15:25:31 -07002701 self.launch_server.hold_jobs_in_build = False
2702 self.launch_server.release()
James E. Blair6bc782d2015-07-17 16:20:21 -07002703 self.waitUntilSettled()
2704
2705 self.assertEqual(A.data['status'], 'MERGED')
2706 self.assertEqual(A.reported, 2)
2707 self.assertEqual(B.data['status'], 'NEW')
2708 self.assertEqual(B.reported, 2)
2709 self.assertEqual(self.history[0].result, 'SUCCESS')
2710 self.assertEqual(self.history[0].name, 'project-merge')
2711 self.assertEqual(self.history[1].result, 'FAILURE')
2712 self.assertEqual(self.history[1].name, 'project-merge')
2713 self.assertEqual(self.history[2].result, 'SUCCESS')
2714 self.assertEqual(self.history[3].result, 'SUCCESS')
2715 self.assertEqual(self.history[4].result, 'SUCCESS')
2716 self.assertEqual(len(self.history), 5)
2717
James E. Blairec056492016-07-22 09:45:56 -07002718 @skip("Disabled for early v3 development")
James E. Blair400e8fd2015-07-30 17:44:45 -07002719 def test_live_reconfiguration_failed_job(self):
2720 # Test that a change with a removed failing job does not
2721 # disrupt reconfiguration. If a change has a failed job and
2722 # that job is removed during a reconfiguration, we observed a
2723 # bug where the code to re-set build statuses would run on
2724 # that build and raise an exception because the job no longer
2725 # existed.
James E. Blair08d19992016-08-10 15:25:31 -07002726 self.launch_server.hold_jobs_in_build = True
James E. Blair400e8fd2015-07-30 17:44:45 -07002727
2728 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
2729
2730 # This change will fail and later be removed by the reconfiguration.
James E. Blair08d19992016-08-10 15:25:31 -07002731 self.launch_server.failJob('project-test1', A)
James E. Blair400e8fd2015-07-30 17:44:45 -07002732
2733 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
2734 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07002735 self.launch_server.release('.*-merge')
James E. Blair400e8fd2015-07-30 17:44:45 -07002736 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07002737 self.launch_server.release('project-test1')
James E. Blair400e8fd2015-07-30 17:44:45 -07002738 self.waitUntilSettled()
2739
2740 self.assertEqual(A.data['status'], 'NEW')
2741 self.assertEqual(A.reported, 0)
2742
2743 self.assertEqual(self.getJobFromHistory('project-merge').result,
2744 'SUCCESS')
2745 self.assertEqual(self.getJobFromHistory('project-test1').result,
2746 'FAILURE')
2747 self.assertEqual(len(self.history), 2)
2748
2749 # Remove the test1 job.
James E. Blairf84026c2015-12-08 16:11:46 -08002750 self.updateConfigLayout(
2751 'tests/fixtures/layout-live-reconfiguration-failed-job.yaml')
James E. Blair400e8fd2015-07-30 17:44:45 -07002752 self.sched.reconfigure(self.config)
2753 self.waitUntilSettled()
2754
James E. Blair08d19992016-08-10 15:25:31 -07002755 self.launch_server.hold_jobs_in_build = False
2756 self.launch_server.release()
James E. Blair400e8fd2015-07-30 17:44:45 -07002757 self.waitUntilSettled()
2758
2759 self.assertEqual(self.getJobFromHistory('project-test2').result,
2760 'SUCCESS')
2761 self.assertEqual(self.getJobFromHistory('project-testfile').result,
2762 'SUCCESS')
2763 self.assertEqual(len(self.history), 4)
2764
2765 self.assertEqual(A.data['status'], 'NEW')
2766 self.assertEqual(A.reported, 1)
2767 self.assertIn('Build succeeded', A.messages[0])
2768 # Ensure the removed job was not included in the report.
2769 self.assertNotIn('project-test1', A.messages[0])
2770
James E. Blairec056492016-07-22 09:45:56 -07002771 @skip("Disabled for early v3 development")
James E. Blairfe707d12015-08-05 15:18:15 -07002772 def test_live_reconfiguration_shared_queue(self):
2773 # Test that a change with a failing job which was removed from
2774 # this project but otherwise still exists in the system does
2775 # not disrupt reconfiguration.
2776
James E. Blair08d19992016-08-10 15:25:31 -07002777 self.launch_server.hold_jobs_in_build = True
James E. Blairfe707d12015-08-05 15:18:15 -07002778
2779 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
2780
James E. Blair08d19992016-08-10 15:25:31 -07002781 self.launch_server.failJob('project1-project2-integration', A)
James E. Blairfe707d12015-08-05 15:18:15 -07002782
2783 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
2784 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07002785 self.launch_server.release('.*-merge')
James E. Blairfe707d12015-08-05 15:18:15 -07002786 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07002787 self.launch_server.release('project1-project2-integration')
James E. Blairfe707d12015-08-05 15:18:15 -07002788 self.waitUntilSettled()
2789
2790 self.assertEqual(A.data['status'], 'NEW')
2791 self.assertEqual(A.reported, 0)
2792
2793 self.assertEqual(self.getJobFromHistory('project1-merge').result,
2794 'SUCCESS')
2795 self.assertEqual(self.getJobFromHistory(
2796 'project1-project2-integration').result, 'FAILURE')
2797 self.assertEqual(len(self.history), 2)
2798
2799 # Remove the integration job.
James E. Blairf84026c2015-12-08 16:11:46 -08002800 self.updateConfigLayout(
2801 'tests/fixtures/layout-live-reconfiguration-shared-queue.yaml')
James E. Blairfe707d12015-08-05 15:18:15 -07002802 self.sched.reconfigure(self.config)
2803 self.waitUntilSettled()
2804
James E. Blair08d19992016-08-10 15:25:31 -07002805 self.launch_server.hold_jobs_in_build = False
2806 self.launch_server.release()
James E. Blairfe707d12015-08-05 15:18:15 -07002807 self.waitUntilSettled()
2808
2809 self.assertEqual(self.getJobFromHistory('project1-merge').result,
2810 'SUCCESS')
2811 self.assertEqual(self.getJobFromHistory('project1-test1').result,
2812 'SUCCESS')
2813 self.assertEqual(self.getJobFromHistory('project1-test2').result,
2814 'SUCCESS')
2815 self.assertEqual(self.getJobFromHistory(
2816 'project1-project2-integration').result, 'FAILURE')
2817 self.assertEqual(len(self.history), 4)
2818
2819 self.assertEqual(A.data['status'], 'NEW')
2820 self.assertEqual(A.reported, 1)
2821 self.assertIn('Build succeeded', A.messages[0])
2822 # Ensure the removed job was not included in the report.
2823 self.assertNotIn('project1-project2-integration', A.messages[0])
2824
James E. Blairec056492016-07-22 09:45:56 -07002825 @skip("Disabled for early v3 development")
Joshua Hesketh4bd7da32016-02-17 20:58:47 +11002826 def test_double_live_reconfiguration_shared_queue(self):
2827 # This was a real-world regression. A change is added to
2828 # gate; a reconfigure happens, a second change which depends
2829 # on the first is added, and a second reconfiguration happens.
2830 # Ensure that both changes merge.
2831
2832 # A failure may indicate incorrect caching or cleaning up of
2833 # references during a reconfiguration.
James E. Blair08d19992016-08-10 15:25:31 -07002834 self.launch_server.hold_jobs_in_build = True
Joshua Hesketh4bd7da32016-02-17 20:58:47 +11002835
2836 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
2837 B = self.fake_gerrit.addFakeChange('org/project1', 'master', 'B')
2838 B.setDependsOn(A, 1)
James E. Blair8b5408c2016-08-08 15:37:46 -07002839 A.addApproval('code-review', 2)
2840 B.addApproval('code-review', 2)
Joshua Hesketh4bd7da32016-02-17 20:58:47 +11002841
2842 # Add the parent change.
James E. Blair8b5408c2016-08-08 15:37:46 -07002843 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
Joshua Hesketh4bd7da32016-02-17 20:58:47 +11002844 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07002845 self.launch_server.release('.*-merge')
Joshua Hesketh4bd7da32016-02-17 20:58:47 +11002846 self.waitUntilSettled()
2847
2848 # Reconfigure (with only one change in the pipeline).
2849 self.sched.reconfigure(self.config)
2850 self.waitUntilSettled()
2851
2852 # Add the child change.
James E. Blair8b5408c2016-08-08 15:37:46 -07002853 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
Joshua Hesketh4bd7da32016-02-17 20:58:47 +11002854 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07002855 self.launch_server.release('.*-merge')
Joshua Hesketh4bd7da32016-02-17 20:58:47 +11002856 self.waitUntilSettled()
2857
2858 # Reconfigure (with both in the pipeline).
2859 self.sched.reconfigure(self.config)
2860 self.waitUntilSettled()
2861
James E. Blair08d19992016-08-10 15:25:31 -07002862 self.launch_server.hold_jobs_in_build = False
2863 self.launch_server.release()
Joshua Hesketh4bd7da32016-02-17 20:58:47 +11002864 self.waitUntilSettled()
2865
2866 self.assertEqual(len(self.history), 8)
2867
2868 self.assertEqual(A.data['status'], 'MERGED')
2869 self.assertEqual(A.reported, 2)
2870 self.assertEqual(B.data['status'], 'MERGED')
2871 self.assertEqual(B.reported, 2)
2872
James E. Blairec056492016-07-22 09:45:56 -07002873 @skip("Disabled for early v3 development")
Evgeny Antyshev0deaaad2015-08-03 20:22:56 +00002874 def test_live_reconfiguration_del_project(self):
2875 # Test project deletion from layout
2876 # while changes are enqueued
2877
James E. Blair08d19992016-08-10 15:25:31 -07002878 self.launch_server.hold_jobs_in_build = True
Evgeny Antyshev0deaaad2015-08-03 20:22:56 +00002879 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
2880 B = self.fake_gerrit.addFakeChange('org/project1', 'master', 'B')
2881 C = self.fake_gerrit.addFakeChange('org/project1', 'master', 'C')
2882
2883 # A Depends-On: B
2884 A.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
2885 A.subject, B.data['id'])
James E. Blair8b5408c2016-08-08 15:37:46 -07002886 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
Evgeny Antyshev0deaaad2015-08-03 20:22:56 +00002887
2888 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
2889 self.fake_gerrit.addEvent(C.getPatchsetCreatedEvent(1))
2890 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07002891 self.launch_server.release('.*-merge')
Evgeny Antyshev0deaaad2015-08-03 20:22:56 +00002892 self.waitUntilSettled()
2893 self.assertEqual(len(self.builds), 5)
2894
2895 # This layout defines only org/project, not org/project1
James E. Blairf84026c2015-12-08 16:11:46 -08002896 self.updateConfigLayout(
2897 'tests/fixtures/layout-live-reconfiguration-del-project.yaml')
Evgeny Antyshev0deaaad2015-08-03 20:22:56 +00002898 self.sched.reconfigure(self.config)
2899 self.waitUntilSettled()
2900
2901 # Builds for C aborted, builds for A succeed,
2902 # and have change B applied ahead
2903 job_c = self.getJobFromHistory('project1-test1')
2904 self.assertEqual(job_c.changes, '3,1')
2905 self.assertEqual(job_c.result, 'ABORTED')
2906
James E. Blair08d19992016-08-10 15:25:31 -07002907 self.launch_server.hold_jobs_in_build = False
2908 self.launch_server.release()
Evgeny Antyshev0deaaad2015-08-03 20:22:56 +00002909 self.waitUntilSettled()
2910
2911 self.assertEqual(self.getJobFromHistory('project-test1').changes,
2912 '2,1 1,1')
2913
2914 self.assertEqual(A.data['status'], 'NEW')
2915 self.assertEqual(B.data['status'], 'NEW')
2916 self.assertEqual(C.data['status'], 'NEW')
2917 self.assertEqual(A.reported, 1)
2918 self.assertEqual(B.reported, 0)
2919 self.assertEqual(C.reported, 0)
2920
2921 self.assertEqual(len(self.sched.layout.pipelines['check'].queues), 0)
2922 self.assertIn('Build succeeded', A.messages[0])
2923
James E. Blairec056492016-07-22 09:45:56 -07002924 @skip("Disabled for early v3 development")
James E. Blaire712d9f2013-07-31 11:40:11 -07002925 def test_live_reconfiguration_functions(self):
2926 "Test live reconfiguration with a custom function"
2927 self.worker.registerFunction('build:node-project-test1:debian')
2928 self.worker.registerFunction('build:node-project-test1:wheezy')
2929 A = self.fake_gerrit.addFakeChange('org/node-project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -07002930 A.addApproval('code-review', 2)
2931 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blaire712d9f2013-07-31 11:40:11 -07002932 self.waitUntilSettled()
2933
2934 self.assertIsNone(self.getJobFromHistory('node-project-merge').node)
2935 self.assertEqual(self.getJobFromHistory('node-project-test1').node,
2936 'debian')
2937 self.assertIsNone(self.getJobFromHistory('node-project-test2').node)
2938
James E. Blairf84026c2015-12-08 16:11:46 -08002939 self.updateConfigLayout(
2940 'tests/fixtures/layout-live-reconfiguration-functions.yaml')
James E. Blaire712d9f2013-07-31 11:40:11 -07002941 self.sched.reconfigure(self.config)
2942 self.worker.build_history = []
2943
2944 B = self.fake_gerrit.addFakeChange('org/node-project', 'master', 'B')
James E. Blair8b5408c2016-08-08 15:37:46 -07002945 B.addApproval('code-review', 2)
2946 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
James E. Blaire712d9f2013-07-31 11:40:11 -07002947 self.waitUntilSettled()
2948
2949 self.assertIsNone(self.getJobFromHistory('node-project-merge').node)
2950 self.assertEqual(self.getJobFromHistory('node-project-test1').node,
2951 'wheezy')
2952 self.assertIsNone(self.getJobFromHistory('node-project-test2').node)
2953
James E. Blairec056492016-07-22 09:45:56 -07002954 @skip("Disabled for early v3 development")
James E. Blair287c06d2013-07-24 10:39:30 -07002955 def test_delayed_repo_init(self):
James E. Blairf84026c2015-12-08 16:11:46 -08002956 self.updateConfigLayout(
2957 'tests/fixtures/layout-delayed-repo-init.yaml')
James E. Blair287c06d2013-07-24 10:39:30 -07002958 self.sched.reconfigure(self.config)
2959
2960 self.init_repo("org/new-project")
2961 A = self.fake_gerrit.addFakeChange('org/new-project', 'master', 'A')
2962
James E. Blair8b5408c2016-08-08 15:37:46 -07002963 A.addApproval('code-review', 2)
2964 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair287c06d2013-07-24 10:39:30 -07002965 self.waitUntilSettled()
2966 self.assertEqual(self.getJobFromHistory('project-merge').result,
2967 'SUCCESS')
2968 self.assertEqual(self.getJobFromHistory('project-test1').result,
2969 'SUCCESS')
2970 self.assertEqual(self.getJobFromHistory('project-test2').result,
2971 'SUCCESS')
2972 self.assertEqual(A.data['status'], 'MERGED')
2973 self.assertEqual(A.reported, 2)
James E. Blair63bb0ef2013-07-29 17:14:51 -07002974
James E. Blairec056492016-07-22 09:45:56 -07002975 @skip("Disabled for early v3 development")
Clark Boylan6dbbc482013-10-18 10:57:31 -07002976 def test_repo_deleted(self):
James E. Blairf84026c2015-12-08 16:11:46 -08002977 self.updateConfigLayout(
2978 'tests/fixtures/layout-repo-deleted.yaml')
Clark Boylan6dbbc482013-10-18 10:57:31 -07002979 self.sched.reconfigure(self.config)
2980
2981 self.init_repo("org/delete-project")
2982 A = self.fake_gerrit.addFakeChange('org/delete-project', 'master', 'A')
2983
James E. Blair8b5408c2016-08-08 15:37:46 -07002984 A.addApproval('code-review', 2)
2985 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
Clark Boylan6dbbc482013-10-18 10:57:31 -07002986 self.waitUntilSettled()
2987 self.assertEqual(self.getJobFromHistory('project-merge').result,
2988 'SUCCESS')
2989 self.assertEqual(self.getJobFromHistory('project-test1').result,
2990 'SUCCESS')
2991 self.assertEqual(self.getJobFromHistory('project-test2').result,
2992 'SUCCESS')
2993 self.assertEqual(A.data['status'], 'MERGED')
2994 self.assertEqual(A.reported, 2)
2995
2996 # Delete org/new-project zuul repo. Should be recloned.
2997 shutil.rmtree(os.path.join(self.git_root, "org/delete-project"))
2998
2999 B = self.fake_gerrit.addFakeChange('org/delete-project', 'master', 'B')
3000
James E. Blair8b5408c2016-08-08 15:37:46 -07003001 B.addApproval('code-review', 2)
3002 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
Clark Boylan6dbbc482013-10-18 10:57:31 -07003003 self.waitUntilSettled()
3004 self.assertEqual(self.getJobFromHistory('project-merge').result,
3005 'SUCCESS')
3006 self.assertEqual(self.getJobFromHistory('project-test1').result,
3007 'SUCCESS')
3008 self.assertEqual(self.getJobFromHistory('project-test2').result,
3009 'SUCCESS')
3010 self.assertEqual(B.data['status'], 'MERGED')
3011 self.assertEqual(B.reported, 2)
3012
James E. Blairec056492016-07-22 09:45:56 -07003013 @skip("Disabled for early v3 development")
James E. Blair456f2fb2016-02-09 09:29:33 -08003014 def test_tags(self):
3015 "Test job tags"
3016 self.config.set('zuul', 'layout_config',
3017 'tests/fixtures/layout-tags.yaml')
3018 self.sched.reconfigure(self.config)
3019
3020 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
3021 B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
3022 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
3023 self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
3024 self.waitUntilSettled()
3025
3026 results = {'project1-merge': 'extratag merge project1',
3027 'project2-merge': 'merge'}
3028
3029 for build in self.history:
3030 self.assertEqual(results.get(build.name, ''),
3031 build.parameters.get('BUILD_TAGS'))
3032
James E. Blairec056492016-07-22 09:45:56 -07003033 @skip("Disabled for early v3 development")
James E. Blair63bb0ef2013-07-29 17:14:51 -07003034 def test_timer(self):
3035 "Test that a periodic job is triggered"
James E. Blair08d19992016-08-10 15:25:31 -07003036 self.launch_server.hold_jobs_in_build = True
James E. Blairf84026c2015-12-08 16:11:46 -08003037 self.updateConfigLayout(
3038 'tests/fixtures/layout-timer.yaml')
James E. Blair63bb0ef2013-07-29 17:14:51 -07003039 self.sched.reconfigure(self.config)
3040 self.registerJobs()
3041
Clark Boylan3ee090a2014-04-03 20:55:09 -07003042 # The pipeline triggers every second, so we should have seen
3043 # several by now.
3044 time.sleep(5)
James E. Blair63bb0ef2013-07-29 17:14:51 -07003045 self.waitUntilSettled()
Clark Boylan3ee090a2014-04-03 20:55:09 -07003046
3047 self.assertEqual(len(self.builds), 2)
3048
James E. Blair63bb0ef2013-07-29 17:14:51 -07003049 port = self.webapp.server.socket.getsockname()[1]
3050
Morgan Fainberg293f7f82016-05-30 14:01:22 -07003051 req = urllib.request.Request("http://localhost:%s/status.json" % port)
3052 f = urllib.request.urlopen(req)
James E. Blair63bb0ef2013-07-29 17:14:51 -07003053 data = f.read()
3054
James E. Blair08d19992016-08-10 15:25:31 -07003055 self.launch_server.hold_jobs_in_build = False
Clark Boylan3ee090a2014-04-03 20:55:09 -07003056 # Stop queuing timer triggered jobs so that the assertions
3057 # below don't race against more jobs being queued.
James E. Blairf84026c2015-12-08 16:11:46 -08003058 self.updateConfigLayout(
3059 'tests/fixtures/layout-no-timer.yaml')
Clark Boylan3ee090a2014-04-03 20:55:09 -07003060 self.sched.reconfigure(self.config)
3061 self.registerJobs()
James E. Blair08d19992016-08-10 15:25:31 -07003062 self.launch_server.release()
James E. Blair63bb0ef2013-07-29 17:14:51 -07003063 self.waitUntilSettled()
3064
3065 self.assertEqual(self.getJobFromHistory(
3066 'project-bitrot-stable-old').result, 'SUCCESS')
3067 self.assertEqual(self.getJobFromHistory(
3068 'project-bitrot-stable-older').result, 'SUCCESS')
3069
3070 data = json.loads(data)
3071 status_jobs = set()
3072 for p in data['pipelines']:
3073 for q in p['change_queues']:
3074 for head in q['heads']:
3075 for change in head:
Alex Gaynorddb9ef32013-09-16 21:04:58 -07003076 self.assertEqual(change['id'], None)
James E. Blair63bb0ef2013-07-29 17:14:51 -07003077 for job in change['jobs']:
3078 status_jobs.add(job['name'])
3079 self.assertIn('project-bitrot-stable-old', status_jobs)
3080 self.assertIn('project-bitrot-stable-older', status_jobs)
Joshua Hesketh5fea8672013-08-19 17:32:01 +10003081
James E. Blairec056492016-07-22 09:45:56 -07003082 @skip("Disabled for early v3 development")
James E. Blair4f6033c2014-03-27 15:49:09 -07003083 def test_idle(self):
3084 "Test that frequent periodic jobs work"
James E. Blair08d19992016-08-10 15:25:31 -07003085 self.launch_server.hold_jobs_in_build = True
James E. Blair4f6033c2014-03-27 15:49:09 -07003086
Clark Boylan3ee090a2014-04-03 20:55:09 -07003087 for x in range(1, 3):
3088 # Test that timer triggers periodic jobs even across
3089 # layout config reloads.
3090 # Start timer trigger
James E. Blairf84026c2015-12-08 16:11:46 -08003091 self.updateConfigLayout(
3092 'tests/fixtures/layout-idle.yaml')
Clark Boylan3ee090a2014-04-03 20:55:09 -07003093 self.sched.reconfigure(self.config)
3094 self.registerJobs()
James E. Blair995fc0f2016-02-04 16:48:31 -08003095 self.waitUntilSettled()
James E. Blair4f6033c2014-03-27 15:49:09 -07003096
Clark Boylan3ee090a2014-04-03 20:55:09 -07003097 # The pipeline triggers every second, so we should have seen
3098 # several by now.
3099 time.sleep(5)
Clark Boylan3ee090a2014-04-03 20:55:09 -07003100
3101 # Stop queuing timer triggered jobs so that the assertions
3102 # below don't race against more jobs being queued.
James E. Blairf84026c2015-12-08 16:11:46 -08003103 self.updateConfigLayout(
3104 'tests/fixtures/layout-no-timer.yaml')
Clark Boylan3ee090a2014-04-03 20:55:09 -07003105 self.sched.reconfigure(self.config)
3106 self.registerJobs()
James E. Blair995fc0f2016-02-04 16:48:31 -08003107 self.waitUntilSettled()
Clark Boylan3ee090a2014-04-03 20:55:09 -07003108
3109 self.assertEqual(len(self.builds), 2)
James E. Blair08d19992016-08-10 15:25:31 -07003110 self.launch_server.release('.*')
Clark Boylan3ee090a2014-04-03 20:55:09 -07003111 self.waitUntilSettled()
3112 self.assertEqual(len(self.builds), 0)
3113 self.assertEqual(len(self.history), x * 2)
James E. Blair4f6033c2014-03-27 15:49:09 -07003114
James E. Blairec056492016-07-22 09:45:56 -07003115 @skip("Disabled for early v3 development")
Joshua Hesketh5fea8672013-08-19 17:32:01 +10003116 def test_check_smtp_pool(self):
James E. Blairf84026c2015-12-08 16:11:46 -08003117 self.updateConfigLayout(
3118 'tests/fixtures/layout-smtp.yaml')
Joshua Hesketh5fea8672013-08-19 17:32:01 +10003119 self.sched.reconfigure(self.config)
3120
3121 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
3122 self.waitUntilSettled()
3123
3124 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
3125 self.waitUntilSettled()
3126
James E. Blairff80a2f2013-12-27 13:24:06 -08003127 self.assertEqual(len(self.smtp_messages), 2)
Joshua Hesketh5fea8672013-08-19 17:32:01 +10003128
3129 # A.messages only holds what FakeGerrit places in it. Thus we
3130 # work on the knowledge of what the first message should be as
3131 # it is only configured to go to SMTP.
3132
3133 self.assertEqual('zuul@example.com',
James E. Blairff80a2f2013-12-27 13:24:06 -08003134 self.smtp_messages[0]['from_email'])
Joshua Hesketh5fea8672013-08-19 17:32:01 +10003135 self.assertEqual(['you@example.com'],
James E. Blairff80a2f2013-12-27 13:24:06 -08003136 self.smtp_messages[0]['to_email'])
Joshua Hesketh5fea8672013-08-19 17:32:01 +10003137 self.assertEqual('Starting check jobs.',
James E. Blairff80a2f2013-12-27 13:24:06 -08003138 self.smtp_messages[0]['body'])
Joshua Hesketh5fea8672013-08-19 17:32:01 +10003139
3140 self.assertEqual('zuul_from@example.com',
James E. Blairff80a2f2013-12-27 13:24:06 -08003141 self.smtp_messages[1]['from_email'])
Joshua Hesketh5fea8672013-08-19 17:32:01 +10003142 self.assertEqual(['alternative_me@example.com'],
James E. Blairff80a2f2013-12-27 13:24:06 -08003143 self.smtp_messages[1]['to_email'])
Joshua Hesketh5fea8672013-08-19 17:32:01 +10003144 self.assertEqual(A.messages[0],
James E. Blairff80a2f2013-12-27 13:24:06 -08003145 self.smtp_messages[1]['body'])
James E. Blairad28e912013-11-27 10:43:22 -08003146
James E. Blairec056492016-07-22 09:45:56 -07003147 @skip("Disabled for early v3 development")
James E. Blaire5910202013-12-27 09:50:31 -08003148 def test_timer_smtp(self):
3149 "Test that a periodic job is triggered"
James E. Blair08d19992016-08-10 15:25:31 -07003150 self.launch_server.hold_jobs_in_build = True
James E. Blairf84026c2015-12-08 16:11:46 -08003151 self.updateConfigLayout(
3152 'tests/fixtures/layout-timer-smtp.yaml')
James E. Blaire5910202013-12-27 09:50:31 -08003153 self.sched.reconfigure(self.config)
3154 self.registerJobs()
3155
Clark Boylan3ee090a2014-04-03 20:55:09 -07003156 # The pipeline triggers every second, so we should have seen
3157 # several by now.
3158 time.sleep(5)
James E. Blaire5910202013-12-27 09:50:31 -08003159 self.waitUntilSettled()
3160
Clark Boylan3ee090a2014-04-03 20:55:09 -07003161 self.assertEqual(len(self.builds), 2)
James E. Blair08d19992016-08-10 15:25:31 -07003162 self.launch_server.release('.*')
Clark Boylan3ee090a2014-04-03 20:55:09 -07003163 self.waitUntilSettled()
3164 self.assertEqual(len(self.history), 2)
3165
James E. Blaire5910202013-12-27 09:50:31 -08003166 self.assertEqual(self.getJobFromHistory(
3167 'project-bitrot-stable-old').result, 'SUCCESS')
3168 self.assertEqual(self.getJobFromHistory(
3169 'project-bitrot-stable-older').result, 'SUCCESS')
3170
James E. Blairff80a2f2013-12-27 13:24:06 -08003171 self.assertEqual(len(self.smtp_messages), 1)
James E. Blaire5910202013-12-27 09:50:31 -08003172
3173 # A.messages only holds what FakeGerrit places in it. Thus we
3174 # work on the knowledge of what the first message should be as
3175 # it is only configured to go to SMTP.
3176
3177 self.assertEqual('zuul_from@example.com',
James E. Blairff80a2f2013-12-27 13:24:06 -08003178 self.smtp_messages[0]['from_email'])
James E. Blaire5910202013-12-27 09:50:31 -08003179 self.assertEqual(['alternative_me@example.com'],
James E. Blairff80a2f2013-12-27 13:24:06 -08003180 self.smtp_messages[0]['to_email'])
James E. Blaire5910202013-12-27 09:50:31 -08003181 self.assertIn('Subject: Periodic check for org/project succeeded',
James E. Blairff80a2f2013-12-27 13:24:06 -08003182 self.smtp_messages[0]['headers'])
James E. Blaire5910202013-12-27 09:50:31 -08003183
Clark Boylan3ee090a2014-04-03 20:55:09 -07003184 # Stop queuing timer triggered jobs and let any that may have
3185 # queued through so that end of test assertions pass.
James E. Blairf84026c2015-12-08 16:11:46 -08003186 self.updateConfigLayout(
3187 'tests/fixtures/layout-no-timer.yaml')
Clark Boylan3ee090a2014-04-03 20:55:09 -07003188 self.sched.reconfigure(self.config)
3189 self.registerJobs()
James E. Blairf8058972014-08-15 16:09:16 -07003190 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07003191 self.launch_server.release('.*')
Clark Boylan3ee090a2014-04-03 20:55:09 -07003192 self.waitUntilSettled()
3193
James E. Blairec056492016-07-22 09:45:56 -07003194 @skip("Disabled for early v3 development")
James E. Blair91e34592015-07-31 16:45:59 -07003195 def test_client_enqueue_change(self):
James E. Blairad28e912013-11-27 10:43:22 -08003196 "Test that the RPC client can enqueue a change"
3197 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -07003198 A.addApproval('code-review', 2)
3199 A.addApproval('approved', 1)
James E. Blairad28e912013-11-27 10:43:22 -08003200
3201 client = zuul.rpcclient.RPCClient('127.0.0.1',
3202 self.gearman_server.port)
3203 r = client.enqueue(pipeline='gate',
3204 project='org/project',
3205 trigger='gerrit',
James E. Blair36658cf2013-12-06 17:53:48 -08003206 change='1,1')
James E. Blairad28e912013-11-27 10:43:22 -08003207 self.waitUntilSettled()
3208 self.assertEqual(self.getJobFromHistory('project-merge').result,
3209 'SUCCESS')
3210 self.assertEqual(self.getJobFromHistory('project-test1').result,
3211 'SUCCESS')
3212 self.assertEqual(self.getJobFromHistory('project-test2').result,
3213 'SUCCESS')
3214 self.assertEqual(A.data['status'], 'MERGED')
3215 self.assertEqual(A.reported, 2)
3216 self.assertEqual(r, True)
3217
James E. Blairec056492016-07-22 09:45:56 -07003218 @skip("Disabled for early v3 development")
James E. Blair91e34592015-07-31 16:45:59 -07003219 def test_client_enqueue_ref(self):
3220 "Test that the RPC client can enqueue a ref"
3221
3222 client = zuul.rpcclient.RPCClient('127.0.0.1',
3223 self.gearman_server.port)
3224 r = client.enqueue_ref(
3225 pipeline='post',
3226 project='org/project',
3227 trigger='gerrit',
3228 ref='master',
3229 oldrev='90f173846e3af9154517b88543ffbd1691f31366',
3230 newrev='d479a0bfcb34da57a31adb2a595c0cf687812543')
3231 self.waitUntilSettled()
3232 job_names = [x.name for x in self.history]
3233 self.assertEqual(len(self.history), 1)
3234 self.assertIn('project-post', job_names)
3235 self.assertEqual(r, True)
3236
James E. Blairec056492016-07-22 09:45:56 -07003237 @skip("Disabled for early v3 development")
James E. Blairad28e912013-11-27 10:43:22 -08003238 def test_client_enqueue_negative(self):
3239 "Test that the RPC client returns errors"
3240 client = zuul.rpcclient.RPCClient('127.0.0.1',
3241 self.gearman_server.port)
3242 with testtools.ExpectedException(zuul.rpcclient.RPCFailure,
3243 "Invalid project"):
3244 r = client.enqueue(pipeline='gate',
3245 project='project-does-not-exist',
3246 trigger='gerrit',
James E. Blair36658cf2013-12-06 17:53:48 -08003247 change='1,1')
James E. Blairad28e912013-11-27 10:43:22 -08003248 client.shutdown()
3249 self.assertEqual(r, False)
3250
3251 with testtools.ExpectedException(zuul.rpcclient.RPCFailure,
3252 "Invalid pipeline"):
3253 r = client.enqueue(pipeline='pipeline-does-not-exist',
3254 project='org/project',
3255 trigger='gerrit',
James E. Blair36658cf2013-12-06 17:53:48 -08003256 change='1,1')
James E. Blairad28e912013-11-27 10:43:22 -08003257 client.shutdown()
3258 self.assertEqual(r, False)
3259
3260 with testtools.ExpectedException(zuul.rpcclient.RPCFailure,
3261 "Invalid trigger"):
3262 r = client.enqueue(pipeline='gate',
3263 project='org/project',
3264 trigger='trigger-does-not-exist',
James E. Blair36658cf2013-12-06 17:53:48 -08003265 change='1,1')
James E. Blairad28e912013-11-27 10:43:22 -08003266 client.shutdown()
3267 self.assertEqual(r, False)
3268
3269 with testtools.ExpectedException(zuul.rpcclient.RPCFailure,
3270 "Invalid change"):
3271 r = client.enqueue(pipeline='gate',
3272 project='org/project',
3273 trigger='gerrit',
James E. Blair36658cf2013-12-06 17:53:48 -08003274 change='1,1')
James E. Blairad28e912013-11-27 10:43:22 -08003275 client.shutdown()
3276 self.assertEqual(r, False)
3277
3278 self.waitUntilSettled()
3279 self.assertEqual(len(self.history), 0)
3280 self.assertEqual(len(self.builds), 0)
James E. Blair36658cf2013-12-06 17:53:48 -08003281
James E. Blairec056492016-07-22 09:45:56 -07003282 @skip("Disabled for early v3 development")
James E. Blair36658cf2013-12-06 17:53:48 -08003283 def test_client_promote(self):
3284 "Test that the RPC client can promote a change"
James E. Blair08d19992016-08-10 15:25:31 -07003285 self.launch_server.hold_jobs_in_build = True
James E. Blair36658cf2013-12-06 17:53:48 -08003286 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
3287 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
3288 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
James E. Blair8b5408c2016-08-08 15:37:46 -07003289 A.addApproval('code-review', 2)
3290 B.addApproval('code-review', 2)
3291 C.addApproval('code-review', 2)
James E. Blair36658cf2013-12-06 17:53:48 -08003292
James E. Blair8b5408c2016-08-08 15:37:46 -07003293 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
3294 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
3295 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
James E. Blair36658cf2013-12-06 17:53:48 -08003296
3297 self.waitUntilSettled()
3298
Sean Daguef39b9ca2014-01-10 21:34:35 -05003299 items = self.sched.layout.pipelines['gate'].getAllItems()
3300 enqueue_times = {}
3301 for item in items:
3302 enqueue_times[str(item.change)] = item.enqueue_time
3303
James E. Blair36658cf2013-12-06 17:53:48 -08003304 client = zuul.rpcclient.RPCClient('127.0.0.1',
3305 self.gearman_server.port)
3306 r = client.promote(pipeline='gate',
3307 change_ids=['2,1', '3,1'])
3308
Sean Daguef39b9ca2014-01-10 21:34:35 -05003309 # ensure that enqueue times are durable
3310 items = self.sched.layout.pipelines['gate'].getAllItems()
3311 for item in items:
3312 self.assertEqual(
3313 enqueue_times[str(item.change)], item.enqueue_time)
3314
James E. Blair78acec92014-02-06 07:11:32 -08003315 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07003316 self.launch_server.release('.*-merge')
James E. Blair36658cf2013-12-06 17:53:48 -08003317 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07003318 self.launch_server.release('.*-merge')
James E. Blair36658cf2013-12-06 17:53:48 -08003319 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07003320 self.launch_server.release('.*-merge')
James E. Blair36658cf2013-12-06 17:53:48 -08003321 self.waitUntilSettled()
3322
3323 self.assertEqual(len(self.builds), 6)
3324 self.assertEqual(self.builds[0].name, 'project-test1')
3325 self.assertEqual(self.builds[1].name, 'project-test2')
3326 self.assertEqual(self.builds[2].name, 'project-test1')
3327 self.assertEqual(self.builds[3].name, 'project-test2')
3328 self.assertEqual(self.builds[4].name, 'project-test1')
3329 self.assertEqual(self.builds[5].name, 'project-test2')
3330
3331 self.assertTrue(self.job_has_changes(self.builds[0], B))
3332 self.assertFalse(self.job_has_changes(self.builds[0], A))
3333 self.assertFalse(self.job_has_changes(self.builds[0], C))
3334
3335 self.assertTrue(self.job_has_changes(self.builds[2], B))
3336 self.assertTrue(self.job_has_changes(self.builds[2], C))
3337 self.assertFalse(self.job_has_changes(self.builds[2], A))
3338
3339 self.assertTrue(self.job_has_changes(self.builds[4], B))
3340 self.assertTrue(self.job_has_changes(self.builds[4], C))
3341 self.assertTrue(self.job_has_changes(self.builds[4], A))
3342
James E. Blair08d19992016-08-10 15:25:31 -07003343 self.launch_server.release()
James E. Blair36658cf2013-12-06 17:53:48 -08003344 self.waitUntilSettled()
3345
3346 self.assertEqual(A.data['status'], 'MERGED')
3347 self.assertEqual(A.reported, 2)
3348 self.assertEqual(B.data['status'], 'MERGED')
3349 self.assertEqual(B.reported, 2)
3350 self.assertEqual(C.data['status'], 'MERGED')
3351 self.assertEqual(C.reported, 2)
3352
3353 client.shutdown()
3354 self.assertEqual(r, True)
3355
James E. Blairec056492016-07-22 09:45:56 -07003356 @skip("Disabled for early v3 development")
James E. Blair36658cf2013-12-06 17:53:48 -08003357 def test_client_promote_dependent(self):
3358 "Test that the RPC client can promote a dependent change"
3359 # C (depends on B) -> B -> A ; then promote C to get:
3360 # A -> C (depends on B) -> B
James E. Blair08d19992016-08-10 15:25:31 -07003361 self.launch_server.hold_jobs_in_build = True
James E. Blair36658cf2013-12-06 17:53:48 -08003362 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
3363 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
3364 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
3365
3366 C.setDependsOn(B, 1)
3367
James E. Blair8b5408c2016-08-08 15:37:46 -07003368 A.addApproval('code-review', 2)
3369 B.addApproval('code-review', 2)
3370 C.addApproval('code-review', 2)
James E. Blair36658cf2013-12-06 17:53:48 -08003371
James E. Blair8b5408c2016-08-08 15:37:46 -07003372 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
3373 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
3374 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
James E. Blair36658cf2013-12-06 17:53:48 -08003375
3376 self.waitUntilSettled()
3377
3378 client = zuul.rpcclient.RPCClient('127.0.0.1',
3379 self.gearman_server.port)
3380 r = client.promote(pipeline='gate',
3381 change_ids=['3,1'])
3382
James E. Blair78acec92014-02-06 07:11:32 -08003383 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07003384 self.launch_server.release('.*-merge')
James E. Blair36658cf2013-12-06 17:53:48 -08003385 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07003386 self.launch_server.release('.*-merge')
James E. Blair36658cf2013-12-06 17:53:48 -08003387 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07003388 self.launch_server.release('.*-merge')
James E. Blair36658cf2013-12-06 17:53:48 -08003389 self.waitUntilSettled()
3390
3391 self.assertEqual(len(self.builds), 6)
3392 self.assertEqual(self.builds[0].name, 'project-test1')
3393 self.assertEqual(self.builds[1].name, 'project-test2')
3394 self.assertEqual(self.builds[2].name, 'project-test1')
3395 self.assertEqual(self.builds[3].name, 'project-test2')
3396 self.assertEqual(self.builds[4].name, 'project-test1')
3397 self.assertEqual(self.builds[5].name, 'project-test2')
3398
3399 self.assertTrue(self.job_has_changes(self.builds[0], B))
3400 self.assertFalse(self.job_has_changes(self.builds[0], A))
3401 self.assertFalse(self.job_has_changes(self.builds[0], C))
3402
3403 self.assertTrue(self.job_has_changes(self.builds[2], B))
3404 self.assertTrue(self.job_has_changes(self.builds[2], C))
3405 self.assertFalse(self.job_has_changes(self.builds[2], A))
3406
3407 self.assertTrue(self.job_has_changes(self.builds[4], B))
3408 self.assertTrue(self.job_has_changes(self.builds[4], C))
3409 self.assertTrue(self.job_has_changes(self.builds[4], A))
3410
James E. Blair08d19992016-08-10 15:25:31 -07003411 self.launch_server.release()
James E. Blair36658cf2013-12-06 17:53:48 -08003412 self.waitUntilSettled()
3413
3414 self.assertEqual(A.data['status'], 'MERGED')
3415 self.assertEqual(A.reported, 2)
3416 self.assertEqual(B.data['status'], 'MERGED')
3417 self.assertEqual(B.reported, 2)
3418 self.assertEqual(C.data['status'], 'MERGED')
3419 self.assertEqual(C.reported, 2)
3420
3421 client.shutdown()
3422 self.assertEqual(r, True)
3423
James E. Blairec056492016-07-22 09:45:56 -07003424 @skip("Disabled for early v3 development")
James E. Blair36658cf2013-12-06 17:53:48 -08003425 def test_client_promote_negative(self):
3426 "Test that the RPC client returns errors for promotion"
James E. Blair08d19992016-08-10 15:25:31 -07003427 self.launch_server.hold_jobs_in_build = True
James E. Blair36658cf2013-12-06 17:53:48 -08003428 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -07003429 A.addApproval('code-review', 2)
3430 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair36658cf2013-12-06 17:53:48 -08003431 self.waitUntilSettled()
3432
3433 client = zuul.rpcclient.RPCClient('127.0.0.1',
3434 self.gearman_server.port)
3435
3436 with testtools.ExpectedException(zuul.rpcclient.RPCFailure):
3437 r = client.promote(pipeline='nonexistent',
3438 change_ids=['2,1', '3,1'])
3439 client.shutdown()
3440 self.assertEqual(r, False)
3441
3442 with testtools.ExpectedException(zuul.rpcclient.RPCFailure):
3443 r = client.promote(pipeline='gate',
3444 change_ids=['4,1'])
3445 client.shutdown()
3446 self.assertEqual(r, False)
3447
James E. Blair08d19992016-08-10 15:25:31 -07003448 self.launch_server.hold_jobs_in_build = False
3449 self.launch_server.release()
James E. Blair36658cf2013-12-06 17:53:48 -08003450 self.waitUntilSettled()
Clark Boylan7603a372014-01-21 11:43:20 -08003451
James E. Blairec056492016-07-22 09:45:56 -07003452 @skip("Disabled for early v3 development")
Clark Boylan7603a372014-01-21 11:43:20 -08003453 def test_queue_rate_limiting(self):
3454 "Test that DependentPipelines are rate limited with dep across window"
James E. Blairf84026c2015-12-08 16:11:46 -08003455 self.updateConfigLayout(
3456 'tests/fixtures/layout-rate-limit.yaml')
Clark Boylan7603a372014-01-21 11:43:20 -08003457 self.sched.reconfigure(self.config)
James E. Blair08d19992016-08-10 15:25:31 -07003458 self.launch_server.hold_jobs_in_build = True
Clark Boylan7603a372014-01-21 11:43:20 -08003459 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
3460 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
3461 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
3462
3463 C.setDependsOn(B, 1)
James E. Blair08d19992016-08-10 15:25:31 -07003464 self.launch_server.failJob('project-test1', A)
Clark Boylan7603a372014-01-21 11:43:20 -08003465
James E. Blair8b5408c2016-08-08 15:37:46 -07003466 A.addApproval('code-review', 2)
3467 B.addApproval('code-review', 2)
3468 C.addApproval('code-review', 2)
Clark Boylan7603a372014-01-21 11:43:20 -08003469
James E. Blair8b5408c2016-08-08 15:37:46 -07003470 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
3471 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
3472 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
Clark Boylan7603a372014-01-21 11:43:20 -08003473 self.waitUntilSettled()
3474
3475 # Only A and B will have their merge jobs queued because
3476 # window is 2.
3477 self.assertEqual(len(self.builds), 2)
3478 self.assertEqual(self.builds[0].name, 'project-merge')
3479 self.assertEqual(self.builds[1].name, 'project-merge')
3480
James E. Blair08d19992016-08-10 15:25:31 -07003481 self.launch_server.release('.*-merge')
Clark Boylan7603a372014-01-21 11:43:20 -08003482 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07003483 self.launch_server.release('.*-merge')
Clark Boylan7603a372014-01-21 11:43:20 -08003484 self.waitUntilSettled()
3485
3486 # Only A and B will have their test jobs queued because
3487 # window is 2.
3488 self.assertEqual(len(self.builds), 4)
3489 self.assertEqual(self.builds[0].name, 'project-test1')
3490 self.assertEqual(self.builds[1].name, 'project-test2')
3491 self.assertEqual(self.builds[2].name, 'project-test1')
3492 self.assertEqual(self.builds[3].name, 'project-test2')
3493
James E. Blair08d19992016-08-10 15:25:31 -07003494 self.launch_server.release('project-.*')
Clark Boylan7603a372014-01-21 11:43:20 -08003495 self.waitUntilSettled()
3496
3497 queue = self.sched.layout.pipelines['gate'].queues[0]
3498 # A failed so window is reduced by 1 to 1.
3499 self.assertEqual(queue.window, 1)
3500 self.assertEqual(queue.window_floor, 1)
3501 self.assertEqual(A.data['status'], 'NEW')
3502
3503 # Gate is reset and only B's merge job is queued because
3504 # window shrunk to 1.
3505 self.assertEqual(len(self.builds), 1)
3506 self.assertEqual(self.builds[0].name, 'project-merge')
3507
James E. Blair08d19992016-08-10 15:25:31 -07003508 self.launch_server.release('.*-merge')
Clark Boylan7603a372014-01-21 11:43:20 -08003509 self.waitUntilSettled()
3510
3511 # Only B's test jobs are queued because window is still 1.
3512 self.assertEqual(len(self.builds), 2)
3513 self.assertEqual(self.builds[0].name, 'project-test1')
3514 self.assertEqual(self.builds[1].name, 'project-test2')
3515
James E. Blair08d19992016-08-10 15:25:31 -07003516 self.launch_server.release('project-.*')
Clark Boylan7603a372014-01-21 11:43:20 -08003517 self.waitUntilSettled()
3518
3519 # B was successfully merged so window is increased to 2.
3520 self.assertEqual(queue.window, 2)
3521 self.assertEqual(queue.window_floor, 1)
3522 self.assertEqual(B.data['status'], 'MERGED')
3523
3524 # Only C is left and its merge job is queued.
3525 self.assertEqual(len(self.builds), 1)
3526 self.assertEqual(self.builds[0].name, 'project-merge')
3527
James E. Blair08d19992016-08-10 15:25:31 -07003528 self.launch_server.release('.*-merge')
Clark Boylan7603a372014-01-21 11:43:20 -08003529 self.waitUntilSettled()
3530
3531 # After successful merge job the test jobs for C are queued.
3532 self.assertEqual(len(self.builds), 2)
3533 self.assertEqual(self.builds[0].name, 'project-test1')
3534 self.assertEqual(self.builds[1].name, 'project-test2')
3535
James E. Blair08d19992016-08-10 15:25:31 -07003536 self.launch_server.release('project-.*')
Clark Boylan7603a372014-01-21 11:43:20 -08003537 self.waitUntilSettled()
3538
3539 # C successfully merged so window is bumped to 3.
3540 self.assertEqual(queue.window, 3)
3541 self.assertEqual(queue.window_floor, 1)
3542 self.assertEqual(C.data['status'], 'MERGED')
3543
James E. Blairec056492016-07-22 09:45:56 -07003544 @skip("Disabled for early v3 development")
Clark Boylan7603a372014-01-21 11:43:20 -08003545 def test_queue_rate_limiting_dependent(self):
3546 "Test that DependentPipelines are rate limited with dep in window"
James E. Blairf84026c2015-12-08 16:11:46 -08003547 self.updateConfigLayout(
3548 'tests/fixtures/layout-rate-limit.yaml')
Clark Boylan7603a372014-01-21 11:43:20 -08003549 self.sched.reconfigure(self.config)
James E. Blair08d19992016-08-10 15:25:31 -07003550 self.launch_server.hold_jobs_in_build = True
Clark Boylan7603a372014-01-21 11:43:20 -08003551 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
3552 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
3553 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
3554
3555 B.setDependsOn(A, 1)
3556
James E. Blair08d19992016-08-10 15:25:31 -07003557 self.launch_server.failJob('project-test1', A)
Clark Boylan7603a372014-01-21 11:43:20 -08003558
James E. Blair8b5408c2016-08-08 15:37:46 -07003559 A.addApproval('code-review', 2)
3560 B.addApproval('code-review', 2)
3561 C.addApproval('code-review', 2)
Clark Boylan7603a372014-01-21 11:43:20 -08003562
James E. Blair8b5408c2016-08-08 15:37:46 -07003563 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
3564 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
3565 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
Clark Boylan7603a372014-01-21 11:43:20 -08003566 self.waitUntilSettled()
3567
3568 # Only A and B will have their merge jobs queued because
3569 # window is 2.
3570 self.assertEqual(len(self.builds), 2)
3571 self.assertEqual(self.builds[0].name, 'project-merge')
3572 self.assertEqual(self.builds[1].name, 'project-merge')
3573
James E. Blair08d19992016-08-10 15:25:31 -07003574 self.launch_server.release('.*-merge')
Clark Boylan7603a372014-01-21 11:43:20 -08003575 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07003576 self.launch_server.release('.*-merge')
Clark Boylan7603a372014-01-21 11:43:20 -08003577 self.waitUntilSettled()
3578
3579 # Only A and B will have their test jobs queued because
3580 # window is 2.
3581 self.assertEqual(len(self.builds), 4)
3582 self.assertEqual(self.builds[0].name, 'project-test1')
3583 self.assertEqual(self.builds[1].name, 'project-test2')
3584 self.assertEqual(self.builds[2].name, 'project-test1')
3585 self.assertEqual(self.builds[3].name, 'project-test2')
3586
James E. Blair08d19992016-08-10 15:25:31 -07003587 self.launch_server.release('project-.*')
Clark Boylan7603a372014-01-21 11:43:20 -08003588 self.waitUntilSettled()
3589
3590 queue = self.sched.layout.pipelines['gate'].queues[0]
3591 # A failed so window is reduced by 1 to 1.
3592 self.assertEqual(queue.window, 1)
3593 self.assertEqual(queue.window_floor, 1)
3594 self.assertEqual(A.data['status'], 'NEW')
3595 self.assertEqual(B.data['status'], 'NEW')
3596
3597 # Gate is reset and only C's merge job is queued because
3598 # window shrunk to 1 and A and B were dequeued.
3599 self.assertEqual(len(self.builds), 1)
3600 self.assertEqual(self.builds[0].name, 'project-merge')
3601
James E. Blair08d19992016-08-10 15:25:31 -07003602 self.launch_server.release('.*-merge')
Clark Boylan7603a372014-01-21 11:43:20 -08003603 self.waitUntilSettled()
3604
3605 # Only C's test jobs are queued because window is still 1.
3606 self.assertEqual(len(self.builds), 2)
3607 self.assertEqual(self.builds[0].name, 'project-test1')
3608 self.assertEqual(self.builds[1].name, 'project-test2')
3609
James E. Blair08d19992016-08-10 15:25:31 -07003610 self.launch_server.release('project-.*')
Clark Boylan7603a372014-01-21 11:43:20 -08003611 self.waitUntilSettled()
3612
3613 # C was successfully merged so window is increased to 2.
3614 self.assertEqual(queue.window, 2)
3615 self.assertEqual(queue.window_floor, 1)
3616 self.assertEqual(C.data['status'], 'MERGED')
Joshua Heskethba8776a2014-01-12 14:35:40 +08003617
James E. Blairec056492016-07-22 09:45:56 -07003618 @skip("Disabled for early v3 development")
Joshua Heskethba8776a2014-01-12 14:35:40 +08003619 def test_worker_update_metadata(self):
3620 "Test if a worker can send back metadata about itself"
James E. Blair08d19992016-08-10 15:25:31 -07003621 self.launch_server.hold_jobs_in_build = True
Joshua Heskethba8776a2014-01-12 14:35:40 +08003622
3623 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -07003624 A.addApproval('code-review', 2)
3625 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
Joshua Heskethba8776a2014-01-12 14:35:40 +08003626 self.waitUntilSettled()
3627
3628 self.assertEqual(len(self.launcher.builds), 1)
3629
3630 self.log.debug('Current builds:')
3631 self.log.debug(self.launcher.builds)
3632
3633 start = time.time()
3634 while True:
3635 if time.time() - start > 10:
3636 raise Exception("Timeout waiting for gearman server to report "
3637 + "back to the client")
3638 build = self.launcher.builds.values()[0]
3639 if build.worker.name == "My Worker":
3640 break
3641 else:
3642 time.sleep(0)
3643
3644 self.log.debug(build)
3645 self.assertEqual("My Worker", build.worker.name)
3646 self.assertEqual("localhost", build.worker.hostname)
3647 self.assertEqual(['127.0.0.1', '192.168.1.1'], build.worker.ips)
3648 self.assertEqual("zuul.example.org", build.worker.fqdn)
3649 self.assertEqual("FakeBuilder", build.worker.program)
3650 self.assertEqual("v1.1", build.worker.version)
3651 self.assertEqual({'something': 'else'}, build.worker.extra)
3652
James E. Blair08d19992016-08-10 15:25:31 -07003653 self.launch_server.hold_jobs_in_build = False
3654 self.launch_server.release()
Joshua Heskethba8776a2014-01-12 14:35:40 +08003655 self.waitUntilSettled()
Joshua Hesketh3979e3e2014-03-04 11:21:10 +11003656
James E. Blairec056492016-07-22 09:45:56 -07003657 @skip("Disabled for early v3 development")
Joshua Hesketh3979e3e2014-03-04 11:21:10 +11003658 def test_footer_message(self):
3659 "Test a pipeline's footer message is correctly added to the report."
James E. Blairf84026c2015-12-08 16:11:46 -08003660 self.updateConfigLayout(
3661 'tests/fixtures/layout-footer-message.yaml')
Joshua Hesketh3979e3e2014-03-04 11:21:10 +11003662 self.sched.reconfigure(self.config)
3663 self.registerJobs()
3664
3665 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -07003666 A.addApproval('code-review', 2)
James E. Blair08d19992016-08-10 15:25:31 -07003667 self.launch_server.failJob('test1', A)
James E. Blair8b5408c2016-08-08 15:37:46 -07003668 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
Joshua Hesketh3979e3e2014-03-04 11:21:10 +11003669 self.waitUntilSettled()
3670
3671 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
James E. Blair8b5408c2016-08-08 15:37:46 -07003672 B.addApproval('code-review', 2)
3673 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
Joshua Hesketh3979e3e2014-03-04 11:21:10 +11003674 self.waitUntilSettled()
3675
3676 self.assertEqual(2, len(self.smtp_messages))
3677
3678 failure_body = """\
3679Build failed. For information on how to proceed, see \
3680http://wiki.example.org/Test_Failures
3681
3682- test1 http://logs.example.com/1/1/gate/test1/0 : FAILURE in 0s
3683- test2 http://logs.example.com/1/1/gate/test2/1 : SUCCESS in 0s
3684
3685For CI problems and help debugging, contact ci@example.org"""
3686
3687 success_body = """\
3688Build succeeded.
3689
3690- test1 http://logs.example.com/2/1/gate/test1/2 : SUCCESS in 0s
3691- test2 http://logs.example.com/2/1/gate/test2/3 : SUCCESS in 0s
3692
3693For CI problems and help debugging, contact ci@example.org"""
3694
3695 self.assertEqual(failure_body, self.smtp_messages[0]['body'])
3696 self.assertEqual(success_body, self.smtp_messages[1]['body'])
Joshua Heskethb7179772014-01-30 23:30:46 +11003697
James E. Blairec056492016-07-22 09:45:56 -07003698 @skip("Disabled for early v3 development")
Joshua Heskethb7179772014-01-30 23:30:46 +11003699 def test_merge_failure_reporters(self):
3700 """Check that the config is set up correctly"""
3701
James E. Blairf84026c2015-12-08 16:11:46 -08003702 self.updateConfigLayout(
3703 'tests/fixtures/layout-merge-failure.yaml')
Joshua Heskethb7179772014-01-30 23:30:46 +11003704 self.sched.reconfigure(self.config)
3705 self.registerJobs()
3706
3707 self.assertEqual(
Jeremy Stanley1c2c3c22015-06-15 21:23:19 +00003708 "Merge Failed.\n\nThis change or one of its cross-repo "
3709 "dependencies was unable to be automatically merged with the "
3710 "current state of its repository. Please rebase the change and "
3711 "upload a new patchset.",
Joshua Heskethb7179772014-01-30 23:30:46 +11003712 self.sched.layout.pipelines['check'].merge_failure_message)
3713 self.assertEqual(
3714 "The merge failed! For more information...",
3715 self.sched.layout.pipelines['gate'].merge_failure_message)
3716
3717 self.assertEqual(
3718 len(self.sched.layout.pipelines['check'].merge_failure_actions), 1)
3719 self.assertEqual(
3720 len(self.sched.layout.pipelines['gate'].merge_failure_actions), 2)
3721
3722 self.assertTrue(isinstance(
Joshua Heskethde958652015-11-10 19:19:50 +11003723 self.sched.layout.pipelines['check'].merge_failure_actions[0],
3724 zuul.reporter.gerrit.GerritReporter))
Joshua Heskethb7179772014-01-30 23:30:46 +11003725
3726 self.assertTrue(
3727 (
3728 isinstance(self.sched.layout.pipelines['gate'].
Joshua Heskethde958652015-11-10 19:19:50 +11003729 merge_failure_actions[0],
Joshua Heskethffe42062014-09-05 21:43:52 +10003730 zuul.reporter.smtp.SMTPReporter) and
Joshua Heskethb7179772014-01-30 23:30:46 +11003731 isinstance(self.sched.layout.pipelines['gate'].
Joshua Heskethde958652015-11-10 19:19:50 +11003732 merge_failure_actions[1],
Joshua Heskethffe42062014-09-05 21:43:52 +10003733 zuul.reporter.gerrit.GerritReporter)
Joshua Heskethb7179772014-01-30 23:30:46 +11003734 ) or (
3735 isinstance(self.sched.layout.pipelines['gate'].
Joshua Heskethde958652015-11-10 19:19:50 +11003736 merge_failure_actions[0],
Joshua Heskethffe42062014-09-05 21:43:52 +10003737 zuul.reporter.gerrit.GerritReporter) and
Joshua Heskethb7179772014-01-30 23:30:46 +11003738 isinstance(self.sched.layout.pipelines['gate'].
Joshua Heskethde958652015-11-10 19:19:50 +11003739 merge_failure_actions[1],
Joshua Heskethffe42062014-09-05 21:43:52 +10003740 zuul.reporter.smtp.SMTPReporter)
Joshua Heskethb7179772014-01-30 23:30:46 +11003741 )
3742 )
3743
James E. Blairec056492016-07-22 09:45:56 -07003744 @skip("Disabled for early v3 development")
Joshua Heskethb7179772014-01-30 23:30:46 +11003745 def test_merge_failure_reports(self):
3746 """Check that when a change fails to merge the correct message is sent
3747 to the correct reporter"""
James E. Blairf84026c2015-12-08 16:11:46 -08003748 self.updateConfigLayout(
3749 'tests/fixtures/layout-merge-failure.yaml')
Joshua Heskethb7179772014-01-30 23:30:46 +11003750 self.sched.reconfigure(self.config)
3751 self.registerJobs()
3752
3753 # Check a test failure isn't reported to SMTP
3754 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -07003755 A.addApproval('code-review', 2)
James E. Blair08d19992016-08-10 15:25:31 -07003756 self.launch_server.failJob('project-test1', A)
James E. Blair8b5408c2016-08-08 15:37:46 -07003757 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
Joshua Heskethb7179772014-01-30 23:30:46 +11003758 self.waitUntilSettled()
3759
3760 self.assertEqual(3, len(self.history)) # 3 jobs
3761 self.assertEqual(0, len(self.smtp_messages))
3762
3763 # Check a merge failure is reported to SMTP
3764 # B should be merged, but C will conflict with B
3765 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
3766 B.addPatchset(['conflict'])
3767 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
3768 C.addPatchset(['conflict'])
James E. Blair8b5408c2016-08-08 15:37:46 -07003769 B.addApproval('code-review', 2)
3770 C.addApproval('code-review', 2)
3771 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
3772 self.fake_gerrit.addEvent(C.addApproval('approved', 1))
Joshua Heskethb7179772014-01-30 23:30:46 +11003773 self.waitUntilSettled()
3774
3775 self.assertEqual(6, len(self.history)) # A and B jobs
3776 self.assertEqual(1, len(self.smtp_messages))
3777 self.assertEqual('The merge failed! For more information...',
3778 self.smtp_messages[0]['body'])
Joshua Hesketh36c3fa52014-01-22 11:40:52 +11003779
James E. Blairec056492016-07-22 09:45:56 -07003780 @skip("Disabled for early v3 development")
James E. Blairf760f0e2016-02-09 08:44:52 -08003781 def test_default_merge_failure_reports(self):
3782 """Check that the default merge failure reports are correct."""
3783
3784 # A should report success, B should report merge failure.
3785 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
3786 A.addPatchset(['conflict'])
3787 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
3788 B.addPatchset(['conflict'])
James E. Blair8b5408c2016-08-08 15:37:46 -07003789 A.addApproval('code-review', 2)
3790 B.addApproval('code-review', 2)
3791 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
3792 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
James E. Blairf760f0e2016-02-09 08:44:52 -08003793 self.waitUntilSettled()
3794
3795 self.assertEqual(3, len(self.history)) # A jobs
3796 self.assertEqual(A.reported, 2)
3797 self.assertEqual(B.reported, 2)
3798 self.assertEqual(A.data['status'], 'MERGED')
3799 self.assertEqual(B.data['status'], 'NEW')
3800 self.assertIn('Build succeeded', A.messages[1])
3801 self.assertIn('Merge Failed', B.messages[1])
3802 self.assertIn('automatically merged', B.messages[1])
3803 self.assertNotIn('logs.example.com', B.messages[1])
3804 self.assertNotIn('SKIPPED', B.messages[1])
3805
James E. Blairec056492016-07-22 09:45:56 -07003806 @skip("Disabled for early v3 development")
Joshua Hesketh36c3fa52014-01-22 11:40:52 +11003807 def test_swift_instructions(self):
3808 "Test that the correct swift instructions are sent to the workers"
James E. Blairf84026c2015-12-08 16:11:46 -08003809 self.updateConfigLayout(
3810 'tests/fixtures/layout-swift.yaml')
Joshua Hesketh36c3fa52014-01-22 11:40:52 +11003811 self.sched.reconfigure(self.config)
3812 self.registerJobs()
3813
James E. Blair08d19992016-08-10 15:25:31 -07003814 self.launch_server.hold_jobs_in_build = True
Joshua Hesketh36c3fa52014-01-22 11:40:52 +11003815 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
3816
James E. Blair8b5408c2016-08-08 15:37:46 -07003817 A.addApproval('code-review', 2)
3818 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
Joshua Hesketh36c3fa52014-01-22 11:40:52 +11003819 self.waitUntilSettled()
3820
3821 self.assertEqual(
3822 "https://storage.example.org/V1/AUTH_account/merge_logs/1/1/1/"
3823 "gate/test-merge/",
Joshua Hesketh76dee532014-07-03 15:39:13 +10003824 self.builds[0].parameters['SWIFT_logs_URL'][:-7])
Joshua Hesketh36c3fa52014-01-22 11:40:52 +11003825 self.assertEqual(5,
3826 len(self.builds[0].parameters['SWIFT_logs_HMAC_BODY'].
3827 split('\n')))
3828 self.assertIn('SWIFT_logs_SIGNATURE', self.builds[0].parameters)
3829
3830 self.assertEqual(
3831 "https://storage.example.org/V1/AUTH_account/logs/1/1/1/"
3832 "gate/test-test/",
Joshua Hesketh76dee532014-07-03 15:39:13 +10003833 self.builds[1].parameters['SWIFT_logs_URL'][:-7])
Joshua Hesketh36c3fa52014-01-22 11:40:52 +11003834 self.assertEqual(5,
3835 len(self.builds[1].parameters['SWIFT_logs_HMAC_BODY'].
3836 split('\n')))
3837 self.assertIn('SWIFT_logs_SIGNATURE', self.builds[1].parameters)
3838
3839 self.assertEqual(
3840 "https://storage.example.org/V1/AUTH_account/stash/1/1/1/"
3841 "gate/test-test/",
Joshua Hesketh76dee532014-07-03 15:39:13 +10003842 self.builds[1].parameters['SWIFT_MOSTLY_URL'][:-7])
Joshua Hesketh36c3fa52014-01-22 11:40:52 +11003843 self.assertEqual(5,
3844 len(self.builds[1].
3845 parameters['SWIFT_MOSTLY_HMAC_BODY'].split('\n')))
3846 self.assertIn('SWIFT_MOSTLY_SIGNATURE', self.builds[1].parameters)
3847
James E. Blair08d19992016-08-10 15:25:31 -07003848 self.launch_server.hold_jobs_in_build = False
3849 self.launch_server.release()
Joshua Hesketh36c3fa52014-01-22 11:40:52 +11003850 self.waitUntilSettled()
Joshua Hesketh85af4e92014-02-21 08:28:58 -08003851
James E. Blairec056492016-07-22 09:45:56 -07003852 @skip("Disabled for early v3 development")
Joshua Hesketh85af4e92014-02-21 08:28:58 -08003853 def test_client_get_running_jobs(self):
3854 "Test that the RPC client can get a list of running jobs"
James E. Blair08d19992016-08-10 15:25:31 -07003855 self.launch_server.hold_jobs_in_build = True
Joshua Hesketh85af4e92014-02-21 08:28:58 -08003856 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
James E. Blair8b5408c2016-08-08 15:37:46 -07003857 A.addApproval('code-review', 2)
3858 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
Joshua Hesketh85af4e92014-02-21 08:28:58 -08003859 self.waitUntilSettled()
3860
3861 client = zuul.rpcclient.RPCClient('127.0.0.1',
3862 self.gearman_server.port)
3863
3864 # Wait for gearman server to send the initial workData back to zuul
3865 start = time.time()
3866 while True:
3867 if time.time() - start > 10:
3868 raise Exception("Timeout waiting for gearman server to report "
3869 + "back to the client")
3870 build = self.launcher.builds.values()[0]
3871 if build.worker.name == "My Worker":
3872 break
3873 else:
3874 time.sleep(0)
3875
3876 running_items = client.get_running_jobs()
3877
3878 self.assertEqual(1, len(running_items))
3879 running_item = running_items[0]
3880 self.assertEqual([], running_item['failing_reasons'])
3881 self.assertEqual([], running_item['items_behind'])
3882 self.assertEqual('https://hostname/1', running_item['url'])
3883 self.assertEqual(None, running_item['item_ahead'])
3884 self.assertEqual('org/project', running_item['project'])
3885 self.assertEqual(None, running_item['remaining_time'])
3886 self.assertEqual(True, running_item['active'])
3887 self.assertEqual('1,1', running_item['id'])
3888
3889 self.assertEqual(3, len(running_item['jobs']))
3890 for job in running_item['jobs']:
3891 if job['name'] == 'project-merge':
3892 self.assertEqual('project-merge', job['name'])
3893 self.assertEqual('gate', job['pipeline'])
3894 self.assertEqual(False, job['retry'])
Joshua Hesketh85af4e92014-02-21 08:28:58 -08003895 self.assertEqual('https://server/job/project-merge/0/',
3896 job['url'])
3897 self.assertEqual(7, len(job['worker']))
3898 self.assertEqual(False, job['canceled'])
3899 self.assertEqual(True, job['voting'])
3900 self.assertEqual(None, job['result'])
3901 self.assertEqual('gate', job['pipeline'])
3902 break
3903
James E. Blair08d19992016-08-10 15:25:31 -07003904 self.launch_server.hold_jobs_in_build = False
3905 self.launch_server.release()
Joshua Hesketh85af4e92014-02-21 08:28:58 -08003906 self.waitUntilSettled()
3907
3908 running_items = client.get_running_jobs()
3909 self.assertEqual(0, len(running_items))
James E. Blairbadc1ad2014-04-28 13:55:14 -07003910
James E. Blairec056492016-07-22 09:45:56 -07003911 @skip("Disabled for early v3 development")
James E. Blairbadc1ad2014-04-28 13:55:14 -07003912 def test_nonvoting_pipeline(self):
3913 "Test that a nonvoting pipeline (experimental) can still report"
3914
Joshua Heskethcc017ea2014-04-30 19:55:25 +10003915 A = self.fake_gerrit.addFakeChange('org/experimental-project',
3916 'master', 'A')
James E. Blairbadc1ad2014-04-28 13:55:14 -07003917 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
3918 self.waitUntilSettled()
Joshua Heskethcc017ea2014-04-30 19:55:25 +10003919 self.assertEqual(
3920 self.getJobFromHistory('experimental-project-test').result,
3921 'SUCCESS')
James E. Blairbadc1ad2014-04-28 13:55:14 -07003922 self.assertEqual(A.reported, 1)
James E. Blair5ee24252014-12-30 10:12:29 -08003923
James E. Blairec056492016-07-22 09:45:56 -07003924 @skip("Disabled for early v3 development")
James E. Blair5ee24252014-12-30 10:12:29 -08003925 def test_crd_gate(self):
3926 "Test cross-repo dependencies"
3927 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
3928 B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
James E. Blair8b5408c2016-08-08 15:37:46 -07003929 A.addApproval('code-review', 2)
3930 B.addApproval('code-review', 2)
James E. Blair5ee24252014-12-30 10:12:29 -08003931
3932 AM2 = self.fake_gerrit.addFakeChange('org/project1', 'master', 'AM2')
3933 AM1 = self.fake_gerrit.addFakeChange('org/project1', 'master', 'AM1')
3934 AM2.setMerged()
3935 AM1.setMerged()
3936
3937 BM2 = self.fake_gerrit.addFakeChange('org/project2', 'master', 'BM2')
3938 BM1 = self.fake_gerrit.addFakeChange('org/project2', 'master', 'BM1')
3939 BM2.setMerged()
3940 BM1.setMerged()
3941
3942 # A -> AM1 -> AM2
3943 # B -> BM1 -> BM2
3944 # A Depends-On: B
3945 # M2 is here to make sure it is never queried. If it is, it
3946 # means zuul is walking down the entire history of merged
3947 # changes.
3948
3949 B.setDependsOn(BM1, 1)
3950 BM1.setDependsOn(BM2, 1)
3951
3952 A.setDependsOn(AM1, 1)
3953 AM1.setDependsOn(AM2, 1)
3954
3955 A.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
3956 A.subject, B.data['id'])
3957
James E. Blair8b5408c2016-08-08 15:37:46 -07003958 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair5ee24252014-12-30 10:12:29 -08003959 self.waitUntilSettled()
3960
3961 self.assertEqual(A.data['status'], 'NEW')
3962 self.assertEqual(B.data['status'], 'NEW')
3963
Joshua Hesketh4bd7da32016-02-17 20:58:47 +11003964 for connection in self.connections.values():
3965 connection.maintainCache([])
James E. Blair5ee24252014-12-30 10:12:29 -08003966
James E. Blair08d19992016-08-10 15:25:31 -07003967 self.launch_server.hold_jobs_in_build = True
James E. Blair8b5408c2016-08-08 15:37:46 -07003968 B.addApproval('approved', 1)
3969 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair5ee24252014-12-30 10:12:29 -08003970 self.waitUntilSettled()
3971
James E. Blair08d19992016-08-10 15:25:31 -07003972 self.launch_server.release('.*-merge')
James E. Blair5ee24252014-12-30 10:12:29 -08003973 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07003974 self.launch_server.release('.*-merge')
James E. Blair5ee24252014-12-30 10:12:29 -08003975 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07003976 self.launch_server.hold_jobs_in_build = False
3977 self.launch_server.release()
James E. Blair5ee24252014-12-30 10:12:29 -08003978 self.waitUntilSettled()
3979
3980 self.assertEqual(AM2.queried, 0)
3981 self.assertEqual(BM2.queried, 0)
3982 self.assertEqual(A.data['status'], 'MERGED')
3983 self.assertEqual(B.data['status'], 'MERGED')
3984 self.assertEqual(A.reported, 2)
3985 self.assertEqual(B.reported, 2)
3986
James E. Blair8f78d882015-02-05 08:51:37 -08003987 self.assertEqual(self.getJobFromHistory('project1-merge').changes,
3988 '2,1 1,1')
3989
James E. Blairec056492016-07-22 09:45:56 -07003990 @skip("Disabled for early v3 development")
James E. Blair8f78d882015-02-05 08:51:37 -08003991 def test_crd_branch(self):
3992 "Test cross-repo dependencies in multiple branches"
3993 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
3994 B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
3995 C = self.fake_gerrit.addFakeChange('org/project2', 'mp', 'C')
3996 C.data['id'] = B.data['id']
James E. Blair8b5408c2016-08-08 15:37:46 -07003997 A.addApproval('code-review', 2)
3998 B.addApproval('code-review', 2)
3999 C.addApproval('code-review', 2)
James E. Blair8f78d882015-02-05 08:51:37 -08004000
4001 # A Depends-On: B+C
4002 A.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
4003 A.subject, B.data['id'])
4004
James E. Blair08d19992016-08-10 15:25:31 -07004005 self.launch_server.hold_jobs_in_build = True
James E. Blair8b5408c2016-08-08 15:37:46 -07004006 B.addApproval('approved', 1)
4007 C.addApproval('approved', 1)
4008 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair8f78d882015-02-05 08:51:37 -08004009 self.waitUntilSettled()
4010
James E. Blair08d19992016-08-10 15:25:31 -07004011 self.launch_server.release('.*-merge')
James E. Blair8f78d882015-02-05 08:51:37 -08004012 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07004013 self.launch_server.release('.*-merge')
James E. Blair8f78d882015-02-05 08:51:37 -08004014 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07004015 self.launch_server.release('.*-merge')
James E. Blair8f78d882015-02-05 08:51:37 -08004016 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07004017 self.launch_server.hold_jobs_in_build = False
4018 self.launch_server.release()
James E. Blair8f78d882015-02-05 08:51:37 -08004019 self.waitUntilSettled()
4020
4021 self.assertEqual(A.data['status'], 'MERGED')
4022 self.assertEqual(B.data['status'], 'MERGED')
4023 self.assertEqual(C.data['status'], 'MERGED')
4024 self.assertEqual(A.reported, 2)
4025 self.assertEqual(B.reported, 2)
4026 self.assertEqual(C.reported, 2)
4027
4028 self.assertEqual(self.getJobFromHistory('project1-merge').changes,
4029 '2,1 3,1 1,1')
4030
James E. Blairec056492016-07-22 09:45:56 -07004031 @skip("Disabled for early v3 development")
James E. Blair8f78d882015-02-05 08:51:37 -08004032 def test_crd_multiline(self):
4033 "Test multiple depends-on lines in commit"
4034 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
4035 B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
4036 C = self.fake_gerrit.addFakeChange('org/project2', 'master', 'C')
James E. Blair8b5408c2016-08-08 15:37:46 -07004037 A.addApproval('code-review', 2)
4038 B.addApproval('code-review', 2)
4039 C.addApproval('code-review', 2)
James E. Blair8f78d882015-02-05 08:51:37 -08004040
4041 # A Depends-On: B+C
4042 A.data['commitMessage'] = '%s\n\nDepends-On: %s\nDepends-On: %s\n' % (
4043 A.subject, B.data['id'], C.data['id'])
4044
James E. Blair08d19992016-08-10 15:25:31 -07004045 self.launch_server.hold_jobs_in_build = True
James E. Blair8b5408c2016-08-08 15:37:46 -07004046 B.addApproval('approved', 1)
4047 C.addApproval('approved', 1)
4048 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair8f78d882015-02-05 08:51:37 -08004049 self.waitUntilSettled()
4050
James E. Blair08d19992016-08-10 15:25:31 -07004051 self.launch_server.release('.*-merge')
James E. Blair8f78d882015-02-05 08:51:37 -08004052 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07004053 self.launch_server.release('.*-merge')
James E. Blair8f78d882015-02-05 08:51:37 -08004054 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07004055 self.launch_server.release('.*-merge')
James E. Blair8f78d882015-02-05 08:51:37 -08004056 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07004057 self.launch_server.hold_jobs_in_build = False
4058 self.launch_server.release()
James E. Blair8f78d882015-02-05 08:51:37 -08004059 self.waitUntilSettled()
4060
4061 self.assertEqual(A.data['status'], 'MERGED')
4062 self.assertEqual(B.data['status'], 'MERGED')
4063 self.assertEqual(C.data['status'], 'MERGED')
4064 self.assertEqual(A.reported, 2)
4065 self.assertEqual(B.reported, 2)
4066 self.assertEqual(C.reported, 2)
4067
4068 self.assertEqual(self.getJobFromHistory('project1-merge').changes,
4069 '2,1 3,1 1,1')
James E. Blair5ee24252014-12-30 10:12:29 -08004070
James E. Blairec056492016-07-22 09:45:56 -07004071 @skip("Disabled for early v3 development")
James E. Blair5ee24252014-12-30 10:12:29 -08004072 def test_crd_unshared_gate(self):
4073 "Test cross-repo dependencies in unshared gate queues"
4074 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
4075 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
James E. Blair8b5408c2016-08-08 15:37:46 -07004076 A.addApproval('code-review', 2)
4077 B.addApproval('code-review', 2)
James E. Blair5ee24252014-12-30 10:12:29 -08004078
4079 # A Depends-On: B
4080 A.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
4081 A.subject, B.data['id'])
4082
4083 # A and B do not share a queue, make sure that A is unable to
4084 # enqueue B (and therefore, A is unable to be enqueued).
James E. Blair8b5408c2016-08-08 15:37:46 -07004085 B.addApproval('approved', 1)
4086 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair5ee24252014-12-30 10:12:29 -08004087 self.waitUntilSettled()
4088
4089 self.assertEqual(A.data['status'], 'NEW')
4090 self.assertEqual(B.data['status'], 'NEW')
4091 self.assertEqual(A.reported, 0)
4092 self.assertEqual(B.reported, 0)
4093 self.assertEqual(len(self.history), 0)
4094
4095 # Enqueue and merge B alone.
James E. Blair8b5408c2016-08-08 15:37:46 -07004096 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
James E. Blair5ee24252014-12-30 10:12:29 -08004097 self.waitUntilSettled()
4098
4099 self.assertEqual(B.data['status'], 'MERGED')
4100 self.assertEqual(B.reported, 2)
4101
4102 # Now that B is merged, A should be able to be enqueued and
4103 # merged.
James E. Blair8b5408c2016-08-08 15:37:46 -07004104 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair5ee24252014-12-30 10:12:29 -08004105 self.waitUntilSettled()
4106
4107 self.assertEqual(A.data['status'], 'MERGED')
4108 self.assertEqual(A.reported, 2)
4109
James E. Blairec056492016-07-22 09:45:56 -07004110 @skip("Disabled for early v3 development")
James E. Blair96698e22015-04-02 07:48:21 -07004111 def test_crd_gate_reverse(self):
4112 "Test reverse cross-repo dependencies"
4113 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
4114 B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
James E. Blair8b5408c2016-08-08 15:37:46 -07004115 A.addApproval('code-review', 2)
4116 B.addApproval('code-review', 2)
James E. Blair96698e22015-04-02 07:48:21 -07004117
4118 # A Depends-On: B
4119
4120 A.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
4121 A.subject, B.data['id'])
4122
James E. Blair8b5408c2016-08-08 15:37:46 -07004123 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair96698e22015-04-02 07:48:21 -07004124 self.waitUntilSettled()
4125
4126 self.assertEqual(A.data['status'], 'NEW')
4127 self.assertEqual(B.data['status'], 'NEW')
4128
James E. Blair08d19992016-08-10 15:25:31 -07004129 self.launch_server.hold_jobs_in_build = True
James E. Blair8b5408c2016-08-08 15:37:46 -07004130 A.addApproval('approved', 1)
4131 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
James E. Blair96698e22015-04-02 07:48:21 -07004132 self.waitUntilSettled()
4133
James E. Blair08d19992016-08-10 15:25:31 -07004134 self.launch_server.release('.*-merge')
James E. Blair96698e22015-04-02 07:48:21 -07004135 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07004136 self.launch_server.release('.*-merge')
James E. Blair96698e22015-04-02 07:48:21 -07004137 self.waitUntilSettled()
James E. Blair08d19992016-08-10 15:25:31 -07004138 self.launch_server.hold_jobs_in_build = False
4139 self.launch_server.release()
James E. Blair96698e22015-04-02 07:48:21 -07004140 self.waitUntilSettled()
4141
4142 self.assertEqual(A.data['status'], 'MERGED')
4143 self.assertEqual(B.data['status'], 'MERGED')
4144 self.assertEqual(A.reported, 2)
4145 self.assertEqual(B.reported, 2)
4146
4147 self.assertEqual(self.getJobFromHistory('project1-merge').changes,
4148 '2,1 1,1')
4149
James E. Blairec056492016-07-22 09:45:56 -07004150 @skip("Disabled for early v3 development")
James E. Blair5ee24252014-12-30 10:12:29 -08004151 def test_crd_cycle(self):
4152 "Test cross-repo dependency cycles"
4153 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
4154 B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
James E. Blair8b5408c2016-08-08 15:37:46 -07004155 A.addApproval('code-review', 2)
4156 B.addApproval('code-review', 2)
James E. Blair5ee24252014-12-30 10:12:29 -08004157
4158 # A -> B -> A (via commit-depends)
4159
4160 A.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
4161 A.subject, B.data['id'])
4162 B.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
4163 B.subject, A.data['id'])
4164
James E. Blair8b5408c2016-08-08 15:37:46 -07004165 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
James E. Blair5ee24252014-12-30 10:12:29 -08004166 self.waitUntilSettled()
4167
4168 self.assertEqual(A.reported, 0)
4169 self.assertEqual(B.reported, 0)
4170 self.assertEqual(A.data['status'], 'NEW')
4171 self.assertEqual(B.data['status'], 'NEW')
James E. Blairbfb8e042014-12-30 17:01:44 -08004172
James E. Blairec056492016-07-22 09:45:56 -07004173 @skip("Disabled for early v3 development")
Evgeny Antyshev0deaaad2015-08-03 20:22:56 +00004174 def test_crd_gate_unknown(self):
4175 "Test unknown projects in dependent pipeline"
4176 self.init_repo("org/unknown")
4177 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
4178 B = self.fake_gerrit.addFakeChange('org/unknown', 'master', 'B')
James E. Blair8b5408c2016-08-08 15:37:46 -07004179 A.addApproval('code-review', 2)
4180 B.addApproval('code-review', 2)
Evgeny Antyshev0deaaad2015-08-03 20:22:56 +00004181
4182 # A Depends-On: B
4183 A.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
4184 A.subject, B.data['id'])
4185
James E. Blair8b5408c2016-08-08 15:37:46 -07004186 B.addApproval('approved', 1)
4187 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
Evgeny Antyshev0deaaad2015-08-03 20:22:56 +00004188 self.waitUntilSettled()
4189
4190 # Unknown projects cannot share a queue with any other
4191 # since they don't have common jobs with any other (they have no jobs).
4192 # Changes which depend on unknown project changes
4193 # should not be processed in dependent pipeline
4194 self.assertEqual(A.data['status'], 'NEW')
4195 self.assertEqual(B.data['status'], 'NEW')
4196 self.assertEqual(A.reported, 0)
4197 self.assertEqual(B.reported, 0)
4198 self.assertEqual(len(self.history), 0)
4199
4200 # Simulate change B being gated outside this layout
James E. Blair8b5408c2016-08-08 15:37:46 -07004201 self.fake_gerrit.addEvent(B.addApproval('approved', 1))
Evgeny Antyshev0deaaad2015-08-03 20:22:56 +00004202 B.setMerged()
4203 self.waitUntilSettled()
4204 self.assertEqual(len(self.history), 0)
4205
4206 # Now that B is merged, A should be able to be enqueued and
4207 # merged.
James E. Blair8b5408c2016-08-08 15:37:46 -07004208 self.fake_gerrit.addEvent(A.addApproval('approved', 1))
Evgeny Antyshev0deaaad2015-08-03 20:22:56 +00004209 self.waitUntilSettled()
4210
4211 self.assertEqual(A.data['status'], 'MERGED')
4212 self.assertEqual(A.reported, 2)
4213 self.assertEqual(B.data['status'], 'MERGED')
4214 self.assertEqual(B.reported, 0)
4215
James E. Blairec056492016-07-22 09:45:56 -07004216 @skip("Disabled for early v3 development")
James E. Blairbfb8e042014-12-30 17:01:44 -08004217 def test_crd_check(self):
4218 "Test cross-repo dependencies in independent pipelines"
4219
4220 self.gearman_server.hold_jobs_in_queue = True
4221 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
4222 B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
4223
4224 # A Depends-On: B
4225 A.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
4226 A.subject, B.data['id'])
4227
4228 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
4229 self.waitUntilSettled()
4230
4231 queue = self.gearman_server.getQueue()
4232 ref = self.getParameter(queue[-1], 'ZUUL_REF')
4233 self.gearman_server.hold_jobs_in_queue = False
4234 self.gearman_server.release()
4235 self.waitUntilSettled()
4236
4237 path = os.path.join(self.git_root, "org/project1")
4238 repo = git.Repo(path)
4239 repo_messages = [c.message.strip() for c in repo.iter_commits(ref)]
4240 repo_messages.reverse()
4241 correct_messages = ['initial commit', 'A-1']
4242 self.assertEqual(repo_messages, correct_messages)
4243
4244 path = os.path.join(self.git_root, "org/project2")
4245 repo = git.Repo(path)
4246 repo_messages = [c.message.strip() for c in repo.iter_commits(ref)]
4247 repo_messages.reverse()
4248 correct_messages = ['initial commit', 'B-1']
4249 self.assertEqual(repo_messages, correct_messages)
4250
4251 self.assertEqual(A.data['status'], 'NEW')
4252 self.assertEqual(B.data['status'], 'NEW')
4253 self.assertEqual(A.reported, 1)
4254 self.assertEqual(B.reported, 0)
4255
4256 self.assertEqual(self.history[0].changes, '2,1 1,1')
4257 self.assertEqual(len(self.sched.layout.pipelines['check'].queues), 0)
James E. Blair8f78d882015-02-05 08:51:37 -08004258
James E. Blairec056492016-07-22 09:45:56 -07004259 @skip("Disabled for early v3 development")
James E. Blairdbfe1cd2015-02-07 11:41:19 -08004260 def test_crd_check_git_depends(self):
4261 "Test single-repo dependencies in independent pipelines"
James E. Blairb8c16472015-05-05 14:55:26 -07004262 self.gearman_server.hold_jobs_in_build = True
James E. Blairdbfe1cd2015-02-07 11:41:19 -08004263 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
4264 B = self.fake_gerrit.addFakeChange('org/project1', 'master', 'B')
4265
4266 # Add two git-dependent changes and make sure they both report
4267 # success.
4268 B.setDependsOn(A, 1)
4269 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
4270 self.waitUntilSettled()
4271 self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
4272 self.waitUntilSettled()
4273
James E. Blairb8c16472015-05-05 14:55:26 -07004274 self.orderedRelease()
4275 self.gearman_server.hold_jobs_in_build = False
James E. Blairdbfe1cd2015-02-07 11:41:19 -08004276 self.waitUntilSettled()
4277
4278 self.assertEqual(A.data['status'], 'NEW')
4279 self.assertEqual(B.data['status'], 'NEW')
4280 self.assertEqual(A.reported, 1)
4281 self.assertEqual(B.reported, 1)
4282
4283 self.assertEqual(self.history[0].changes, '1,1')
4284 self.assertEqual(self.history[-1].changes, '1,1 2,1')
4285 self.assertEqual(len(self.sched.layout.pipelines['check'].queues), 0)
4286
4287 self.assertIn('Build succeeded', A.messages[0])
4288 self.assertIn('Build succeeded', B.messages[0])
4289
James E. Blairec056492016-07-22 09:45:56 -07004290 @skip("Disabled for early v3 development")
James E. Blairdbfe1cd2015-02-07 11:41:19 -08004291 def test_crd_check_duplicate(self):
4292 "Test duplicate check in independent pipelines"
James E. Blair08d19992016-08-10 15:25:31 -07004293 self.launch_server.hold_jobs_in_build = True
James E. Blairdbfe1cd2015-02-07 11:41:19 -08004294 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
4295 B = self.fake_gerrit.addFakeChange('org/project1', 'master', 'B')
4296 check_pipeline = self.sched.layout.pipelines['check']
4297
4298 # Add two git-dependent changes...
4299 B.setDependsOn(A, 1)
4300 self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
4301 self.waitUntilSettled()
4302 self.assertEqual(len(check_pipeline.getAllItems()), 2)
4303
4304 # ...make sure the live one is not duplicated...
4305 self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
4306 self.waitUntilSettled()
4307 self.assertEqual(len(check_pipeline.getAllItems()), 2)
4308
4309 # ...but the non-live one is able to be.
4310 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
4311 self.waitUntilSettled()
4312 self.assertEqual(len(check_pipeline.getAllItems()), 3)
4313
Clark Boylandd849822015-03-02 12:38:14 -08004314 # Release jobs in order to avoid races with change A jobs
4315 # finishing before change B jobs.
James E. Blaird7650852015-05-07 15:47:37 -07004316 self.orderedRelease()
James E. Blair08d19992016-08-10 15:25:31 -07004317 self.launch_server.hold_jobs_in_build = False
4318 self.launch_server.release()
James E. Blairdbfe1cd2015-02-07 11:41:19 -08004319 self.waitUntilSettled()
4320
4321 self.assertEqual(A.data['status'], 'NEW')
4322 self.assertEqual(B.data['status'], 'NEW')
4323 self.assertEqual(A.reported, 1)
4324 self.assertEqual(B.reported, 1)
4325
4326 self.assertEqual(self.history[0].changes, '1,1 2,1')
4327 self.assertEqual(self.history[1].changes, '1,1')
4328 self.assertEqual(len(self.sched.layout.pipelines['check'].queues), 0)
4329
4330 self.assertIn('Build succeeded', A.messages[0])
4331 self.assertIn('Build succeeded', B.messages[0])
4332
James E. Blairec056492016-07-22 09:45:56 -07004333 @skip("Disabled for early v3 development")
Evgeny Antyshev0deaaad2015-08-03 20:22:56 +00004334 def _test_crd_check_reconfiguration(self, project1, project2):
James E. Blair8f78d882015-02-05 08:51:37 -08004335 "Test cross-repo dependencies re-enqueued in independent pipelines"
4336
4337 self.gearman_server.hold_jobs_in_queue = True
Evgeny Antyshev0deaaad2015-08-03 20:22:56 +00004338 A = self.fake_gerrit.addFakeChange(project1, 'master', 'A')
4339 B = self.fake_gerrit.addFakeChange(project2, 'master', 'B')
James E. Blair8f78d882015-02-05 08:51:37 -08004340
4341 # A Depends-On: B
4342 A.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
4343 A.subject, B.data['id'])
4344
4345 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
4346 self.waitUntilSettled()
4347
4348 self.sched.reconfigure(self.config)
4349
4350 # Make sure the items still share a change queue, and the
4351 # first one is not live.
4352 self.assertEqual(len(self.sched.layout.pipelines['check'].queues), 1)
4353 queue = self.sched.layout.pipelines['check'].queues[0]
4354 first_item = queue.queue[0]
4355 for item in queue.queue:
4356 self.assertEqual(item.queue, first_item.queue)
4357 self.assertFalse(first_item.live)
4358 self.assertTrue(queue.queue[1].live)
4359
4360 self.gearman_server.hold_jobs_in_queue = False
4361 self.gearman_server.release()
4362 self.waitUntilSettled()
4363
4364 self.assertEqual(A.data['status'], 'NEW')
4365 self.assertEqual(B.data['status'], 'NEW')
4366 self.assertEqual(A.reported, 1)
4367 self.assertEqual(B.reported, 0)
4368
4369 self.assertEqual(self.history[0].changes, '2,1 1,1')
4370 self.assertEqual(len(self.sched.layout.pipelines['check'].queues), 0)
James E. Blair17dd6772015-02-09 14:45:18 -08004371
James E. Blairec056492016-07-22 09:45:56 -07004372 @skip("Disabled for early v3 development")
Evgeny Antyshev0deaaad2015-08-03 20:22:56 +00004373 def test_crd_check_reconfiguration(self):
4374 self._test_crd_check_reconfiguration('org/project1', 'org/project2')
4375
James E. Blairec056492016-07-22 09:45:56 -07004376 @skip("Disabled for early v3 development")
Evgeny Antyshev0deaaad2015-08-03 20:22:56 +00004377 def test_crd_undefined_project(self):
4378 """Test that undefined projects in dependencies are handled for
4379 independent pipelines"""
4380 # It's a hack for fake gerrit,
4381 # as it implies repo creation upon the creation of any change
4382 self.init_repo("org/unknown")
4383 self._test_crd_check_reconfiguration('org/project1', 'org/unknown')
4384
James E. Blairec056492016-07-22 09:45:56 -07004385 @skip("Disabled for early v3 development")
James E. Blair17dd6772015-02-09 14:45:18 -08004386 def test_crd_check_ignore_dependencies(self):
4387 "Test cross-repo dependencies can be ignored"
James E. Blairf84026c2015-12-08 16:11:46 -08004388 self.updateConfigLayout(
4389 'tests/fixtures/layout-ignore-dependencies.yaml')
James E. Blair17dd6772015-02-09 14:45:18 -08004390 self.sched.reconfigure(self.config)
4391 self.registerJobs()
4392
4393 self.gearman_server.hold_jobs_in_queue = True
4394 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
4395 B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
4396 C = self.fake_gerrit.addFakeChange('org/project2', 'master', 'C')
4397
4398 # A Depends-On: B
4399 A.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
4400 A.subject, B.data['id'])
4401 # C git-depends on B
4402 C.setDependsOn(B, 1)
4403 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
4404 self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
4405 self.fake_gerrit.addEvent(C.getPatchsetCreatedEvent(1))
4406 self.waitUntilSettled()
4407
4408 # Make sure none of the items share a change queue, and all
4409 # are live.
4410 check_pipeline = self.sched.layout.pipelines['check']
4411 self.assertEqual(len(check_pipeline.queues), 3)
4412 self.assertEqual(len(check_pipeline.getAllItems()), 3)
4413 for item in check_pipeline.getAllItems():
4414 self.assertTrue(item.live)
4415
4416 self.gearman_server.hold_jobs_in_queue = False
4417 self.gearman_server.release()
4418 self.waitUntilSettled()
4419
4420 self.assertEqual(A.data['status'], 'NEW')
4421 self.assertEqual(B.data['status'], 'NEW')
4422 self.assertEqual(C.data['status'], 'NEW')
4423 self.assertEqual(A.reported, 1)
4424 self.assertEqual(B.reported, 1)
4425 self.assertEqual(C.reported, 1)
4426
4427 # Each job should have tested exactly one change
4428 for job in self.history:
4429 self.assertEqual(len(job.changes.split()), 1)
James E. Blair96698e22015-04-02 07:48:21 -07004430
James E. Blairec056492016-07-22 09:45:56 -07004431 @skip("Disabled for early v3 development")
James E. Blair96698e22015-04-02 07:48:21 -07004432 def test_crd_check_transitive(self):
4433 "Test transitive cross-repo dependencies"
4434 # Specifically, if A -> B -> C, and C gets a new patchset and
4435 # A gets a new patchset, ensure the test of A,2 includes B,1
4436 # and C,2 (not C,1 which would indicate stale data in the
4437 # cache for B).
4438 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
4439 B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
4440 C = self.fake_gerrit.addFakeChange('org/project3', 'master', 'C')
4441
4442 # A Depends-On: B
4443 A.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
4444 A.subject, B.data['id'])
4445
4446 # B Depends-On: C
4447 B.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
4448 B.subject, C.data['id'])
4449
4450 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
4451 self.waitUntilSettled()
4452 self.assertEqual(self.history[-1].changes, '3,1 2,1 1,1')
4453
4454 self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
4455 self.waitUntilSettled()
4456 self.assertEqual(self.history[-1].changes, '3,1 2,1')
4457
4458 self.fake_gerrit.addEvent(C.getPatchsetCreatedEvent(1))
4459 self.waitUntilSettled()
4460 self.assertEqual(self.history[-1].changes, '3,1')
4461
4462 C.addPatchset()
4463 self.fake_gerrit.addEvent(C.getPatchsetCreatedEvent(2))
4464 self.waitUntilSettled()
4465 self.assertEqual(self.history[-1].changes, '3,2')
4466
4467 A.addPatchset()
4468 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(2))
4469 self.waitUntilSettled()
4470 self.assertEqual(self.history[-1].changes, '3,2 2,1 1,2')
Joshua Hesketh89e829d2015-02-10 16:29:45 +11004471
James E. Blairec056492016-07-22 09:45:56 -07004472 @skip("Disabled for early v3 development")
James E. Blaira8b90b32016-08-24 15:18:50 -07004473 def test_crd_check_unknown(self):
4474 "Test unknown projects in independent pipeline"
4475 self.init_repo("org/unknown")
4476 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
4477 B = self.fake_gerrit.addFakeChange('org/unknown', 'master', 'D')
4478 # A Depends-On: B
4479 A.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
4480 A.subject, B.data['id'])
4481
4482 # Make sure zuul has seen an event on B.
4483 self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
4484 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
4485 self.waitUntilSettled()
4486
4487 self.assertEqual(A.data['status'], 'NEW')
4488 self.assertEqual(A.reported, 1)
4489 self.assertEqual(B.data['status'], 'NEW')
4490 self.assertEqual(B.reported, 0)
4491
Joshua Heskethefeeb6d2016-09-20 14:42:37 +02004492 @skip("Disabled for early v3 development")
James E. Blair92464a22016-04-05 10:21:26 -07004493 def test_crd_cycle_join(self):
4494 "Test an updated change creates a cycle"
4495 A = self.fake_gerrit.addFakeChange('org/project2', 'master', 'A')
4496
4497 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
4498 self.waitUntilSettled()
4499
4500 # Create B->A
4501 B = self.fake_gerrit.addFakeChange('org/project1', 'master', 'B')
4502 B.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
4503 B.subject, A.data['id'])
4504 self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
4505 self.waitUntilSettled()
4506
4507 # Update A to add A->B (a cycle).
4508 A.addPatchset()
4509 A.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
4510 A.subject, B.data['id'])
4511 # Normally we would submit the patchset-created event for
4512 # processing here, however, we have no way of noting whether
4513 # the dependency cycle detection correctly raised an
4514 # exception, so instead, we reach into the source driver and
4515 # call the method that would ultimately be called by the event
4516 # processing.
4517
4518 source = self.sched.layout.pipelines['gate'].source
4519 with testtools.ExpectedException(
4520 Exception, "Dependency cycle detected"):
4521 source._getChange(u'1', u'2', True)
4522 self.log.debug("Got expected dependency cycle exception")
4523
4524 # Now if we update B to remove the depends-on, everything
4525 # should be okay. B; A->B
4526
4527 B.addPatchset()
4528 B.data['commitMessage'] = '%s\n' % (B.subject,)
4529 source._getChange(u'1', u'2', True)
4530 source._getChange(u'2', u'2', True)
4531
James E. Blairec056492016-07-22 09:45:56 -07004532 @skip("Disabled for early v3 development")
Joshua Hesketh89e829d2015-02-10 16:29:45 +11004533 def test_disable_at(self):
4534 "Test a pipeline will only report to the disabled trigger when failing"
4535
James E. Blairf84026c2015-12-08 16:11:46 -08004536 self.updateConfigLayout(
4537 'tests/fixtures/layout-disable-at.yaml')
Joshua Hesketh89e829d2015-02-10 16:29:45 +11004538 self.sched.reconfigure(self.config)
4539
4540 self.assertEqual(3, self.sched.layout.pipelines['check'].disable_at)
4541 self.assertEqual(
4542 0, self.sched.layout.pipelines['check']._consecutive_failures)
4543 self.assertFalse(self.sched.layout.pipelines['check']._disabled)
4544
4545 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
4546 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
4547 C = self.fake_gerrit.addFakeChange('org/project', 'master', 'C')
4548 D = self.fake_gerrit.addFakeChange('org/project', 'master', 'D')
4549 E = self.fake_gerrit.addFakeChange('org/project', 'master', 'E')
4550 F = self.fake_gerrit.addFakeChange('org/project', 'master', 'F')
4551 G = self.fake_gerrit.addFakeChange('org/project', 'master', 'G')
4552 H = self.fake_gerrit.addFakeChange('org/project', 'master', 'H')
4553 I = self.fake_gerrit.addFakeChange('org/project', 'master', 'I')
4554 J = self.fake_gerrit.addFakeChange('org/project', 'master', 'J')
4555 K = self.fake_gerrit.addFakeChange('org/project', 'master', 'K')
4556
James E. Blair08d19992016-08-10 15:25:31 -07004557 self.launch_server.failJob('project-test1', A)
4558 self.launch_server.failJob('project-test1', B)
Joshua Hesketh89e829d2015-02-10 16:29:45 +11004559 # Let C pass, resetting the counter
James E. Blair08d19992016-08-10 15:25:31 -07004560 self.launch_server.failJob('project-test1', D)
4561 self.launch_server.failJob('project-test1', E)
4562 self.launch_server.failJob('project-test1', F)
4563 self.launch_server.failJob('project-test1', G)
4564 self.launch_server.failJob('project-test1', H)
Joshua Hesketh89e829d2015-02-10 16:29:45 +11004565 # I also passes but should only report to the disabled reporters
James E. Blair08d19992016-08-10 15:25:31 -07004566 self.launch_server.failJob('project-test1', J)
4567 self.launch_server.failJob('project-test1', K)
Joshua Hesketh89e829d2015-02-10 16:29:45 +11004568
4569 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
4570 self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
4571 self.waitUntilSettled()
4572
4573 self.assertEqual(
4574 2, self.sched.layout.pipelines['check']._consecutive_failures)
4575 self.assertFalse(self.sched.layout.pipelines['check']._disabled)
4576
4577 self.fake_gerrit.addEvent(C.getPatchsetCreatedEvent(1))
4578 self.waitUntilSettled()
4579
4580 self.assertEqual(
4581 0, self.sched.layout.pipelines['check']._consecutive_failures)
4582 self.assertFalse(self.sched.layout.pipelines['check']._disabled)
4583
4584 self.fake_gerrit.addEvent(D.getPatchsetCreatedEvent(1))
4585 self.fake_gerrit.addEvent(E.getPatchsetCreatedEvent(1))
4586 self.fake_gerrit.addEvent(F.getPatchsetCreatedEvent(1))
4587 self.waitUntilSettled()
4588
4589 # We should be disabled now
4590 self.assertEqual(
4591 3, self.sched.layout.pipelines['check']._consecutive_failures)
4592 self.assertTrue(self.sched.layout.pipelines['check']._disabled)
4593
4594 # We need to wait between each of these patches to make sure the
4595 # smtp messages come back in an expected order
4596 self.fake_gerrit.addEvent(G.getPatchsetCreatedEvent(1))
4597 self.waitUntilSettled()
4598 self.fake_gerrit.addEvent(H.getPatchsetCreatedEvent(1))
4599 self.waitUntilSettled()
4600 self.fake_gerrit.addEvent(I.getPatchsetCreatedEvent(1))
4601 self.waitUntilSettled()
4602
4603 # The first 6 (ABCDEF) jobs should have reported back to gerrt thus
4604 # leaving a message on each change
4605 self.assertEqual(1, len(A.messages))
4606 self.assertIn('Build failed.', A.messages[0])
4607 self.assertEqual(1, len(B.messages))
4608 self.assertIn('Build failed.', B.messages[0])
4609 self.assertEqual(1, len(C.messages))
4610 self.assertIn('Build succeeded.', C.messages[0])
4611 self.assertEqual(1, len(D.messages))
4612 self.assertIn('Build failed.', D.messages[0])
4613 self.assertEqual(1, len(E.messages))
4614 self.assertIn('Build failed.', E.messages[0])
4615 self.assertEqual(1, len(F.messages))
4616 self.assertIn('Build failed.', F.messages[0])
4617
4618 # The last 3 (GHI) would have only reported via smtp.
4619 self.assertEqual(3, len(self.smtp_messages))
4620 self.assertEqual(0, len(G.messages))
4621 self.assertIn('Build failed.', self.smtp_messages[0]['body'])
4622 self.assertIn('/7/1/check', self.smtp_messages[0]['body'])
4623 self.assertEqual(0, len(H.messages))
4624 self.assertIn('Build failed.', self.smtp_messages[1]['body'])
4625 self.assertIn('/8/1/check', self.smtp_messages[1]['body'])
4626 self.assertEqual(0, len(I.messages))
4627 self.assertIn('Build succeeded.', self.smtp_messages[2]['body'])
4628 self.assertIn('/9/1/check', self.smtp_messages[2]['body'])
4629
4630 # Now reload the configuration (simulate a HUP) to check the pipeline
4631 # comes out of disabled
4632 self.sched.reconfigure(self.config)
4633
4634 self.assertEqual(3, self.sched.layout.pipelines['check'].disable_at)
4635 self.assertEqual(
4636 0, self.sched.layout.pipelines['check']._consecutive_failures)
4637 self.assertFalse(self.sched.layout.pipelines['check']._disabled)
4638
4639 self.fake_gerrit.addEvent(J.getPatchsetCreatedEvent(1))
4640 self.fake_gerrit.addEvent(K.getPatchsetCreatedEvent(1))
4641 self.waitUntilSettled()
4642
4643 self.assertEqual(
4644 2, self.sched.layout.pipelines['check']._consecutive_failures)
4645 self.assertFalse(self.sched.layout.pipelines['check']._disabled)
4646
4647 # J and K went back to gerrit
4648 self.assertEqual(1, len(J.messages))
4649 self.assertIn('Build failed.', J.messages[0])
4650 self.assertEqual(1, len(K.messages))
4651 self.assertIn('Build failed.', K.messages[0])
4652 # No more messages reported via smtp
4653 self.assertEqual(3, len(self.smtp_messages))
Joshua Heskethd6dbd682015-12-22 10:06:54 +11004654
James E. Blairec056492016-07-22 09:45:56 -07004655 @skip("Disabled for early v3 development")
Joshua Heskethd6dbd682015-12-22 10:06:54 +11004656 def test_success_pattern(self):
4657 "Ensure bad build params are ignored"
4658
4659 # Use SMTP reporter to grab the result message easier
4660 self.init_repo("org/docs")
4661 self.config.set('zuul', 'layout_config',
4662 'tests/fixtures/layout-success-pattern.yaml')
4663 self.sched.reconfigure(self.config)
James E. Blair08d19992016-08-10 15:25:31 -07004664 self.launch_server.hold_jobs_in_build = True
Joshua Heskethd6dbd682015-12-22 10:06:54 +11004665 self.registerJobs()
4666
4667 A = self.fake_gerrit.addFakeChange('org/docs', 'master', 'A')
4668 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
4669 self.waitUntilSettled()
4670
4671 # Grab build id
4672 self.assertEqual(len(self.builds), 1)
4673 uuid = self.builds[0].unique[:7]
4674
James E. Blair08d19992016-08-10 15:25:31 -07004675 self.launch_server.hold_jobs_in_build = False
4676 self.launch_server.release()
Joshua Heskethd6dbd682015-12-22 10:06:54 +11004677 self.waitUntilSettled()
4678
4679 self.assertEqual(len(self.smtp_messages), 1)
4680 body = self.smtp_messages[0]['body'].splitlines()
4681 self.assertEqual('Build succeeded.', body[0])
4682
4683 self.assertIn(
4684 '- docs-draft-test http://docs-draft.example.org/1/1/1/check/'
4685 'docs-draft-test/%s/publish-docs/' % uuid,
4686 body[2])
4687 self.assertIn(
4688 '- docs-draft-test2 https://server/job/docs-draft-test2/1/',
4689 body[3])