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