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 |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
225 def create_generic_build_tree(self, master_title, master_url_chunk): | 225 def create_generic_build_tree(self, master_title, master_url_chunk): |
226 build = GatekeeperTest.create_generic_build(1, ['a_committer@chromium.org']) | 226 build = GatekeeperTest.create_generic_build(1, ['a_committer@chromium.org']) |
227 | 227 |
228 builder = Builder('mybuilder', [build]) | 228 builder = Builder('mybuilder', [build]) |
229 | 229 |
230 return Master(master_title, self.master_url_root + master_url_chunk, | 230 return Master(master_title, self.master_url_root + master_url_chunk, |
231 [builder]) | 231 [builder]) |
232 | 232 |
233 def call_gatekeeper(self): | 233 def call_gatekeeper(self): |
234 """Sets up handlers for all the json and actually calls gatekeeper.""" | 234 """Sets up handlers for all the json and actually calls gatekeeper.""" |
235 self.url_calls = [] | |
235 self.handle_build_tree(self.masters) | 236 self.handle_build_tree(self.masters) |
236 ret = gatekeeper_ng.main() | 237 ret = gatekeeper_ng.main() |
237 if ret != 0: | 238 if ret != 0: |
238 raise ValueError('return code was %d' % ret) | 239 raise ValueError('return code was %d' % ret) |
239 | 240 |
240 # Return urls as a convenience. | 241 # Return urls as a convenience. |
241 return [call['url'] for call in self.url_calls] | 242 return [call['url'] for call in self.url_calls] |
242 | 243 |
243 @contextlib.contextmanager | 244 @contextlib.contextmanager |
244 def gatekeeper_config_editor(self): | 245 def gatekeeper_config_editor(self): |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
350 {}) | 351 {}) |
351 | 352 |
352 urls = self.call_gatekeeper() | 353 urls = self.call_gatekeeper() |
353 self.assertEquals(urls, [self.masters[0].url + '/json']) | 354 self.assertEquals(urls, [self.masters[0].url + '/json']) |
354 | 355 |
355 def testIgnoreSuccessfulBuildNoGatekeeperSteps(self): | 356 def testIgnoreSuccessfulBuildNoGatekeeperSteps(self): |
356 """If gatekeeper_spec doesn't have any annotations, don't fail build.""" | 357 """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([m.url for m in self.masters]) |
358 sys.argv.extend(['--skip-build-db-update', | 359 sys.argv.extend(['--skip-build-db-update', |
359 '--json', self.gatekeeper_file, | 360 '--json', self.gatekeeper_file, |
361 '--process-finished-builds-on-new-builder', | |
iannucci
2014/02/20 03:30:55
nope
ghost stip (do not use)
2014/02/22 10:03:07
Done.
| |
360 '--email-app-secret-file=%s' % self.email_secret_file]) | 362 '--email-app-secret-file=%s' % self.email_secret_file]) |
361 | 363 |
362 | 364 |
363 self.handle_build_tree([self.masters[0]]) | 365 self.handle_build_tree([self.masters[0]]) |
364 gatekeeper_ng.main() | 366 gatekeeper_ng.main() |
365 urls = [call['url'] for call in self.url_calls] | 367 urls = [call['url'] for call in self.url_calls] |
366 self.assertNotIn(self.mailer_url, urls) | 368 self.assertNotIn(self.mailer_url, urls) |
367 | 369 |
368 def testFailedBuildDetected(self): | 370 def testFailedBuildDetected(self): |
369 """Test that an erroneous build result closes the tree.""" | 371 """Test that an erroneous build result closes the tree.""" |
370 sys.argv.extend([m.url for m in self.masters]) | 372 sys.argv.extend([m.url for m in self.masters]) |
371 sys.argv.extend(['--skip-build-db-update', | 373 sys.argv.extend(['--skip-build-db-update', |
372 '--json', self.gatekeeper_file, | 374 '--json', self.gatekeeper_file, |
375 '--process-finished-builds-on-new-builder', | |
373 '--email-app-secret-file=%s' % self.email_secret_file]) | 376 '--email-app-secret-file=%s' % self.email_secret_file]) |
374 | 377 |
375 self.masters[0].builders[0].builds[0].results = 3 | 378 self.masters[0].builders[0].builds[0].results = 3 |
376 self.add_gatekeeper_master_config(self.masters[0].url, | 379 self.add_gatekeeper_master_config(self.masters[0].url, |
377 {'respect_build_status': True}) | 380 {'respect_build_status': True}) |
378 self.add_gatekeeper_section(self.masters[0].url, | 381 self.add_gatekeeper_section(self.masters[0].url, |
379 self.masters[0].builders[0].name, | 382 self.masters[0].builders[0].name, |
380 {}, | 383 {}, |
381 idx=0) | 384 idx=0) |
382 | 385 |
383 self.handle_url_str(self.mailer_url, '') | 386 self.handle_url_str(self.mailer_url, '') |
384 | 387 |
385 self.handle_build_tree([self.masters[0]]) | 388 self.handle_build_tree([self.masters[0]]) |
386 gatekeeper_ng.main() | 389 gatekeeper_ng.main() |
387 | 390 |
388 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 391 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
389 mailer_data = GatekeeperTest.decode_param_json( | 392 mailer_data = GatekeeperTest.decode_param_json( |
390 self.url_calls[-1]['params']) | 393 self.url_calls[-1]['params']) |
391 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 394 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
392 | 395 |
393 def testFailedBuildNoEmail(self): | 396 def testFailedBuildNoEmail(self): |
394 """Test that no email is sent if there are no watchers.""" | 397 """Test that no email is sent if there are no watchers.""" |
395 sys.argv.extend([m.url for m in self.masters]) | 398 sys.argv.extend([m.url for m in self.masters]) |
396 sys.argv.extend(['--skip-build-db-update', | 399 sys.argv.extend(['--skip-build-db-update', |
397 '--json', self.gatekeeper_file, | 400 '--json', self.gatekeeper_file, |
401 '--process-finished-builds-on-new-builder', | |
398 '--email-app-secret-file=%s' % self.email_secret_file]) | 402 '--email-app-secret-file=%s' % self.email_secret_file]) |
399 | 403 |
400 | 404 |
401 self.masters[0].builders[0].builds[0].results = 3 | 405 self.masters[0].builders[0].builds[0].results = 3 |
402 self.masters[0].builders[0].builds[0].blame = [] | 406 self.masters[0].builders[0].builds[0].blame = [] |
403 self.add_gatekeeper_master_config(self.masters[0].url, | 407 self.add_gatekeeper_master_config(self.masters[0].url, |
404 {'respect_build_status': True}) | 408 {'respect_build_status': True}) |
405 self.add_gatekeeper_section(self.masters[0].url, | 409 self.add_gatekeeper_section(self.masters[0].url, |
406 self.masters[0].builders[0].name, | 410 self.masters[0].builders[0].name, |
407 {}, | 411 {}, |
408 idx=0) | 412 idx=0) |
409 | 413 |
410 | 414 |
411 urls = self.call_gatekeeper() | 415 urls = self.call_gatekeeper() |
412 self.assertNotIn(self.mailer_url, urls) | 416 self.assertNotIn(self.mailer_url, urls) |
413 | 417 |
414 | 418 |
415 def testStepNonCloserFailureIgnored(self): | 419 def testStepNonCloserFailureIgnored(self): |
416 """Test that a non-closing failure is ignored.""" | 420 """Test that a non-closing failure is ignored.""" |
417 sys.argv.extend([m.url for m in self.masters]) | 421 sys.argv.extend([m.url for m in self.masters]) |
418 sys.argv.extend(['--skip-build-db-update', | 422 sys.argv.extend(['--skip-build-db-update', |
419 '--json', self.gatekeeper_file, | 423 '--json', self.gatekeeper_file, |
424 '--process-finished-builds-on-new-builder', | |
420 '--email-app-secret-file=%s' % self.email_secret_file]) | 425 '--email-app-secret-file=%s' % self.email_secret_file]) |
421 | 426 |
422 self.masters[0].builders[0].builds[0].steps[2].results = [2, None] | 427 self.masters[0].builders[0].builds[0].steps[2].results = [2, None] |
423 self.add_gatekeeper_section(self.masters[0].url, | 428 self.add_gatekeeper_section(self.masters[0].url, |
424 self.masters[0].builders[0].name, | 429 self.masters[0].builders[0].name, |
425 {'closing_steps': ['step1']}) | 430 {'closing_steps': ['step1']}) |
426 | 431 |
427 urls = self.call_gatekeeper() | 432 urls = self.call_gatekeeper() |
428 self.assertNotIn(self.mailer_url, urls) | 433 self.assertNotIn(self.mailer_url, urls) |
429 | 434 |
430 def testStepCloserFailureDetected(self): | 435 def testStepCloserFailureDetected(self): |
431 """Test that a failed closing step closes the tree.""" | 436 """Test that a failed closing step closes the tree.""" |
432 sys.argv.extend([m.url for m in self.masters]) | 437 sys.argv.extend([m.url for m in self.masters]) |
433 sys.argv.extend(['--skip-build-db-update', | 438 sys.argv.extend(['--skip-build-db-update', |
434 '--json', self.gatekeeper_file, | 439 '--json', self.gatekeeper_file, |
440 '--process-finished-builds-on-new-builder', | |
435 '--email-app-secret-file=%s' % self.email_secret_file]) | 441 '--email-app-secret-file=%s' % self.email_secret_file]) |
436 | 442 |
437 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 443 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
438 self.add_gatekeeper_section(self.masters[0].url, | 444 self.add_gatekeeper_section(self.masters[0].url, |
439 self.masters[0].builders[0].name, | 445 self.masters[0].builders[0].name, |
440 {'closing_steps': ['step1']}) | 446 {'closing_steps': ['step1']}) |
441 | 447 |
442 self.call_gatekeeper() | 448 self.call_gatekeeper() |
443 | 449 |
444 # Check that gatekeeper indeed sent an email. | 450 # Check that gatekeeper indeed sent an email. |
445 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 451 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
446 mailer_data = GatekeeperTest.decode_param_json( | 452 mailer_data = GatekeeperTest.decode_param_json( |
447 self.url_calls[-1]['params']) | 453 self.url_calls[-1]['params']) |
448 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 454 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
449 | 455 |
450 def testStepCloserFailureOptional(self): | 456 def testStepCloserFailureOptional(self): |
451 """Test that a failed closing_optional step closes the tree.""" | 457 """Test that a failed closing_optional step closes the tree.""" |
452 sys.argv.extend([m.url for m in self.masters]) | 458 sys.argv.extend([m.url for m in self.masters]) |
453 sys.argv.extend(['--skip-build-db-update', | 459 sys.argv.extend(['--skip-build-db-update', |
454 '--json', self.gatekeeper_file, | 460 '--json', self.gatekeeper_file, |
461 '--process-finished-builds-on-new-builder', | |
455 '--email-app-secret-file=%s' % self.email_secret_file]) | 462 '--email-app-secret-file=%s' % self.email_secret_file]) |
456 | 463 |
457 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 464 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
458 self.add_gatekeeper_section(self.masters[0].url, | 465 self.add_gatekeeper_section(self.masters[0].url, |
459 self.masters[0].builders[0].name, | 466 self.masters[0].builders[0].name, |
460 {'closing_optional': ['step1']}) | 467 {'closing_optional': ['step1']}) |
461 | 468 |
462 self.call_gatekeeper() | 469 self.call_gatekeeper() |
463 | 470 |
464 # Check that gatekeeper indeed sent an email. | 471 # Check that gatekeeper indeed sent an email. |
465 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 472 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
466 mailer_data = GatekeeperTest.decode_param_json( | 473 mailer_data = GatekeeperTest.decode_param_json( |
467 self.url_calls[-1]['params']) | 474 self.url_calls[-1]['params']) |
468 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 475 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
469 | 476 |
470 def testStepCloserFailureOptionalStar(self): | 477 def testStepCloserFailureOptionalStar(self): |
471 """Test that a failed closing_optional * step closes the tree.""" | 478 """Test that a failed closing_optional * step closes the tree.""" |
472 sys.argv.extend([m.url for m in self.masters]) | 479 sys.argv.extend([m.url for m in self.masters]) |
473 sys.argv.extend(['--skip-build-db-update', | 480 sys.argv.extend(['--skip-build-db-update', |
474 '--json', self.gatekeeper_file, | 481 '--json', self.gatekeeper_file, |
482 '--process-finished-builds-on-new-builder', | |
475 '--email-app-secret-file=%s' % self.email_secret_file]) | 483 '--email-app-secret-file=%s' % self.email_secret_file]) |
476 | 484 |
477 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 485 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
478 self.add_gatekeeper_section(self.masters[0].url, | 486 self.add_gatekeeper_section(self.masters[0].url, |
479 self.masters[0].builders[0].name, | 487 self.masters[0].builders[0].name, |
480 {'closing_optional': ['*']}) | 488 {'closing_optional': ['*']}) |
481 | 489 |
482 self.call_gatekeeper() | 490 self.call_gatekeeper() |
483 | 491 |
484 # Check that gatekeeper indeed sent an email. | 492 # Check that gatekeeper indeed sent an email. |
485 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 493 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
486 mailer_data = GatekeeperTest.decode_param_json( | 494 mailer_data = GatekeeperTest.decode_param_json( |
487 self.url_calls[-1]['params']) | 495 self.url_calls[-1]['params']) |
488 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 496 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
489 | 497 |
490 def testStepOmissionDetected(self): | 498 def testStepOmissionDetected(self): |
491 """Test that the lack of a closing step closes the tree.""" | 499 """Test that the lack of a closing step closes the tree.""" |
492 sys.argv.extend([m.url for m in self.masters]) | 500 sys.argv.extend([m.url for m in self.masters]) |
493 sys.argv.extend(['--skip-build-db-update', | 501 sys.argv.extend(['--skip-build-db-update', |
494 '--json', self.gatekeeper_file, | 502 '--json', self.gatekeeper_file, |
503 '--process-finished-builds-on-new-builder', | |
495 '--email-app-secret-file=%s' % self.email_secret_file]) | 504 '--email-app-secret-file=%s' % self.email_secret_file]) |
496 | 505 |
497 self.add_gatekeeper_section(self.masters[0].url, | 506 self.add_gatekeeper_section(self.masters[0].url, |
498 self.masters[0].builders[0].name, | 507 self.masters[0].builders[0].name, |
499 {'closing_steps': ['step4']}) | 508 {'closing_steps': ['step4']}) |
500 | 509 |
501 self.call_gatekeeper() | 510 self.call_gatekeeper() |
502 | 511 |
503 # Check that gatekeeper indeed sent an email. | 512 # Check that gatekeeper indeed sent an email. |
504 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 513 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
505 mailer_data = GatekeeperTest.decode_param_json(self.url_calls[-1]['params']) | 514 mailer_data = GatekeeperTest.decode_param_json(self.url_calls[-1]['params']) |
506 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 515 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
507 | 516 |
508 def testStepOmissionOptional(self): | 517 def testStepOmissionOptional(self): |
509 """Test that the lack of a closing_optional step doesn't close the tree.""" | 518 """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]) | 519 sys.argv.extend([m.url for m in self.masters]) |
511 sys.argv.extend(['--skip-build-db-update', | 520 sys.argv.extend(['--skip-build-db-update', |
512 '--json', self.gatekeeper_file, | 521 '--json', self.gatekeeper_file, |
522 '--process-finished-builds-on-new-builder', | |
513 '--email-app-secret-file=%s' % self.email_secret_file]) | 523 '--email-app-secret-file=%s' % self.email_secret_file]) |
514 | 524 |
515 self.add_gatekeeper_section(self.masters[0].url, | 525 self.add_gatekeeper_section(self.masters[0].url, |
516 self.masters[0].builders[0].name, | 526 self.masters[0].builders[0].name, |
517 {'closing_optional': ['step4']}) | 527 {'closing_optional': ['step4']}) |
518 | 528 |
519 self.call_gatekeeper() | 529 self.call_gatekeeper() |
520 urls = self.call_gatekeeper() | 530 urls = self.call_gatekeeper() |
521 self.assertNotIn(self.status_url, urls) | 531 self.assertNotIn(self.status_url, urls) |
522 self.assertNotIn(self.mailer_url, urls) | 532 self.assertNotIn(self.mailer_url, urls) |
523 | 533 |
524 def testStepForgivingOmissionOptional(self): | 534 def testStepForgivingOmissionOptional(self): |
525 """Test that the lack of a forgiving_optional step doesn't close tree.""" | 535 """Test that the lack of a forgiving_optional step doesn't close tree.""" |
526 sys.argv.extend([m.url for m in self.masters]) | 536 sys.argv.extend([m.url for m in self.masters]) |
527 sys.argv.extend(['--skip-build-db-update', | 537 sys.argv.extend(['--skip-build-db-update', |
528 '--json', self.gatekeeper_file, | 538 '--json', self.gatekeeper_file, |
539 '--process-finished-builds-on-new-builder', | |
529 '--email-app-secret-file=%s' % self.email_secret_file]) | 540 '--email-app-secret-file=%s' % self.email_secret_file]) |
530 | 541 |
531 self.add_gatekeeper_section(self.masters[0].url, | 542 self.add_gatekeeper_section(self.masters[0].url, |
532 self.masters[0].builders[0].name, | 543 self.masters[0].builders[0].name, |
533 {'forgiving_optional': ['step4']}) | 544 {'forgiving_optional': ['step4']}) |
534 | 545 |
535 self.call_gatekeeper() | 546 self.call_gatekeeper() |
536 | 547 |
537 urls = self.call_gatekeeper() | 548 urls = self.call_gatekeeper() |
538 self.assertNotIn(self.status_url, urls) | 549 self.assertNotIn(self.status_url, urls) |
539 self.assertNotIn(self.mailer_url, urls) | 550 self.assertNotIn(self.mailer_url, urls) |
540 | 551 |
541 def testStepNotStarted(self): | 552 def testStepNotStarted(self): |
542 """Test that a skipped closing step closes the tree.""" | 553 """Test that a skipped closing step closes the tree.""" |
543 sys.argv.extend([m.url for m in self.masters]) | 554 sys.argv.extend([m.url for m in self.masters]) |
544 sys.argv.extend(['--skip-build-db-update', | 555 sys.argv.extend(['--skip-build-db-update', |
545 '--json', self.gatekeeper_file, | 556 '--json', self.gatekeeper_file, |
557 '--process-finished-builds-on-new-builder', | |
546 '--email-app-secret-file=%s' % self.email_secret_file]) | 558 '--email-app-secret-file=%s' % self.email_secret_file]) |
547 | 559 |
548 self.add_gatekeeper_section(self.masters[0].url, | 560 self.add_gatekeeper_section(self.masters[0].url, |
549 self.masters[0].builders[0].name, | 561 self.masters[0].builders[0].name, |
550 {'closing_steps': ['step1']}) | 562 {'closing_steps': ['step1']}) |
551 | 563 |
552 self.masters[0].builders[0].builds[0].steps[1].isStarted = False | 564 self.masters[0].builders[0].builds[0].steps[1].isStarted = False |
553 self.masters[0].builders[0].builds[0].steps[1].isFinished = False | 565 self.masters[0].builders[0].builds[0].steps[1].isFinished = False |
554 | 566 |
555 self.call_gatekeeper() | 567 self.call_gatekeeper() |
556 | 568 |
557 # Check that gatekeeper indeed sent an email. | 569 # Check that gatekeeper indeed sent an email. |
558 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 570 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
559 mailer_data = GatekeeperTest.decode_param_json( | 571 mailer_data = GatekeeperTest.decode_param_json( |
560 self.url_calls[-1]['params']) | 572 self.url_calls[-1]['params']) |
561 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 573 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
562 | 574 |
563 def testGatekeeperOOO(self): | 575 def testGatekeeperOOO(self): |
564 """Test that gatekeeper_spec works even if not the first step.""" | 576 """Test that gatekeeper_spec works even if not the first step.""" |
565 sys.argv.extend([m.url for m in self.masters]) | 577 sys.argv.extend([m.url for m in self.masters]) |
566 sys.argv.extend(['--skip-build-db-update', | 578 sys.argv.extend(['--skip-build-db-update', |
567 '--json', self.gatekeeper_file, | 579 '--json', self.gatekeeper_file, |
580 '--process-finished-builds-on-new-builder', | |
568 '--email-app-secret-file=%s' % self.email_secret_file]) | 581 '--email-app-secret-file=%s' % self.email_secret_file]) |
569 | 582 |
570 self.add_gatekeeper_section(self.masters[0].url, | 583 self.add_gatekeeper_section(self.masters[0].url, |
571 self.masters[0].builders[0].name, | 584 self.masters[0].builders[0].name, |
572 {'closing_steps': ['step1']}) | 585 {'closing_steps': ['step1']}) |
573 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 586 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
574 | 587 |
575 spec = self.masters[0].builders[0].builds[0].steps | 588 spec = self.masters[0].builders[0].builds[0].steps |
576 self.masters[0].builders[0].builds[0].steps = spec[1:]+spec[:1] | 589 self.masters[0].builders[0].builds[0].steps = spec[1:]+spec[:1] |
577 | 590 |
578 self.call_gatekeeper() | 591 self.call_gatekeeper() |
579 | 592 |
580 # Check that gatekeeper indeed sent an email. | 593 # Check that gatekeeper indeed sent an email. |
581 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 594 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
582 mailer_data = GatekeeperTest.decode_param_json( | 595 mailer_data = GatekeeperTest.decode_param_json( |
583 self.url_calls[-1]['params']) | 596 self.url_calls[-1]['params']) |
584 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 597 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
585 | 598 |
586 def testFailedBuildClosesTree(self): | 599 def testFailedBuildClosesTree(self): |
587 """Test that a failed build calls to the status app.""" | 600 """Test that a failed build calls to the status app.""" |
588 sys.argv.extend([m.url for m in self.masters]) | 601 sys.argv.extend([m.url for m in self.masters]) |
589 sys.argv.extend(['--skip-build-db-update', | 602 sys.argv.extend(['--skip-build-db-update', |
590 '--no-email-app', '--set-status', | 603 '--no-email-app', '--set-status', |
591 '--json', self.gatekeeper_file, | 604 '--json', self.gatekeeper_file, |
605 '--process-finished-builds-on-new-builder', | |
592 '--password-file', self.status_secret_file]) | 606 '--password-file', self.status_secret_file]) |
593 | 607 |
594 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] |
595 self.add_gatekeeper_section(self.masters[0].url, | 609 self.add_gatekeeper_section(self.masters[0].url, |
596 self.masters[0].builders[0].name, | 610 self.masters[0].builders[0].name, |
597 {'closing_steps': ['step1']}) | 611 {'closing_steps': ['step1']}) |
598 | 612 |
599 urls = self.call_gatekeeper() | 613 urls = self.call_gatekeeper() |
600 self.assertIn(self.status_url, urls) | 614 self.assertIn(self.status_url, urls) |
601 | 615 |
602 def testIgnoredStepsDontCloseTree(self): | 616 def testIgnoredStepsDontCloseTree(self): |
603 """Test that ignored steps don't call to the status app.""" | 617 """Test that ignored steps don't call to the status app.""" |
604 sys.argv.extend([m.url for m in self.masters]) | 618 sys.argv.extend([m.url for m in self.masters]) |
605 sys.argv.extend(['--skip-build-db-update', | 619 sys.argv.extend(['--skip-build-db-update', |
606 '--no-email-app', '--set-status', | 620 '--no-email-app', '--set-status', |
607 '--json', self.gatekeeper_file, | 621 '--json', self.gatekeeper_file, |
622 '--process-finished-builds-on-new-builder', | |
608 '--password-file', self.status_secret_file]) | 623 '--password-file', self.status_secret_file]) |
609 | 624 |
610 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 625 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
611 self.add_gatekeeper_section(self.masters[0].url, | 626 self.add_gatekeeper_section(self.masters[0].url, |
612 self.masters[0].builders[0].name, | 627 self.masters[0].builders[0].name, |
613 {'closing_steps': ['step2']}) | 628 {'closing_steps': ['step2']}) |
614 | 629 |
615 self.handle_url_str(self.status_url, 'the status') | 630 self.handle_url_str(self.status_url, 'the status') |
616 | 631 |
617 urls = self.call_gatekeeper() | 632 urls = self.call_gatekeeper() |
618 self.assertNotIn(self.status_url, urls) | 633 self.assertNotIn(self.status_url, urls) |
619 | 634 |
620 def testDefaultSubjectTemplate(self): | 635 def testDefaultSubjectTemplate(self): |
621 """Test that the subject template is set by default.""" | 636 """Test that the subject template is set by default.""" |
622 sys.argv.extend([m.url for m in self.masters]) | 637 sys.argv.extend([m.url for m in self.masters]) |
623 sys.argv.extend(['--skip-build-db-update', | 638 sys.argv.extend(['--skip-build-db-update', |
624 '--json', self.gatekeeper_file, | 639 '--json', self.gatekeeper_file, |
640 '--process-finished-builds-on-new-builder', | |
625 '--email-app-secret-file=%s' % self.email_secret_file]) | 641 '--email-app-secret-file=%s' % self.email_secret_file]) |
626 | 642 |
627 self.add_gatekeeper_section(self.masters[0].url, | 643 self.add_gatekeeper_section(self.masters[0].url, |
628 self.masters[0].builders[0].name, | 644 self.masters[0].builders[0].name, |
629 {'closing_steps': ['step4']}) | 645 {'closing_steps': ['step4']}) |
630 | 646 |
631 self.call_gatekeeper() | 647 self.call_gatekeeper() |
632 | 648 |
633 # Check that gatekeeper indeed sent an email. | 649 # Check that gatekeeper indeed sent an email. |
634 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 650 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
635 mailer_data = GatekeeperTest.decode_param_json(self.url_calls[-1]['params']) | 651 mailer_data = GatekeeperTest.decode_param_json(self.url_calls[-1]['params']) |
636 self.assertEquals(mailer_data['subject_template'], unicode( | 652 self.assertEquals(mailer_data['subject_template'], unicode( |
637 'buildbot %(result)s in %(projectName)s on %(builder)s, ' | 653 'buildbot %(result)s in %(projectName)s on %(builder)s, ' |
638 'revision %(revision)s')) | 654 'revision %(revision)s')) |
639 | 655 |
640 | 656 |
641 def testEmailJson(self): | 657 def testEmailJson(self): |
642 """Test that the email json is formatted correctly.""" | 658 """Test that the email json is formatted correctly.""" |
643 sys.argv.extend([m.url for m in self.masters]) | 659 sys.argv.extend([m.url for m in self.masters]) |
644 sys.argv.extend(['--skip-build-db-update', | 660 sys.argv.extend(['--skip-build-db-update', |
645 '--json', self.gatekeeper_file, | 661 '--json', self.gatekeeper_file, |
662 '--process-finished-builds-on-new-builder', | |
646 '--email-app-secret-file=%s' % self.email_secret_file]) | 663 '--email-app-secret-file=%s' % self.email_secret_file]) |
647 | 664 |
648 subject_template = 'build %(result)s, oh no!' | 665 subject_template = 'build %(result)s, oh no!' |
649 self.masters[0].builders[0].builds[0].results = 3 | 666 self.masters[0].builders[0].builds[0].results = 3 |
650 self.add_gatekeeper_master_config(self.masters[0].url, | 667 self.add_gatekeeper_master_config(self.masters[0].url, |
651 {'respect_build_status': True}) | 668 {'respect_build_status': True}) |
652 self.add_gatekeeper_section(self.masters[0].url, | 669 self.add_gatekeeper_section(self.masters[0].url, |
653 self.masters[0].builders[0].name, | 670 self.masters[0].builders[0].name, |
654 {'subject_template': subject_template}, | 671 {'subject_template': subject_template}, |
655 idx=0) | 672 idx=0) |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
694 self.assertEquals(mailer_data['from_addr'], 'buildbot@chromium.org') | 711 self.assertEquals(mailer_data['from_addr'], 'buildbot@chromium.org') |
695 self.assertEquals(mailer_data['subject_template'], | 712 self.assertEquals(mailer_data['subject_template'], |
696 unicode(subject_template)) | 713 unicode(subject_template)) |
697 | 714 |
698 | 715 |
699 #### BuildDB operation. | 716 #### BuildDB operation. |
700 | 717 |
701 def testIncrementalScanning(self): | 718 def testIncrementalScanning(self): |
702 """Test that builds in the build DB are skipped.""" | 719 """Test that builds in the build DB are skipped.""" |
703 fd, dbfilename = tempfile.mkstemp() | 720 fd, dbfilename = tempfile.mkstemp() |
704 build_db = {self.masters[0].url: { 'mybuilder': 1 }} | 721 build_db = {'build_db_version': gatekeeper_ng.BUILD_DB_VERSION, |
722 'sections': {}, | |
723 'masters': { | |
724 self.masters[0].url: { 'mybuilder': [{'build': 1, | |
725 'finished': True}] } | |
726 } | |
727 } | |
705 os.write(fd, json.dumps(build_db)) | 728 os.write(fd, json.dumps(build_db)) |
706 os.close(fd) | 729 os.close(fd) |
707 | 730 |
708 sys.argv.extend([m.url for m in self.masters]) | 731 sys.argv.extend([m.url for m in self.masters]) |
709 sys.argv.extend(['--build-db=%s' % dbfilename, | 732 sys.argv.extend(['--build-db=%s' % dbfilename, |
710 '--json', self.gatekeeper_file, | 733 '--json', self.gatekeeper_file, |
711 '--email-app-secret-file=%s' % self.email_secret_file]) | 734 '--email-app-secret-file=%s' % self.email_secret_file]) |
712 | 735 |
713 | 736 |
714 self.add_gatekeeper_section(self.masters[0].url, | 737 self.add_gatekeeper_section(self.masters[0].url, |
715 self.masters[0].builders[0].name, | 738 self.masters[0].builders[0].name, |
716 {'closing_steps': ['step1']}) | 739 {'closing_steps': ['step1']}) |
717 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 740 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
718 | 741 |
719 self.masters[0].builders[0].builds.append( | 742 self.masters[0].builders[0].builds.append( |
720 GatekeeperTest.create_generic_build(2,[ | 743 GatekeeperTest.create_generic_build(2,[ |
721 'a_second_committer@chromium.org'])) | 744 'a_second_committer@chromium.org'])) |
722 self.masters[0].builders[0].builds[1].steps[1].results = [2, None] | 745 self.masters[0].builders[0].builds[1].steps[1].results = [2, None] |
723 | 746 |
724 @contextlib.contextmanager | 747 @contextlib.contextmanager |
725 def delfile(filename): | 748 def delfile(filename): |
726 yield | 749 yield |
727 os.unlink(filename) | 750 os.unlink(filename) |
728 | 751 |
729 with delfile(dbfilename): | 752 with delfile(dbfilename): |
730 self.call_gatekeeper() | 753 self.call_gatekeeper() |
731 with open(dbfilename) as f: | 754 with open(dbfilename) as f: |
732 new_build_db = json.load(f) | 755 new_build_db = json.load(f) |
733 self.assertEquals(new_build_db, {self.masters[0].url: {'mybuilder': 2}}) | 756 finished_new_builds = [ |
757 b for b in new_build_db['masters'][self.masters[0].url]['mybuilder'] if | |
758 b.get('finished')] | |
759 self.assertEquals(finished_new_builds, | |
760 [{'build': 2, | |
761 'finished': True, | |
762 'triggered': ['2be9f9320c2d26b09e416d615ff047' | |
763 '86abc74794bd5b669a1bb4228f884ddf50']}]) | |
734 | 764 |
735 #check that gatekeeper indeed sent an email. | 765 # Check that gatekeeper indeed sent an email. |
736 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 766 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
737 mailer_data = GatekeeperTest.decode_param_json( | 767 mailer_data = GatekeeperTest.decode_param_json( |
738 self.url_calls[-1]['params']) | 768 self.url_calls[-1]['params']) |
739 self.assertEquals(mailer_data['recipients'], | 769 self.assertEquals(mailer_data['recipients'], |
740 ['a_second_committer@chromium.org']) | 770 ['a_second_committer@chromium.org']) |
741 urls = [call['url'] for call in self.url_calls] | 771 urls = [call['url'] for call in self.url_calls] |
742 self.assertEquals(urls.count(self.mailer_url), 1) | 772 self.assertEquals(urls.count(self.mailer_url), 1) |
743 | 773 |
744 | 774 |
745 #### Gatekeeper parsing. | 775 #### Gatekeeper parsing. |
746 | 776 |
747 def testSheriffParsing(self): | 777 def testSheriffParsing(self): |
748 """Test that sheriff annotations are properly parsed.""" | 778 """Test that sheriff annotations are properly parsed.""" |
749 sys.argv.extend([m.url for m in self.masters]) | 779 sys.argv.extend([m.url for m in self.masters]) |
750 sys.argv.extend(['--skip-build-db-update', | 780 sys.argv.extend(['--skip-build-db-update', |
751 '--json', self.gatekeeper_file, | 781 '--json', self.gatekeeper_file, |
782 '--process-finished-builds-on-new-builder', | |
752 '--email-app-secret-file=%s' % self.email_secret_file]) | 783 '--email-app-secret-file=%s' % self.email_secret_file]) |
753 | 784 |
754 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 785 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
755 self.add_gatekeeper_section(self.masters[0].url, | 786 self.add_gatekeeper_section(self.masters[0].url, |
756 self.masters[0].builders[0].name, | 787 self.masters[0].builders[0].name, |
757 {'closing_steps': ['step1'], | 788 {'closing_steps': ['step1'], |
758 'sheriff_classes': ['sheriff_android']}) | 789 'sheriff_classes': ['sheriff_android']}) |
759 | 790 |
760 | 791 |
761 sheriff_url = 'http://build.chromium.org/p/chromium/sheriff_android.js' | 792 sheriff_url = 'http://build.chromium.org/p/chromium/sheriff_android.js' |
(...skipping 12 matching lines...) Expand all Loading... | |
774 self.assertEquals(mailer_data['recipients'], | 805 self.assertEquals(mailer_data['recipients'], |
775 ['a_committer@chromium.org', | 806 ['a_committer@chromium.org', |
776 'anothersheriff@google.com', | 807 'anothersheriff@google.com', |
777 'asheriff@google.com']) | 808 'asheriff@google.com']) |
778 | 809 |
779 def testNoSheriff(self): | 810 def testNoSheriff(self): |
780 """Test that a no-sheriff condition works OK (weekends).""" | 811 """Test that a no-sheriff condition works OK (weekends).""" |
781 sys.argv.extend([m.url for m in self.masters]) | 812 sys.argv.extend([m.url for m in self.masters]) |
782 sys.argv.extend(['--skip-build-db-update', | 813 sys.argv.extend(['--skip-build-db-update', |
783 '--json', self.gatekeeper_file, | 814 '--json', self.gatekeeper_file, |
815 '--process-finished-builds-on-new-builder', | |
784 '--email-app-secret-file=%s' % self.email_secret_file]) | 816 '--email-app-secret-file=%s' % self.email_secret_file]) |
785 | 817 |
786 self.masters[0].builders[0].builds[0].blame = [] | 818 self.masters[0].builders[0].builds[0].blame = [] |
787 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 819 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
788 | 820 |
789 self.add_gatekeeper_section(self.masters[0].url, | 821 self.add_gatekeeper_section(self.masters[0].url, |
790 self.masters[0].builders[0].name, | 822 self.masters[0].builders[0].name, |
791 {'closing_steps': ['step1'], | 823 {'closing_steps': ['step1'], |
792 'sheriff_classes': ['sheriff_android']}) | 824 'sheriff_classes': ['sheriff_android']}) |
793 | 825 |
794 sheriff_url = 'http://build.chromium.org/p/chromium/sheriff_android.js' | 826 sheriff_url = 'http://build.chromium.org/p/chromium/sheriff_android.js' |
795 sheriff_string = 'document.write(\'None (channel is sheriff)\')' | 827 sheriff_string = 'document.write(\'None (channel is sheriff)\')' |
796 self.handle_url_str(sheriff_url, sheriff_string) | 828 self.handle_url_str(sheriff_url, sheriff_string) |
797 | 829 |
798 self.call_gatekeeper() | 830 self.call_gatekeeper() |
799 | 831 |
800 self.assertEquals(self.url_calls[-1]['url'], sheriff_url) | 832 self.assertEquals(self.url_calls[-1]['url'], sheriff_url) |
801 | 833 |
802 urls = [call['url'] for call in self.url_calls] | 834 urls = [call['url'] for call in self.url_calls] |
803 self.assertNotIn(self.mailer_url, urls) | 835 self.assertNotIn(self.mailer_url, urls) |
804 | 836 |
805 def testNoSheriffButBlame(self): | 837 def testNoSheriffButBlame(self): |
806 """Test that no-sheriff works ok with a blamelist.""" | 838 """Test that no-sheriff works ok with a blamelist.""" |
807 sys.argv.extend([m.url for m in self.masters]) | 839 sys.argv.extend([m.url for m in self.masters]) |
808 sys.argv.extend(['--skip-build-db-update', | 840 sys.argv.extend(['--skip-build-db-update', |
809 '--json', self.gatekeeper_file, | 841 '--json', self.gatekeeper_file, |
842 '--process-finished-builds-on-new-builder', | |
810 '--email-app-secret-file=%s' % self.email_secret_file]) | 843 '--email-app-secret-file=%s' % self.email_secret_file]) |
811 | 844 |
812 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 845 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
813 self.add_gatekeeper_section(self.masters[0].url, | 846 self.add_gatekeeper_section(self.masters[0].url, |
814 self.masters[0].builders[0].name, | 847 self.masters[0].builders[0].name, |
815 {'closing_steps': ['step1'], | 848 {'closing_steps': ['step1'], |
816 'sheriff_classes': ['sheriff_android']}) | 849 'sheriff_classes': ['sheriff_android']}) |
817 | 850 |
818 sheriff_url = 'http://build.chromium.org/p/chromium/sheriff_android.js' | 851 sheriff_url = 'http://build.chromium.org/p/chromium/sheriff_android.js' |
819 sheriff_string = 'document.write(\'None (channel is sheriff)\')' | 852 sheriff_string = 'document.write(\'None (channel is sheriff)\')' |
820 self.handle_url_str(sheriff_url, sheriff_string) | 853 self.handle_url_str(sheriff_url, sheriff_string) |
821 | 854 |
822 self.call_gatekeeper() | 855 self.call_gatekeeper() |
823 | 856 |
824 self.assertEquals(self.url_calls[-2]['url'], sheriff_url) | 857 self.assertEquals(self.url_calls[-2]['url'], sheriff_url) |
825 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 858 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
826 mailer_data = GatekeeperTest.decode_param_json( | 859 mailer_data = GatekeeperTest.decode_param_json( |
827 self.url_calls[-1]['params']) | 860 self.url_calls[-1]['params']) |
828 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 861 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
829 | 862 |
830 def testMultiSheriff(self): | 863 def testMultiSheriff(self): |
831 """Test that multiple sheriff lists can be merged.""" | 864 """Test that multiple sheriff lists can be merged.""" |
832 sys.argv.extend([m.url for m in self.masters]) | 865 sys.argv.extend([m.url for m in self.masters]) |
833 sys.argv.extend(['--skip-build-db-update', | 866 sys.argv.extend(['--skip-build-db-update', |
834 '--json', self.gatekeeper_file, | 867 '--json', self.gatekeeper_file, |
868 '--process-finished-builds-on-new-builder', | |
835 '--email-app-secret-file=%s' % self.email_secret_file]) | 869 '--email-app-secret-file=%s' % self.email_secret_file]) |
836 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 870 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
837 self.add_gatekeeper_section(self.masters[0].url, | 871 self.add_gatekeeper_section(self.masters[0].url, |
838 self.masters[0].builders[0].name, | 872 self.masters[0].builders[0].name, |
839 {'closing_steps': ['step1'], | 873 {'closing_steps': ['step1'], |
840 'sheriff_classes': ['sheriff_android', | 874 'sheriff_classes': ['sheriff_android', |
841 'sheriff']}) | 875 'sheriff']}) |
842 | 876 |
843 sheriff_url = 'http://build.chromium.org/p/chromium/sheriff_android.js' | 877 sheriff_url = 'http://build.chromium.org/p/chromium/sheriff_android.js' |
844 sheriff_string = 'document.write(\'asheriff, anothersheriff\')' | 878 sheriff_string = 'document.write(\'asheriff, anothersheriff\')' |
(...skipping 17 matching lines...) Expand all Loading... | |
862 ['a_committer@chromium.org', | 896 ['a_committer@chromium.org', |
863 'anothersheriff@google.com', | 897 'anothersheriff@google.com', |
864 'asheriff@google.com', | 898 'asheriff@google.com', |
865 'athirdsheriff@google.com']) | 899 'athirdsheriff@google.com']) |
866 | 900 |
867 def testNotifyParsing(self): | 901 def testNotifyParsing(self): |
868 """Test that additional watchers can be merged to the mailing list.""" | 902 """Test that additional watchers can be merged to the mailing list.""" |
869 sys.argv.extend([m.url for m in self.masters]) | 903 sys.argv.extend([m.url for m in self.masters]) |
870 sys.argv.extend(['--skip-build-db-update', | 904 sys.argv.extend(['--skip-build-db-update', |
871 '--json', self.gatekeeper_file, | 905 '--json', self.gatekeeper_file, |
906 '--process-finished-builds-on-new-builder', | |
872 '--email-app-secret-file=%s' % self.email_secret_file]) | 907 '--email-app-secret-file=%s' % self.email_secret_file]) |
873 | 908 |
874 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 909 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
875 self.add_gatekeeper_section(self.masters[0].url, | 910 self.add_gatekeeper_section(self.masters[0].url, |
876 self.masters[0].builders[0].name, | 911 self.masters[0].builders[0].name, |
877 {'closing_steps': ['step1'], | 912 {'closing_steps': ['step1'], |
878 'tree_notify': ['a_watcher@chromium.org']}) | 913 'tree_notify': ['a_watcher@chromium.org']}) |
879 | 914 |
880 sheriff_url = 'http://build.chromium.org/p/chromium/sheriff_android.js' | 915 sheriff_url = 'http://build.chromium.org/p/chromium/sheriff_android.js' |
881 sheriff_string = 'document.write(\'asheriff, anothersheriff\')' | 916 sheriff_string = 'document.write(\'asheriff, anothersheriff\')' |
882 self.handle_url_str(sheriff_url, sheriff_string) | 917 self.handle_url_str(sheriff_url, sheriff_string) |
883 | 918 |
884 self.call_gatekeeper() | 919 self.call_gatekeeper() |
885 | 920 |
886 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 921 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
887 | 922 |
888 mailer_data = GatekeeperTest.decode_param_json( | 923 mailer_data = GatekeeperTest.decode_param_json( |
889 self.url_calls[-1]['params']) | 924 self.url_calls[-1]['params']) |
890 mailer_data['recipients'].sort() | 925 mailer_data['recipients'].sort() |
891 self.assertEquals(mailer_data['recipients'], | 926 self.assertEquals(mailer_data['recipients'], |
892 ['a_committer@chromium.org', | 927 ['a_committer@chromium.org', |
893 'a_watcher@chromium.org']) | 928 'a_watcher@chromium.org']) |
894 | 929 |
895 def testNotifyNoBlame(self): | 930 def testNotifyNoBlame(self): |
896 """Test that notify works with no blamelist.""" | 931 """Test that notify works with no blamelist.""" |
897 sys.argv.extend([m.url for m in self.masters]) | 932 sys.argv.extend([m.url for m in self.masters]) |
898 sys.argv.extend(['--skip-build-db-update', | 933 sys.argv.extend(['--skip-build-db-update', |
899 '--json', self.gatekeeper_file, | 934 '--json', self.gatekeeper_file, |
935 '--process-finished-builds-on-new-builder', | |
900 '--email-app-secret-file=%s' % self.email_secret_file]) | 936 '--email-app-secret-file=%s' % self.email_secret_file]) |
901 | 937 |
902 self.masters[0].builders[0].builds[0].blame = [] | 938 self.masters[0].builders[0].builds[0].blame = [] |
903 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 939 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
904 self.add_gatekeeper_section(self.masters[0].url, | 940 self.add_gatekeeper_section(self.masters[0].url, |
905 self.masters[0].builders[0].name, | 941 self.masters[0].builders[0].name, |
906 {'closing_steps': ['step1'], | 942 {'closing_steps': ['step1'], |
907 'tree_notify': ['a_watcher@chromium.org']}) | 943 'tree_notify': ['a_watcher@chromium.org']}) |
908 | 944 |
909 self.call_gatekeeper() | 945 self.call_gatekeeper() |
910 | 946 |
911 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 947 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
912 | 948 |
913 mailer_data = GatekeeperTest.decode_param_json( | 949 mailer_data = GatekeeperTest.decode_param_json( |
914 self.url_calls[-1]['params']) | 950 self.url_calls[-1]['params']) |
915 mailer_data['recipients'].sort() | 951 mailer_data['recipients'].sort() |
916 self.assertEquals(mailer_data['recipients'], ['a_watcher@chromium.org']) | 952 self.assertEquals(mailer_data['recipients'], ['a_watcher@chromium.org']) |
917 | 953 |
918 def testForgivingSteps(self): | 954 def testForgivingSteps(self): |
919 """Test that forgiving steps set status but don't email blamelist.""" | 955 """Test that forgiving steps set status but don't email blamelist.""" |
920 sys.argv.extend([m.url for m in self.masters]) | 956 sys.argv.extend([m.url for m in self.masters]) |
921 sys.argv.extend(['--skip-build-db-update', | 957 sys.argv.extend(['--skip-build-db-update', |
922 '--json', self.gatekeeper_file, | 958 '--json', self.gatekeeper_file, |
959 '--process-finished-builds-on-new-builder', | |
923 '--email-app-secret-file=%s' % self.email_secret_file, | 960 '--email-app-secret-file=%s' % self.email_secret_file, |
924 '--set-status', '--password-file', self.status_secret_file | 961 '--set-status', '--password-file', self.status_secret_file |
925 ]) | 962 ]) |
926 | 963 |
927 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 964 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
928 self.add_gatekeeper_section(self.masters[0].url, | 965 self.add_gatekeeper_section(self.masters[0].url, |
929 self.masters[0].builders[0].name, | 966 self.masters[0].builders[0].name, |
930 {'forgiving_steps': ['step1']}) | 967 {'forgiving_steps': ['step1']}) |
931 urls = self.call_gatekeeper() | 968 urls = self.call_gatekeeper() |
932 | 969 |
933 self.assertNotIn(self.mailer_url, urls) | 970 self.assertNotIn(self.mailer_url, urls) |
934 self.assertIn(self.status_url, urls) | 971 self.assertIn(self.status_url, urls) |
935 | 972 |
936 def testForgivingOptional(self): | 973 def testForgivingOptional(self): |
937 """Test that forgiving_optional steps set status but don't email.""" | 974 """Test that forgiving_optional steps set status but don't email.""" |
938 sys.argv.extend([m.url for m in self.masters]) | 975 sys.argv.extend([m.url for m in self.masters]) |
939 sys.argv.extend(['--skip-build-db-update', | 976 sys.argv.extend(['--skip-build-db-update', |
940 '--json', self.gatekeeper_file, | 977 '--json', self.gatekeeper_file, |
978 '--process-finished-builds-on-new-builder', | |
941 '--email-app-secret-file=%s' % self.email_secret_file, | 979 '--email-app-secret-file=%s' % self.email_secret_file, |
942 '--set-status', '--password-file', self.status_secret_file | 980 '--set-status', '--password-file', self.status_secret_file |
943 ]) | 981 ]) |
944 | 982 |
945 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 983 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
946 self.add_gatekeeper_section(self.masters[0].url, | 984 self.add_gatekeeper_section(self.masters[0].url, |
947 self.masters[0].builders[0].name, | 985 self.masters[0].builders[0].name, |
948 {'forgiving_optional': ['step1']}) | 986 {'forgiving_optional': ['step1']}) |
949 urls = self.call_gatekeeper() | 987 urls = self.call_gatekeeper() |
950 | 988 |
951 self.assertNotIn(self.mailer_url, urls) | 989 self.assertNotIn(self.mailer_url, urls) |
952 self.assertIn(self.status_url, urls) | 990 self.assertIn(self.status_url, urls) |
953 | 991 |
954 def testForgivingOptionalStar(self): | 992 def testForgivingOptionalStar(self): |
955 """Test that forgiving_optional * sets status but doesn't email.""" | 993 """Test that forgiving_optional * sets status but doesn't email.""" |
956 sys.argv.extend([m.url for m in self.masters]) | 994 sys.argv.extend([m.url for m in self.masters]) |
957 sys.argv.extend(['--skip-build-db-update', | 995 sys.argv.extend(['--skip-build-db-update', |
958 '--json', self.gatekeeper_file, | 996 '--json', self.gatekeeper_file, |
997 '--process-finished-builds-on-new-builder', | |
959 '--email-app-secret-file=%s' % self.email_secret_file, | 998 '--email-app-secret-file=%s' % self.email_secret_file, |
960 '--set-status', '--password-file', self.status_secret_file | 999 '--set-status', '--password-file', self.status_secret_file |
961 ]) | 1000 ]) |
962 | 1001 |
963 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1002 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
964 self.add_gatekeeper_section(self.masters[0].url, | 1003 self.add_gatekeeper_section(self.masters[0].url, |
965 self.masters[0].builders[0].name, | 1004 self.masters[0].builders[0].name, |
966 {'forgiving_optional': ['*']}) | 1005 {'forgiving_optional': ['*']}) |
967 urls = self.call_gatekeeper() | 1006 urls = self.call_gatekeeper() |
968 | 1007 |
969 self.assertNotIn(self.mailer_url, urls) | 1008 self.assertNotIn(self.mailer_url, urls) |
970 self.assertIn(self.status_url, urls) | 1009 self.assertIn(self.status_url, urls) |
971 | 1010 |
972 def testForgiveAllSteps(self): | 1011 def testForgiveAllSteps(self): |
973 """Test that setting forgive_all prevents emailing the blamelist.""" | 1012 """Test that setting forgive_all prevents emailing the blamelist.""" |
974 sys.argv.extend([m.url for m in self.masters]) | 1013 sys.argv.extend([m.url for m in self.masters]) |
975 sys.argv.extend(['--skip-build-db-update', | 1014 sys.argv.extend(['--skip-build-db-update', |
976 '--json', self.gatekeeper_file, | 1015 '--json', self.gatekeeper_file, |
1016 '--process-finished-builds-on-new-builder', | |
977 '--email-app-secret-file=%s' % self.email_secret_file, | 1017 '--email-app-secret-file=%s' % self.email_secret_file, |
978 '--set-status', '--password-file', self.status_secret_file | 1018 '--set-status', '--password-file', self.status_secret_file |
979 ]) | 1019 ]) |
980 | 1020 |
981 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1021 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
982 self.add_gatekeeper_section(self.masters[0].url, | 1022 self.add_gatekeeper_section(self.masters[0].url, |
983 self.masters[0].builders[0].name, | 1023 self.masters[0].builders[0].name, |
984 {'closing_steps': ['step1'], | 1024 {'closing_steps': ['step1'], |
985 'forgive_all': 'true'}) | 1025 'forgive_all': 'true'}) |
986 urls = self.call_gatekeeper() | 1026 urls = self.call_gatekeeper() |
987 | 1027 |
988 self.assertNotIn(self.mailer_url, urls) | 1028 self.assertNotIn(self.mailer_url, urls) |
989 self.assertIn(self.status_url, urls) | 1029 self.assertIn(self.status_url, urls) |
990 | 1030 |
991 def testForgiveAllOptionalSteps(self): | 1031 def testForgiveAllOptionalSteps(self): |
992 """Test that setting forgive_all prevents emailing the blamelist.""" | 1032 """Test that setting forgive_all prevents emailing the blamelist.""" |
993 sys.argv.extend([m.url for m in self.masters]) | 1033 sys.argv.extend([m.url for m in self.masters]) |
994 sys.argv.extend(['--skip-build-db-update', | 1034 sys.argv.extend(['--skip-build-db-update', |
995 '--json', self.gatekeeper_file, | 1035 '--json', self.gatekeeper_file, |
1036 '--process-finished-builds-on-new-builder', | |
996 '--email-app-secret-file=%s' % self.email_secret_file, | 1037 '--email-app-secret-file=%s' % self.email_secret_file, |
997 '--set-status', '--password-file', self.status_secret_file | 1038 '--set-status', '--password-file', self.status_secret_file |
998 ]) | 1039 ]) |
999 | 1040 |
1000 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1041 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1001 self.add_gatekeeper_section(self.masters[0].url, | 1042 self.add_gatekeeper_section(self.masters[0].url, |
1002 self.masters[0].builders[0].name, | 1043 self.masters[0].builders[0].name, |
1003 {'closing_optional': ['step1'], | 1044 {'closing_optional': ['step1'], |
1004 'forgive_all': 'true'}) | 1045 'forgive_all': 'true'}) |
1005 urls = self.call_gatekeeper() | 1046 urls = self.call_gatekeeper() |
1006 | 1047 |
1007 self.assertNotIn(self.mailer_url, urls) | 1048 self.assertNotIn(self.mailer_url, urls) |
1008 self.assertIn(self.status_url, urls) | 1049 self.assertIn(self.status_url, urls) |
1009 | 1050 |
1010 #### Multiple failures. | 1051 #### Multiple failures. |
1011 | 1052 |
1012 def testSequentialFailures(self): | 1053 def testSequentialFailures(self): |
1013 """Test that the status app is only hit once if many failures are seen.""" | 1054 """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]) | 1055 sys.argv.extend([m.url for m in self.masters]) |
1015 sys.argv.extend(['--skip-build-db-update', | 1056 sys.argv.extend(['--skip-build-db-update', |
1016 '--json', self.gatekeeper_file, | 1057 '--json', self.gatekeeper_file, |
1058 '--process-finished-builds-on-new-builder', | |
1017 '--email-app-secret-file=%s' % self.email_secret_file, | 1059 '--email-app-secret-file=%s' % self.email_secret_file, |
1018 '--set-status', '--password-file', self.status_secret_file | 1060 '--set-status', '--password-file', self.status_secret_file |
1019 ]) | 1061 ]) |
1020 | 1062 |
1021 new_build = self.create_generic_build(2, | 1063 new_build = self.create_generic_build(2, |
1022 ['a_second_committer@chromium.org']) | 1064 ['a_second_committer@chromium.org']) |
1023 self.masters[0].builders[0].builds.append(new_build) | 1065 self.masters[0].builders[0].builds.append(new_build) |
1024 | 1066 |
1025 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1067 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1026 self.add_gatekeeper_section(self.masters[0].url, | 1068 self.add_gatekeeper_section(self.masters[0].url, |
(...skipping 13 matching lines...) Expand all Loading... | |
1040 mailer_data = GatekeeperTest.decode_param_json( | 1082 mailer_data = GatekeeperTest.decode_param_json( |
1041 self.url_calls[-1]['params']) | 1083 self.url_calls[-1]['params']) |
1042 self.assertEquals(mailer_data['recipients'], | 1084 self.assertEquals(mailer_data['recipients'], |
1043 ['a_second_committer@chromium.org']) | 1085 ['a_second_committer@chromium.org']) |
1044 | 1086 |
1045 def testSequentialOneFailure(self): | 1087 def testSequentialOneFailure(self): |
1046 """Test that failing builds aren't mixed with good ones.""" | 1088 """Test that failing builds aren't mixed with good ones.""" |
1047 sys.argv.extend([m.url for m in self.masters]) | 1089 sys.argv.extend([m.url for m in self.masters]) |
1048 sys.argv.extend(['--skip-build-db-update', | 1090 sys.argv.extend(['--skip-build-db-update', |
1049 '--json', self.gatekeeper_file, | 1091 '--json', self.gatekeeper_file, |
1092 '--process-finished-builds-on-new-builder', | |
1050 '--email-app-secret-file=%s' % self.email_secret_file, | 1093 '--email-app-secret-file=%s' % self.email_secret_file, |
1051 '--set-status', '--password-file', self.status_secret_file | 1094 '--set-status', '--password-file', self.status_secret_file |
1052 ]) | 1095 ]) |
1053 | 1096 |
1054 new_build = self.create_generic_build(2, | 1097 new_build = self.create_generic_build(2, |
1055 ['a_second_committer@chromium.org']) | 1098 ['a_second_committer@chromium.org']) |
1056 self.masters[0].builders[0].builds.append(new_build) | 1099 self.masters[0].builders[0].builds.append(new_build) |
1057 | 1100 |
1058 self.add_gatekeeper_section(self.masters[0].url, | 1101 self.add_gatekeeper_section(self.masters[0].url, |
1059 self.masters[0].builders[0].name, | 1102 self.masters[0].builders[0].name, |
1060 {'closing_steps': ['step1']}) | 1103 {'closing_steps': ['step1']}) |
1061 | 1104 |
1062 self.masters[0].builders[0].builds[1].steps[1].results = [2, None] | 1105 self.masters[0].builders[0].builds[1].steps[1].results = [2, None] |
1063 | 1106 |
1064 urls = self.call_gatekeeper() | 1107 urls = self.call_gatekeeper() |
1065 self.assertEquals(urls.count(self.status_url), 1) | 1108 self.assertEquals(urls.count(self.status_url), 1) |
1066 self.assertEquals(urls.count(self.mailer_url), 1) | 1109 self.assertEquals(urls.count(self.mailer_url), 1) |
1067 | 1110 |
1068 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 1111 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
1069 mailer_data = GatekeeperTest.decode_param_json( | 1112 mailer_data = GatekeeperTest.decode_param_json( |
1070 self.url_calls[-1]['params']) | 1113 self.url_calls[-1]['params']) |
1071 self.assertEquals(mailer_data['recipients'], | 1114 self.assertEquals(mailer_data['recipients'], |
1072 ['a_second_committer@chromium.org']) | 1115 ['a_second_committer@chromium.org']) |
1073 | 1116 |
1074 def testStarBuilder(self): | 1117 def testStarBuilder(self): |
1075 """Test that * captures failures across all builders.""" | 1118 """Test that * captures failures across all builders.""" |
1076 sys.argv.extend([m.url for m in self.masters]) | 1119 sys.argv.extend([m.url for m in self.masters]) |
1077 sys.argv.extend(['--skip-build-db-update', | 1120 sys.argv.extend(['--skip-build-db-update', |
1078 '--json', self.gatekeeper_file, | 1121 '--json', self.gatekeeper_file, |
1122 '--process-finished-builds-on-new-builder', | |
1079 '--email-app-secret-file=%s' % self.email_secret_file]) | 1123 '--email-app-secret-file=%s' % self.email_secret_file]) |
1080 | 1124 |
1081 self.add_gatekeeper_section(self.masters[0].url, | 1125 self.add_gatekeeper_section(self.masters[0].url, |
1082 '*', | 1126 '*', |
1083 {'closing_steps': ['step4']}) | 1127 {'closing_steps': ['step4']}) |
1084 | 1128 |
1085 self.call_gatekeeper() | 1129 self.call_gatekeeper() |
1086 | 1130 |
1087 # Check that gatekeeper indeed sent an email. | 1131 # Check that gatekeeper indeed sent an email. |
1088 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 1132 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
1089 mailer_data = GatekeeperTest.decode_param_json(self.url_calls[-1]['params']) | 1133 mailer_data = GatekeeperTest.decode_param_json(self.url_calls[-1]['params']) |
1090 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 1134 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
1091 | 1135 |
1092 def testStarBuilderOverride(self): | 1136 def testStarBuilderOverride(self): |
1093 """Test that * can be explicitly overridden.""" | 1137 """Test that * can be explicitly overridden.""" |
1094 sys.argv.extend([m.url for m in self.masters]) | 1138 sys.argv.extend([m.url for m in self.masters]) |
1095 sys.argv.extend(['--skip-build-db-update', | 1139 sys.argv.extend(['--skip-build-db-update', |
1096 '--json', self.gatekeeper_file, | 1140 '--json', self.gatekeeper_file, |
1141 '--process-finished-builds-on-new-builder', | |
1097 '--email-app-secret-file=%s' % self.email_secret_file]) | 1142 '--email-app-secret-file=%s' % self.email_secret_file]) |
1098 | 1143 |
1099 # step3 won't fail the build. | 1144 # step3 won't fail the build. |
1100 self.add_gatekeeper_section(self.masters[0].url, | 1145 self.add_gatekeeper_section(self.masters[0].url, |
1101 '*', | 1146 '*', |
1102 {'closing_steps': ['step3']}) | 1147 {'closing_steps': ['step3']}) |
1103 | 1148 |
1104 # But step4 will. | 1149 # But step4 will. |
1105 self.add_gatekeeper_section(self.masters[0].url, | 1150 self.add_gatekeeper_section(self.masters[0].url, |
1106 self.masters[0].builders[0].name, | 1151 self.masters[0].builders[0].name, |
1107 {'closing_steps': ['step4']}, | 1152 {'closing_steps': ['step4']}, |
1108 idx=0) | 1153 idx=0) |
1109 | 1154 |
1110 self.call_gatekeeper() | 1155 self.call_gatekeeper() |
1111 | 1156 |
1112 # Check that gatekeeper indeed sent an email. | 1157 # Check that gatekeeper indeed sent an email. |
1113 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 1158 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
1114 mailer_data = GatekeeperTest.decode_param_json(self.url_calls[-1]['params']) | 1159 mailer_data = GatekeeperTest.decode_param_json(self.url_calls[-1]['params']) |
1115 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 1160 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
1116 | 1161 |
1117 def testStarBuilderNoPropagate(self): | 1162 def testStarBuilderNoPropagate(self): |
1118 """Test that * doesn't propagate to other builders.""" | 1163 """Test that * doesn't propagate to other builders.""" |
1119 sys.argv.extend([m.url for m in self.masters]) | 1164 sys.argv.extend([m.url for m in self.masters]) |
1120 sys.argv.extend(['--skip-build-db-update', | 1165 sys.argv.extend(['--skip-build-db-update', |
1121 '--json', self.gatekeeper_file, | 1166 '--json', self.gatekeeper_file, |
1167 '--process-finished-builds-on-new-builder', | |
1122 '--email-app-secret-file=%s' % self.email_secret_file]) | 1168 '--email-app-secret-file=%s' % self.email_secret_file]) |
1123 | 1169 |
1124 # step4 will fail the build. | 1170 # step4 will fail the build. |
1125 self.add_gatekeeper_section(self.masters[0].url, | 1171 self.add_gatekeeper_section(self.masters[0].url, |
1126 '*', | 1172 '*', |
1127 {'closing_steps': ['step4']}) | 1173 {'closing_steps': ['step4']}) |
1128 | 1174 |
1129 # But step3 won't. | 1175 # But step3 won't. |
1130 self.add_gatekeeper_section(self.masters[0].url, | 1176 self.add_gatekeeper_section(self.masters[0].url, |
1131 self.masters[0].builders[0].name, | 1177 self.masters[0].builders[0].name, |
1132 {'closing_steps': ['step3']}, | 1178 {'closing_steps': ['step3']}, |
1133 idx=0) | 1179 idx=0) |
1134 | 1180 |
1135 urls = self.call_gatekeeper() | 1181 urls = self.call_gatekeeper() |
1136 | 1182 |
1137 self.assertNotIn(self.mailer_url, urls) | 1183 self.assertNotIn(self.mailer_url, urls) |
1138 | 1184 |
1139 def testMultiBuilderOneFailure(self): | 1185 def testMultiBuilderOneFailure(self): |
1140 """Test that failure in one build doesn't affect another.""" | 1186 """Test that failure in one build doesn't affect another.""" |
1141 sys.argv.extend([m.url for m in self.masters]) | 1187 sys.argv.extend([m.url for m in self.masters]) |
1142 sys.argv.extend(['--skip-build-db-update', | 1188 sys.argv.extend(['--skip-build-db-update', |
1143 '--json', self.gatekeeper_file, | 1189 '--json', self.gatekeeper_file, |
1190 '--process-finished-builds-on-new-builder', | |
1144 '--email-app-secret-file=%s' % self.email_secret_file, | 1191 '--email-app-secret-file=%s' % self.email_secret_file, |
1145 '--set-status', '--password-file', self.status_secret_file | 1192 '--set-status', '--password-file', self.status_secret_file |
1146 ]) | 1193 ]) |
1147 | 1194 |
1148 new_build = self.create_generic_build(2, | 1195 new_build = self.create_generic_build(2, |
1149 ['a_second_committer@chromium.org']) | 1196 ['a_second_committer@chromium.org']) |
1150 self.masters[0].builders.append(Builder('mybuilder2', [new_build])) | 1197 self.masters[0].builders.append(Builder('mybuilder2', [new_build])) |
1151 | 1198 |
1152 self.add_gatekeeper_section(self.masters[0].url, | 1199 self.add_gatekeeper_section(self.masters[0].url, |
1153 self.masters[0].builders[0].name, | 1200 self.masters[0].builders[0].name, |
(...skipping 14 matching lines...) Expand all Loading... | |
1168 self.url_calls[-1]['params']) | 1215 self.url_calls[-1]['params']) |
1169 self.assertEquals(mailer_data['recipients'], | 1216 self.assertEquals(mailer_data['recipients'], |
1170 ['a_second_committer@chromium.org']) | 1217 ['a_second_committer@chromium.org']) |
1171 | 1218 |
1172 def testMultiBuilderFailures(self): | 1219 def testMultiBuilderFailures(self): |
1173 """Test that failures on several builders are handled properly.""" | 1220 """Test that failures on several builders are handled properly.""" |
1174 master_url = 'http://build.chromium.org/p/chromium.fyi' | 1221 master_url = 'http://build.chromium.org/p/chromium.fyi' |
1175 sys.argv.extend([master_url, | 1222 sys.argv.extend([master_url, |
1176 '--skip-build-db-update', | 1223 '--skip-build-db-update', |
1177 '--json', self.gatekeeper_file, | 1224 '--json', self.gatekeeper_file, |
1225 '--process-finished-builds-on-new-builder', | |
1178 '--email-app-secret-file=%s' % self.email_secret_file, | 1226 '--email-app-secret-file=%s' % self.email_secret_file, |
1179 '--set-status', '--password-file', self.status_secret_file | 1227 '--set-status', '--password-file', self.status_secret_file |
1180 ]) | 1228 ]) |
1181 | 1229 |
1182 new_build = self.create_generic_build(2, | 1230 new_build = self.create_generic_build(2, |
1183 ['a_second_committer@chromium.org']) | 1231 ['a_second_committer@chromium.org']) |
1184 self.masters[0].builders.append(Builder('mybuilder2', [new_build])) | 1232 self.masters[0].builders.append(Builder('mybuilder2', [new_build])) |
1185 | 1233 |
1186 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1234 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1187 self.add_gatekeeper_section(self.masters[0].url, | 1235 self.add_gatekeeper_section(self.masters[0].url, |
(...skipping 20 matching lines...) Expand all Loading... | |
1208 ['a_second_committer@chromium.org']) | 1256 ['a_second_committer@chromium.org']) |
1209 | 1257 |
1210 def testMultiMaster(self): | 1258 def testMultiMaster(self): |
1211 """Test that multiple master failures are handled properly.""" | 1259 """Test that multiple master failures are handled properly.""" |
1212 self.masters.append(self.create_generic_build_tree('Chromium FYI 2', | 1260 self.masters.append(self.create_generic_build_tree('Chromium FYI 2', |
1213 'chromium2.fyi')) | 1261 'chromium2.fyi')) |
1214 | 1262 |
1215 sys.argv.extend([m.url for m in self.masters]) | 1263 sys.argv.extend([m.url for m in self.masters]) |
1216 sys.argv.extend(['--skip-build-db-update', | 1264 sys.argv.extend(['--skip-build-db-update', |
1217 '--json', self.gatekeeper_file, | 1265 '--json', self.gatekeeper_file, |
1266 '--process-finished-builds-on-new-builder', | |
1218 '--email-app-secret-file=%s' % self.email_secret_file, | 1267 '--email-app-secret-file=%s' % self.email_secret_file, |
1219 '--set-status', '--password-file', self.status_secret_file | 1268 '--set-status', '--password-file', self.status_secret_file |
1220 ]) | 1269 ]) |
1221 | 1270 |
1222 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1271 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1223 self.add_gatekeeper_section(self.masters[0].url, | 1272 self.add_gatekeeper_section(self.masters[0].url, |
1224 self.masters[0].builders[0].name, | 1273 self.masters[0].builders[0].name, |
1225 {'closing_steps': ['step1']}) | 1274 {'closing_steps': ['step1']}) |
1226 | 1275 |
1227 self.masters[1].builders[0].builds[0].blame = [ | 1276 self.masters[1].builders[0].builds[0].blame = [ |
(...skipping 17 matching lines...) Expand all Loading... | |
1245 self.assertEquals(mailer_data['recipients'], | 1294 self.assertEquals(mailer_data['recipients'], |
1246 ['a_second_committer@chromium.org']) | 1295 ['a_second_committer@chromium.org']) |
1247 | 1296 |
1248 #### Partial builds (still running). | 1297 #### Partial builds (still running). |
1249 | 1298 |
1250 def testDontFailOmissionOnUncompletedBuild(self): | 1299 def testDontFailOmissionOnUncompletedBuild(self): |
1251 """Don't fail a running build because of omitted steps.""" | 1300 """Don't fail a running build because of omitted steps.""" |
1252 sys.argv.extend([m.url for m in self.masters]) | 1301 sys.argv.extend([m.url for m in self.masters]) |
1253 sys.argv.extend(['--skip-build-db-update', | 1302 sys.argv.extend(['--skip-build-db-update', |
1254 '--json', self.gatekeeper_file, | 1303 '--json', self.gatekeeper_file, |
1304 '--process-finished-builds-on-new-builder', | |
1255 '--no-email-app', '--set-status', | 1305 '--no-email-app', '--set-status', |
1256 '--password-file', self.status_secret_file]) | 1306 '--password-file', self.status_secret_file]) |
1257 | 1307 |
1258 self.masters[0].builders[0].builds[0].steps.append( | 1308 self.masters[0].builders[0].builds[0].steps.append( |
1259 BuildStep('step4', [], isStarted=True, isFinished=True)) | 1309 BuildStep('step4', [], isStarted=True, isFinished=True)) |
1260 mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) | 1310 mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) |
1261 mybuild.finished = False | 1311 mybuild.finished = False |
1262 self.masters[0].builders[0].builds.append(mybuild) | 1312 self.masters[0].builders[0].builds.append(mybuild) |
1263 self.add_gatekeeper_section(self.masters[0].url, | 1313 self.add_gatekeeper_section(self.masters[0].url, |
1264 self.masters[0].builders[0].name, | 1314 self.masters[0].builders[0].name, |
1265 {'closing_steps': ['step4']}) | 1315 {'closing_steps': ['step4']}) |
1266 | 1316 |
1267 urls = self.call_gatekeeper() | 1317 urls = self.call_gatekeeper() |
1268 self.assertNotIn(self.status_url, urls) | 1318 self.assertNotIn(self.status_url, urls) |
1269 | 1319 |
1270 def testFailedBuildInProgress(self): | 1320 def testFailedBuildInProgress(self): |
1271 """Test that a still-running build can close the tree.""" | 1321 """Test that a still-running build can close the tree.""" |
1272 sys.argv.extend([m.url for m in self.masters]) | 1322 sys.argv.extend([m.url for m in self.masters]) |
1273 sys.argv.extend(['--skip-build-db-update', | 1323 sys.argv.extend(['--skip-build-db-update', |
1274 '--json', self.gatekeeper_file, | 1324 '--json', self.gatekeeper_file, |
1325 '--process-finished-builds-on-new-builder', | |
1275 '--no-email-app', '--set-status', | 1326 '--no-email-app', '--set-status', |
1276 '--password-file', self.status_secret_file]) | 1327 '--password-file', self.status_secret_file]) |
1277 | 1328 |
1278 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1329 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1279 self.add_gatekeeper_section(self.masters[0].url, | 1330 self.add_gatekeeper_section(self.masters[0].url, |
1280 self.masters[0].builders[0].name, | 1331 self.masters[0].builders[0].name, |
1281 {'closing_steps': ['step1']}) | 1332 {'closing_steps': ['step1']}) |
1282 mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) | 1333 mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) |
1283 mybuild.finished = False | 1334 mybuild.finished = False |
1284 self.masters[0].builders[0].builds.append(mybuild) | 1335 self.masters[0].builders[0].builds.append(mybuild) |
1285 | 1336 |
1286 urls = self.call_gatekeeper() | 1337 urls = self.call_gatekeeper() |
1287 self.assertIn(self.status_url, urls) | 1338 self.assertIn(self.status_url, urls) |
1288 | 1339 |
1289 def testUpdateBuildDBNotCompletedButFailed(self): | 1340 def testUpdateBuildDBNotCompletedButFailed(self): |
1290 """Test that partial builds increment the DB if they failed.""" | 1341 """Test that partial builds increment the DB if they failed.""" |
1291 fd, dbfilename = tempfile.mkstemp() | 1342 fd, dbfilename = tempfile.mkstemp() |
1292 build_db = {self.masters[0].url: { 'mybuilder': 1 }} | 1343 build_db = {'build_db_version': gatekeeper_ng.BUILD_DB_VERSION, |
1344 'sections': {}, | |
1345 'masters': { | |
1346 self.masters[0].url: { 'mybuilder': [{'build': 1, | |
1347 'finished': True}] } | |
1348 } | |
1349 } | |
1293 os.write(fd, json.dumps(build_db)) | 1350 os.write(fd, json.dumps(build_db)) |
1294 os.close(fd) | 1351 os.close(fd) |
1295 | 1352 |
1296 sys.argv.extend([m.url for m in self.masters]) | 1353 sys.argv.extend([m.url for m in self.masters]) |
1297 sys.argv.extend(['--build-db=%s' % dbfilename, | 1354 sys.argv.extend(['--build-db=%s' % dbfilename, |
1298 '--json', self.gatekeeper_file, | 1355 '--json', self.gatekeeper_file, |
1299 '--no-email-app', '--set-status', | 1356 '--no-email-app', '--set-status', |
1300 '--password-file', self.status_secret_file]) | 1357 '--password-file', self.status_secret_file]) |
1301 | 1358 |
1302 mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) | 1359 mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) |
1303 mybuild.steps[1].results = [2, None] | 1360 mybuild.steps[1].results = [2, None] |
1304 mybuild.finished = False | 1361 mybuild.finished = False |
1305 self.masters[0].builders[0].builds.append(mybuild) | 1362 self.masters[0].builders[0].builds.append(mybuild) |
1306 self.add_gatekeeper_section(self.masters[0].url, | 1363 self.add_gatekeeper_section(self.masters[0].url, |
1307 self.masters[0].builders[0].name, | 1364 self.masters[0].builders[0].name, |
1308 {'closing_steps': ['step1']}) | 1365 {'closing_steps': ['step1']}) |
1309 | 1366 |
1310 @contextlib.contextmanager | 1367 @contextlib.contextmanager |
1311 def delfile(filename): | 1368 def delfile(filename): |
1312 yield | 1369 yield |
1313 os.unlink(filename) | 1370 os.unlink(filename) |
1314 | 1371 |
1315 with delfile(dbfilename): | 1372 with delfile(dbfilename): |
1316 urls = self.call_gatekeeper() | 1373 urls = self.call_gatekeeper() |
1317 with open(dbfilename) as f: | 1374 with open(dbfilename) as f: |
1318 new_build_db = json.load(f) | 1375 new_build_db = json.load(f) |
1319 self.assertEquals(new_build_db, {self.masters[0].url: {'mybuilder': 2}}) | 1376 finished_new_builds = [ |
1377 b for b in new_build_db['masters'][self.masters[0].url]['mybuilder'] if | |
1378 b.get('finished')] | |
1379 self.assertEquals(finished_new_builds, | |
1380 [{'build': 1, 'finished': True}]) | |
1381 unfinished_new_builds = [ | |
1382 b for b in new_build_db['masters'][self.masters[0].url]['mybuilder'] | |
1383 if not b.get('finished')] | |
1384 self.assertEquals(unfinished_new_builds, | |
1385 [{'build': 2, 'triggered': [ | |
1386 '2be9f9320c2d26b09e416d615' | |
1387 'ff04786abc74794bd5b669a1bb4228f884ddf50']}]) | |
1388 | |
1320 self.assertIn(self.status_url, urls) | 1389 self.assertIn(self.status_url, urls) |
1321 | 1390 |
1322 def testDontUpdateBuildDBIfNotCompleted(self): | 1391 def testDontUpdateBuildDBIfNotCompleted(self): |
1323 """Test that partial builds don't increment the DB if still running.""" | 1392 """Test that partial builds aren't marked as finished.""" |
1324 fd, dbfilename = tempfile.mkstemp() | 1393 fd, dbfilename = tempfile.mkstemp() |
1325 build_db = {self.masters[0].url: { 'mybuilder': 1 }} | 1394 build_db = {'build_db_version': gatekeeper_ng.BUILD_DB_VERSION, |
1395 'sections': {}, | |
1396 'masters': { | |
1397 self.masters[0].url: { 'mybuilder': [{'build': 1, | |
1398 'finished': True}] } | |
1399 } | |
1400 } | |
1326 os.write(fd, json.dumps(build_db)) | 1401 os.write(fd, json.dumps(build_db)) |
1327 os.close(fd) | 1402 os.close(fd) |
1328 | 1403 |
1329 sys.argv.extend([m.url for m in self.masters]) | 1404 sys.argv.extend([m.url for m in self.masters]) |
1330 sys.argv.extend(['--build-db=%s' % dbfilename, | 1405 sys.argv.extend(['--build-db=%s' % dbfilename, |
1331 '--json', self.gatekeeper_file, | 1406 '--json', self.gatekeeper_file, |
1332 '--no-email-app', '--set-status', | 1407 '--no-email-app', '--set-status', |
1333 '--password-file', self.status_secret_file]) | 1408 '--password-file', self.status_secret_file]) |
1334 | 1409 |
1335 mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) | 1410 mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) |
1336 mybuild.finished = False | 1411 mybuild.finished = False |
1337 self.masters[0].builders[0].builds.append(mybuild) | 1412 self.masters[0].builders[0].builds.append(mybuild) |
1338 self.add_gatekeeper_section(self.masters[0].url, | 1413 self.add_gatekeeper_section(self.masters[0].url, |
1339 self.masters[0].builders[0].name, | 1414 self.masters[0].builders[0].name, |
1340 {'closing_steps': ['step4']}) | 1415 {'closing_steps': ['step4']}) |
1341 | 1416 |
1342 @contextlib.contextmanager | 1417 @contextlib.contextmanager |
1343 def delfile(filename): | 1418 def delfile(filename): |
1344 yield | 1419 yield |
1345 os.unlink(filename) | 1420 os.unlink(filename) |
1346 | 1421 |
1347 with delfile(dbfilename): | 1422 with delfile(dbfilename): |
1348 urls = self.call_gatekeeper() | 1423 urls = self.call_gatekeeper() |
1349 with open(dbfilename) as f: | 1424 with open(dbfilename) as f: |
1350 new_build_db = json.load(f) | 1425 new_build_db = json.load(f) |
1351 self.assertEquals(new_build_db, {self.masters[0].url: {'mybuilder': 1}}) | 1426 finished_new_builds = [ |
1427 b for b in new_build_db['masters'][self.masters[0].url]['mybuilder'] if | |
1428 b.get('finished')] | |
1429 self.assertEquals(finished_new_builds, | |
1430 [{'build': 1, 'finished': True}]) | |
1431 unfinished_new_builds = [ | |
1432 b for b in new_build_db['masters'][self.masters[0].url]['mybuilder'] | |
1433 if not b.get('finished')] | |
1434 self.assertEquals(unfinished_new_builds, | |
1435 [{'build': 2}]) | |
1352 self.assertNotIn(self.status_url, urls) | 1436 self.assertNotIn(self.status_url, urls) |
1353 | 1437 |
1438 def testTriggeringDoesntTriggerOnSameBuild(self): | |
1439 """Test that a section won't fire twice on a build.""" | |
1440 fd, dbfilename = tempfile.mkstemp() | |
1441 build_db = {'build_db_version': gatekeeper_ng.BUILD_DB_VERSION, | |
1442 'sections': {}, | |
1443 'masters': { | |
1444 self.masters[0].url: { | |
1445 'mybuilder': [], | |
1446 }, | |
1447 }, | |
1448 } | |
1449 os.write(fd, json.dumps(build_db)) | |
1450 os.close(fd) | |
1451 | |
1452 sys.argv.extend([m.url for m in self.masters]) | |
1453 sys.argv.extend(['--build-db=%s' % dbfilename, | |
1454 '--json', self.gatekeeper_file, | |
1455 '--no-email-app', '--set-status', | |
1456 '--password-file', self.status_secret_file]) | |
1457 | |
1458 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | |
1459 self.masters[0].builders[0].builds[0].finished = False | |
1460 self.add_gatekeeper_section(self.masters[0].url, | |
1461 self.masters[0].builders[0].name, | |
1462 {'closing_steps': ['step1']}) | |
1463 | |
1464 @contextlib.contextmanager | |
1465 def delfile(filename): | |
1466 yield | |
1467 os.unlink(filename) | |
1468 | |
1469 with delfile(dbfilename): | |
1470 urls = self.call_gatekeeper() | |
1471 urls += self.call_gatekeeper() | |
1472 with open(dbfilename) as f: | |
1473 new_build_db = json.load(f) | |
1474 print new_build_db | |
1475 finished_new_builds = [ | |
1476 b for b in new_build_db['masters'][self.masters[0].url]['mybuilder'] if | |
1477 b.get('finished')] | |
1478 self.assertEquals(finished_new_builds, []) | |
1479 unfinished_new_builds = [ | |
1480 b for b in new_build_db['masters'][self.masters[0].url]['mybuilder'] | |
1481 if not b.get('finished')] | |
1482 self.assertEquals(unfinished_new_builds, | |
1483 [{'build': 1, | |
1484 'triggered': ['2be9f9320c2d26b09e416d615ff047' | |
1485 '86abc74794bd5b669a1bb4228f884ddf50']}]) | |
1486 self.assertEquals(1, len([u for u in urls if u == self.status_url])) | |
1487 | |
1488 def testTriggeringOneHashDoesntStopAnother(self): | |
1489 """Test that firing on one hash doesn't prevent another hash triggering.""" | |
1490 fd, dbfilename = tempfile.mkstemp() | |
1491 build_db = {'build_db_version': gatekeeper_ng.BUILD_DB_VERSION, | |
1492 'sections': {}, | |
1493 'masters': { | |
1494 self.masters[0].url: { 'mybuilder': [{'build': 1, | |
1495 'finished': True}] } | |
1496 } | |
1497 } | |
1498 os.write(fd, json.dumps(build_db)) | |
1499 os.close(fd) | |
1500 | |
1501 sys.argv.extend([m.url for m in self.masters]) | |
1502 sys.argv.extend(['--build-db=%s' % dbfilename, | |
1503 '--json', self.gatekeeper_file, | |
1504 '--no-email-app', '--set-status', | |
1505 '--password-file', self.status_secret_file]) | |
1506 | |
1507 mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) | |
1508 mybuild.finished = False | |
1509 self.masters[0].builders[0].builds.append(mybuild) | |
1510 self.masters[0].builders[0].builds[1].steps[1].results = [2, None] | |
1511 self.add_gatekeeper_section(self.masters[0].url, | |
1512 self.masters[0].builders[0].name, | |
1513 {'closing_steps': ['step1']}) | |
1514 | |
1515 @contextlib.contextmanager | |
1516 def delfile(filename): | |
1517 yield | |
1518 os.unlink(filename) | |
1519 | |
1520 with delfile(dbfilename): | |
1521 urls = self.call_gatekeeper() | |
1522 self.add_gatekeeper_section(self.masters[0].url, | |
1523 self.masters[0].builders[0].name, | |
1524 {'closing_steps': ['step2']}) | |
1525 self.masters[0].builders[0].builds[1].steps[2].results = [2, None] | |
1526 print 'nerdup', urls | |
1527 urls += self.call_gatekeeper() | |
1528 print 'nerdup kwarg', urls | |
1529 with open(dbfilename) as f: | |
1530 new_build_db = json.load(f) | |
1531 finished_new_builds = [ | |
1532 b for b in new_build_db['masters'][self.masters[0].url]['mybuilder'] if | |
1533 b.get('finished')] | |
1534 self.assertEquals(finished_new_builds, | |
1535 [{'build': 1, 'finished': True}]) | |
1536 unfinished_new_builds = [ | |
1537 b for b in new_build_db['masters'][self.masters[0].url]['mybuilder'] | |
1538 if not b.get('finished')] | |
1539 self.assertEquals(unfinished_new_builds, | |
1540 [{'build': 2, | |
1541 'triggered': ['2be9f9320c2d26b09e416d615ff04786ab' | |
1542 'c74794bd5b669a1bb4228f884ddf50', | |
1543 | |
1544 'ac0bb2a7245af2aa43c257a3c4eda19dee' | |
1545 'a4137bc1bce6a8b307047fd6149e32']}]) | |
1546 self.assertEquals(2, len([u for u in urls if u == self.status_url])) | |
1547 | |
1354 ### JSON config file tests. | 1548 ### JSON config file tests. |
1355 | 1549 |
1356 def testInheritFromCategory(self): | 1550 def testInheritFromCategory(self): |
1357 """Check that steps in categories are inherited by builders.""" | 1551 """Check that steps in categories are inherited by builders.""" |
1358 sys.argv.extend([m.url for m in self.masters]) | 1552 sys.argv.extend([m.url for m in self.masters]) |
1359 sys.argv.extend(['--skip-build-db-update', | 1553 sys.argv.extend(['--skip-build-db-update', |
1360 '--json', self.gatekeeper_file, | 1554 '--json', self.gatekeeper_file, |
1555 '--process-finished-builds-on-new-builder', | |
1361 '--email-app-secret-file=%s' % self.email_secret_file]) | 1556 '--email-app-secret-file=%s' % self.email_secret_file]) |
1362 | 1557 |
1363 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1558 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1364 self.add_gatekeeper_category('mycat', {'closing_steps': ['step1']}) | 1559 self.add_gatekeeper_category('mycat', {'closing_steps': ['step1']}) |
1365 self.add_gatekeeper_section(self.masters[0].url, | 1560 self.add_gatekeeper_section(self.masters[0].url, |
1366 self.masters[0].builders[0].name, | 1561 self.masters[0].builders[0].name, |
1367 {'categories': ['mycat']}) | 1562 {'categories': ['mycat']}) |
1368 | 1563 |
1369 self.call_gatekeeper() | 1564 self.call_gatekeeper() |
1370 | 1565 |
1371 # Check that gatekeeper indeed sent an email. | 1566 # Check that gatekeeper indeed sent an email. |
1372 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 1567 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
1373 mailer_data = GatekeeperTest.decode_param_json( | 1568 mailer_data = GatekeeperTest.decode_param_json( |
1374 self.url_calls[-1]['params']) | 1569 self.url_calls[-1]['params']) |
1375 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 1570 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
1376 | 1571 |
1377 def testMultiCategory(self): | 1572 def testMultiCategory(self): |
1378 """Check that steps in categories are inherited by builders.""" | 1573 """Check that steps in categories are inherited by builders.""" |
1379 sys.argv.extend([m.url for m in self.masters]) | 1574 sys.argv.extend([m.url for m in self.masters]) |
1380 sys.argv.extend(['--skip-build-db-update', | 1575 sys.argv.extend(['--skip-build-db-update', |
1381 '--json', self.gatekeeper_file, | 1576 '--json', self.gatekeeper_file, |
1577 '--process-finished-builds-on-new-builder', | |
1382 '--email-app-secret-file=%s' % self.email_secret_file]) | 1578 '--email-app-secret-file=%s' % self.email_secret_file]) |
1383 | 1579 |
1384 self.masters[0].builders[0].builds[0].steps[2].results = [2, None] | 1580 self.masters[0].builders[0].builds[0].steps[2].results = [2, None] |
1385 self.add_gatekeeper_category('mycat', {'closing_steps': ['step1']}) | 1581 self.add_gatekeeper_category('mycat', {'closing_steps': ['step1']}) |
1386 self.add_gatekeeper_category('mycat2', {'closing_steps': ['step2']}) | 1582 self.add_gatekeeper_category('mycat2', {'closing_steps': ['step2']}) |
1387 self.add_gatekeeper_section(self.masters[0].url, | 1583 self.add_gatekeeper_section(self.masters[0].url, |
1388 self.masters[0].builders[0].name, | 1584 self.masters[0].builders[0].name, |
1389 {'categories': ['mycat', 'mycat2']}) | 1585 {'categories': ['mycat', 'mycat2']}) |
1390 | 1586 |
1391 self.call_gatekeeper() | 1587 self.call_gatekeeper() |
1392 | 1588 |
1393 # Check that gatekeeper indeed sent an email. | 1589 # Check that gatekeeper indeed sent an email. |
1394 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 1590 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
1395 mailer_data = GatekeeperTest.decode_param_json( | 1591 mailer_data = GatekeeperTest.decode_param_json( |
1396 self.url_calls[-1]['params']) | 1592 self.url_calls[-1]['params']) |
1397 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 1593 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
1398 | 1594 |
1399 def testAddonCategory(self): | 1595 def testAddonCategory(self): |
1400 """Check that builders can add-on to categories.""" | 1596 """Check that builders can add-on to categories.""" |
1401 sys.argv.extend([m.url for m in self.masters]) | 1597 sys.argv.extend([m.url for m in self.masters]) |
1402 sys.argv.extend(['--skip-build-db-update', | 1598 sys.argv.extend(['--skip-build-db-update', |
1403 '--json', self.gatekeeper_file, | 1599 '--json', self.gatekeeper_file, |
1600 '--process-finished-builds-on-new-builder', | |
1404 '--email-app-secret-file=%s' % self.email_secret_file]) | 1601 '--email-app-secret-file=%s' % self.email_secret_file]) |
1405 | 1602 |
1406 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1603 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1407 self.add_gatekeeper_category('mycat', {'closing_steps': ['step2']}) | 1604 self.add_gatekeeper_category('mycat', {'closing_steps': ['step2']}) |
1408 self.add_gatekeeper_section(self.masters[0].url, | 1605 self.add_gatekeeper_section(self.masters[0].url, |
1409 self.masters[0].builders[0].name, | 1606 self.masters[0].builders[0].name, |
1410 {'categories': ['mycat'], | 1607 {'categories': ['mycat'], |
1411 'closing_steps': ['step1']}) | 1608 'closing_steps': ['step1']}) |
1412 | 1609 |
1413 self.call_gatekeeper() | 1610 self.call_gatekeeper() |
1414 | 1611 |
1415 # Check that gatekeeper indeed sent an email. | 1612 # Check that gatekeeper indeed sent an email. |
1416 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 1613 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
1417 mailer_data = GatekeeperTest.decode_param_json( | 1614 mailer_data = GatekeeperTest.decode_param_json( |
1418 self.url_calls[-1]['params']) | 1615 self.url_calls[-1]['params']) |
1419 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 1616 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
1420 | 1617 |
1421 def testInheritFromMaster(self): | 1618 def testInheritFromMaster(self): |
1422 """Check that steps in masters are inherited by builders.""" | 1619 """Check that steps in masters are inherited by builders.""" |
1423 sys.argv.extend([m.url for m in self.masters]) | 1620 sys.argv.extend([m.url for m in self.masters]) |
1424 sys.argv.extend(['--skip-build-db-update', | 1621 sys.argv.extend(['--skip-build-db-update', |
1425 '--json', self.gatekeeper_file, | 1622 '--json', self.gatekeeper_file, |
1623 '--process-finished-builds-on-new-builder', | |
1426 '--email-app-secret-file=%s' % self.email_secret_file]) | 1624 '--email-app-secret-file=%s' % self.email_secret_file]) |
1427 | 1625 |
1428 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1626 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1429 self.add_gatekeeper_master_config(self.masters[0].url, | 1627 self.add_gatekeeper_master_config(self.masters[0].url, |
1430 {'sheriff_classes': ['sheriff_android']}) | 1628 {'sheriff_classes': ['sheriff_android']}) |
1431 self.add_gatekeeper_section(self.masters[0].url, | 1629 self.add_gatekeeper_section(self.masters[0].url, |
1432 self.masters[0].builders[0].name, | 1630 self.masters[0].builders[0].name, |
1433 {'closing_steps': ['step1']}, | 1631 {'closing_steps': ['step1']}, |
1434 idx=0) | 1632 idx=0) |
1435 | 1633 |
(...skipping 13 matching lines...) Expand all Loading... | |
1449 self.assertEquals(mailer_data['recipients'], | 1647 self.assertEquals(mailer_data['recipients'], |
1450 ['a_committer@chromium.org', | 1648 ['a_committer@chromium.org', |
1451 'anothersheriff@google.com', | 1649 'anothersheriff@google.com', |
1452 'asheriff@google.com']) | 1650 'asheriff@google.com']) |
1453 | 1651 |
1454 def testAddonToMaster(self): | 1652 def testAddonToMaster(self): |
1455 """Check that steps in masters can be added by builders.""" | 1653 """Check that steps in masters can be added by builders.""" |
1456 sys.argv.extend([m.url for m in self.masters]) | 1654 sys.argv.extend([m.url for m in self.masters]) |
1457 sys.argv.extend(['--skip-build-db-update', | 1655 sys.argv.extend(['--skip-build-db-update', |
1458 '--json', self.gatekeeper_file, | 1656 '--json', self.gatekeeper_file, |
1657 '--process-finished-builds-on-new-builder', | |
1459 '--email-app-secret-file=%s' % self.email_secret_file]) | 1658 '--email-app-secret-file=%s' % self.email_secret_file]) |
1460 | 1659 |
1461 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1660 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1462 self.add_gatekeeper_master_config(self.masters[0].url, | 1661 self.add_gatekeeper_master_config(self.masters[0].url, |
1463 {'sheriff_classes': ['sheriff_android']}) | 1662 {'sheriff_classes': ['sheriff_android']}) |
1464 self.add_gatekeeper_section(self.masters[0].url, | 1663 self.add_gatekeeper_section(self.masters[0].url, |
1465 self.masters[0].builders[0].name, | 1664 self.masters[0].builders[0].name, |
1466 {'closing_steps': ['step1'], | 1665 {'closing_steps': ['step1'], |
1467 'sheriff_classes': ['sheriff']}, | 1666 'sheriff_classes': ['sheriff']}, |
1468 idx=0) | 1667 idx=0) |
(...skipping 21 matching lines...) Expand all Loading... | |
1490 'anothersheriff2@google.com', | 1689 'anothersheriff2@google.com', |
1491 'anothersheriff@google.com', | 1690 'anothersheriff@google.com', |
1492 'asheriff2@google.com', | 1691 'asheriff2@google.com', |
1493 'asheriff@google.com']) | 1692 'asheriff@google.com']) |
1494 | 1693 |
1495 def testInheritCategoryFromMaster(self): | 1694 def testInheritCategoryFromMaster(self): |
1496 """Check that steps can inherit categories from masters.""" | 1695 """Check that steps can inherit categories from masters.""" |
1497 sys.argv.extend([m.url for m in self.masters]) | 1696 sys.argv.extend([m.url for m in self.masters]) |
1498 sys.argv.extend(['--skip-build-db-update', | 1697 sys.argv.extend(['--skip-build-db-update', |
1499 '--json', self.gatekeeper_file, | 1698 '--json', self.gatekeeper_file, |
1699 '--process-finished-builds-on-new-builder', | |
1500 '--email-app-secret-file=%s' % self.email_secret_file]) | 1700 '--email-app-secret-file=%s' % self.email_secret_file]) |
1501 | 1701 |
1502 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1702 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1503 self.add_gatekeeper_category('mycat', {'closing_steps': ['step1']}) | 1703 self.add_gatekeeper_category('mycat', {'closing_steps': ['step1']}) |
1504 self.add_gatekeeper_master_config(self.masters[0].url, | 1704 self.add_gatekeeper_master_config(self.masters[0].url, |
1505 {'categories': ['mycat']}) | 1705 {'categories': ['mycat']}) |
1506 self.add_gatekeeper_section(self.masters[0].url, | 1706 self.add_gatekeeper_section(self.masters[0].url, |
1507 self.masters[0].builders[0].name, | 1707 self.masters[0].builders[0].name, |
1508 {}, | 1708 {}, |
1509 idx=0) | 1709 idx=0) |
1510 | 1710 |
1511 self.call_gatekeeper() | 1711 self.call_gatekeeper() |
1512 | 1712 |
1513 # Check that gatekeeper indeed sent an email. | 1713 # Check that gatekeeper indeed sent an email. |
1514 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 1714 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
1515 mailer_data = GatekeeperTest.decode_param_json( | 1715 mailer_data = GatekeeperTest.decode_param_json( |
1516 self.url_calls[-1]['params']) | 1716 self.url_calls[-1]['params']) |
1517 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 1717 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
1518 | 1718 |
1519 def testMasterSections(self): | 1719 def testMasterSections(self): |
1520 """Check that master sections work correctly.""" | 1720 """Check that master sections work correctly.""" |
1521 sys.argv.extend([m.url for m in self.masters]) | 1721 sys.argv.extend([m.url for m in self.masters]) |
1522 sys.argv.extend(['--skip-build-db-update', | 1722 sys.argv.extend(['--skip-build-db-update', |
1523 '--json', self.gatekeeper_file, | 1723 '--json', self.gatekeeper_file, |
1724 '--process-finished-builds-on-new-builder', | |
1524 '--email-app-secret-file=%s' % self.email_secret_file]) | 1725 '--email-app-secret-file=%s' % self.email_secret_file]) |
1525 | 1726 |
1526 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1727 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1527 self.add_gatekeeper_category('mycat', {'closing_steps': ['step1']}) | 1728 self.add_gatekeeper_category('mycat', {'closing_steps': ['step1']}) |
1528 self.add_gatekeeper_master_config(self.masters[0].url, | 1729 self.add_gatekeeper_master_config(self.masters[0].url, |
1529 {} | 1730 {} |
1530 ) | 1731 ) |
1531 self.add_gatekeeper_section(self.masters[0].url, | 1732 self.add_gatekeeper_section(self.masters[0].url, |
1532 self.masters[0].builders[0].name, | 1733 self.masters[0].builders[0].name, |
1533 {}, | 1734 {}, |
1534 idx=0) | 1735 idx=0) |
1535 | 1736 |
1536 self.add_gatekeeper_section(self.masters[0].url, | 1737 self.add_gatekeeper_section(self.masters[0].url, |
1537 self.masters[0].builders[0].name, | 1738 self.masters[0].builders[0].name, |
1538 {'categories': ['mycat']}) | 1739 {'categories': ['mycat']}) |
1539 | 1740 |
1540 self.call_gatekeeper() | 1741 self.call_gatekeeper() |
1541 | 1742 |
1542 # Check that gatekeeper indeed sent an email. | 1743 # Check that gatekeeper indeed sent an email. |
1543 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) | 1744 self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
1544 mailer_data = GatekeeperTest.decode_param_json( | 1745 mailer_data = GatekeeperTest.decode_param_json( |
1545 self.url_calls[-1]['params']) | 1746 self.url_calls[-1]['params']) |
1546 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) | 1747 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org']) |
1547 | 1748 |
1548 def testMasterSectionEmails(self): | 1749 def testMasterSectionEmails(self): |
1549 """Check that master section handles email properly.""" | 1750 """Check that master section handles email properly.""" |
1550 sys.argv.extend([m.url for m in self.masters]) | 1751 sys.argv.extend([m.url for m in self.masters]) |
1551 sys.argv.extend(['--skip-build-db-update', | 1752 sys.argv.extend(['--skip-build-db-update', |
1552 '--json', self.gatekeeper_file, | 1753 '--json', self.gatekeeper_file, |
1754 '--process-finished-builds-on-new-builder', | |
1553 '--email-app-secret-file=%s' % self.email_secret_file]) | 1755 '--email-app-secret-file=%s' % self.email_secret_file]) |
1554 | 1756 |
1555 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1757 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1556 self.add_gatekeeper_category('mycat', {'closing_steps': ['step1']}) | 1758 self.add_gatekeeper_category('mycat', {'closing_steps': ['step1']}) |
1557 self.add_gatekeeper_master_config(self.masters[0].url, | 1759 self.add_gatekeeper_master_config(self.masters[0].url, |
1558 {} | 1760 {} |
1559 ) | 1761 ) |
1560 self.add_gatekeeper_section(self.masters[0].url, | 1762 self.add_gatekeeper_section(self.masters[0].url, |
1561 self.masters[0].builders[0].name, | 1763 self.masters[0].builders[0].name, |
1562 {'closing_steps': ['step1'], | 1764 {'closing_steps': ['step1'], |
(...skipping 11 matching lines...) Expand all Loading... | |
1574 mailer_data = GatekeeperTest.decode_param_json( | 1776 mailer_data = GatekeeperTest.decode_param_json( |
1575 self.url_calls[-1]['params']) | 1777 self.url_calls[-1]['params']) |
1576 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org', | 1778 self.assertEquals(mailer_data['recipients'], ['a_committer@chromium.org', |
1577 'a_watcher@chromium.org']) | 1779 'a_watcher@chromium.org']) |
1578 | 1780 |
1579 def testEmailFilter(self): | 1781 def testEmailFilter(self): |
1580 """Test that no email is sent if the email isn't in the domain filter.""" | 1782 """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]) | 1783 sys.argv.extend([m.url for m in self.masters]) |
1582 sys.argv.extend(['--skip-build-db-update', | 1784 sys.argv.extend(['--skip-build-db-update', |
1583 '--json', self.gatekeeper_file, | 1785 '--json', self.gatekeeper_file, |
1786 '--process-finished-builds-on-new-builder', | |
1584 '--email-app-secret-file=%s' % self.email_secret_file, | 1787 '--email-app-secret-file=%s' % self.email_secret_file, |
1585 '--filter-domain=squirrels.net,squirrels.com']) | 1788 '--filter-domain=squirrels.net,squirrels.com']) |
1586 | 1789 |
1587 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1790 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1588 self.add_gatekeeper_section(self.masters[0].url, | 1791 self.add_gatekeeper_section(self.masters[0].url, |
1589 self.masters[0].builders[0].name, | 1792 self.masters[0].builders[0].name, |
1590 {'closing_steps': ['step1']}) | 1793 {'closing_steps': ['step1']}) |
1591 | 1794 |
1592 urls = self.call_gatekeeper() | 1795 urls = self.call_gatekeeper() |
1593 self.assertNotIn(self.mailer_url, urls) | 1796 self.assertNotIn(self.mailer_url, urls) |
1594 | 1797 |
1595 def testDisableEmailFilter(self): | 1798 def testDisableEmailFilter(self): |
1596 """Test that no email is sent if the email isn't in the domain filter.""" | 1799 """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]) | 1800 sys.argv.extend([m.url for m in self.masters]) |
1598 sys.argv.extend(['--skip-build-db-update', | 1801 sys.argv.extend(['--skip-build-db-update', |
1599 '--json', self.gatekeeper_file, | 1802 '--json', self.gatekeeper_file, |
1803 '--process-finished-builds-on-new-builder', | |
1600 '--email-app-secret-file=%s' % self.email_secret_file, | 1804 '--email-app-secret-file=%s' % self.email_secret_file, |
1601 '--disable-domain-filter', | 1805 '--disable-domain-filter', |
1602 '--filter-domain=squirrels.net,squirrels.com']) | 1806 '--filter-domain=squirrels.net,squirrels.com']) |
1603 | 1807 |
1604 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1808 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1605 self.add_gatekeeper_section(self.masters[0].url, | 1809 self.add_gatekeeper_section(self.masters[0].url, |
1606 self.masters[0].builders[0].name, | 1810 self.masters[0].builders[0].name, |
1607 {'closing_steps': ['step1']}) | 1811 {'closing_steps': ['step1']}) |
1608 | 1812 |
1609 self.call_gatekeeper() | 1813 self.call_gatekeeper() |
(...skipping 13 matching lines...) Expand all Loading... | |
1623 '--no-email-app']) | 1827 '--no-email-app']) |
1624 with self.assertRaises(ValueError): | 1828 with self.assertRaises(ValueError): |
1625 self.call_gatekeeper() | 1829 self.call_gatekeeper() |
1626 | 1830 |
1627 def testSectionWillNotCloseTree(self): | 1831 def testSectionWillNotCloseTree(self): |
1628 """Test that close_tree=False sections don't call to the status app.""" | 1832 """Test that close_tree=False sections don't call to the status app.""" |
1629 sys.argv.extend([m.url for m in self.masters]) | 1833 sys.argv.extend([m.url for m in self.masters]) |
1630 sys.argv.extend(['--skip-build-db-update', | 1834 sys.argv.extend(['--skip-build-db-update', |
1631 '--no-email-app', '--set-status', | 1835 '--no-email-app', '--set-status', |
1632 '--json', self.gatekeeper_file, | 1836 '--json', self.gatekeeper_file, |
1837 '--process-finished-builds-on-new-builder', | |
1633 '--password-file', self.status_secret_file]) | 1838 '--password-file', self.status_secret_file]) |
1634 | 1839 |
1635 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] | 1840 self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
1636 self.add_gatekeeper_section(self.masters[0].url, | 1841 self.add_gatekeeper_section(self.masters[0].url, |
1637 self.masters[0].builders[0].name, | 1842 self.masters[0].builders[0].name, |
1638 {'closing_steps': ['step1']}) | 1843 {'closing_steps': ['step1']}) |
1639 | 1844 |
1640 self.handle_url_str(self.status_url, 'the status') | 1845 self.handle_url_str(self.status_url, 'the status') |
1641 | 1846 |
1642 self.add_gatekeeper_master_section(self.masters[0].url, -1, | 1847 self.add_gatekeeper_master_section(self.masters[0].url, -1, |
(...skipping 16 matching lines...) Expand all Loading... | |
1659 def testCheckedInConfigIsValid(self): | 1864 def testCheckedInConfigIsValid(self): |
1660 sys.argv.extend(['--verify', | 1865 sys.argv.extend(['--verify', |
1661 '--json', | 1866 '--json', |
1662 os.path.join(SCRIPT_DIR, os.pardir, 'gatekeeper.json')]) | 1867 os.path.join(SCRIPT_DIR, os.pardir, 'gatekeeper.json')]) |
1663 self.call_gatekeeper() | 1868 self.call_gatekeeper() |
1664 | 1869 |
1665 | 1870 |
1666 if __name__ == '__main__': | 1871 if __name__ == '__main__': |
1667 with utils.print_coverage(include=[__file__]): | 1872 with utils.print_coverage(include=[__file__]): |
1668 unittest.main() | 1873 unittest.main() |
OLD | NEW |