| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 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 verification/try_job_on_rietveld.py.""" | 6 """Unit tests for verification/try_job_on_rietveld.py.""" |
| 7 | 7 |
| 8 import logging | 8 import logging |
| 9 import os | 9 import os |
| 10 import random | 10 import random |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 def add_build(self, builder, number, revision, key): | 66 def add_build(self, builder, number, revision, key): |
| 67 """Add a build to a builder.""" | 67 """Add a build to a builder.""" |
| 68 self.builders[builder].builds[number] = BuildbotBuild(revision, key) | 68 self.builders[builder].builds[number] = BuildbotBuild(revision, key) |
| 69 return self.builders[builder].builds[number] | 69 return self.builders[builder].builds[number] |
| 70 | 70 |
| 71 | 71 |
| 72 def _posted(builders): | 72 def _posted(builders): |
| 73 return 'trigger_try_jobs(42, 23, \'CQ\', False, None, %s)' % str(builders) | 73 return 'trigger_try_jobs(42, 23, \'CQ\', False, None, %s)' % str(builders) |
| 74 | 74 |
| 75 | 75 |
| 76 def gen_job_pending(**kwargs): |
| 77 value = { |
| 78 '__persistent_module__': 'verification.try_job_on_rietveld', |
| 79 '__persistent_type__': 'RietveldTryJobPending', |
| 80 'builder': None, |
| 81 'clobber': False, |
| 82 'requested_steps': [], |
| 83 'revision': None, |
| 84 'tries': 1, |
| 85 } |
| 86 assert all(arg in value for arg in kwargs) |
| 87 value.update(kwargs) |
| 88 return value |
| 89 |
| 90 |
| 76 def gen_job(**kwargs): | 91 def gen_job(**kwargs): |
| 77 value = { | 92 value = { |
| 78 '__persistent_module__': 'verification.try_job_on_rietveld', | 93 '__persistent_module__': 'verification.try_job_on_rietveld', |
| 79 '__persistent_type__': 'RietveldTryJob', | 94 '__persistent_type__': 'RietveldTryJob', |
| 80 'build': None, | 95 'build': None, |
| 81 'builder': None, | 96 'builder': None, |
| 82 'clobber': False, | 97 'clobber': False, |
| 83 'completed': False, | 98 'completed': False, |
| 84 'requested_steps': [], | 99 'requested_steps': [], |
| 85 'revision': None, | 100 'revision': None, |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 return self.pending.verifications[self.try_runner.name] | 163 return self.pending.verifications[self.try_runner.name] |
| 149 | 164 |
| 150 def _assert_pending_is_empty(self): | 165 def _assert_pending_is_empty(self): |
| 151 actual = self._get_verif().as_dict() | 166 actual = self._get_verif().as_dict() |
| 152 expected = gen_jobs( | 167 expected = gen_jobs( |
| 153 builders_and_tests={ | 168 builders_and_tests={ |
| 154 'linux': ['test1', 'test2'], | 169 'linux': ['test1', 'test2'], |
| 155 'mac': ['test1', 'test2'], | 170 'mac': ['test1', 'test2'], |
| 156 }, | 171 }, |
| 157 pendings=[ | 172 pendings=[ |
| 158 gen_job(builder='linux', requested_steps=['test1', 'test2']), | 173 gen_job_pending(builder='linux', requested_steps=['test1', 'test2']), |
| 159 gen_job(builder='mac', requested_steps=['test1', 'test2']), | 174 gen_job_pending(builder='mac', requested_steps=['test1', 'test2']), |
| 160 ]) | 175 ]) |
| 161 self.assertEquals(expected, actual) | 176 self.assertEquals(expected, actual) |
| 162 | 177 |
| 163 def _add_build(self, builder, buildnumber, revision, steps): | 178 def _add_build(self, builder, buildnumber, revision, steps): |
| 164 """Adds a build with a randomly generated key. | 179 """Adds a build with a randomly generated key. |
| 165 | 180 |
| 166 Adds the build to both the try server and to Rietveld. | 181 Adds the build to both the try server and to Rietveld. |
| 167 """ | 182 """ |
| 168 key = ''.join(random.choice(string.ascii_letters) for _ in xrange(8)) | 183 key = ''.join(random.choice(string.ascii_letters) for _ in xrange(8)) |
| 169 build = self.try_runner.status.add_build( | 184 build = self.try_runner.status.add_build( |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 ]) | 240 ]) |
| 226 key = self._add_build('mac', 32, 42, []) | 241 key = self._add_build('mac', 32, 42, []) |
| 227 | 242 |
| 228 self.try_runner.update_status([self.pending]) | 243 self.try_runner.update_status([self.pending]) |
| 229 expected = gen_jobs( | 244 expected = gen_jobs( |
| 230 builders_and_tests={ | 245 builders_and_tests={ |
| 231 'linux': ['test1', 'test2'], | 246 'linux': ['test1', 'test2'], |
| 232 'mac': ['test1', 'test2'], | 247 'mac': ['test1', 'test2'], |
| 233 }, | 248 }, |
| 234 pendings=[ | 249 pendings=[ |
| 235 gen_job(builder='linux', requested_steps=['test1', 'test2']), | 250 gen_job_pending(builder='linux', requested_steps=['test1', 'test2']), |
| 236 ], | 251 ], |
| 237 try_jobs={ | 252 try_jobs={ |
| 238 key: gen_job( | 253 key: gen_job( |
| 239 builder='mac', | 254 builder='mac', |
| 240 build=32, | 255 build=32, |
| 241 requested_steps=['test1', 'test2'], | 256 requested_steps=['test1', 'test2'], |
| 242 revision=42), | 257 revision=42), |
| 243 }) | 258 }) |
| 244 self.assertEquals(expected, self._get_verif().as_dict()) | 259 self.assertEquals(expected, self._get_verif().as_dict()) |
| 245 self.context.status.check_names(['try job rietveld'] * 1) | 260 self.context.status.check_names(['try job rietveld'] * 1) |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 'linux', 32, 42, | 316 'linux', 32, 42, |
| 302 [BuildbotBuildStep('test1', True), BuildbotBuildStep('test2', True)]) | 317 [BuildbotBuildStep('test1', True), BuildbotBuildStep('test2', True)]) |
| 303 | 318 |
| 304 self.try_runner.update_status([self.pending]) | 319 self.try_runner.update_status([self.pending]) |
| 305 expected = gen_jobs( | 320 expected = gen_jobs( |
| 306 builders_and_tests={ | 321 builders_and_tests={ |
| 307 'linux': ['test1', 'test2'], | 322 'linux': ['test1', 'test2'], |
| 308 'mac': ['test1', 'test2'], | 323 'mac': ['test1', 'test2'], |
| 309 }, | 324 }, |
| 310 pendings=[ | 325 pendings=[ |
| 311 gen_job(builder='mac', requested_steps=['test2'], tries=2), | 326 gen_job_pending(builder='mac', requested_steps=['test2'], tries=2), |
| 312 ], | 327 ], |
| 313 try_jobs={ | 328 try_jobs={ |
| 314 key1: gen_job( | 329 key1: gen_job( |
| 315 builder='mac', | 330 builder='mac', |
| 316 build=32, | 331 build=32, |
| 317 requested_steps=['test1', 'test2'], | 332 requested_steps=['test1', 'test2'], |
| 318 steps_failed=['test2'], | 333 steps_failed=['test2'], |
| 319 steps_passed=['test1'], | 334 steps_passed=['test1'], |
| 320 revision=42), | 335 revision=42), |
| 321 key2: gen_job( | 336 key2: gen_job( |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 'linux', 32, 42, | 401 'linux', 32, 42, |
| 387 [BuildbotBuildStep('test1', True), BuildbotBuildStep('test2', True)]) | 402 [BuildbotBuildStep('test1', True), BuildbotBuildStep('test2', True)]) |
| 388 | 403 |
| 389 self.try_runner.update_status([self.pending]) | 404 self.try_runner.update_status([self.pending]) |
| 390 expected = gen_jobs( | 405 expected = gen_jobs( |
| 391 builders_and_tests={ | 406 builders_and_tests={ |
| 392 'linux': ['test1', 'test2'], | 407 'linux': ['test1', 'test2'], |
| 393 'mac': ['test1', 'test2'], | 408 'mac': ['test1', 'test2'], |
| 394 }, | 409 }, |
| 395 pendings=[ | 410 pendings=[ |
| 396 gen_job(builder='mac', requested_steps=['test2'], tries=2), | 411 gen_job_pending(builder='mac', requested_steps=['test2'], tries=2), |
| 397 ], | 412 ], |
| 398 try_jobs={ | 413 try_jobs={ |
| 399 key1: gen_job( | 414 key1: gen_job( |
| 400 builder='mac', | 415 builder='mac', |
| 401 build=32, | 416 build=32, |
| 402 requested_steps=['test1', 'test2'], | 417 requested_steps=['test1', 'test2'], |
| 403 steps_failed=['test2'], | 418 steps_failed=['test2'], |
| 404 steps_passed=['test1'], | 419 steps_passed=['test1'], |
| 405 revision=42), | 420 revision=42), |
| 406 key2: gen_job( | 421 key2: gen_job( |
| (...skipping 15 matching lines...) Expand all Loading... |
| 422 key3 = self._add_build('mac', 33, 42, [BuildbotBuildStep('test2', False)]) | 437 key3 = self._add_build('mac', 33, 42, [BuildbotBuildStep('test2', False)]) |
| 423 | 438 |
| 424 self.try_runner.update_status([self.pending]) | 439 self.try_runner.update_status([self.pending]) |
| 425 self.context.status.check_names(['try job rietveld'] * 2) | 440 self.context.status.check_names(['try job rietveld'] * 2) |
| 426 expected = gen_jobs( | 441 expected = gen_jobs( |
| 427 builders_and_tests={ | 442 builders_and_tests={ |
| 428 'linux': ['test1', 'test2'], | 443 'linux': ['test1', 'test2'], |
| 429 'mac': ['test1', 'test2'], | 444 'mac': ['test1', 'test2'], |
| 430 }, | 445 }, |
| 431 pendings=[ | 446 pendings=[ |
| 432 gen_job(builder='mac', requested_steps=['test2'], tries=3), | 447 gen_job_pending(builder='mac', requested_steps=['test2'], tries=3), |
| 433 ], | 448 ], |
| 434 try_jobs={ | 449 try_jobs={ |
| 435 key1: gen_job( | 450 key1: gen_job( |
| 436 build=32, | 451 build=32, |
| 437 builder='mac', | 452 builder='mac', |
| 438 requested_steps=['test1', 'test2'], | 453 requested_steps=['test1', 'test2'], |
| 439 steps_failed=['test2'], | 454 steps_failed=['test2'], |
| 440 steps_passed=['test1'], | 455 steps_passed=['test1'], |
| 441 revision=42), | 456 revision=42), |
| 442 key2: gen_job( | 457 key2: gen_job( |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 483 _posted({"linux": ["test1", "test2"]}), | 498 _posted({"linux": ["test1", "test2"]}), |
| 484 ]) | 499 ]) |
| 485 | 500 |
| 486 self.try_runner.update_status([self.pending]) | 501 self.try_runner.update_status([self.pending]) |
| 487 expected = gen_jobs( | 502 expected = gen_jobs( |
| 488 builders_and_tests={ | 503 builders_and_tests={ |
| 489 'linux': ['test1', 'test2'], | 504 'linux': ['test1', 'test2'], |
| 490 'mac': ['test1', 'test2'], | 505 'mac': ['test1', 'test2'], |
| 491 }, | 506 }, |
| 492 pendings=[ | 507 pendings=[ |
| 493 gen_job(builder='linux', requested_steps=['test1', 'test2']), | 508 gen_job_pending(builder='linux', requested_steps=['test1', 'test2']), |
| 494 ], | 509 ], |
| 495 try_jobs={ | 510 try_jobs={ |
| 496 key1: gen_job( | 511 key1: gen_job( |
| 497 build=32, | 512 build=32, |
| 498 builder='mac', | 513 builder='mac', |
| 499 # Note that requested_steps is empty since testfilter is not parsed. | 514 # Note that requested_steps is empty since testfilter is not parsed. |
| 500 steps_passed=['test1', 'test2'], | 515 steps_passed=['test1', 'test2'], |
| 501 revision=42, | 516 revision=42, |
| 502 # tries == 0 since we didn't start it. | 517 # tries == 0 since we didn't start it. |
| 503 tries=0), | 518 tries=0), |
| (...skipping 11 matching lines...) Expand all Loading... |
| 515 | 530 |
| 516 self.try_runner.verify(self.pending) | 531 self.try_runner.verify(self.pending) |
| 517 self.context.status.check_names(['try job rietveld'] * 2) | 532 self.context.status.check_names(['try job rietveld'] * 2) |
| 518 self.context.rietveld.check_calls( | 533 self.context.rietveld.check_calls( |
| 519 [ | 534 [ |
| 520 _posted({"linux": ["test1", "test2"]}), | 535 _posted({"linux": ["test1", "test2"]}), |
| 521 _posted({"mac": ["test1", "test2"]}), | 536 _posted({"mac": ["test1", "test2"]}), |
| 522 ]) | 537 ]) |
| 523 | 538 |
| 524 self.try_runner.update_status([self.pending]) | 539 self.try_runner.update_status([self.pending]) |
| 525 # self.timestamp is a mock for time.time() | |
| 526 started = self.timestamp[-1] | |
| 527 expected = gen_jobs( | 540 expected = gen_jobs( |
| 528 builders_and_tests={ | 541 builders_and_tests={ |
| 529 'linux': ['test1', 'test2'], | 542 'linux': ['test1', 'test2'], |
| 530 'mac': ['test1', 'test2'], | 543 'mac': ['test1', 'test2'], |
| 531 }, | 544 }, |
| 532 irrelevant=[key1], | 545 irrelevant=[key1], |
| 533 pendings=[ | 546 pendings=[ |
| 534 gen_job( | 547 gen_job_pending(builder='linux', requested_steps=['test1', 'test2']), |
| 535 builder='linux', | 548 gen_job_pending(builder='mac', requested_steps=['test1', 'test2']), |
| 536 requested_steps=['test1', 'test2'], | |
| 537 started=started), | |
| 538 gen_job( | |
| 539 builder='mac', | |
| 540 requested_steps=['test1', 'test2'], | |
| 541 started=started), | |
| 542 ]) | 549 ]) |
| 543 self.assertEquals(expected, self._get_verif().as_dict()) | 550 self.assertEquals(expected, self._get_verif().as_dict()) |
| 544 self.assertEquals(base.PROCESSING, self.pending.get_state()) | 551 self.assertEquals(base.PROCESSING, self.pending.get_state()) |
| 545 self.assertEquals('', self.pending.error_message()) | 552 self.assertEquals('', self.pending.error_message()) |
| 546 | 553 |
| 547 def testVerificationPreviousExpiredRevisionTooOld(self): | 554 def testVerificationPreviousExpiredRevisionTooOld(self): |
| 548 self.context.checkout.revisions = lambda _r1, _r2: 201 | 555 self.context.checkout.revisions = lambda _r1, _r2: 201 |
| 549 self._expired() | 556 self._expired() |
| 550 | 557 |
| 551 def testVerificationPreviousExpiredDateTooOld(self): | 558 def testVerificationPreviousExpiredDateTooOld(self): |
| (...skipping 14 matching lines...) Expand all Loading... |
| 566 _posted({"mac": ["test1"]}), | 573 _posted({"mac": ["test1"]}), |
| 567 ]) | 574 ]) |
| 568 | 575 |
| 569 self.try_runner.update_status([self.pending]) | 576 self.try_runner.update_status([self.pending]) |
| 570 expected = gen_jobs( | 577 expected = gen_jobs( |
| 571 builders_and_tests={ | 578 builders_and_tests={ |
| 572 'linux': ['test1', 'test2'], | 579 'linux': ['test1', 'test2'], |
| 573 'mac': ['test1', 'test2'], | 580 'mac': ['test1', 'test2'], |
| 574 }, | 581 }, |
| 575 pendings=[ | 582 pendings=[ |
| 576 gen_job(builder='linux', requested_steps=['test1', 'test2']), | 583 gen_job_pending(builder='linux', requested_steps=['test1', 'test2']), |
| 577 gen_job(builder='mac', requested_steps=['test1']), | 584 gen_job_pending(builder='mac', requested_steps=['test1']), |
| 578 ], | 585 ], |
| 579 try_jobs={ | 586 try_jobs={ |
| 580 key1: gen_job( | 587 key1: gen_job( |
| 581 build=32, | 588 build=32, |
| 582 builder='mac', | 589 builder='mac', |
| 583 # Note that requested_steps is empty since testfilter is not parsed. | 590 # Note that requested_steps is empty since testfilter is not parsed. |
| 584 steps_failed=steps_failed, | 591 steps_failed=steps_failed, |
| 585 steps_passed=['test2'], | 592 steps_passed=['test2'], |
| 586 revision=42, | 593 revision=42, |
| 587 # tries == 0 since we didn't start it. | 594 # tries == 0 since we didn't start it. |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 637 steps_passed=['test1', 'test2'], | 644 steps_passed=['test1', 'test2'], |
| 638 revision=42, | 645 revision=42, |
| 639 # tries == 0 since we didn't start it. | 646 # tries == 0 since we didn't start it. |
| 640 tries=0), | 647 tries=0), |
| 641 }) | 648 }) |
| 642 self.assertEquals(expected, self._get_verif().as_dict()) | 649 self.assertEquals(expected, self._get_verif().as_dict()) |
| 643 # People will love that! | 650 # People will love that! |
| 644 self.assertEquals(base.SUCCEEDED, self.pending.get_state()) | 651 self.assertEquals(base.SUCCEEDED, self.pending.get_state()) |
| 645 self.assertEquals('', self.pending.error_message()) | 652 self.assertEquals('', self.pending.error_message()) |
| 646 | 653 |
| 654 def testRietveldTryJobs_1(self): |
| 655 jobs = try_job_on_rietveld.RietveldTryJobs() |
| 656 jobs.builders_and_tests['builder1'] = ['test10', 'test11'] |
| 657 jobs.try_jobs['key1'] = try_job_on_rietveld.RietveldTryJob( |
| 658 builder='builder1', |
| 659 build=12, |
| 660 revision=13, |
| 661 requested_steps=['test10'], |
| 662 started=time.time(), |
| 663 passed=['test10'], |
| 664 failed=[], |
| 665 clobber=False, |
| 666 completed=True, |
| 667 tries=1) |
| 668 self.assertEquals({'builder1': ['test11']}, jobs.tests_need_to_be_run()) |
| 669 self.assertEquals({'builder1': ['test11']}, jobs.tests_waiting_for_result()) |
| 670 |
| 671 def testRietveldTryJobs_2(self): |
| 672 jobs = try_job_on_rietveld.RietveldTryJobs() |
| 673 jobs.builders_and_tests['builder1'] = ['test10', 'test11'] |
| 674 jobs.try_jobs['key1'] = try_job_on_rietveld.RietveldTryJob( |
| 675 'builder1', |
| 676 12, |
| 677 13, |
| 678 ['test10'], |
| 679 time.time(), |
| 680 ['test10'], |
| 681 [], |
| 682 False, |
| 683 True, |
| 684 1) |
| 685 self.assertEquals({'builder1': ['test11']}, jobs.tests_need_to_be_run()) |
| 686 self.assertEquals({'builder1': ['test11']}, jobs.tests_waiting_for_result()) |
| 687 |
| 688 def testRietveldTryJobs_3(self): |
| 689 jobs = try_job_on_rietveld.RietveldTryJobs() |
| 690 jobs.builders_and_tests['builder1'] = ['test10', 'test11'] |
| 691 jobs.try_jobs['key1'] = try_job_on_rietveld.RietveldTryJob( |
| 692 builder='builder1', |
| 693 build=12, |
| 694 revision=13, |
| 695 requested_steps=['test10'], |
| 696 started=time.time(), |
| 697 passed=['test10'], |
| 698 failed=[], |
| 699 clobber=False, |
| 700 completed=True, |
| 701 tries=1) |
| 702 jobs.pendings.append( |
| 703 try_job_on_rietveld.RietveldTryJobPending( |
| 704 builder='builder1', |
| 705 revision=13, |
| 706 requested_steps=['test11'], |
| 707 clobber=False, |
| 708 tries=1)) |
| 709 self.assertEquals({}, jobs.tests_need_to_be_run()) |
| 710 self.assertEquals({'builder1': ['test11']}, jobs.tests_waiting_for_result()) |
| 711 |
| 712 def testRietveldTryJobs_4(self): |
| 713 # Construct an instance that has both tests to trigger and tests that are |
| 714 # pending results. |
| 715 jobs = try_job_on_rietveld.RietveldTryJobs() |
| 716 jobs.builders_and_tests = { |
| 717 'builder1': ['test10', 'test11'], |
| 718 'builder2': ['test20', 'test21'], |
| 719 } |
| 720 jobs.try_jobs['key1'] = try_job_on_rietveld.RietveldTryJob( |
| 721 builder='builder1', |
| 722 build=12, |
| 723 revision=13, |
| 724 requested_steps=['test10'], |
| 725 started=time.time(), |
| 726 passed=['test10'], |
| 727 failed=[], |
| 728 clobber=False, |
| 729 completed=True, |
| 730 tries=1) |
| 731 jobs.try_jobs['key2'] = try_job_on_rietveld.RietveldTryJob( |
| 732 builder='builder2', |
| 733 build=13, |
| 734 revision=14, |
| 735 requested_steps=[], |
| 736 started=time.time(), |
| 737 passed=['test21'], |
| 738 failed=[], |
| 739 clobber=False, |
| 740 completed=False, |
| 741 tries=1) |
| 742 jobs.pendings.append( |
| 743 try_job_on_rietveld.RietveldTryJobPending( |
| 744 builder='builder2', |
| 745 revision=14, |
| 746 requested_steps=['test20'], |
| 747 clobber=False, |
| 748 tries=1)) |
| 749 # test11 is still not queued to be run but build with test20 in it has still |
| 750 # not started yet. |
| 751 self.assertEquals({'builder1': ['test11']}, jobs.tests_need_to_be_run()) |
| 752 self.assertEquals( |
| 753 {'builder1': ['test11'], 'builder2': ['test20']}, |
| 754 jobs.tests_waiting_for_result()) |
| 755 |
| 647 | 756 |
| 648 if __name__ == '__main__': | 757 if __name__ == '__main__': |
| 649 logging.basicConfig( | 758 logging.basicConfig( |
| 650 level=[logging.WARNING, logging.INFO, logging.DEBUG][ | 759 level=[logging.WARNING, logging.INFO, logging.DEBUG][ |
| 651 min(sys.argv.count('-v'), 2)], | 760 min(sys.argv.count('-v'), 2)], |
| 652 format='%(levelname)5s %(module)15s(%(lineno)3d): %(message)s') | 761 format='%(levelname)5s %(module)15s(%(lineno)3d): %(message)s') |
| 653 unittest.main() | 762 unittest.main() |
| OLD | NEW |