OLD | NEW |
---|---|
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2013 The Chromium Authors. All rights reserved. | 2 # Copyright 2013 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Unit tests for gatekeeper_ng.py. | 6 """Unit tests for gatekeeper_ng.py. |
7 | 7 |
8 This is a basic check that gatekeeper_ng.py can properly interpret builds and | 8 This is a basic check that gatekeeper_ng.py can properly interpret builds and |
9 close the tree. | 9 close the tree. |
10 | 10 |
11 """ | 11 """ |
12 | 12 |
13 # Needs to be at the top, otherwise coverage will spit nonsense. | 13 # Needs to be at the top, otherwise coverage will spit nonsense. |
14 import utils | 14 import utils |
15 | 15 |
16 import contextlib | 16 import contextlib |
17 import json | 17 import json |
18 import mock | 18 import mock |
19 import os | 19 import os |
20 import StringIO | 20 import StringIO |
21 import sys | 21 import sys |
22 import tempfile | 22 import tempfile |
23 import unittest | 23 import unittest |
24 import urllib2 | 24 import urllib2 |
25 import urlparse | 25 import urlparse |
26 | 26 |
27 import test_env # pylint: disable=W0403,W0611 | 27 import test_env # pylint: disable=W0403,W0611 |
28 | 28 |
29 from slave import gatekeeper_ng | 29 from slave import gatekeeper_ng |
30 from slave import gatekeeper_ng_db | |
30 | 31 |
31 | 32 |
32 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) | 33 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) |
33 | 34 |
34 | 35 |
35 class BuildLog(object): | 36 class BuildLog(object): |
36 def __init__(self, name, fp=None, string=None, logjson=None): | 37 def __init__(self, name, fp=None, string=None, logjson=None): |
37 self.name = name | 38 self.name = name |
38 self.fp = fp | 39 self.fp = fp |
39 self.string = string | 40 self.string = string |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
129 | 130 |
130 self.status_url = 'https://chromium-status.appspot.com/status' | 131 self.status_url = 'https://chromium-status.appspot.com/status' |
131 self.mailer_url = 'https://chromium-build.appspot.com/mailer/email' | 132 self.mailer_url = 'https://chromium-build.appspot.com/mailer/email' |
132 self.handle_url_str(self.mailer_url, '') | 133 self.handle_url_str(self.mailer_url, '') |
133 self.handle_url_str(self.status_url, 'the status') | 134 self.handle_url_str(self.status_url, 'the status') |
134 | 135 |
135 self.master_url_root = 'http://build.chromium.org/p/' | 136 self.master_url_root = 'http://build.chromium.org/p/' |
136 self.masters = [self.create_generic_build_tree('Chromium FYI', | 137 self.masters = [self.create_generic_build_tree('Chromium FYI', |
137 'chromium.fyi')] | 138 'chromium.fyi')] |
138 | 139 |
140 self.build_db_file = self.fill_tempfile('{}') | |
139 self.gatekeeper_file = self.fill_tempfile('{}') | 141 self.gatekeeper_file = self.fill_tempfile('{}') |
140 self.email_secret_file = self.fill_tempfile('seekrit') | 142 self.email_secret_file = self.fill_tempfile('seekrit') |
141 self.status_secret_file = self.fill_tempfile('reindeerflotilla') | 143 self.status_secret_file = self.fill_tempfile('reindeerflotilla') |
142 | 144 |
143 self._gatekeeper_config = None | 145 self._gatekeeper_config = None |
144 | 146 |
145 def fill_tempfile(self, content): | 147 def fill_tempfile(self, content): |
146 fd, filename = tempfile.mkstemp() | 148 fd, filename = tempfile.mkstemp() |
147 os.write(fd, content) | 149 os.write(fd, content) |
148 os.close(fd) | 150 os.close(fd) |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
223 return Build(number, [step0, step1, step2, step3], committers) | 225 return Build(number, [step0, step1, step2, step3], committers) |
224 | 226 |
225 def create_generic_build_tree(self, master_title, master_url_chunk): | 227 def create_generic_build_tree(self, master_title, master_url_chunk): |
226 build = GatekeeperTest.create_generic_build(1, ['a_committer@chromium.org']) | 228 build = GatekeeperTest.create_generic_build(1, ['a_committer@chromium.org']) |
227 | 229 |
228 builder = Builder('mybuilder', [build]) | 230 builder = Builder('mybuilder', [build]) |
229 | 231 |
230 return Master(master_title, self.master_url_root + master_url_chunk, | 232 return Master(master_title, self.master_url_root + master_url_chunk, |
231 [builder]) | 233 [builder]) |
232 | 234 |
233 def call_gatekeeper(self): | 235 def call_gatekeeper(self, build_db=None, json=None): # pylint: disable=W0621 |
234 """Sets up handlers for all the json and actually calls gatekeeper.""" | 236 """Sets up handlers for all the json and actually calls gatekeeper.""" |
237 self.url_calls = [] | |
235 self.handle_build_tree(self.masters) | 238 self.handle_build_tree(self.masters) |
236 ret = gatekeeper_ng.main() | 239 json = json or self.gatekeeper_file |
240 self._gatekeeper_config = self._gatekeeper_config or {} | |
241 if not build_db: | |
242 build_db = gatekeeper_ng_db.gen_db(masters={ | |
243 self.masters[0].url: { | |
244 'mybuilder': { | |
245 0: gatekeeper_ng_db.gen_build(finished=True) | |
246 } | |
247 } | |
248 }) | |
249 | |
250 with open(self.build_db_file, 'w') as f: | |
251 gatekeeper_ng_db.convert_db_to_json(build_db, self._gatekeeper_config, f) | |
252 | |
253 old_argv = sys.argv[:] | |
254 sys.argv.extend(['--build-db=%s' % self.build_db_file, | |
255 '--json', json]) | |
256 | |
257 try: | |
258 ret = gatekeeper_ng.main() | |
259 finally: | |
260 sys.argv = old_argv | |
261 | |
237 if ret != 0: | 262 if ret != 0: |
238 raise ValueError('return code was %d' % ret) | 263 raise ValueError('return code was %d' % ret) |
239 | 264 |
240 # Return urls as a convenience. | 265 # Return urls as a convenience. |
241 return [call['url'] for call in self.url_calls] | 266 return [call['url'] for call in self.url_calls] |
242 | 267 |
268 | |
269 def process_build_db(self, master, builder): | |
270 """Reads the build_db from a file and splits out finished/unfinished.""" | |
271 new_build_db = gatekeeper_ng_db.get_build_db(self.build_db_file) | |
272 builds = new_build_db.masters[master][builder] | |
273 finished_new_builds = dict( | |
274 (k, v) for k, v in builds.iteritems() if v.finished) | |
275 unfinished_new_builds = dict( | |
276 (k, v) for k, v in builds.iteritems() if not v.finished) | |
277 return unfinished_new_builds, finished_new_builds | |
278 | |
279 | |
243 @contextlib.contextmanager | 280 @contextlib.contextmanager |
244 def gatekeeper_config_editor(self): | 281 def gatekeeper_config_editor(self): |
282 """Wrapper to edit the gatekeeper_config, then reserialize it.""" | |
245 if not self._gatekeeper_config: | 283 if not self._gatekeeper_config: |
246 with open(self.gatekeeper_file) as f: | 284 with open(self.gatekeeper_file) as f: |
247 self._gatekeeper_config = json.load(f) | 285 self._gatekeeper_config = json.load(f) |
248 | 286 |
249 yield self._gatekeeper_config | 287 yield self._gatekeeper_config |
250 | 288 |
251 with open(self.gatekeeper_file, 'w') as f: | 289 with open(self.gatekeeper_file, 'w') as f: |
252 json.dump(self._gatekeeper_config, f) | 290 json.dump(self._gatekeeper_config, f) |
253 self._gatekeeper_config = None | 291 self._gatekeeper_config = None |
254 else: | 292 else: |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
320 def handle_url_json(self, url, data): | 358 def handle_url_json(self, url, data): |
321 """Add a json object to handle a mocked URL.""" | 359 """Add a json object to handle a mocked URL.""" |
322 buf = StringIO.StringIO() | 360 buf = StringIO.StringIO() |
323 json.dump(data, buf) | 361 json.dump(data, buf) |
324 buf.seek(0) | 362 buf.seek(0) |
325 self.handle_url_fp(url, buf) | 363 self.handle_url_fp(url, buf) |
326 | 364 |
327 | 365 |
328 #### Email and status. | 366 #### Email and status. |
329 | 367 |
330 def testBasicURLQuery(self): | |
ghost stip (do not use)
2014/02/22 10:03:07
this check didn't do much and got in the way of mo
| |
331 """Check that things are basically sane.""" | |
332 sys.argv.extend([m.url for m in self.masters]) | |
333 sys.argv.extend(['--skip-build-db-update', | |
334 '--json', self.gatekeeper_file, | |
335 '--no-email-app']) | |
336 | |
337 self.handle_build_tree([self.masters[0]]) | |
338 gatekeeper_ng.main() | |
339 | |
340 def testIgnoreNoGatekeeper(self): | 368 def testIgnoreNoGatekeeper(self): |
341 """Check that logs aren't read unless the builder is noted in the config.""" | 369 """Check that logs aren't read unless the builder is noted in the config.""" |
342 | 370 |
343 sys.argv.extend([m.url for m in self.masters]) | 371 sys.argv.extend([m.url for m in self.masters]) |
344 sys.argv.extend(['--skip-build-db-update', | 372 sys.argv.extend(['--skip-build-db-update', |
345 '--json', self.gatekeeper_file, | |
346 '--no-email-app']) | 373 '--no-email-app']) |
347 | 374 |
348 self.add_gatekeeper_section(self.masters[0].url, | 375 self.add_gatekeeper_section(self.masters[0].url, |
349 self.masters[0].builders[0].name, | 376 self.masters[0].builders[0].name, |
350 {}) | 377 {}) |
351 | 378 |
352 urls = self.call_gatekeeper() | 379 urls = self.call_gatekeeper() |
353 self.assertEquals(urls, [self.masters[0].url + '/json']) | 380 self.assertEquals(urls, [self.masters[0].url + '/json']) |
354 | 381 |
355 def testIgnoreSuccessfulBuildNoGatekeeperSteps(self): | |
ghost stip (do not use)
2014/02/22 10:03:07
this check didn't do much and got in the way of mo
| |
356 """If gatekeeper_spec doesn't have any annotations, don't fail build.""" | |
357 sys.argv.extend([m.url for m in self.masters]) | |
358 sys.argv.extend(['--skip-build-db-update', | |
359 '--json', self.gatekeeper_file, | |
360 '--email-app-secret-file=%s' % self.email_secret_file]) | |
361 | |
362 | |
363 self.handle_build_tree([self.masters[0]]) | |
364 gatekeeper_ng.main() | |
365 urls = [call['url'] for call in self.url_calls] | |
366 self.assertNotIn(self.mailer_url, urls) | |
367 | |
368 def testFailedBuildDetected(self): | 382 def testFailedBuildDetected(self): |
369 """Test that an erroneous build result closes the tree.""" | 383 """Test that an erroneous build result closes the tree.""" |
370 sys.argv.extend([m.url for m in self.masters]) | 384 sys.argv.extend([m.url for m in self.masters]) |
371 sys.argv.extend(['--skip-build-db-update', | 385 sys.argv.extend(['--skip-build-db-update', |
372 '--json', self.gatekeeper_file, | |
373 '--email-app-secret-file=%s' % self.email_secret_file]) | 386 '--email-app-secret-file=%s' % self.email_secret_file]) |
374 | 387 |
375 self.masters[0].builders[0].builds[0].results = 3 | 388 self.masters[0].builders[0].builds[0].results = 3 |
376 self.add_gatekeeper_master_config(self.masters[0].url, | 389 self.add_gatekeeper_master_config(self.masters[0].url, |
377 {'respect_build_status': True}) | 390 {'respect_build_status': True}) |
378 self.add_gatekeeper_section(self.masters[0].url, | 391 self.add_gatekeeper_section(self.masters[0].url, |
379 self.masters[0].builders[0].name, | 392 self.masters[0].builders[0].name, |
380 {}, | 393 {}, |
381 idx=0) | 394 idx=0) |
382 | 395 |
383 self.handle_url_str(self.mailer_url, '') | 396 self.call_gatekeeper() |
384 | |
385 self.handle_build_tree([self.masters[0]]) | |
386 gatekeeper_ng.main() | |
387 | 397 |
388 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 398 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
389 mailer_data = GatekeeperTest.decode_param_json( | 399 mailer_data = GatekeeperTest.decode_param_json( |
390 self.url_calls[-1]['params']) | 400 self.url_calls[-1]['params']) |
391 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 401 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
392 | 402 |
393 def testFailedBuildNoEmail(self): | 403 def testFailedBuildNoEmail(self): |
394 """Test that no email is sent if there are no watchers.""" | 404 """Test that no email is sent if there are no watchers.""" |
395 sys.argv.extend([m.url for m in self.masters]) | 405 sys.argv.extend([m.url for m in self.masters]) |
396 sys.argv.extend(['--skip-build-db-update', | 406 sys.argv.extend(['--skip-build-db-update', |
397 '--json', self.gatekeeper_file, | |
398 '--email-app-secret-file=%s' % self.email_secret_file]) | 407 '--email-app-secret-file=%s' % self.email_secret_file]) |
399 | 408 |
400 | 409 |
401 self.masters[0].builders[0].builds[0].results = 3 | 410 self.masters[0].builders[0].builds[0].results = 3 |
402 self.masters[0].builders[0].builds[0].blame = [] | 411 self.masters[0].builders[0].builds[0].blame = [] |
403 self.add_gatekeeper_master_config(self.masters[0].url, | 412 self.add_gatekeeper_master_config(self.masters[0].url, |
404 {'respect_build_status': True}) | 413 {'respect_build_status': True}) |
405 self.add_gatekeeper_section(self.masters[0].url, | 414 self.add_gatekeeper_section(self.masters[0].url, |
406 self.masters[0].builders[0].name, | 415 self.masters[0].builders[0].name, |
407 {}, | 416 {}, |
408 idx=0) | 417 idx=0) |
409 | 418 |
410 | 419 |
411 urls = self.call_gatekeeper() | 420 urls = self.call_gatekeeper() |
412 self.assertNotIn(self.mailer_url, urls) | 421 self.assertNotIn(self.mailer_url, urls) |
413 | 422 |
414 | 423 |
415 def testStepNonCloserFailureIgnored(self): | 424 def testStepNonCloserFailureIgnored(self): |
416 """Test that a non-closing failure is ignored.""" | 425 """Test that a non-closing failure is ignored.""" |
417 sys.argv.extend([m.url for m in self.masters]) | 426 sys.argv.extend([m.url for m in self.masters]) |
418 sys.argv.extend(['--skip-build-db-update', | 427 sys.argv.extend(['--skip-build-db-update', |
419 '--json', self.gatekeeper_file, | |
420 '--email-app-secret-file=%s' % self.email_secret_file]) | 428 '--email-app-secret-file=%s' % self.email_secret_file]) |
421 | 429 |
422 self.masters[0].builders[0].builds[0].steps[2].results = [2, None] | 430 self.masters[0].builders[0].builds[0].steps[2].results = [2, None] |
423 self.add_gatekeeper_section(self.masters[0].url, | 431 self.add_gatekeeper_section(self.masters[0].url, |
424 self.masters[0].builders[0].name, | 432 self.masters[0].builders[0].name, |
425 {'closing_steps': ['step1']}) | 433 {'closing_steps': ['step1']}) |
426 | 434 |
427 urls = self.call_gatekeeper() | 435 urls = self.call_gatekeeper() |
428 self.assertNotIn(self.mailer_url, urls) | 436 self.assertNotIn(self.mailer_url, urls) |
429 | 437 |
430 def testStepCloserFailureDetected(self): | 438 def testStepCloserFailureDetected(self): |
431 """Test that a failed closing step closes the tree.""" | 439 """Test that a failed closing step closes the tree.""" |
432 sys.argv.extend([m.url for m in self.masters]) | 440 sys.argv.extend([m.url for m in self.masters]) |
433 sys.argv.extend(['--skip-build-db-update', | 441 sys.argv.extend(['--skip-build-db-update', |
434 '--json', self.gatekeeper_file, | |
435 '--email-app-secret-file=%s' % self.email_secret_file]) | 442 '--email-app-secret-file=%s' % self.email_secret_file]) |
436 | 443 |
437 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 444 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
438 self.add_gatekeeper_section(self.masters[0].url, | 445 self.add_gatekeeper_section(self.masters[0].url, |
439 self.masters[0].builders[0].name, | 446 self.masters[0].builders[0].name, |
440 {'closing_steps': ['step1']}) | 447 {'closing_steps': ['step1']}) |
441 | 448 |
442 self.call_gatekeeper() | 449 self.call_gatekeeper() |
443 | 450 |
444 # Check that gatekeeper indeed sent an email. | 451 # Check that gatekeeper indeed sent an email. |
445 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 452 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
446 mailer_data = GatekeeperTest.decode_param_json( | 453 mailer_data = GatekeeperTest.decode_param_json( |
447 self.url_calls[-1]['params']) | 454 self.url_calls[-1]['params']) |
448 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 455 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
449 | 456 |
450 def testStepCloserFailureOptional(self): | 457 def testStepCloserFailureOptional(self): |
451 """Test that a failed closing_optional step closes the tree.""" | 458 """Test that a failed closing_optional step closes the tree.""" |
452 sys.argv.extend([m.url for m in self.masters]) | 459 sys.argv.extend([m.url for m in self.masters]) |
453 sys.argv.extend(['--skip-build-db-update', | 460 sys.argv.extend(['--skip-build-db-update', |
454 '--json', self.gatekeeper_file, | |
455 '--email-app-secret-file=%s' % self.email_secret_file]) | 461 '--email-app-secret-file=%s' % self.email_secret_file]) |
456 | 462 |
457 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 463 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
458 self.add_gatekeeper_section(self.masters[0].url, | 464 self.add_gatekeeper_section(self.masters[0].url, |
459 self.masters[0].builders[0].name, | 465 self.masters[0].builders[0].name, |
460 {'closing_optional': ['step1']}) | 466 {'closing_optional': ['step1']}) |
461 | 467 |
462 self.call_gatekeeper() | 468 self.call_gatekeeper() |
463 | 469 |
464 # Check that gatekeeper indeed sent an email. | 470 # Check that gatekeeper indeed sent an email. |
465 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 471 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
466 mailer_data = GatekeeperTest.decode_param_json( | 472 mailer_data = GatekeeperTest.decode_param_json( |
467 self.url_calls[-1]['params']) | 473 self.url_calls[-1]['params']) |
468 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 474 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
469 | 475 |
470 def testStepCloserFailureOptionalStar(self): | 476 def testStepCloserFailureOptionalStar(self): |
471 """Test that a failed closing_optional * step closes the tree.""" | 477 """Test that a failed closing_optional * step closes the tree.""" |
472 sys.argv.extend([m.url for m in self.masters]) | 478 sys.argv.extend([m.url for m in self.masters]) |
473 sys.argv.extend(['--skip-build-db-update', | 479 sys.argv.extend(['--skip-build-db-update', |
474 '--json', self.gatekeeper_file, | |
475 '--email-app-secret-file=%s' % self.email_secret_file]) | 480 '--email-app-secret-file=%s' % self.email_secret_file]) |
476 | 481 |
477 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 482 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
478 self.add_gatekeeper_section(self.masters[0].url, | 483 self.add_gatekeeper_section(self.masters[0].url, |
479 self.masters[0].builders[0].name, | 484 self.masters[0].builders[0].name, |
480 {'closing_optional': ['*']}) | 485 {'closing_optional': ['*']}) |
481 | 486 |
482 self.call_gatekeeper() | 487 self.call_gatekeeper() |
483 | 488 |
484 # Check that gatekeeper indeed sent an email. | 489 # Check that gatekeeper indeed sent an email. |
485 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 490 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
486 mailer_data = GatekeeperTest.decode_param_json( | 491 mailer_data = GatekeeperTest.decode_param_json( |
487 self.url_calls[-1]['params']) | 492 self.url_calls[-1]['params']) |
488 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 493 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
489 | 494 |
490 def testStepOmissionDetected(self): | 495 def testStepOmissionDetected(self): |
491 """Test that the lack of a closing step closes the tree.""" | 496 """Test that the lack of a closing step closes the tree.""" |
492 sys.argv.extend([m.url for m in self.masters]) | 497 sys.argv.extend([m.url for m in self.masters]) |
493 sys.argv.extend(['--skip-build-db-update', | 498 sys.argv.extend(['--skip-build-db-update', |
494 '--json', self.gatekeeper_file, | |
495 '--email-app-secret-file=%s' % self.email_secret_file]) | 499 '--email-app-secret-file=%s' % self.email_secret_file]) |
496 | 500 |
497 self.add_gatekeeper_section(self.masters[0].url, | 501 self.add_gatekeeper_section(self.masters[0].url, |
498 self.masters[0].builders[0].name, | 502 self.masters[0].builders[0].name, |
499 {'closing_steps': ['step4']}) | 503 {'closing_steps': ['step4']}) |
500 | 504 |
501 self.call_gatekeeper() | 505 self.call_gatekeeper() |
502 | 506 |
503 # Check that gatekeeper indeed sent an email. | 507 # Check that gatekeeper indeed sent an email. |
504 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 508 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
505 mailer_data = GatekeeperTest.decode_param_json(self.url_calls[-1]['params']) | 509 mailer_data = GatekeeperTest.decode_param_json(self.url_calls[-1]['params']) |
506 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 510 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
507 | 511 |
508 def testStepOmissionOptional(self): | 512 def testStepOmissionOptional(self): |
509 """Test that the lack of a closing_optional step doesn't close the tree.""" | 513 """Test that the lack of a closing_optional step doesn't close the tree.""" |
510 sys.argv.extend([m.url for m in self.masters]) | 514 sys.argv.extend([m.url for m in self.masters]) |
511 sys.argv.extend(['--skip-build-db-update', | 515 sys.argv.extend(['--skip-build-db-update', |
512 '--json', self.gatekeeper_file, | |
513 '--email-app-secret-file=%s' % self.email_secret_file]) | 516 '--email-app-secret-file=%s' % self.email_secret_file]) |
514 | 517 |
515 self.add_gatekeeper_section(self.masters[0].url, | 518 self.add_gatekeeper_section(self.masters[0].url, |
516 self.masters[0].builders[0].name, | 519 self.masters[0].builders[0].name, |
517 {'closing_optional': ['step4']}) | 520 {'closing_optional': ['step4']}) |
518 | 521 |
519 self.call_gatekeeper() | 522 self.call_gatekeeper() |
520 urls = self.call_gatekeeper() | 523 urls = self.call_gatekeeper() |
521 self.assertNotIn(self.status_url, urls) | 524 self.assertNotIn(self.status_url, urls) |
522 self.assertNotIn(self.mailer_url, urls) | 525 self.assertNotIn(self.mailer_url, urls) |
523 | 526 |
524 def testStepForgivingOmissionOptional(self): | 527 def testStepForgivingOmissionOptional(self): |
525 """Test that the lack of a forgiving_optional step doesn't close tree.""" | 528 """Test that the lack of a forgiving_optional step doesn't close tree.""" |
526 sys.argv.extend([m.url for m in self.masters]) | 529 sys.argv.extend([m.url for m in self.masters]) |
527 sys.argv.extend(['--skip-build-db-update', | 530 sys.argv.extend(['--skip-build-db-update', |
528 '--json', self.gatekeeper_file, | |
529 '--email-app-secret-file=%s' % self.email_secret_file]) | 531 '--email-app-secret-file=%s' % self.email_secret_file]) |
530 | 532 |
531 self.add_gatekeeper_section(self.masters[0].url, | 533 self.add_gatekeeper_section(self.masters[0].url, |
532 self.masters[0].builders[0].name, | 534 self.masters[0].builders[0].name, |
533 {'forgiving_optional': ['step4']}) | 535 {'forgiving_optional': ['step4']}) |
534 | 536 |
535 self.call_gatekeeper() | 537 self.call_gatekeeper() |
536 | 538 |
537 urls = self.call_gatekeeper() | 539 urls = self.call_gatekeeper() |
538 self.assertNotIn(self.status_url, urls) | 540 self.assertNotIn(self.status_url, urls) |
539 self.assertNotIn(self.mailer_url, urls) | 541 self.assertNotIn(self.mailer_url, urls) |
540 | 542 |
541 def testStepNotStarted(self): | 543 def testStepNotStarted(self): |
542 """Test that a skipped closing step closes the tree.""" | 544 """Test that a skipped closing step closes the tree.""" |
543 sys.argv.extend([m.url for m in self.masters]) | 545 sys.argv.extend([m.url for m in self.masters]) |
544 sys.argv.extend(['--skip-build-db-update', | 546 sys.argv.extend(['--skip-build-db-update', |
545 '--json', self.gatekeeper_file, | |
546 '--email-app-secret-file=%s' % self.email_secret_file]) | 547 '--email-app-secret-file=%s' % self.email_secret_file]) |
547 | 548 |
548 self.add_gatekeeper_section(self.masters[0].url, | 549 self.add_gatekeeper_section(self.masters[0].url, |
549 self.masters[0].builders[0].name, | 550 self.masters[0].builders[0].name, |
550 {'closing_steps': ['step1']}) | 551 {'closing_steps': ['step1']}) |
551 | 552 |
552 self.masters[0].builders[0].builds[0].steps[1].isStarted = False | 553 self.masters[0].builders[0].builds[0].steps[1].isStarted = False |
553 self.masters[0].builders[0].builds[0].steps[1].isFinished = False | 554 self.masters[0].builders[0].builds[0].steps[1].isFinished = False |
554 | 555 |
555 self.call_gatekeeper() | 556 self.call_gatekeeper() |
556 | 557 |
557 # Check that gatekeeper indeed sent an email. | 558 # Check that gatekeeper indeed sent an email. |
558 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 559 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
559 mailer_data = GatekeeperTest.decode_param_json( | 560 mailer_data = GatekeeperTest.decode_param_json( |
560 self.url_calls[-1]['params']) | 561 self.url_calls[-1]['params']) |
561 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 562 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
562 | 563 |
563 def testGatekeeperOOO(self): | 564 def testGatekeeperOOO(self): |
564 """Test that gatekeeper_spec works even if not the first step.""" | 565 """Test that gatekeeper_spec works even if not the first step.""" |
565 sys.argv.extend([m.url for m in self.masters]) | 566 sys.argv.extend([m.url for m in self.masters]) |
566 sys.argv.extend(['--skip-build-db-update', | 567 sys.argv.extend(['--skip-build-db-update', |
567 '--json', self.gatekeeper_file, | |
568 '--email-app-secret-file=%s' % self.email_secret_file]) | 568 '--email-app-secret-file=%s' % self.email_secret_file]) |
569 | 569 |
570 self.add_gatekeeper_section(self.masters[0].url, | 570 self.add_gatekeeper_section(self.masters[0].url, |
571 self.masters[0].builders[0].name, | 571 self.masters[0].builders[0].name, |
572 {'closing_steps': ['step1']}) | 572 {'closing_steps': ['step1']}) |
573 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 573 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
574 | 574 |
575 spec = self.masters[0].builders[0].builds[0].steps | 575 spec = self.masters[0].builders[0].builds[0].steps |
576 self.masters[0].builders[0].builds[0].steps = spec[1:]+spec[:1] | 576 self.masters[0].builders[0].builds[0].steps = spec[1:]+spec[:1] |
577 | 577 |
578 self.call_gatekeeper() | 578 self.call_gatekeeper() |
579 | 579 |
580 # Check that gatekeeper indeed sent an email. | 580 # Check that gatekeeper indeed sent an email. |
581 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 581 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
582 mailer_data = GatekeeperTest.decode_param_json( | 582 mailer_data = GatekeeperTest.decode_param_json( |
583 self.url_calls[-1]['params']) | 583 self.url_calls[-1]['params']) |
584 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 584 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
585 | 585 |
586 def testFailedBuildClosesTree(self): | 586 def testFailedBuildClosesTree(self): |
587 """Test that a failed build calls to the status app.""" | 587 """Test that a failed build calls to the status app.""" |
588 sys.argv.extend([m.url for m in self.masters]) | 588 sys.argv.extend([m.url for m in self.masters]) |
589 sys.argv.extend(['--skip-build-db-update', | 589 sys.argv.extend(['--skip-build-db-update', |
590 '--no-email-app', '--set-status', | 590 '--no-email-app', '--set-status', |
591 '--json', self.gatekeeper_file, | |
592 '--password-file', self.status_secret_file]) | 591 '--password-file', self.status_secret_file]) |
593 | 592 |
594 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 593 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
595 self.add_gatekeeper_section(self.masters[0].url, | 594 self.add_gatekeeper_section(self.masters[0].url, |
596 self.masters[0].builders[0].name, | 595 self.masters[0].builders[0].name, |
597 {'closing_steps': ['step1']}) | 596 {'closing_steps': ['step1']}) |
598 | 597 |
599 urls = self.call_gatekeeper() | 598 urls = self.call_gatekeeper() |
600 self.assertIn(self.status_url, urls) | 599 self.assertIn(self.status_url, urls) |
601 | 600 |
602 def testIgnoredStepsDontCloseTree(self): | 601 def testIgnoredStepsDontCloseTree(self): |
603 """Test that ignored steps don't call to the status app.""" | 602 """Test that ignored steps don't call to the status app.""" |
604 sys.argv.extend([m.url for m in self.masters]) | 603 sys.argv.extend([m.url for m in self.masters]) |
605 sys.argv.extend(['--skip-build-db-update', | 604 sys.argv.extend(['--skip-build-db-update', |
606 '--no-email-app', '--set-status', | 605 '--no-email-app', '--set-status', |
607 '--json', self.gatekeeper_file, | |
608 '--password-file', self.status_secret_file]) | 606 '--password-file', self.status_secret_file]) |
609 | 607 |
610 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 608 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
611 self.add_gatekeeper_section(self.masters[0].url, | 609 self.add_gatekeeper_section(self.masters[0].url, |
612 self.masters[0].builders[0].name, | 610 self.masters[0].builders[0].name, |
613 {'closing_steps': ['step2']}) | 611 {'closing_steps': ['step2']}) |
614 | 612 |
615 self.handle_url_str(self.status_url, 'the status') | 613 self.handle_url_str(self.status_url, 'the status') |
616 | 614 |
617 urls = self.call_gatekeeper() | 615 urls = self.call_gatekeeper() |
618 self.assertNotIn(self.status_url, urls) | 616 self.assertNotIn(self.status_url, urls) |
619 | 617 |
620 def testDefaultSubjectTemplate(self): | 618 def testDefaultSubjectTemplate(self): |
621 """Test that the subject template is set by default.""" | 619 """Test that the subject template is set by default.""" |
622 sys.argv.extend([m.url for m in self.masters]) | 620 sys.argv.extend([m.url for m in self.masters]) |
623 sys.argv.extend(['--skip-build-db-update', | 621 sys.argv.extend(['--skip-build-db-update', |
624 '--json', self.gatekeeper_file, | |
625 '--email-app-secret-file=%s' % self.email_secret_file]) | 622 '--email-app-secret-file=%s' % self.email_secret_file]) |
626 | 623 |
627 self.add_gatekeeper_section(self.masters[0].url, | 624 self.add_gatekeeper_section(self.masters[0].url, |
628 self.masters[0].builders[0].name, | 625 self.masters[0].builders[0].name, |
629 {'closing_steps': ['step4']}) | 626 {'closing_steps': ['step4']}) |
630 | 627 |
631 self.call_gatekeeper() | 628 self.call_gatekeeper() |
632 | 629 |
633 # Check that gatekeeper indeed sent an email. | 630 # Check that gatekeeper indeed sent an email. |
634 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 631 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
635 mailer_data = GatekeeperTest.decode_param_json(self.url_calls[-1]['params']) | 632 mailer_data = GatekeeperTest.decode_param_json(self.url_calls[-1]['params']) |
636 self.assertEquals(mailer_data['subject_template'], unicode( | 633 self.assertEquals(mailer_data['subject_template'], unicode( |
637 'buildbot %(result)s in %(projectName)s on %(builder)s, ' | 634 'buildbot %(result)s in %(projectName)s on %(builder)s, ' |
638 'revision %(revision)s')) | 635 'revision %(revision)s')) |
639 | 636 |
640 | 637 |
641 def testEmailJson(self): | 638 def testEmailJson(self): |
642 """Test that the email json is formatted correctly.""" | 639 """Test that the email json is formatted correctly.""" |
643 sys.argv.extend([m.url for m in self.masters]) | 640 sys.argv.extend([m.url for m in self.masters]) |
644 sys.argv.extend(['--skip-build-db-update', | 641 sys.argv.extend(['--skip-build-db-update', |
645 '--json', self.gatekeeper_file, | |
646 '--email-app-secret-file=%s' % self.email_secret_file]) | 642 '--email-app-secret-file=%s' % self.email_secret_file]) |
647 | 643 |
648 subject_template = 'build %(result)s, oh no!' | 644 subject_template = 'build %(result)s, oh no!' |
649 self.masters[0].builders[0].builds[0].results = 3 | 645 self.masters[0].builders[0].builds[0].results = 3 |
650 self.add_gatekeeper_master_config(self.masters[0].url, | 646 self.add_gatekeeper_master_config(self.masters[0].url, |
651 {'respect_build_status': True}) | 647 {'respect_build_status': True}) |
652 self.add_gatekeeper_section(self.masters[0].url, | 648 self.add_gatekeeper_section(self.masters[0].url, |
653 self.masters[0].builders[0].name, | 649 self.masters[0].builders[0].name, |
654 {'subject_template': subject_template}, | 650 {'subject_template': subject_template}, |
655 idx=0) | 651 idx=0) |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
693 self.assertEquals(mailer_data['project_name'], unicode('Chromium FYI')) | 689 self.assertEquals(mailer_data['project_name'], unicode('Chromium FYI')) |
694 self.assertEquals(mailer_data['from_addr'], 'buildbot@chromium.org') | 690 self.assertEquals(mailer_data['from_addr'], 'buildbot@chromium.org') |
695 self.assertEquals(mailer_data['subject_template'], | 691 self.assertEquals(mailer_data['subject_template'], |
696 unicode(subject_template)) | 692 unicode(subject_template)) |
697 | 693 |
698 | 694 |
699 #### BuildDB operation. | 695 #### BuildDB operation. |
700 | 696 |
701 def testIncrementalScanning(self): | 697 def testIncrementalScanning(self): |
702 """Test that builds in the build DB are skipped.""" | 698 """Test that builds in the build DB are skipped.""" |
703 fd, dbfilename = tempfile.mkstemp() | 699 build_db = gatekeeper_ng_db.gen_db(masters={ |
704 build_db = {self.masters[0].url: { 'mybuilder': 1 }} | 700 self.masters[0].url: { |
705 os.write(fd, json.dumps(build_db)) | 701 'mybuilder': { |
706 os.close(fd) | 702 1: gatekeeper_ng_db.gen_build(finished=True)}}}) |
707 | 703 |
708 sys.argv.extend([m.url for m in self.masters]) | 704 sys.argv.extend([m.url for m in self.masters]) |
709 sys.argv.extend(['--build-db=%s' % dbfilename, | 705 sys.argv.extend(['--email-app-secret-file=%s' % self.email_secret_file]) |
710 '--json', self.gatekeeper_file, | |
711 '--email-app-secret-file=%s' % self.email_secret_file]) | |
712 | 706 |
713 | 707 |
714 self.add_gatekeeper_section(self.masters[0].url, | 708 self.add_gatekeeper_section(self.masters[0].url, |
715 self.masters[0].builders[0].name, | 709 self.masters[0].builders[0].name, |
716 {'closing_steps': ['step1']}) | 710 {'closing_steps': ['step1']}) |
717 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 711 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
718 | 712 |
719 self.masters[0].builders[0].builds.append( | 713 self.masters[0].builders[0].builds.append( |
720 GatekeeperTest.create_generic_build(2,[ | 714 GatekeeperTest.create_generic_build(2,[ |
721 'a_second_committer@chromium.org'])) | 715 'a_second_committer@chromium.org'])) |
722 self.masters[0].builders[0].builds[1].steps[1].results = [2, None] | 716 self.masters[0].builders[0].builds[1].steps[1].results = [2, None] |
723 | 717 |
724 @contextlib.contextmanager | 718 self.call_gatekeeper(build_db=build_db) |
725 def delfile(filename): | 719 _, finished_new_builds = self.process_build_db( |
726 yield | 720 self.masters[0].url, 'mybuilder') |
727 os.unlink(filename) | 721 self.assertEquals(finished_new_builds, |
722 {2: gatekeeper_ng_db.gen_build(finished=True, triggered=[ | |
723 '2be9f9320c2d26b09e416d615ff047' | |
724 '86abc74794bd5b669a1bb4228f884ddf50'])}) | |
728 | 725 |
729 with delfile(dbfilename): | 726 # Check that gatekeeper indeed sent an email. |
730 self.call_gatekeeper() | |
731 with open(dbfilename) as f: | |
732 new_build_db = json.load(f) | |
733 self.assertEquals(new_build_db, {self.masters[0].url: {'mybuilder': 2}}) | |
734 | |
735 #check that gatekeeper indeed sent an email. | |
736 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 727 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
737 mailer_data = GatekeeperTest.decode_param_json( | 728 mailer_data = GatekeeperTest.decode_param_json( |
738 self.url_calls[-1]['params']) | 729 self.url_calls[-1]['params']) |
739 self.assertEquals(mailer_data['recipients'], | 730 self.assertEquals(mailer_data['recipients'], |
740 ['a_second_committer@chromium.org']) | 731 ['a_second_committer@chromium.org']) |
741 urls = [call['url'] for call in self.url_calls] | 732 urls = [call['url'] for call in self.url_calls] |
742 self.assertEquals(urls.count(self.mailer_url), 1) | 733 self.assertEquals(urls.count(self.mailer_url), 1) |
743 | 734 |
744 | 735 |
745 #### Gatekeeper parsing. | 736 #### Gatekeeper parsing. |
746 | 737 |
747 def testSheriffParsing(self): | 738 def testSheriffParsing(self): |
748 """Test that sheriff annotations are properly parsed.""" | 739 """Test that sheriff annotations are properly parsed.""" |
749 sys.argv.extend([m.url for m in self.masters]) | 740 sys.argv.extend([m.url for m in self.masters]) |
750 sys.argv.extend(['--skip-build-db-update', | 741 sys.argv.extend(['--skip-build-db-update', |
751 '--json', self.gatekeeper_file, | |
752 '--email-app-secret-file=%s' % self.email_secret_file]) | 742 '--email-app-secret-file=%s' % self.email_secret_file]) |
753 | 743 |
754 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 744 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
755 self.add_gatekeeper_section(self.masters[0].url, | 745 self.add_gatekeeper_section(self.masters[0].url, |
756 self.masters[0].builders[0].name, | 746 self.masters[0].builders[0].name, |
757 {'closing_steps': ['step1'], | 747 {'closing_steps': ['step1'], |
758 'sheriff_classes': ['sheriff_android']}) | 748 'sheriff_classes': ['sheriff_android']}) |
759 | 749 |
760 | 750 |
761 sheriff_url = 'http://build.chromium.org/p/chromium/sheriff_android.js' | 751 sheriff_url = 'http://build.chromium.org/p/chromium/sheriff_android.js' |
(...skipping 11 matching lines...) Expand all Loading... | |
773 mailer_data['recipients'].sort() | 763 mailer_data['recipients'].sort() |
774 self.assertEquals(mailer_data['recipients'], | 764 self.assertEquals(mailer_data['recipients'], |
775 ['a_committer@chromium.org', | 765 ['a_committer@chromium.org', |
776 'anothersheriff@google.com', | 766 'anothersheriff@google.com', |
777 'asheriff@google.com']) | 767 'asheriff@google.com']) |
778 | 768 |
779 def testNoSheriff(self): | 769 def testNoSheriff(self): |
780 """Test that a no-sheriff condition works OK (weekends).""" | 770 """Test that a no-sheriff condition works OK (weekends).""" |
781 sys.argv.extend([m.url for m in self.masters]) | 771 sys.argv.extend([m.url for m in self.masters]) |
782 sys.argv.extend(['--skip-build-db-update', | 772 sys.argv.extend(['--skip-build-db-update', |
783 '--json', self.gatekeeper_file, | |
784 '--email-app-secret-file=%s' % self.email_secret_file]) | 773 '--email-app-secret-file=%s' % self.email_secret_file]) |
785 | 774 |
786 self.masters[0].builders[0].builds[0].blame = [] | 775 self.masters[0].builders[0].builds[0].blame = [] |
787 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 776 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
788 | 777 |
789 self.add_gatekeeper_section(self.masters[0].url, | 778 self.add_gatekeeper_section(self.masters[0].url, |
790 self.masters[0].builders[0].name, | 779 self.masters[0].builders[0].name, |
791 {'closing_steps': ['step1'], | 780 {'closing_steps': ['step1'], |
792 'sheriff_classes': ['sheriff_android']}) | 781 'sheriff_classes': ['sheriff_android']}) |
793 | 782 |
794 sheriff_url = 'http://build.chromium.org/p/chromium/sheriff_android.js' | 783 sheriff_url = 'http://build.chromium.org/p/chromium/sheriff_android.js' |
795 sheriff_string = 'document.write(\'None (channel is sheriff)\')' | 784 sheriff_string = 'document.write(\'None (channel is sheriff)\')' |
796 self.handle_url_str(sheriff_url, sheriff_string) | 785 self.handle_url_str(sheriff_url, sheriff_string) |
797 | 786 |
798 self.call_gatekeeper() | 787 self.call_gatekeeper() |
799 | 788 |
800 self.assertEquals(self.url_calls[-1]['url'], sheriff_url) | 789 self.assertEquals(self.url_calls[-1]['url'], sheriff_url) |
801 | 790 |
802 urls = [call['url'] for call in self.url_calls] | 791 urls = [call['url'] for call in self.url_calls] |
803 self.assertNotIn(self.mailer_url, urls) | 792 self.assertNotIn(self.mailer_url, urls) |
804 | 793 |
805 def testNoSheriffButBlame(self): | 794 def testNoSheriffButBlame(self): |
806 """Test that no-sheriff works ok with a blamelist.""" | 795 """Test that no-sheriff works ok with a blamelist.""" |
807 sys.argv.extend([m.url for m in self.masters]) | 796 sys.argv.extend([m.url for m in self.masters]) |
808 sys.argv.extend(['--skip-build-db-update', | 797 sys.argv.extend(['--skip-build-db-update', |
809 '--json', self.gatekeeper_file, | |
810 '--email-app-secret-file=%s' % self.email_secret_file]) | 798 '--email-app-secret-file=%s' % self.email_secret_file]) |
811 | 799 |
812 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 800 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
813 self.add_gatekeeper_section(self.masters[0].url, | 801 self.add_gatekeeper_section(self.masters[0].url, |
814 self.masters[0].builders[0].name, | 802 self.masters[0].builders[0].name, |
815 {'closing_steps': ['step1'], | 803 {'closing_steps': ['step1'], |
816 'sheriff_classes': ['sheriff_android']}) | 804 'sheriff_classes': ['sheriff_android']}) |
817 | 805 |
818 sheriff_url = 'http://build.chromium.org/p/chromium/sheriff_android.js' | 806 sheriff_url = 'http://build.chromium.org/p/chromium/sheriff_android.js' |
819 sheriff_string = 'document.write(\'None (channel is sheriff)\')' | 807 sheriff_string = 'document.write(\'None (channel is sheriff)\')' |
820 self.handle_url_str(sheriff_url, sheriff_string) | 808 self.handle_url_str(sheriff_url, sheriff_string) |
821 | 809 |
822 self.call_gatekeeper() | 810 self.call_gatekeeper() |
823 | 811 |
824 self.assertEquals(self.url_calls[-2]['url'], sheriff_url) | 812 self.assertEquals(self.url_calls[-2]['url'], sheriff_url) |
825 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 813 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
826 mailer_data = GatekeeperTest.decode_param_json( | 814 mailer_data = GatekeeperTest.decode_param_json( |
827 self.url_calls[-1]['params']) | 815 self.url_calls[-1]['params']) |
828 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 816 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
829 | 817 |
830 def testMultiSheriff(self): | 818 def testMultiSheriff(self): |
831 """Test that multiple sheriff lists can be merged.""" | 819 """Test that multiple sheriff lists can be merged.""" |
832 sys.argv.extend([m.url for m in self.masters]) | 820 sys.argv.extend([m.url for m in self.masters]) |
833 sys.argv.extend(['--skip-build-db-update', | 821 sys.argv.extend(['--skip-build-db-update', |
834 '--json', self.gatekeeper_file, | |
835 '--email-app-secret-file=%s' % self.email_secret_file]) | 822 '--email-app-secret-file=%s' % self.email_secret_file]) |
836 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 823 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
837 self.add_gatekeeper_section(self.masters[0].url, | 824 self.add_gatekeeper_section(self.masters[0].url, |
838 self.masters[0].builders[0].name, | 825 self.masters[0].builders[0].name, |
839 {'closing_steps': ['step1'], | 826 {'closing_steps': ['step1'], |
840 'sheriff_classes': ['sheriff_android', | 827 'sheriff_classes': ['sheriff_android', |
841 'sheriff']}) | 828 'sheriff']}) |
842 | 829 |
843 sheriff_url = 'http://build.chromium.org/p/chromium/sheriff_android.js' | 830 sheriff_url = 'http://build.chromium.org/p/chromium/sheriff_android.js' |
844 sheriff_string = 'document.write(\'asheriff, anothersheriff\')' | 831 sheriff_string = 'document.write(\'asheriff, anothersheriff\')' |
(...skipping 16 matching lines...) Expand all Loading... | |
861 self.assertEquals(mailer_data['recipients'], | 848 self.assertEquals(mailer_data['recipients'], |
862 ['a_committer@chromium.org', | 849 ['a_committer@chromium.org', |
863 'anothersheriff@google.com', | 850 'anothersheriff@google.com', |
864 'asheriff@google.com', | 851 'asheriff@google.com', |
865 'athirdsheriff@google.com']) | 852 'athirdsheriff@google.com']) |
866 | 853 |
867 def testNotifyParsing(self): | 854 def testNotifyParsing(self): |
868 """Test that additional watchers can be merged to the mailing list.""" | 855 """Test that additional watchers can be merged to the mailing list.""" |
869 sys.argv.extend([m.url for m in self.masters]) | 856 sys.argv.extend([m.url for m in self.masters]) |
870 sys.argv.extend(['--skip-build-db-update', | 857 sys.argv.extend(['--skip-build-db-update', |
871 '--json', self.gatekeeper_file, | |
872 '--email-app-secret-file=%s' % self.email_secret_file]) | 858 '--email-app-secret-file=%s' % self.email_secret_file]) |
873 | 859 |
874 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 860 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
875 self.add_gatekeeper_section(self.masters[0].url, | 861 self.add_gatekeeper_section(self.masters[0].url, |
876 self.masters[0].builders[0].name, | 862 self.masters[0].builders[0].name, |
877 {'closing_steps': ['step1'], | 863 {'closing_steps': ['step1'], |
878 'tree_notify': ['a_watcher@chromium.org']}) | 864 'tree_notify': ['a_watcher@chromium.org']}) |
879 | 865 |
880 sheriff_url = 'http://build.chromium.org/p/chromium/sheriff_android.js' | 866 sheriff_url = 'http://build.chromium.org/p/chromium/sheriff_android.js' |
881 sheriff_string = 'document.write(\'asheriff, anothersheriff\')' | 867 sheriff_string = 'document.write(\'asheriff, anothersheriff\')' |
882 self.handle_url_str(sheriff_url, sheriff_string) | 868 self.handle_url_str(sheriff_url, sheriff_string) |
883 | 869 |
884 self.call_gatekeeper() | 870 self.call_gatekeeper() |
885 | 871 |
886 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 872 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
887 | 873 |
888 mailer_data = GatekeeperTest.decode_param_json( | 874 mailer_data = GatekeeperTest.decode_param_json( |
889 self.url_calls[-1]['params']) | 875 self.url_calls[-1]['params']) |
890 mailer_data['recipients'].sort() | 876 mailer_data['recipients'].sort() |
891 self.assertEquals(mailer_data['recipients'], | 877 self.assertEquals(mailer_data['recipients'], |
892 ['a_committer@chromium.org', | 878 ['a_committer@chromium.org', |
893 'a_watcher@chromium.org']) | 879 'a_watcher@chromium.org']) |
894 | 880 |
895 def testNotifyNoBlame(self): | 881 def testNotifyNoBlame(self): |
896 """Test that notify works with no blamelist.""" | 882 """Test that notify works with no blamelist.""" |
897 sys.argv.extend([m.url for m in self.masters]) | 883 sys.argv.extend([m.url for m in self.masters]) |
898 sys.argv.extend(['--skip-build-db-update', | 884 sys.argv.extend(['--skip-build-db-update', |
899 '--json', self.gatekeeper_file, | |
900 '--email-app-secret-file=%s' % self.email_secret_file]) | 885 '--email-app-secret-file=%s' % self.email_secret_file]) |
901 | 886 |
902 self.masters[0].builders[0].builds[0].blame = [] | 887 self.masters[0].builders[0].builds[0].blame = [] |
903 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 888 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
904 self.add_gatekeeper_section(self.masters[0].url, | 889 self.add_gatekeeper_section(self.masters[0].url, |
905 self.masters[0].builders[0].name, | 890 self.masters[0].builders[0].name, |
906 {'closing_steps': ['step1'], | 891 {'closing_steps': ['step1'], |
907 'tree_notify': ['a_watcher@chromium.org']}) | 892 'tree_notify': ['a_watcher@chromium.org']}) |
908 | 893 |
909 self.call_gatekeeper() | 894 self.call_gatekeeper() |
910 | 895 |
911 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 896 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
912 | 897 |
913 mailer_data = GatekeeperTest.decode_param_json( | 898 mailer_data = GatekeeperTest.decode_param_json( |
914 self.url_calls[-1]['params']) | 899 self.url_calls[-1]['params']) |
915 mailer_data['recipients'].sort() | 900 mailer_data['recipients'].sort() |
916 self.assertEquals(mailer_data['recipients'], ['a_watcher@chromium.org']) | 901 self.assertEquals(mailer_data['recipients'], ['a_watcher@chromium.org']) |
917 | 902 |
918 def testForgivingSteps(self): | 903 def testForgivingSteps(self): |
919 """Test that forgiving steps set status but don't email blamelist.""" | 904 """Test that forgiving steps set status but don't email blamelist.""" |
920 sys.argv.extend([m.url for m in self.masters]) | 905 sys.argv.extend([m.url for m in self.masters]) |
921 sys.argv.extend(['--skip-build-db-update', | 906 sys.argv.extend(['--skip-build-db-update', |
922 '--json', self.gatekeeper_file, | |
923 '--email-app-secret-file=%s' % self.email_secret_file, | 907 '--email-app-secret-file=%s' % self.email_secret_file, |
924 '--set-status', '--password-file', self.status_secret_file | 908 '--set-status', '--password-file', self.status_secret_file |
925 ]) | 909 ]) |
926 | 910 |
927 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 911 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
928 self.add_gatekeeper_section(self.masters[0].url, | 912 self.add_gatekeeper_section(self.masters[0].url, |
929 self.masters[0].builders[0].name, | 913 self.masters[0].builders[0].name, |
930 {'forgiving_steps': ['step1']}) | 914 {'forgiving_steps': ['step1']}) |
931 urls = self.call_gatekeeper() | 915 urls = self.call_gatekeeper() |
932 | 916 |
933 self.assertNotIn(self.mailer_url, urls) | 917 self.assertNotIn(self.mailer_url, urls) |
934 self.assertIn(self.status_url, urls) | 918 self.assertIn(self.status_url, urls) |
935 | 919 |
936 def testForgivingOptional(self): | 920 def testForgivingOptional(self): |
937 """Test that forgiving_optional steps set status but don't email.""" | 921 """Test that forgiving_optional steps set status but don't email.""" |
938 sys.argv.extend([m.url for m in self.masters]) | 922 sys.argv.extend([m.url for m in self.masters]) |
939 sys.argv.extend(['--skip-build-db-update', | 923 sys.argv.extend(['--skip-build-db-update', |
940 '--json', self.gatekeeper_file, | |
941 '--email-app-secret-file=%s' % self.email_secret_file, | 924 '--email-app-secret-file=%s' % self.email_secret_file, |
942 '--set-status', '--password-file', self.status_secret_file | 925 '--set-status', '--password-file', self.status_secret_file |
943 ]) | 926 ]) |
944 | 927 |
945 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 928 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
946 self.add_gatekeeper_section(self.masters[0].url, | 929 self.add_gatekeeper_section(self.masters[0].url, |
947 self.masters[0].builders[0].name, | 930 self.masters[0].builders[0].name, |
948 {'forgiving_optional': ['step1']}) | 931 {'forgiving_optional': ['step1']}) |
949 urls = self.call_gatekeeper() | 932 urls = self.call_gatekeeper() |
950 | 933 |
951 self.assertNotIn(self.mailer_url, urls) | 934 self.assertNotIn(self.mailer_url, urls) |
952 self.assertIn(self.status_url, urls) | 935 self.assertIn(self.status_url, urls) |
953 | 936 |
954 def testForgivingOptionalStar(self): | 937 def testForgivingOptionalStar(self): |
955 """Test that forgiving_optional * sets status but doesn't email.""" | 938 """Test that forgiving_optional * sets status but doesn't email.""" |
956 sys.argv.extend([m.url for m in self.masters]) | 939 sys.argv.extend([m.url for m in self.masters]) |
957 sys.argv.extend(['--skip-build-db-update', | 940 sys.argv.extend(['--skip-build-db-update', |
958 '--json', self.gatekeeper_file, | |
959 '--email-app-secret-file=%s' % self.email_secret_file, | 941 '--email-app-secret-file=%s' % self.email_secret_file, |
960 '--set-status', '--password-file', self.status_secret_file | 942 '--set-status', '--password-file', self.status_secret_file |
961 ]) | 943 ]) |
962 | 944 |
963 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 945 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
964 self.add_gatekeeper_section(self.masters[0].url, | 946 self.add_gatekeeper_section(self.masters[0].url, |
965 self.masters[0].builders[0].name, | 947 self.masters[0].builders[0].name, |
966 {'forgiving_optional': ['*']}) | 948 {'forgiving_optional': ['*']}) |
967 urls = self.call_gatekeeper() | 949 urls = self.call_gatekeeper() |
968 | 950 |
969 self.assertNotIn(self.mailer_url, urls) | 951 self.assertNotIn(self.mailer_url, urls) |
970 self.assertIn(self.status_url, urls) | 952 self.assertIn(self.status_url, urls) |
971 | 953 |
972 def testForgiveAllSteps(self): | 954 def testForgiveAllSteps(self): |
973 """Test that setting forgive_all prevents emailing the blamelist.""" | 955 """Test that setting forgive_all prevents emailing the blamelist.""" |
974 sys.argv.extend([m.url for m in self.masters]) | 956 sys.argv.extend([m.url for m in self.masters]) |
975 sys.argv.extend(['--skip-build-db-update', | 957 sys.argv.extend(['--skip-build-db-update', |
976 '--json', self.gatekeeper_file, | |
977 '--email-app-secret-file=%s' % self.email_secret_file, | 958 '--email-app-secret-file=%s' % self.email_secret_file, |
978 '--set-status', '--password-file', self.status_secret_file | 959 '--set-status', '--password-file', self.status_secret_file |
979 ]) | 960 ]) |
980 | 961 |
981 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 962 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
982 self.add_gatekeeper_section(self.masters[0].url, | 963 self.add_gatekeeper_section(self.masters[0].url, |
983 self.masters[0].builders[0].name, | 964 self.masters[0].builders[0].name, |
984 {'closing_steps': ['step1'], | 965 {'closing_steps': ['step1'], |
985 'forgive_all': 'true'}) | 966 'forgive_all': 'true'}) |
986 urls = self.call_gatekeeper() | 967 urls = self.call_gatekeeper() |
987 | 968 |
988 self.assertNotIn(self.mailer_url, urls) | 969 self.assertNotIn(self.mailer_url, urls) |
989 self.assertIn(self.status_url, urls) | 970 self.assertIn(self.status_url, urls) |
990 | 971 |
991 def testForgiveAllOptionalSteps(self): | 972 def testForgiveAllOptionalSteps(self): |
992 """Test that setting forgive_all prevents emailing the blamelist.""" | 973 """Test that setting forgive_all prevents emailing the blamelist.""" |
993 sys.argv.extend([m.url for m in self.masters]) | 974 sys.argv.extend([m.url for m in self.masters]) |
994 sys.argv.extend(['--skip-build-db-update', | 975 sys.argv.extend(['--skip-build-db-update', |
995 '--json', self.gatekeeper_file, | |
996 '--email-app-secret-file=%s' % self.email_secret_file, | 976 '--email-app-secret-file=%s' % self.email_secret_file, |
997 '--set-status', '--password-file', self.status_secret_file | 977 '--set-status', '--password-file', self.status_secret_file |
998 ]) | 978 ]) |
999 | 979 |
1000 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 980 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1001 self.add_gatekeeper_section(self.masters[0].url, | 981 self.add_gatekeeper_section(self.masters[0].url, |
1002 self.masters[0].builders[0].name, | 982 self.masters[0].builders[0].name, |
1003 {'closing_optional': ['step1'], | 983 {'closing_optional': ['step1'], |
1004 'forgive_all': 'true'}) | 984 'forgive_all': 'true'}) |
1005 urls = self.call_gatekeeper() | 985 urls = self.call_gatekeeper() |
1006 | 986 |
1007 self.assertNotIn(self.mailer_url, urls) | 987 self.assertNotIn(self.mailer_url, urls) |
1008 self.assertIn(self.status_url, urls) | 988 self.assertIn(self.status_url, urls) |
1009 | 989 |
1010 #### Multiple failures. | 990 #### Multiple failures. |
1011 | 991 |
1012 def testSequentialFailures(self): | 992 def testSequentialFailures(self): |
1013 """Test that the status app is only hit once if many failures are seen.""" | 993 """Test that the status app is only hit once if many failures are seen.""" |
1014 sys.argv.extend([m.url for m in self.masters]) | 994 sys.argv.extend([m.url for m in self.masters]) |
1015 sys.argv.extend(['--skip-build-db-update', | 995 sys.argv.extend(['--skip-build-db-update', |
1016 '--json', self.gatekeeper_file, | |
1017 '--email-app-secret-file=%s' % self.email_secret_file, | 996 '--email-app-secret-file=%s' % self.email_secret_file, |
1018 '--set-status', '--password-file', self.status_secret_file | 997 '--set-status', '--password-file', self.status_secret_file |
1019 ]) | 998 ]) |
1020 | 999 |
1021 new_build = self.create_generic_build(2, | 1000 new_build = self.create_generic_build(2, |
1022 ['a_second_committer@chromium.org']) | 1001 ['a_second_committer@chromium.org']) |
1023 self.masters[0].builders[0].builds.append(new_build) | 1002 self.masters[0].builders[0].builds.append(new_build) |
1024 | 1003 |
1025 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1004 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1026 self.add_gatekeeper_section(self.masters[0].url, | 1005 self.add_gatekeeper_section(self.masters[0].url, |
(...skipping 12 matching lines...) Expand all Loading... | |
1039 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 1018 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
1040 mailer_data = GatekeeperTest.decode_param_json( | 1019 mailer_data = GatekeeperTest.decode_param_json( |
1041 self.url_calls[-1]['params']) | 1020 self.url_calls[-1]['params']) |
1042 self.assertEquals(mailer_data['recipients'], | 1021 self.assertEquals(mailer_data['recipients'], |
1043 ['a_second_committer@chromium.org']) | 1022 ['a_second_committer@chromium.org']) |
1044 | 1023 |
1045 def testSequentialOneFailure(self): | 1024 def testSequentialOneFailure(self): |
1046 """Test that failing builds aren't mixed with good ones.""" | 1025 """Test that failing builds aren't mixed with good ones.""" |
1047 sys.argv.extend([m.url for m in self.masters]) | 1026 sys.argv.extend([m.url for m in self.masters]) |
1048 sys.argv.extend(['--skip-build-db-update', | 1027 sys.argv.extend(['--skip-build-db-update', |
1049 '--json', self.gatekeeper_file, | |
1050 '--email-app-secret-file=%s' % self.email_secret_file, | 1028 '--email-app-secret-file=%s' % self.email_secret_file, |
1051 '--set-status', '--password-file', self.status_secret_file | 1029 '--set-status', '--password-file', self.status_secret_file |
1052 ]) | 1030 ]) |
1053 | 1031 |
1054 new_build = self.create_generic_build(2, | 1032 new_build = self.create_generic_build(2, |
1055 ['a_second_committer@chromium.org']) | 1033 ['a_second_committer@chromium.org']) |
1056 self.masters[0].builders[0].builds.append(new_build) | 1034 self.masters[0].builders[0].builds.append(new_build) |
1057 | 1035 |
1058 self.add_gatekeeper_section(self.masters[0].url, | 1036 self.add_gatekeeper_section(self.masters[0].url, |
1059 self.masters[0].builders[0].name, | 1037 self.masters[0].builders[0].name, |
1060 {'closing_steps': ['step1']}) | 1038 {'closing_steps': ['step1']}) |
1061 | 1039 |
1062 self.masters[0].builders[0].builds[1].steps[1].results = [2, None] | 1040 self.masters[0].builders[0].builds[1].steps[1].results = [2, None] |
1063 | 1041 |
1064 urls = self.call_gatekeeper() | 1042 urls = self.call_gatekeeper() |
1065 self.assertEquals(urls.count(self.status_url), 1) | 1043 self.assertEquals(urls.count(self.status_url), 1) |
1066 self.assertEquals(urls.count(self.mailer_url), 1) | 1044 self.assertEquals(urls.count(self.mailer_url), 1) |
1067 | 1045 |
1068 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 1046 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
1069 mailer_data = GatekeeperTest.decode_param_json( | 1047 mailer_data = GatekeeperTest.decode_param_json( |
1070 self.url_calls[-1]['params']) | 1048 self.url_calls[-1]['params']) |
1071 self.assertEquals(mailer_data['recipients'], | 1049 self.assertEquals(mailer_data['recipients'], |
1072 ['a_second_committer@chromium.org']) | 1050 ['a_second_committer@chromium.org']) |
1073 | 1051 |
1074 def testStarBuilder(self): | 1052 def testStarBuilder(self): |
1075 """Test that * captures failures across all builders.""" | 1053 """Test that * captures failures across all builders.""" |
1076 sys.argv.extend([m.url for m in self.masters]) | 1054 sys.argv.extend([m.url for m in self.masters]) |
1077 sys.argv.extend(['--skip-build-db-update', | 1055 sys.argv.extend(['--skip-build-db-update', |
1078 '--json', self.gatekeeper_file, | |
1079 '--email-app-secret-file=%s' % self.email_secret_file]) | 1056 '--email-app-secret-file=%s' % self.email_secret_file]) |
1080 | 1057 |
1081 self.add_gatekeeper_section(self.masters[0].url, | 1058 self.add_gatekeeper_section(self.masters[0].url, |
1082 '*', | 1059 '*', |
1083 {'closing_steps': ['step4']}) | 1060 {'closing_steps': ['step4']}) |
1084 | 1061 |
1085 self.call_gatekeeper() | 1062 self.call_gatekeeper() |
1086 | 1063 |
1087 # Check that gatekeeper indeed sent an email. | 1064 # Check that gatekeeper indeed sent an email. |
1088 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 1065 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
1089 mailer_data = GatekeeperTest.decode_param_json(self.url_calls[-1]['params']) | 1066 mailer_data = GatekeeperTest.decode_param_json(self.url_calls[-1]['params']) |
1090 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 1067 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
1091 | 1068 |
1092 def testStarBuilderOverride(self): | 1069 def testStarBuilderOverride(self): |
1093 """Test that * can be explicitly overridden.""" | 1070 """Test that * can be explicitly overridden.""" |
1094 sys.argv.extend([m.url for m in self.masters]) | 1071 sys.argv.extend([m.url for m in self.masters]) |
1095 sys.argv.extend(['--skip-build-db-update', | 1072 sys.argv.extend(['--skip-build-db-update', |
1096 '--json', self.gatekeeper_file, | |
1097 '--email-app-secret-file=%s' % self.email_secret_file]) | 1073 '--email-app-secret-file=%s' % self.email_secret_file]) |
1098 | 1074 |
1099 # step3 won't fail the build. | 1075 # step3 won't fail the build. |
1100 self.add_gatekeeper_section(self.masters[0].url, | 1076 self.add_gatekeeper_section(self.masters[0].url, |
1101 '*', | 1077 '*', |
1102 {'closing_steps': ['step3']}) | 1078 {'closing_steps': ['step3']}) |
1103 | 1079 |
1104 # But step4 will. | 1080 # But step4 will. |
1105 self.add_gatekeeper_section(self.masters[0].url, | 1081 self.add_gatekeeper_section(self.masters[0].url, |
1106 self.masters[0].builders[0].name, | 1082 self.masters[0].builders[0].name, |
1107 {'closing_steps': ['step4']}, | 1083 {'closing_steps': ['step4']}, |
1108 idx=0) | 1084 idx=0) |
1109 | 1085 |
1110 self.call_gatekeeper() | 1086 self.call_gatekeeper() |
1111 | 1087 |
1112 # Check that gatekeeper indeed sent an email. | 1088 # Check that gatekeeper indeed sent an email. |
1113 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 1089 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
1114 mailer_data = GatekeeperTest.decode_param_json(self.url_calls[-1]['params']) | 1090 mailer_data = GatekeeperTest.decode_param_json(self.url_calls[-1]['params']) |
1115 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 1091 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
1116 | 1092 |
1117 def testStarBuilderNoPropagate(self): | 1093 def testStarBuilderNoPropagate(self): |
1118 """Test that * doesn't propagate to other builders.""" | 1094 """Test that * doesn't propagate to other builders.""" |
1119 sys.argv.extend([m.url for m in self.masters]) | 1095 sys.argv.extend([m.url for m in self.masters]) |
1120 sys.argv.extend(['--skip-build-db-update', | 1096 sys.argv.extend(['--skip-build-db-update', |
1121 '--json', self.gatekeeper_file, | |
1122 '--email-app-secret-file=%s' % self.email_secret_file]) | 1097 '--email-app-secret-file=%s' % self.email_secret_file]) |
1123 | 1098 |
1124 # step4 will fail the build. | 1099 # step4 will fail the build. |
1125 self.add_gatekeeper_section(self.masters[0].url, | 1100 self.add_gatekeeper_section(self.masters[0].url, |
1126 '*', | 1101 '*', |
1127 {'closing_steps': ['step4']}) | 1102 {'closing_steps': ['step4']}) |
1128 | 1103 |
1129 # But step3 won't. | 1104 # But step3 won't. |
1130 self.add_gatekeeper_section(self.masters[0].url, | 1105 self.add_gatekeeper_section(self.masters[0].url, |
1131 self.masters[0].builders[0].name, | 1106 self.masters[0].builders[0].name, |
1132 {'closing_steps': ['step3']}, | 1107 {'closing_steps': ['step3']}, |
1133 idx=0) | 1108 idx=0) |
1134 | 1109 |
1135 urls = self.call_gatekeeper() | 1110 urls = self.call_gatekeeper() |
1136 | 1111 |
1137 self.assertNotIn(self.mailer_url, urls) | 1112 self.assertNotIn(self.mailer_url, urls) |
1138 | 1113 |
1139 def testMultiBuilderOneFailure(self): | 1114 def testMultiBuilderOneFailure(self): |
1140 """Test that failure in one build doesn't affect another.""" | 1115 """Test that failure in one build doesn't affect another.""" |
1141 sys.argv.extend([m.url for m in self.masters]) | 1116 sys.argv.extend([m.url for m in self.masters]) |
1142 sys.argv.extend(['--skip-build-db-update', | 1117 sys.argv.extend(['--skip-build-db-update', |
1143 '--json', self.gatekeeper_file, | |
1144 '--email-app-secret-file=%s' % self.email_secret_file, | 1118 '--email-app-secret-file=%s' % self.email_secret_file, |
1145 '--set-status', '--password-file', self.status_secret_file | 1119 '--set-status', '--password-file', self.status_secret_file |
1146 ]) | 1120 ]) |
1147 | 1121 |
1122 build_db = gatekeeper_ng_db.gen_db(masters={ | |
1123 self.masters[0].url: { | |
1124 'mybuilder': { | |
1125 0: gatekeeper_ng_db.gen_build(finished=True)}, | |
1126 'mybuilder2': { | |
1127 0: gatekeeper_ng_db.gen_build(finished=True)}, | |
1128 }}) | |
1129 | |
1148 new_build = self.create_generic_build(2, | 1130 new_build = self.create_generic_build(2, |
1149 ['a_second_committer@chromium.org']) | 1131 ['a_second_committer@chromium.org']) |
1150 self.masters[0].builders.append(Builder('mybuilder2', [new_build])) | 1132 self.masters[0].builders.append(Builder('mybuilder2', [new_build])) |
1151 | 1133 |
1152 self.add_gatekeeper_section(self.masters[0].url, | 1134 self.add_gatekeeper_section(self.masters[0].url, |
1153 self.masters[0].builders[0].name, | 1135 self.masters[0].builders[0].name, |
1154 {'closing_steps': ['step1']}) | 1136 {'closing_steps': ['step1']}) |
1155 | 1137 |
1156 self.masters[0].builders[1].builds[0].steps[1].results = [2, None] | 1138 self.masters[0].builders[1].builds[0].steps[1].results = [2, None] |
1157 self.add_gatekeeper_section(self.masters[0].url, | 1139 self.add_gatekeeper_section(self.masters[0].url, |
1158 self.masters[0].builders[1].name, | 1140 self.masters[0].builders[1].name, |
1159 {'closing_steps': ['step1']}, | 1141 {'closing_steps': ['step1']}, |
1160 idx=0) | 1142 idx=0) |
1161 | 1143 |
1162 urls = self.call_gatekeeper() | 1144 urls = self.call_gatekeeper(build_db=build_db) |
1163 self.assertEquals(urls.count(self.status_url), 1) | 1145 self.assertEquals(urls.count(self.status_url), 1) |
1164 self.assertEquals(urls.count(self.mailer_url), 1) | 1146 self.assertEquals(urls.count(self.mailer_url), 1) |
1165 | 1147 |
1166 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 1148 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
1167 mailer_data = GatekeeperTest.decode_param_json( | 1149 mailer_data = GatekeeperTest.decode_param_json( |
1168 self.url_calls[-1]['params']) | 1150 self.url_calls[-1]['params']) |
1169 self.assertEquals(mailer_data['recipients'], | 1151 self.assertEquals(mailer_data['recipients'], |
1170 ['a_second_committer@chromium.org']) | 1152 ['a_second_committer@chromium.org']) |
1171 | 1153 |
1172 def testMultiBuilderFailures(self): | 1154 def testMultiBuilderFailures(self): |
1173 """Test that failures on several builders are handled properly.""" | 1155 """Test that failures on several builders are handled properly.""" |
1174 master_url = 'http://build.chromium.org/p/chromium.fyi' | 1156 master_url = 'http://build.chromium.org/p/chromium.fyi' |
1175 sys.argv.extend([master_url, | 1157 sys.argv.extend([master_url, |
1176 '--skip-build-db-update', | 1158 '--skip-build-db-update', |
1177 '--json', self.gatekeeper_file, | |
1178 '--email-app-secret-file=%s' % self.email_secret_file, | 1159 '--email-app-secret-file=%s' % self.email_secret_file, |
1179 '--set-status', '--password-file', self.status_secret_file | 1160 '--set-status', '--password-file', self.status_secret_file |
1180 ]) | 1161 ]) |
1181 | 1162 |
1163 build_db = gatekeeper_ng_db.gen_db(masters={ | |
1164 self.masters[0].url: { | |
1165 'mybuilder': { | |
1166 0: gatekeeper_ng_db.gen_build(finished=True)}, | |
1167 'mybuilder2': { | |
1168 0: gatekeeper_ng_db.gen_build(finished=True)}, | |
1169 }}) | |
1170 | |
1182 new_build = self.create_generic_build(2, | 1171 new_build = self.create_generic_build(2, |
1183 ['a_second_committer@chromium.org']) | 1172 ['a_second_committer@chromium.org']) |
1184 self.masters[0].builders.append(Builder('mybuilder2', [new_build])) | 1173 self.masters[0].builders.append(Builder('mybuilder2', [new_build])) |
1185 | 1174 |
1186 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1175 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1187 self.add_gatekeeper_section(self.masters[0].url, | 1176 self.add_gatekeeper_section(self.masters[0].url, |
1188 self.masters[0].builders[0].name, | 1177 self.masters[0].builders[0].name, |
1189 {'closing_steps': ['step1']}) | 1178 {'closing_steps': ['step1']}) |
1190 | 1179 |
1191 self.masters[0].builders[1].builds[0].steps[1].results = [2, None] | 1180 self.masters[0].builders[1].builds[0].steps[1].results = [2, None] |
1192 self.add_gatekeeper_section(self.masters[0].url, | 1181 self.add_gatekeeper_section(self.masters[0].url, |
1193 self.masters[0].builders[1].name, | 1182 self.masters[0].builders[1].name, |
1194 {'closing_steps': ['step1']}, | 1183 {'closing_steps': ['step1']}, |
1195 idx=0) | 1184 idx=0) |
1196 | 1185 |
1197 urls = self.call_gatekeeper() | 1186 urls = self.call_gatekeeper(build_db=build_db) |
1198 self.assertEquals(urls.count(self.status_url), 1) | 1187 self.assertEquals(urls.count(self.status_url), 1) |
1199 | 1188 |
1200 self.assertEquals(self.url_calls[-2]['url'], self.mailer_url) | 1189 self.assertEquals(self.url_calls[-2]['url'], self.mailer_url) |
1201 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 1190 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
1202 mailer_data = GatekeeperTest.decode_param_json( | 1191 mailer_data = GatekeeperTest.decode_param_json( |
1203 self.url_calls[-2]['params']) | 1192 self.url_calls[-2]['params']) |
1204 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 1193 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
1205 mailer_data = GatekeeperTest.decode_param_json( | 1194 mailer_data = GatekeeperTest.decode_param_json( |
1206 self.url_calls[-1]['params']) | 1195 self.url_calls[-1]['params']) |
1207 self.assertEquals(mailer_data['recipients'], | 1196 self.assertEquals(mailer_data['recipients'], |
1208 ['a_second_committer@chromium.org']) | 1197 ['a_second_committer@chromium.org']) |
1209 | 1198 |
1210 def testMultiMaster(self): | 1199 def testMultiMaster(self): |
1211 """Test that multiple master failures are handled properly.""" | 1200 """Test that multiple master failures are handled properly.""" |
1212 self.masters.append(self.create_generic_build_tree('Chromium FYI 2', | 1201 self.masters.append(self.create_generic_build_tree('Chromium FYI 2', |
1213 'chromium2.fyi')) | 1202 'chromium2.fyi')) |
1214 | 1203 |
1215 sys.argv.extend([m.url for m in self.masters]) | 1204 sys.argv.extend([m.url for m in self.masters]) |
1216 sys.argv.extend(['--skip-build-db-update', | 1205 sys.argv.extend(['--skip-build-db-update', |
1217 '--json', self.gatekeeper_file, | |
1218 '--email-app-secret-file=%s' % self.email_secret_file, | 1206 '--email-app-secret-file=%s' % self.email_secret_file, |
1219 '--set-status', '--password-file', self.status_secret_file | 1207 '--set-status', '--password-file', self.status_secret_file |
1220 ]) | 1208 ]) |
1221 | 1209 |
1210 build_db = gatekeeper_ng_db.gen_db(masters={ | |
1211 self.masters[0].url: { | |
1212 'mybuilder': { | |
1213 0: gatekeeper_ng_db.gen_build(finished=True)}, | |
1214 }, | |
1215 self.masters[1].url: { | |
1216 'mybuilder': { | |
1217 0: gatekeeper_ng_db.gen_build(finished=True)}, | |
1218 }, | |
1219 }) | |
1220 | |
1222 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1221 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1223 self.add_gatekeeper_section(self.masters[0].url, | 1222 self.add_gatekeeper_section(self.masters[0].url, |
1224 self.masters[0].builders[0].name, | 1223 self.masters[0].builders[0].name, |
1225 {'closing_steps': ['step1']}) | 1224 {'closing_steps': ['step1']}) |
1226 | 1225 |
1227 self.masters[1].builders[0].builds[0].blame = [ | 1226 self.masters[1].builders[0].builds[0].blame = [ |
1228 'a_second_committer@chromium.org'] | 1227 'a_second_committer@chromium.org'] |
1229 self.masters[1].builders[0].builds[0].steps[1].results = [2, None] | 1228 self.masters[1].builders[0].builds[0].steps[1].results = [2, None] |
1230 self.add_gatekeeper_section(self.masters[1].url, | 1229 self.add_gatekeeper_section(self.masters[1].url, |
1231 self.masters[0].builders[0].name, | 1230 self.masters[0].builders[0].name, |
1232 {'closing_steps': ['step1']}) | 1231 {'closing_steps': ['step1']}) |
1233 | 1232 |
1234 urls = self.call_gatekeeper() | 1233 urls = self.call_gatekeeper(build_db) |
1235 self.assertEquals(urls.count(self.status_url), 1) | 1234 self.assertEquals(urls.count(self.status_url), 1) |
1236 | 1235 |
1237 self.assertEquals(urls[-1], self.mailer_url) | 1236 self.assertEquals(urls[-1], self.mailer_url) |
1238 self.assertEquals(urls[-1], self.mailer_url) | 1237 self.assertEquals(urls[-1], self.mailer_url) |
1239 mailer_data = GatekeeperTest.decode_param_json( | 1238 mailer_data = GatekeeperTest.decode_param_json( |
1240 self.url_calls[-2]['params']) | 1239 self.url_calls[-2]['params']) |
1241 self.assertEquals(mailer_data['recipients'], | 1240 self.assertEquals(mailer_data['recipients'], |
1242 ['a_committer@chromium.org']) | 1241 ['a_committer@chromium.org']) |
1243 mailer_data = GatekeeperTest.decode_param_json( | 1242 mailer_data = GatekeeperTest.decode_param_json( |
1244 self.url_calls[-1]['params']) | 1243 self.url_calls[-1]['params']) |
1245 self.assertEquals(mailer_data['recipients'], | 1244 self.assertEquals(mailer_data['recipients'], |
1246 ['a_second_committer@chromium.org']) | 1245 ['a_second_committer@chromium.org']) |
1247 | 1246 |
1248 #### Partial builds (still running). | 1247 #### Partial builds (still running). |
1249 | 1248 |
1250 def testDontFailOmissionOnUncompletedBuild(self): | 1249 def testDontFailOmissionOnUncompletedBuild(self): |
1251 """Don't fail a running build because of omitted steps.""" | 1250 """Don't fail a running build because of omitted steps.""" |
1252 sys.argv.extend([m.url for m in self.masters]) | 1251 sys.argv.extend([m.url for m in self.masters]) |
1253 sys.argv.extend(['--skip-build-db-update', | 1252 sys.argv.extend(['--skip-build-db-update', |
1254 '--json', self.gatekeeper_file, | |
1255 '--no-email-app', '--set-status', | 1253 '--no-email-app', '--set-status', |
1256 '--password-file', self.status_secret_file]) | 1254 '--password-file', self.status_secret_file]) |
1257 | 1255 |
1258 self.masters[0].builders[0].builds[0].steps.append( | 1256 self.masters[0].builders[0].builds[0].steps.append( |
1259 BuildStep('step4', [], isStarted=True, isFinished=True)) | 1257 BuildStep('step4', [], isStarted=True, isFinished=True)) |
1260 mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) | 1258 mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) |
1261 mybuild.finished = False | 1259 mybuild.finished = False |
1262 self.masters[0].builders[0].builds.append(mybuild) | 1260 self.masters[0].builders[0].builds.append(mybuild) |
1263 self.add_gatekeeper_section(self.masters[0].url, | 1261 self.add_gatekeeper_section(self.masters[0].url, |
1264 self.masters[0].builders[0].name, | 1262 self.masters[0].builders[0].name, |
1265 {'closing_steps': ['step4']}) | 1263 {'closing_steps': ['step4']}) |
1266 | 1264 |
1267 urls = self.call_gatekeeper() | 1265 urls = self.call_gatekeeper() |
1268 self.assertNotIn(self.status_url, urls) | 1266 self.assertNotIn(self.status_url, urls) |
1269 | 1267 |
1270 def testFailedBuildInProgress(self): | 1268 def testFailedBuildInProgress(self): |
1271 """Test that a still-running build can close the tree.""" | 1269 """Test that a still-running build can close the tree.""" |
1272 sys.argv.extend([m.url for m in self.masters]) | 1270 sys.argv.extend([m.url for m in self.masters]) |
1273 sys.argv.extend(['--skip-build-db-update', | 1271 sys.argv.extend(['--skip-build-db-update', |
1274 '--json', self.gatekeeper_file, | |
1275 '--no-email-app', '--set-status', | 1272 '--no-email-app', '--set-status', |
1276 '--password-file', self.status_secret_file]) | 1273 '--password-file', self.status_secret_file]) |
1277 | 1274 |
1278 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1275 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1279 self.add_gatekeeper_section(self.masters[0].url, | 1276 self.add_gatekeeper_section(self.masters[0].url, |
1280 self.masters[0].builders[0].name, | 1277 self.masters[0].builders[0].name, |
1281 {'closing_steps': ['step1']}) | 1278 {'closing_steps': ['step1']}) |
1282 mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) | 1279 mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) |
1283 mybuild.finished = False | 1280 mybuild.finished = False |
1284 self.masters[0].builders[0].builds.append(mybuild) | 1281 self.masters[0].builders[0].builds.append(mybuild) |
1285 | 1282 |
1286 urls = self.call_gatekeeper() | 1283 urls = self.call_gatekeeper() |
1287 self.assertIn(self.status_url, urls) | 1284 self.assertIn(self.status_url, urls) |
1288 | 1285 |
1289 def testUpdateBuildDBNotCompletedButFailed(self): | 1286 def testUpdateBuildDBNotCompletedButFailed(self): |
1290 """Test that partial builds increment the DB if they failed.""" | 1287 """Test that partial builds increment the DB if they failed.""" |
1291 fd, dbfilename = tempfile.mkstemp() | 1288 build_db = gatekeeper_ng_db.gen_db(masters={ |
1292 build_db = {self.masters[0].url: { 'mybuilder': 1 }} | 1289 self.masters[0].url: { |
1293 os.write(fd, json.dumps(build_db)) | 1290 'mybuilder': { |
1294 os.close(fd) | 1291 1: gatekeeper_ng_db.gen_build(finished=True)}}}) |
1295 | 1292 |
1296 sys.argv.extend([m.url for m in self.masters]) | 1293 sys.argv.extend([m.url for m in self.masters]) |
1297 sys.argv.extend(['--build-db=%s' % dbfilename, | 1294 sys.argv.extend(['--no-email-app', '--set-status', |
1298 '--json', self.gatekeeper_file, | |
1299 '--no-email-app', '--set-status', | |
1300 '--password-file', self.status_secret_file]) | 1295 '--password-file', self.status_secret_file]) |
1301 | 1296 |
1302 mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) | 1297 mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) |
1303 mybuild.steps[1].results = [2, None] | 1298 mybuild.steps[1].results = [2, None] |
1304 mybuild.finished = False | 1299 mybuild.finished = False |
1305 self.masters[0].builders[0].builds.append(mybuild) | 1300 self.masters[0].builders[0].builds.append(mybuild) |
1306 self.add_gatekeeper_section(self.masters[0].url, | 1301 self.add_gatekeeper_section(self.masters[0].url, |
1307 self.masters[0].builders[0].name, | 1302 self.masters[0].builders[0].name, |
1308 {'closing_steps': ['step1']}) | 1303 {'closing_steps': ['step1']}) |
1309 | 1304 |
1310 @contextlib.contextmanager | 1305 urls = self.call_gatekeeper(build_db=build_db) |
1311 def delfile(filename): | 1306 unfinished_new_builds, finished_new_builds = self.process_build_db( |
1312 yield | 1307 self.masters[0].url, 'mybuilder') |
1313 os.unlink(filename) | |
1314 | 1308 |
1315 with delfile(dbfilename): | 1309 self.assertEquals(finished_new_builds, |
1316 urls = self.call_gatekeeper() | 1310 {1: gatekeeper_ng_db.gen_build(finished=True)}) |
1317 with open(dbfilename) as f: | 1311 self.assertEquals(unfinished_new_builds, |
1318 new_build_db = json.load(f) | 1312 {2: gatekeeper_ng_db.gen_build(triggered=[ |
1319 self.assertEquals(new_build_db, {self.masters[0].url: {'mybuilder': 2}}) | 1313 '2be9f9320c2d26b09e416d615' |
1314 'ff04786abc74794bd5b669a1bb4228f884ddf50'])}) | |
1315 | |
1320 self.assertIn(self.status_url, urls) | 1316 self.assertIn(self.status_url, urls) |
1321 | 1317 |
1322 def testDontUpdateBuildDBIfNotCompleted(self): | 1318 def testDontUpdateBuildDBIfNotCompleted(self): |
1323 """Test that partial builds don't increment the DB if still running.""" | 1319 """Test that partial builds aren't marked as finished.""" |
1324 fd, dbfilename = tempfile.mkstemp() | 1320 build_db = gatekeeper_ng_db.gen_db(masters={ |
1325 build_db = {self.masters[0].url: { 'mybuilder': 1 }} | 1321 self.masters[0].url: { |
1326 os.write(fd, json.dumps(build_db)) | 1322 'mybuilder': { |
1327 os.close(fd) | 1323 1: gatekeeper_ng_db.gen_build(finished=True), |
1324 2: gatekeeper_ng_db.gen_build()}}}) | |
1328 | 1325 |
1329 sys.argv.extend([m.url for m in self.masters]) | 1326 sys.argv.extend([m.url for m in self.masters]) |
1330 sys.argv.extend(['--build-db=%s' % dbfilename, | 1327 sys.argv.extend(['--no-email-app', '--set-status', |
1331 '--json', self.gatekeeper_file, | |
1332 '--no-email-app', '--set-status', | |
1333 '--password-file', self.status_secret_file]) | 1328 '--password-file', self.status_secret_file]) |
1334 | 1329 |
1335 mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) | 1330 mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) |
1336 mybuild.finished = False | 1331 mybuild.finished = False |
1337 self.masters[0].builders[0].builds.append(mybuild) | 1332 self.masters[0].builders[0].builds.append(mybuild) |
1338 self.add_gatekeeper_section(self.masters[0].url, | 1333 self.add_gatekeeper_section(self.masters[0].url, |
1339 self.masters[0].builders[0].name, | 1334 self.masters[0].builders[0].name, |
1340 {'closing_steps': ['step4']}) | 1335 {'closing_steps': ['step4']}) |
1341 | 1336 |
1342 @contextlib.contextmanager | 1337 urls = self.call_gatekeeper(build_db=build_db) |
1343 def delfile(filename): | 1338 unfinished_new_builds, finished_new_builds = self.process_build_db( |
1344 yield | 1339 self.masters[0].url, 'mybuilder') |
1345 os.unlink(filename) | |
1346 | 1340 |
1347 with delfile(dbfilename): | 1341 self.assertEquals(finished_new_builds, |
1348 urls = self.call_gatekeeper() | 1342 {1: gatekeeper_ng_db.gen_build(finished=True)}) |
1349 with open(dbfilename) as f: | 1343 self.assertEquals(unfinished_new_builds, |
1350 new_build_db = json.load(f) | 1344 {2: gatekeeper_ng_db.gen_build()}) |
1351 self.assertEquals(new_build_db, {self.masters[0].url: {'mybuilder': 1}}) | |
1352 self.assertNotIn(self.status_url, urls) | 1345 self.assertNotIn(self.status_url, urls) |
1353 | 1346 |
1347 def testTriggeringDoesntTriggerOnSameBuild(self): | |
1348 """Test that a section won't fire twice on a build.""" | |
1349 sys.argv.extend([m.url for m in self.masters]) | |
1350 sys.argv.extend(['--no-email-app', '--set-status', | |
1351 '--password-file', self.status_secret_file]) | |
1352 | |
1353 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | |
1354 self.masters[0].builders[0].builds[0].finished = False | |
1355 self.add_gatekeeper_section(self.masters[0].url, | |
1356 self.masters[0].builders[0].name, | |
1357 {'closing_steps': ['step1']}) | |
1358 | |
1359 urls = self.call_gatekeeper() | |
1360 build_db = gatekeeper_ng_db.get_build_db(self.build_db_file) | |
1361 urls += self.call_gatekeeper(build_db=build_db) | |
1362 unfinished_new_builds, finished_new_builds = self.process_build_db( | |
1363 self.masters[0].url, 'mybuilder') | |
1364 self.assertEquals(finished_new_builds, | |
1365 {0: gatekeeper_ng_db.gen_build(finished=True)}) | |
1366 self.assertEquals(unfinished_new_builds, | |
1367 {1: gatekeeper_ng_db.gen_build(triggered=[ | |
1368 '2be9f9320c2d26b09e416d615ff047' | |
1369 '86abc74794bd5b669a1bb4228f884ddf50'])}) | |
1370 self.assertEquals(1, len([u for u in urls if u == self.status_url])) | |
1371 | |
1372 def testTriggeringOneHashDoesntStopAnother(self): | |
1373 """Test that firing on one hash doesn't prevent another hash triggering.""" | |
1374 build_db = gatekeeper_ng_db.gen_db(masters={ | |
1375 self.masters[0].url: { | |
1376 'mybuilder': { | |
1377 1: gatekeeper_ng_db.gen_build(finished=True)}}}) | |
1378 | |
1379 sys.argv.extend([m.url for m in self.masters]) | |
1380 sys.argv.extend(['--no-email-app', '--set-status', | |
1381 '--password-file', self.status_secret_file]) | |
1382 | |
1383 mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) | |
1384 mybuild.finished = False | |
1385 self.masters[0].builders[0].builds.append(mybuild) | |
1386 self.masters[0].builders[0].builds[1].steps[1].results = [2, None] | |
1387 self.add_gatekeeper_section(self.masters[0].url, | |
1388 self.masters[0].builders[0].name, | |
1389 {'closing_steps': ['step1']}) | |
1390 | |
1391 urls = self.call_gatekeeper(build_db=build_db) | |
1392 self.add_gatekeeper_section(self.masters[0].url, | |
1393 self.masters[0].builders[0].name, | |
1394 {'closing_steps': ['step2']}) | |
1395 self.masters[0].builders[0].builds[1].steps[2].results = [2, None] | |
1396 build_db = gatekeeper_ng_db.get_build_db(self.build_db_file) | |
1397 urls += self.call_gatekeeper(build_db=build_db) | |
1398 unfinished_new_builds, finished_new_builds = self.process_build_db( | |
1399 self.masters[0].url, 'mybuilder') | |
1400 self.assertEquals(finished_new_builds, | |
1401 {1: gatekeeper_ng_db.gen_build(finished=True)}) | |
1402 self.assertEquals(unfinished_new_builds, | |
1403 {2: gatekeeper_ng_db.gen_build(triggered=[ | |
1404 '2be9f9320c2d26b09e416d615ff04786ab' | |
1405 'c74794bd5b669a1bb4228f884ddf50', | |
1406 | |
1407 'ac0bb2a7245af2aa43c257a3c4eda19dee' | |
1408 'a4137bc1bce6a8b307047fd6149e32'])}) | |
1409 self.assertEquals(2, len([u for u in urls if u == self.status_url])) | |
1410 | |
1354 ### JSON config file tests. | 1411 ### JSON config file tests. |
1355 | 1412 |
1356 def testInheritFromCategory(self): | 1413 def testInheritFromCategory(self): |
1357 """Check that steps in categories are inherited by builders.""" | 1414 """Check that steps in categories are inherited by builders.""" |
1358 sys.argv.extend([m.url for m in self.masters]) | 1415 sys.argv.extend([m.url for m in self.masters]) |
1359 sys.argv.extend(['--skip-build-db-update', | 1416 sys.argv.extend(['--skip-build-db-update', |
1360 '--json', self.gatekeeper_file, | |
1361 '--email-app-secret-file=%s' % self.email_secret_file]) | 1417 '--email-app-secret-file=%s' % self.email_secret_file]) |
1362 | 1418 |
1363 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1419 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1364 self.add_gatekeeper_category('mycat', {'closing_steps': ['step1']}) | 1420 self.add_gatekeeper_category('mycat', {'closing_steps': ['step1']}) |
1365 self.add_gatekeeper_section(self.masters[0].url, | 1421 self.add_gatekeeper_section(self.masters[0].url, |
1366 self.masters[0].builders[0].name, | 1422 self.masters[0].builders[0].name, |
1367 {'categories': ['mycat']}) | 1423 {'categories': ['mycat']}) |
1368 | 1424 |
1369 self.call_gatekeeper() | 1425 self.call_gatekeeper() |
1370 | 1426 |
1371 # Check that gatekeeper indeed sent an email. | 1427 # Check that gatekeeper indeed sent an email. |
1372 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 1428 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
1373 mailer_data = GatekeeperTest.decode_param_json( | 1429 mailer_data = GatekeeperTest.decode_param_json( |
1374 self.url_calls[-1]['params']) | 1430 self.url_calls[-1]['params']) |
1375 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 1431 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
1376 | 1432 |
1377 def testMultiCategory(self): | 1433 def testMultiCategory(self): |
1378 """Check that steps in categories are inherited by builders.""" | 1434 """Check that steps in categories are inherited by builders.""" |
1379 sys.argv.extend([m.url for m in self.masters]) | 1435 sys.argv.extend([m.url for m in self.masters]) |
1380 sys.argv.extend(['--skip-build-db-update', | 1436 sys.argv.extend(['--skip-build-db-update', |
1381 '--json', self.gatekeeper_file, | |
1382 '--email-app-secret-file=%s' % self.email_secret_file]) | 1437 '--email-app-secret-file=%s' % self.email_secret_file]) |
1383 | 1438 |
1384 self.masters[0].builders[0].builds[0].steps[2].results = [2, None] | 1439 self.masters[0].builders[0].builds[0].steps[2].results = [2, None] |
1385 self.add_gatekeeper_category('mycat', {'closing_steps': ['step1']}) | 1440 self.add_gatekeeper_category('mycat', {'closing_steps': ['step1']}) |
1386 self.add_gatekeeper_category('mycat2', {'closing_steps': ['step2']}) | 1441 self.add_gatekeeper_category('mycat2', {'closing_steps': ['step2']}) |
1387 self.add_gatekeeper_section(self.masters[0].url, | 1442 self.add_gatekeeper_section(self.masters[0].url, |
1388 self.masters[0].builders[0].name, | 1443 self.masters[0].builders[0].name, |
1389 {'categories': ['mycat', 'mycat2']}) | 1444 {'categories': ['mycat', 'mycat2']}) |
1390 | 1445 |
1391 self.call_gatekeeper() | 1446 self.call_gatekeeper() |
1392 | 1447 |
1393 # Check that gatekeeper indeed sent an email. | 1448 # Check that gatekeeper indeed sent an email. |
1394 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 1449 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
1395 mailer_data = GatekeeperTest.decode_param_json( | 1450 mailer_data = GatekeeperTest.decode_param_json( |
1396 self.url_calls[-1]['params']) | 1451 self.url_calls[-1]['params']) |
1397 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 1452 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
1398 | 1453 |
1399 def testAddonCategory(self): | 1454 def testAddonCategory(self): |
1400 """Check that builders can add-on to categories.""" | 1455 """Check that builders can add-on to categories.""" |
1401 sys.argv.extend([m.url for m in self.masters]) | 1456 sys.argv.extend([m.url for m in self.masters]) |
1402 sys.argv.extend(['--skip-build-db-update', | 1457 sys.argv.extend(['--skip-build-db-update', |
1403 '--json', self.gatekeeper_file, | |
1404 '--email-app-secret-file=%s' % self.email_secret_file]) | 1458 '--email-app-secret-file=%s' % self.email_secret_file]) |
1405 | 1459 |
1406 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1460 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1407 self.add_gatekeeper_category('mycat', {'closing_steps': ['step2']}) | 1461 self.add_gatekeeper_category('mycat', {'closing_steps': ['step2']}) |
1408 self.add_gatekeeper_section(self.masters[0].url, | 1462 self.add_gatekeeper_section(self.masters[0].url, |
1409 self.masters[0].builders[0].name, | 1463 self.masters[0].builders[0].name, |
1410 {'categories': ['mycat'], | 1464 {'categories': ['mycat'], |
1411 'closing_steps': ['step1']}) | 1465 'closing_steps': ['step1']}) |
1412 | 1466 |
1413 self.call_gatekeeper() | 1467 self.call_gatekeeper() |
1414 | 1468 |
1415 # Check that gatekeeper indeed sent an email. | 1469 # Check that gatekeeper indeed sent an email. |
1416 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 1470 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
1417 mailer_data = GatekeeperTest.decode_param_json( | 1471 mailer_data = GatekeeperTest.decode_param_json( |
1418 self.url_calls[-1]['params']) | 1472 self.url_calls[-1]['params']) |
1419 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 1473 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
1420 | 1474 |
1421 def testInheritFromMaster(self): | 1475 def testInheritFromMaster(self): |
1422 """Check that steps in masters are inherited by builders.""" | 1476 """Check that steps in masters are inherited by builders.""" |
1423 sys.argv.extend([m.url for m in self.masters]) | 1477 sys.argv.extend([m.url for m in self.masters]) |
1424 sys.argv.extend(['--skip-build-db-update', | 1478 sys.argv.extend(['--skip-build-db-update', |
1425 '--json', self.gatekeeper_file, | |
1426 '--email-app-secret-file=%s' % self.email_secret_file]) | 1479 '--email-app-secret-file=%s' % self.email_secret_file]) |
1427 | 1480 |
1428 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1481 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1429 self.add_gatekeeper_master_config(self.masters[0].url, | 1482 self.add_gatekeeper_master_config(self.masters[0].url, |
1430 {'sheriff_classes': ['sheriff_android']}) | 1483 {'sheriff_classes': ['sheriff_android']}) |
1431 self.add_gatekeeper_section(self.masters[0].url, | 1484 self.add_gatekeeper_section(self.masters[0].url, |
1432 self.masters[0].builders[0].name, | 1485 self.masters[0].builders[0].name, |
1433 {'closing_steps': ['step1']}, | 1486 {'closing_steps': ['step1']}, |
1434 idx=0) | 1487 idx=0) |
1435 | 1488 |
(...skipping 12 matching lines...) Expand all Loading... | |
1448 mailer_data['recipients'].sort() | 1501 mailer_data['recipients'].sort() |
1449 self.assertEquals(mailer_data['recipients'], | 1502 self.assertEquals(mailer_data['recipients'], |
1450 ['a_committer@chromium.org', | 1503 ['a_committer@chromium.org', |
1451 'anothersheriff@google.com', | 1504 'anothersheriff@google.com', |
1452 'asheriff@google.com']) | 1505 'asheriff@google.com']) |
1453 | 1506 |
1454 def testAddonToMaster(self): | 1507 def testAddonToMaster(self): |
1455 """Check that steps in masters can be added by builders.""" | 1508 """Check that steps in masters can be added by builders.""" |
1456 sys.argv.extend([m.url for m in self.masters]) | 1509 sys.argv.extend([m.url for m in self.masters]) |
1457 sys.argv.extend(['--skip-build-db-update', | 1510 sys.argv.extend(['--skip-build-db-update', |
1458 '--json', self.gatekeeper_file, | |
1459 '--email-app-secret-file=%s' % self.email_secret_file]) | 1511 '--email-app-secret-file=%s' % self.email_secret_file]) |
1460 | 1512 |
1461 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1513 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1462 self.add_gatekeeper_master_config(self.masters[0].url, | 1514 self.add_gatekeeper_master_config(self.masters[0].url, |
1463 {'sheriff_classes': ['sheriff_android']}) | 1515 {'sheriff_classes': ['sheriff_android']}) |
1464 self.add_gatekeeper_section(self.masters[0].url, | 1516 self.add_gatekeeper_section(self.masters[0].url, |
1465 self.masters[0].builders[0].name, | 1517 self.masters[0].builders[0].name, |
1466 {'closing_steps': ['step1'], | 1518 {'closing_steps': ['step1'], |
1467 'sheriff_classes': ['sheriff']}, | 1519 'sheriff_classes': ['sheriff']}, |
1468 idx=0) | 1520 idx=0) |
(...skipping 20 matching lines...) Expand all Loading... | |
1489 ['a_committer@chromium.org', | 1541 ['a_committer@chromium.org', |
1490 'anothersheriff2@google.com', | 1542 'anothersheriff2@google.com', |
1491 'anothersheriff@google.com', | 1543 'anothersheriff@google.com', |
1492 'asheriff2@google.com', | 1544 'asheriff2@google.com', |
1493 'asheriff@google.com']) | 1545 'asheriff@google.com']) |
1494 | 1546 |
1495 def testInheritCategoryFromMaster(self): | 1547 def testInheritCategoryFromMaster(self): |
1496 """Check that steps can inherit categories from masters.""" | 1548 """Check that steps can inherit categories from masters.""" |
1497 sys.argv.extend([m.url for m in self.masters]) | 1549 sys.argv.extend([m.url for m in self.masters]) |
1498 sys.argv.extend(['--skip-build-db-update', | 1550 sys.argv.extend(['--skip-build-db-update', |
1499 '--json', self.gatekeeper_file, | |
1500 '--email-app-secret-file=%s' % self.email_secret_file]) | 1551 '--email-app-secret-file=%s' % self.email_secret_file]) |
1501 | 1552 |
1502 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1553 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1503 self.add_gatekeeper_category('mycat', {'closing_steps': ['step1']}) | 1554 self.add_gatekeeper_category('mycat', {'closing_steps': ['step1']}) |
1504 self.add_gatekeeper_master_config(self.masters[0].url, | 1555 self.add_gatekeeper_master_config(self.masters[0].url, |
1505 {'categories': ['mycat']}) | 1556 {'categories': ['mycat']}) |
1506 self.add_gatekeeper_section(self.masters[0].url, | 1557 self.add_gatekeeper_section(self.masters[0].url, |
1507 self.masters[0].builders[0].name, | 1558 self.masters[0].builders[0].name, |
1508 {}, | 1559 {}, |
1509 idx=0) | 1560 idx=0) |
1510 | 1561 |
1511 self.call_gatekeeper() | 1562 self.call_gatekeeper() |
1512 | 1563 |
1513 # Check that gatekeeper indeed sent an email. | 1564 # Check that gatekeeper indeed sent an email. |
1514 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 1565 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
1515 mailer_data = GatekeeperTest.decode_param_json( | 1566 mailer_data = GatekeeperTest.decode_param_json( |
1516 self.url_calls[-1]['params']) | 1567 self.url_calls[-1]['params']) |
1517 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 1568 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
1518 | 1569 |
1519 def testMasterSections(self): | 1570 def testMasterSections(self): |
1520 """Check that master sections work correctly.""" | 1571 """Check that master sections work correctly.""" |
1521 sys.argv.extend([m.url for m in self.masters]) | 1572 sys.argv.extend([m.url for m in self.masters]) |
1522 sys.argv.extend(['--skip-build-db-update', | 1573 sys.argv.extend(['--skip-build-db-update', |
1523 '--json', self.gatekeeper_file, | |
1524 '--email-app-secret-file=%s' % self.email_secret_file]) | 1574 '--email-app-secret-file=%s' % self.email_secret_file]) |
1525 | 1575 |
1526 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1576 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1527 self.add_gatekeeper_category('mycat', {'closing_steps': ['step1']}) | 1577 self.add_gatekeeper_category('mycat', {'closing_steps': ['step1']}) |
1528 self.add_gatekeeper_master_config(self.masters[0].url, | 1578 self.add_gatekeeper_master_config(self.masters[0].url, |
1529 {} | 1579 {} |
1530 ) | 1580 ) |
1531 self.add_gatekeeper_section(self.masters[0].url, | 1581 self.add_gatekeeper_section(self.masters[0].url, |
1532 self.masters[0].builders[0].name, | 1582 self.masters[0].builders[0].name, |
1533 {}, | 1583 {}, |
1534 idx=0) | 1584 idx=0) |
1535 | 1585 |
1536 self.add_gatekeeper_section(self.masters[0].url, | 1586 self.add_gatekeeper_section(self.masters[0].url, |
1537 self.masters[0].builders[0].name, | 1587 self.masters[0].builders[0].name, |
1538 {'categories': ['mycat']}) | 1588 {'categories': ['mycat']}) |
1539 | 1589 |
1540 self.call_gatekeeper() | 1590 self.call_gatekeeper() |
1541 | 1591 |
1542 # Check that gatekeeper indeed sent an email. | 1592 # Check that gatekeeper indeed sent an email. |
1543 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 1593 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
1544 mailer_data = GatekeeperTest.decode_param_json( | 1594 mailer_data = GatekeeperTest.decode_param_json( |
1545 self.url_calls[-1]['params']) | 1595 self.url_calls[-1]['params']) |
1546 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 1596 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
1547 | 1597 |
1548 def testMasterSectionEmails(self): | 1598 def testMasterSectionEmails(self): |
1549 """Check that master section handles email properly.""" | 1599 """Check that master section handles email properly.""" |
1550 sys.argv.extend([m.url for m in self.masters]) | 1600 sys.argv.extend([m.url for m in self.masters]) |
1551 sys.argv.extend(['--skip-build-db-update', | 1601 sys.argv.extend(['--skip-build-db-update', |
1552 '--json', self.gatekeeper_file, | |
1553 '--email-app-secret-file=%s' % self.email_secret_file]) | 1602 '--email-app-secret-file=%s' % self.email_secret_file]) |
1554 | 1603 |
1555 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1604 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1556 self.add_gatekeeper_category('mycat', {'closing_steps': ['step1']}) | 1605 self.add_gatekeeper_category('mycat', {'closing_steps': ['step1']}) |
1557 self.add_gatekeeper_master_config(self.masters[0].url, | 1606 self.add_gatekeeper_master_config(self.masters[0].url, |
1558 {} | 1607 {} |
1559 ) | 1608 ) |
1560 self.add_gatekeeper_section(self.masters[0].url, | 1609 self.add_gatekeeper_section(self.masters[0].url, |
1561 self.masters[0].builders[0].name, | 1610 self.masters[0].builders[0].name, |
1562 {'closing_steps': ['step1'], | 1611 {'closing_steps': ['step1'], |
(...skipping 10 matching lines...) Expand all Loading... | |
1573 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 1622 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
1574 mailer_data = GatekeeperTest.decode_param_json( | 1623 mailer_data = GatekeeperTest.decode_param_json( |
1575 self.url_calls[-1]['params']) | 1624 self.url_calls[-1]['params']) |
1576 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org', | 1625 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org', |
1577 'a_watcher@chromium.org']) | 1626 'a_watcher@chromium.org']) |
1578 | 1627 |
1579 def testEmailFilter(self): | 1628 def testEmailFilter(self): |
1580 """Test that no email is sent if the email isn't in the domain filter.""" | 1629 """Test that no email is sent if the email isn't in the domain filter.""" |
1581 sys.argv.extend([m.url for m in self.masters]) | 1630 sys.argv.extend([m.url for m in self.masters]) |
1582 sys.argv.extend(['--skip-build-db-update', | 1631 sys.argv.extend(['--skip-build-db-update', |
1583 '--json', self.gatekeeper_file, | |
1584 '--email-app-secret-file=%s' % self.email_secret_file, | 1632 '--email-app-secret-file=%s' % self.email_secret_file, |
1585 '--filter-domain=squirrels.net,squirrels.com']) | 1633 '--filter-domain=squirrels.net,squirrels.com']) |
1586 | 1634 |
1587 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1635 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1588 self.add_gatekeeper_section(self.masters[0].url, | 1636 self.add_gatekeeper_section(self.masters[0].url, |
1589 self.masters[0].builders[0].name, | 1637 self.masters[0].builders[0].name, |
1590 {'closing_steps': ['step1']}) | 1638 {'closing_steps': ['step1']}) |
1591 | 1639 |
1592 urls = self.call_gatekeeper() | 1640 urls = self.call_gatekeeper() |
1593 self.assertNotIn(self.mailer_url, urls) | 1641 self.assertNotIn(self.mailer_url, urls) |
1594 | 1642 |
1595 def testDisableEmailFilter(self): | 1643 def testDisableEmailFilter(self): |
1596 """Test that no email is sent if the email isn't in the domain filter.""" | 1644 """Test that no email is sent if the email isn't in the domain filter.""" |
1597 sys.argv.extend([m.url for m in self.masters]) | 1645 sys.argv.extend([m.url for m in self.masters]) |
1598 sys.argv.extend(['--skip-build-db-update', | 1646 sys.argv.extend(['--skip-build-db-update', |
1599 '--json', self.gatekeeper_file, | |
1600 '--email-app-secret-file=%s' % self.email_secret_file, | 1647 '--email-app-secret-file=%s' % self.email_secret_file, |
1601 '--disable-domain-filter', | 1648 '--disable-domain-filter', |
1602 '--filter-domain=squirrels.net,squirrels.com']) | 1649 '--filter-domain=squirrels.net,squirrels.com']) |
1603 | 1650 |
1604 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1651 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1605 self.add_gatekeeper_section(self.masters[0].url, | 1652 self.add_gatekeeper_section(self.masters[0].url, |
1606 self.masters[0].builders[0].name, | 1653 self.masters[0].builders[0].name, |
1607 {'closing_steps': ['step1']}) | 1654 {'closing_steps': ['step1']}) |
1608 | 1655 |
1609 self.call_gatekeeper() | 1656 self.call_gatekeeper() |
1610 | 1657 |
1611 # Check that gatekeeper indeed sent an email. | 1658 # Check that gatekeeper indeed sent an email. |
1612 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 1659 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
1613 mailer_data = GatekeeperTest.decode_param_json( | 1660 mailer_data = GatekeeperTest.decode_param_json( |
1614 self.url_calls[-1]['params']) | 1661 self.url_calls[-1]['params']) |
1615 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 1662 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
1616 | 1663 |
1617 def testMasterNotConfigured(self): | 1664 def testMasterNotConfigured(self): |
1618 """Check that gatekeeper fails if a master isn't in config json.""" | 1665 """Check that gatekeeper fails if a master isn't in config json.""" |
1619 | 1666 |
1620 sys.argv.extend([m.url for m in self.masters]) | 1667 sys.argv.extend([m.url for m in self.masters]) |
1621 sys.argv.extend(['--skip-build-db-update', | 1668 sys.argv.extend(['--skip-build-db-update', |
1622 '--json', self.gatekeeper_file, | |
1623 '--no-email-app']) | 1669 '--no-email-app']) |
1624 with self.assertRaises(ValueError): | 1670 with self.assertRaises(ValueError): |
1625 self.call_gatekeeper() | 1671 self.call_gatekeeper() |
1626 | 1672 |
1627 def testSectionWillNotCloseTree(self): | 1673 def testSectionWillNotCloseTree(self): |
1628 """Test that close_tree=False sections don't call to the status app.""" | 1674 """Test that close_tree=False sections don't call to the status app.""" |
1629 sys.argv.extend([m.url for m in self.masters]) | 1675 sys.argv.extend([m.url for m in self.masters]) |
1630 sys.argv.extend(['--skip-build-db-update', | 1676 sys.argv.extend(['--skip-build-db-update', |
1631 '--no-email-app', '--set-status', | 1677 '--no-email-app', '--set-status', |
1632 '--json', self.gatekeeper_file, | |
1633 '--password-file', self.status_secret_file]) | 1678 '--password-file', self.status_secret_file]) |
1634 | 1679 |
1635 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1680 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1636 self.add_gatekeeper_section(self.masters[0].url, | 1681 self.add_gatekeeper_section(self.masters[0].url, |
1637 self.masters[0].builders[0].name, | 1682 self.masters[0].builders[0].name, |
1638 {'closing_steps': ['step1']}) | 1683 {'closing_steps': ['step1']}) |
1639 | 1684 |
1640 self.handle_url_str(self.status_url, 'the status') | 1685 self.handle_url_str(self.status_url, 'the status') |
1641 | 1686 |
1642 self.add_gatekeeper_master_section(self.masters[0].url, -1, | 1687 self.add_gatekeeper_master_section(self.masters[0].url, -1, |
1643 {'close_tree': False}) | 1688 {'close_tree': False}) |
1644 | 1689 |
1645 urls = self.call_gatekeeper() | 1690 urls = self.call_gatekeeper() |
1646 self.assertNotIn(self.status_url, urls) | 1691 self.assertNotIn(self.status_url, urls) |
1647 | 1692 |
1648 def testInvalidConfigIsCaught(self): | 1693 def testInvalidConfigIsCaught(self): |
1649 sys.argv.extend(['--verify', | 1694 sys.argv.extend(['--verify']) |
1650 '--json', self.gatekeeper_file]) | |
1651 | 1695 |
1652 self.add_gatekeeper_section(self.masters[0].url, | 1696 self.add_gatekeeper_section(self.masters[0].url, |
1653 self.masters[0].builders[0].name, | 1697 self.masters[0].builders[0].name, |
1654 {'squirrels': ['yay']}) | 1698 {'squirrels': ['yay']}) |
1655 with self.assertRaises(AssertionError): | 1699 with self.assertRaises(AssertionError): |
1656 self.call_gatekeeper() | 1700 self.call_gatekeeper() |
1657 | 1701 |
1658 # Check that the checked in gatekeeper.json is valid. | 1702 # Check that the checked in gatekeeper.json is valid. |
1659 def testCheckedInConfigIsValid(self): | 1703 def testCheckedInConfigIsValid(self): |
1660 sys.argv.extend(['--verify', | 1704 sys.argv.extend(['--verify']) |
1661 '--json', | 1705 self.call_gatekeeper( |
1662 os.path.join(SCRIPT_DIR, os.pardir, 'gatekeeper.json')]) | 1706 json=os.path.join(SCRIPT_DIR, os.pardir, 'gatekeeper.json')) |
1663 self.call_gatekeeper() | |
1664 | 1707 |
1665 | 1708 |
1666 if __name__ == '__main__': | 1709 if __name__ == '__main__': |
1667 with utils.print_coverage(include=[__file__]): | 1710 with utils.print_coverage(include=[__file__]): |
1668 unittest.main() | 1711 unittest.main() |
OLD | NEW |