Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(729)

Side by Side Diff: scripts/slave/unittests/gatekeeper_ng_test.py

Issue 172523005: Keep track of hashes triggered instead of builds. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/build
Patch Set: Whitespace change. Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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()
OLDNEW
« scripts/slave/gatekeeper_ng.py ('K') | « scripts/slave/gatekeeper_ng.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698