| OLD | NEW |
| 1 # Copyright 2015 The Chromium Authors. All rights reserved. | 1 # Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 from datetime import datetime | 5 from datetime import datetime |
| 6 from datetime import timedelta | 6 from datetime import timedelta |
| 7 | 7 |
| 8 from common.waterfall import failure_type | 8 from common.waterfall import failure_type |
| 9 from model import analysis_status | 9 from model import analysis_status |
| 10 from model.wf_analysis import WfAnalysis | 10 from model.wf_analysis import WfAnalysis |
| (...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 394 # Run pipeline with signals that have the same failed output nodes. | 394 # Run pipeline with signals that have the same failed output nodes. |
| 395 # Observe no new group creation. | 395 # Observe no new group creation. |
| 396 self.assertFalse(try_job_util._IsBuildFailureUniqueAcrossPlatforms( | 396 self.assertFalse(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 397 master_name_2, builder_name, build_number, failure_type.COMPILE, | 397 master_name_2, builder_name, build_number, failure_type.COMPILE, |
| 398 blame_list, None, signals, None)) | 398 blame_list, None, signals, None)) |
| 399 | 399 |
| 400 analysis_2 = WfAnalysis.Get(master_name_2, builder_name, build_number) | 400 analysis_2 = WfAnalysis.Get(master_name_2, builder_name, build_number) |
| 401 self.assertEqual( | 401 self.assertEqual( |
| 402 [master_name, builder_name, build_number], analysis_2.failure_group_key) | 402 [master_name, builder_name, build_number], analysis_2.failure_group_key) |
| 403 | 403 |
| 404 def testGroupCompilesWithRelatedFailures(self): | 404 def testGroupCompilesWithRelatedFailuresWithHeuristicResult(self): |
| 405 master_name = 'm1' | 405 master_name = 'm1' |
| 406 builder_name = 'b' | 406 builder_name = 'b' |
| 407 build_number = 1 | 407 build_number = 1 |
| 408 master_name_2 = 'm2' |
| 409 |
| 410 blame_list = ['a'] |
| 411 |
| 412 signals = { |
| 413 'compile': { |
| 414 'failed_output_nodes': [ |
| 415 'abc.obj' |
| 416 ] |
| 417 } |
| 418 } |
| 419 |
| 420 heuristic_result = { |
| 421 'failures': [ |
| 422 { |
| 423 'step_name': 'step1', |
| 424 'suspected_cls': [ |
| 425 { |
| 426 'revision': 'rev1', |
| 427 } |
| 428 ], |
| 429 } |
| 430 ] |
| 431 } |
| 432 |
| 433 WfAnalysis.Create(master_name, builder_name, build_number).put() |
| 434 # Run pipeline with signals that have certain failed output nodes. |
| 435 # Observe new group creation. |
| 436 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 437 master_name, builder_name, build_number, failure_type.COMPILE, |
| 438 blame_list, None, signals, heuristic_result)) |
| 439 self.assertIsNotNone( |
| 440 WfFailureGroup.Get(master_name, builder_name, build_number)) |
| 441 |
| 442 WfAnalysis.Create(master_name_2, builder_name, build_number).put() |
| 443 # Run pipeline with signals that have the same failed output nodes. |
| 444 # Observe no new group creation. |
| 445 self.assertFalse(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 446 master_name_2, builder_name, build_number, failure_type.COMPILE, |
| 447 blame_list, None, signals, heuristic_result)) |
| 448 self.assertIsNone( |
| 449 WfFailureGroup.Get(master_name_2, builder_name, build_number)) |
| 450 |
| 451 def testGroupCompilesWithRelatedFailuresWithoutHeuristicResult(self): |
| 452 master_name = 'm1' |
| 453 builder_name = 'b' |
| 454 build_number = 1 |
| 408 master_name_2 = 'm2' | 455 master_name_2 = 'm2' |
| 409 | 456 |
| 410 blame_list = ['a'] | 457 blame_list = ['a'] |
| 411 | 458 |
| 412 signals = { | 459 signals = { |
| 413 'compile': { | 460 'compile': { |
| 414 'failed_output_nodes': [ | 461 'failed_output_nodes': [ |
| 415 'abc.obj' | 462 'abc.obj' |
| 416 ] | 463 ] |
| 417 } | 464 } |
| 418 } | 465 } |
| 419 | 466 |
| 420 WfAnalysis.Create(master_name, builder_name, build_number).put() | 467 WfAnalysis.Create(master_name, builder_name, build_number).put() |
| 421 # Run pipeline with signals that have certain failed output nodes. | 468 # Run pipeline with signals that have certain failed output nodes. |
| 422 # Observe new group creation. | 469 # Observe new group creation. |
| 423 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( | 470 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 424 master_name, builder_name, build_number, failure_type.COMPILE, | 471 master_name, builder_name, build_number, failure_type.COMPILE, |
| 425 blame_list, None, signals, None)) | 472 blame_list, None, signals, None)) |
| 426 self.assertTrue(WfFailureGroup.Get(master_name, builder_name, build_number)) | 473 self.assertIsNotNone( |
| 474 WfFailureGroup.Get(master_name, builder_name, build_number)) |
| 427 | 475 |
| 428 WfAnalysis.Create(master_name_2, builder_name, build_number).put() | 476 WfAnalysis.Create(master_name_2, builder_name, build_number).put() |
| 429 # Run pipeline with signals that have the same failed output nodes. | 477 # Run pipeline with signals that have the same failed output nodes. |
| 430 # Observe no new group creation. | 478 # Observe no new group creation. |
| 431 self.assertFalse(try_job_util._IsBuildFailureUniqueAcrossPlatforms( | 479 self.assertFalse(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 432 master_name_2, builder_name, build_number, failure_type.COMPILE, | 480 master_name_2, builder_name, build_number, failure_type.COMPILE, |
| 433 blame_list, None, signals, None)) | 481 blame_list, None, signals, None)) |
| 434 self.assertIsNone( | 482 self.assertIsNone( |
| 435 WfFailureGroup.Get(master_name_2, builder_name, build_number)) | 483 WfFailureGroup.Get(master_name_2, builder_name, build_number)) |
| 436 | 484 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 451 ] | 499 ] |
| 452 } | 500 } |
| 453 } | 501 } |
| 454 | 502 |
| 455 WfAnalysis.Create(master_name, builder_name, build_number).put() | 503 WfAnalysis.Create(master_name, builder_name, build_number).put() |
| 456 # Run pipeline with signals that have certain failed output nodes. | 504 # Run pipeline with signals that have certain failed output nodes. |
| 457 # Observe new group creation. | 505 # Observe new group creation. |
| 458 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( | 506 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 459 master_name, builder_name, build_number, failure_type.COMPILE, | 507 master_name, builder_name, build_number, failure_type.COMPILE, |
| 460 blame_list_1, None, signals, None)) | 508 blame_list_1, None, signals, None)) |
| 461 self.assertTrue(WfFailureGroup.Get(master_name, builder_name, build_number)) | 509 self.assertIsNotNone( |
| 510 WfFailureGroup.Get(master_name, builder_name, build_number)) |
| 462 | 511 |
| 463 WfAnalysis.Create(master_name_2, builder_name, build_number).put() | 512 WfAnalysis.Create(master_name_2, builder_name, build_number).put() |
| 464 # Run pipeline with signals that have different failed output nodes. | 513 # Run pipeline with signals that have different failed output nodes. |
| 465 # Observe new group creation. | 514 # Observe new group creation. |
| 466 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( | 515 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 467 master_name_2, builder_name, build_number, failure_type.COMPILE, | 516 master_name_2, builder_name, build_number, failure_type.COMPILE, |
| 468 blame_list_2, None, signals, None)) | 517 blame_list_2, None, signals, None)) |
| 469 self.assertTrue( | 518 self.assertTrue( |
| 470 WfFailureGroup.Get(master_name_2, builder_name, build_number)) | 519 WfFailureGroup.Get(master_name_2, builder_name, build_number)) |
| 471 | 520 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 497 } | 546 } |
| 498 ] | 547 ] |
| 499 } | 548 } |
| 500 | 549 |
| 501 heuristic_result_2 = { | 550 heuristic_result_2 = { |
| 502 'failures': [ | 551 'failures': [ |
| 503 { | 552 { |
| 504 'step_name': 'step1', | 553 'step_name': 'step1', |
| 505 'suspected_cls': [ | 554 'suspected_cls': [ |
| 506 { | 555 { |
| 507 'revision': 'rev1', | 556 'revision': 'rev2', |
| 508 } | 557 } |
| 509 ], | 558 ], |
| 510 } | 559 } |
| 511 ] | 560 ] |
| 512 } | 561 } |
| 513 | 562 |
| 514 WfAnalysis.Create(master_name, builder_name, build_number).put() | 563 WfAnalysis.Create(master_name, builder_name, build_number).put() |
| 515 # Run pipeline with signals that have certain failed output nodes. | 564 # Run pipeline with signals that have certain failed output nodes. |
| 516 # Observe new group creation. | 565 # Observe new group creation. |
| 517 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( | 566 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 518 master_name, builder_name, build_number, failure_type.COMPILE, | 567 master_name, builder_name, build_number, failure_type.COMPILE, |
| 519 blame_list, None, signals, | 568 blame_list, None, signals, |
| 520 heuristic_result_1)) | 569 heuristic_result_1)) |
| 521 self.assertTrue(WfFailureGroup.Get(master_name, builder_name, build_number)) | 570 self.assertIsNotNone( |
| 571 WfFailureGroup.Get(master_name, builder_name, build_number)) |
| 522 | 572 |
| 523 WfAnalysis.Create(master_name_2, builder_name, build_number).put() | 573 WfAnalysis.Create(master_name_2, builder_name, build_number).put() |
| 524 # Run pipeline with signals that have different failed output nodes. | 574 # Run pipeline with signals that have different failed output nodes. |
| 525 # Observe new group creation. | 575 # Observe new group creation. |
| 526 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( | 576 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 527 master_name_2, builder_name, build_number, failure_type.COMPILE, | 577 master_name_2, builder_name, build_number, failure_type.COMPILE, |
| 528 blame_list, None, signals, heuristic_result_2)) | 578 blame_list, None, signals, heuristic_result_2)) |
| 529 self.assertTrue( | 579 self.assertTrue( |
| 530 WfFailureGroup.Get(master_name_2, builder_name, build_number)) | 580 WfFailureGroup.Get(master_name_2, builder_name, build_number)) |
| 531 | 581 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 552 ] | 602 ] |
| 553 } | 603 } |
| 554 } | 604 } |
| 555 | 605 |
| 556 WfAnalysis.Create(master_name, builder_name, build_number).put() | 606 WfAnalysis.Create(master_name, builder_name, build_number).put() |
| 557 # Run pipeline with signals that have certain failed output nodes. | 607 # Run pipeline with signals that have certain failed output nodes. |
| 558 # Observe new group creation. | 608 # Observe new group creation. |
| 559 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( | 609 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 560 master_name, builder_name, build_number, failure_type.COMPILE, | 610 master_name, builder_name, build_number, failure_type.COMPILE, |
| 561 blame_list, None, signals_1, None)) | 611 blame_list, None, signals_1, None)) |
| 562 self.assertTrue(WfFailureGroup.Get(master_name, builder_name, build_number)) | 612 self.assertIsNotNone( |
| 613 WfFailureGroup.Get(master_name, builder_name, build_number)) |
| 563 | 614 |
| 564 WfAnalysis.Create(master_name_2, builder_name, build_number).put() | 615 WfAnalysis.Create(master_name_2, builder_name, build_number).put() |
| 565 # Run pipeline with signals that have different failed output nodes. | 616 # Run pipeline with signals that have different failed output nodes. |
| 566 # Observe new group creation. | 617 # Observe new group creation. |
| 567 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( | 618 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 568 master_name_2, builder_name, build_number, failure_type.COMPILE, | 619 master_name_2, builder_name, build_number, failure_type.COMPILE, |
| 569 blame_list, None, signals_2, None)) | 620 blame_list, None, signals_2, None)) |
| 570 self.assertTrue( | 621 self.assertTrue( |
| 571 WfFailureGroup.Get(master_name_2, builder_name, build_number)) | 622 WfFailureGroup.Get(master_name_2, builder_name, build_number)) |
| 572 | 623 |
| 573 def testDoNotGroupTestWithNoSteps(self): | 624 def testDoNotGroupTestWithNoSteps(self): |
| 574 master_name = 'm1' | 625 master_name = 'm1' |
| 575 builder_name = 'b' | 626 builder_name = 'b' |
| 576 build_number = 1 | 627 build_number = 1 |
| 577 | 628 |
| 578 blame_list = ['a'] | 629 blame_list = ['a'] |
| 579 | 630 |
| 580 failed_steps = {} | 631 failed_steps = {} |
| 581 | 632 |
| 582 WfAnalysis.Create(master_name, builder_name, build_number).put() | 633 WfAnalysis.Create(master_name, builder_name, build_number).put() |
| 583 # Run pipeline with signals that have zero failed steps. | 634 # Run pipeline with signals that have zero failed steps. |
| 584 # Observe that the build failure is unique, but there is no new group | 635 # Observe that the build failure is unique, but there is no new group |
| 585 # creation. | 636 # creation. |
| 586 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( | 637 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 587 master_name, builder_name, build_number, failure_type.TEST, blame_list, | 638 master_name, builder_name, build_number, failure_type.TEST, blame_list, |
| 588 failed_steps, None, None)) | 639 failed_steps, None, None)) |
| 589 self.assertIsNone( | 640 self.assertIsNone( |
| 590 WfFailureGroup.Get(master_name, builder_name, build_number)) | 641 WfFailureGroup.Get(master_name, builder_name, build_number)) |
| 591 | 642 |
| 592 def testGroupTestsWithRelatedSteps(self): | 643 def testGroupTestsWithRelatedStepsWithHeuristicResult(self): |
| 593 master_name = 'm1' | 644 master_name = 'm1' |
| 594 builder_name = 'b' | 645 builder_name = 'b' |
| 595 build_number = 1 | 646 build_number = 1 |
| 647 master_name_2 = 'm2' |
| 648 |
| 649 blame_list = ['a'] |
| 650 |
| 651 failed_steps = { |
| 652 'step_a': { |
| 653 'current_failure': 3, |
| 654 'first_failure': 2, |
| 655 'last_pass': 1 |
| 656 } |
| 657 } |
| 658 |
| 659 heuristic_result = { |
| 660 'failures': [ |
| 661 { |
| 662 'step_name': 'step1', |
| 663 'suspected_cls': [ |
| 664 { |
| 665 'revision': 'rev1', |
| 666 } |
| 667 ], |
| 668 } |
| 669 ] |
| 670 } |
| 671 |
| 672 WfAnalysis.Create(master_name, builder_name, build_number).put() |
| 673 # Run pipeline with signals that have certain failed steps. |
| 674 # Observe new group creation. |
| 675 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 676 master_name, builder_name, build_number, failure_type.TEST, blame_list, |
| 677 failed_steps, None, heuristic_result)) |
| 678 self.assertIsNotNone( |
| 679 WfFailureGroup.Get(master_name, builder_name, build_number)) |
| 680 |
| 681 WfAnalysis.Create(master_name_2, builder_name, build_number).put() |
| 682 # Run pipeline with signals that have the same failed steps. |
| 683 # Observe no new group creation. |
| 684 self.assertFalse(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 685 master_name_2, builder_name, build_number, failure_type.TEST, |
| 686 blame_list, failed_steps, None, heuristic_result)) |
| 687 self.assertIsNone( |
| 688 WfFailureGroup.Get(master_name_2, builder_name, build_number)) |
| 689 |
| 690 def testGroupTestsWithRelatedStepsWithoutHeuristicResult(self): |
| 691 master_name = 'm1' |
| 692 builder_name = 'b' |
| 693 build_number = 1 |
| 596 master_name_2 = 'm2' | 694 master_name_2 = 'm2' |
| 597 | 695 |
| 598 blame_list = ['a'] | 696 blame_list = ['a'] |
| 599 | 697 |
| 600 failed_steps = { | 698 failed_steps = { |
| 601 'step_a': { | 699 'step_a': { |
| 602 'current_failure': 3, | 700 'current_failure': 3, |
| 603 'first_failure': 2, | 701 'first_failure': 2, |
| 604 'last_pass': 1 | 702 'last_pass': 1 |
| 605 } | 703 } |
| 606 } | 704 } |
| 607 | 705 |
| 608 WfAnalysis.Create(master_name, builder_name, build_number).put() | 706 WfAnalysis.Create(master_name, builder_name, build_number).put() |
| 609 # Run pipeline with signals that have certain failed steps. | 707 # Run pipeline with signals that have certain failed steps. |
| 610 # Observe new group creation. | 708 # Observe new group creation. |
| 611 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( | 709 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 612 master_name, builder_name, build_number, failure_type.TEST, blame_list, | 710 master_name, builder_name, build_number, failure_type.TEST, blame_list, |
| 613 failed_steps, None, None)) | 711 failed_steps, None, None)) |
| 614 self.assertTrue(WfFailureGroup.Get(master_name, builder_name, build_number)) | 712 self.assertIsNotNone( |
| 713 WfFailureGroup.Get(master_name, builder_name, build_number)) |
| 615 | 714 |
| 616 WfAnalysis.Create(master_name_2, builder_name, build_number).put() | 715 WfAnalysis.Create(master_name_2, builder_name, build_number).put() |
| 617 # Run pipeline with signals that have the same failed steps. | 716 # Run pipeline with signals that have the same failed steps. |
| 618 # Observe no new group creation. | 717 # Observe no new group creation. |
| 619 self.assertFalse(try_job_util._IsBuildFailureUniqueAcrossPlatforms( | 718 self.assertFalse(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 620 master_name_2, builder_name, build_number, failure_type.TEST, | 719 master_name_2, builder_name, build_number, failure_type.TEST, |
| 621 blame_list, failed_steps, None, None)) | 720 blame_list, failed_steps, None, None)) |
| 622 self.assertIsNone( | 721 self.assertIsNone( |
| 623 WfFailureGroup.Get(master_name_2, builder_name, build_number)) | 722 WfFailureGroup.Get(master_name_2, builder_name, build_number)) |
| 624 | 723 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 638 } | 737 } |
| 639 } | 738 } |
| 640 | 739 |
| 641 WfAnalysis.Create(master_name, builder_name, build_number).put() | 740 WfAnalysis.Create(master_name, builder_name, build_number).put() |
| 642 # Run pipeline with signals that have certain failed steps. | 741 # Run pipeline with signals that have certain failed steps. |
| 643 # Observe new group creation. | 742 # Observe new group creation. |
| 644 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( | 743 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 645 master_name, builder_name, build_number, failure_type.TEST, | 744 master_name, builder_name, build_number, failure_type.TEST, |
| 646 blame_list_1, failed_steps, None, | 745 blame_list_1, failed_steps, None, |
| 647 None)) | 746 None)) |
| 648 self.assertTrue(WfFailureGroup.Get(master_name, builder_name, build_number)) | 747 self.assertIsNotNone( |
| 748 WfFailureGroup.Get(master_name, builder_name, build_number)) |
| 649 | 749 |
| 650 WfAnalysis.Create(master_name_2, builder_name, build_number).put() | 750 WfAnalysis.Create(master_name_2, builder_name, build_number).put() |
| 651 # Run pipeline with signals that have different failed steps. | 751 # Run pipeline with signals that have different failed steps. |
| 652 # Observe new group creation. | 752 # Observe new group creation. |
| 653 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( | 753 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 654 master_name_2, builder_name, build_number, failure_type.TEST, | 754 master_name_2, builder_name, build_number, failure_type.TEST, |
| 655 blame_list_2, failed_steps, None, None)) | 755 blame_list_2, failed_steps, None, None)) |
| 656 self.assertTrue( | 756 self.assertTrue( |
| 657 WfFailureGroup.Get(master_name_2, builder_name, build_number)) | 757 WfFailureGroup.Get(master_name_2, builder_name, build_number)) |
| 658 | 758 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 683 } | 783 } |
| 684 ] | 784 ] |
| 685 } | 785 } |
| 686 | 786 |
| 687 heuristic_result_2 = { | 787 heuristic_result_2 = { |
| 688 'failures': [ | 788 'failures': [ |
| 689 { | 789 { |
| 690 'step_name': 'step1', | 790 'step_name': 'step1', |
| 691 'suspected_cls': [ | 791 'suspected_cls': [ |
| 692 { | 792 { |
| 693 'revision': 'rev1', | 793 'revision': 'rev2', |
| 694 } | 794 } |
| 695 ], | 795 ], |
| 696 } | 796 } |
| 697 ] | 797 ] |
| 698 } | 798 } |
| 699 | 799 |
| 700 WfAnalysis.Create(master_name, builder_name, build_number).put() | 800 WfAnalysis.Create(master_name, builder_name, build_number).put() |
| 701 # Run pipeline with signals that have certain failed steps. | 801 # Run pipeline with signals that have certain failed steps. |
| 702 # Observe new group creation. | 802 # Observe new group creation. |
| 703 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( | 803 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 704 master_name, builder_name, build_number, failure_type.TEST, blame_list, | 804 master_name, builder_name, build_number, failure_type.TEST, blame_list, |
| 705 failed_steps, None, heuristic_result_1)) | 805 failed_steps, None, heuristic_result_1)) |
| 706 self.assertTrue(WfFailureGroup.Get(master_name, builder_name, build_number)) | 806 self.assertIsNotNone( |
| 807 WfFailureGroup.Get(master_name, builder_name, build_number)) |
| 707 | 808 |
| 708 WfAnalysis.Create(master_name_2, builder_name, build_number).put() | 809 WfAnalysis.Create(master_name_2, builder_name, build_number).put() |
| 709 # Run pipeline with signals that have different failed steps. | 810 # Run pipeline with signals that have different failed steps. |
| 710 # Observe new group creation. | 811 # Observe new group creation. |
| 711 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( | 812 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 712 master_name_2, builder_name, build_number, failure_type.TEST, | 813 master_name_2, builder_name, build_number, failure_type.TEST, |
| 713 blame_list, failed_steps, None, heuristic_result_2)) | 814 blame_list, failed_steps, None, heuristic_result_2)) |
| 714 self.assertTrue( | 815 self.assertTrue( |
| 715 WfFailureGroup.Get(master_name_2, builder_name, build_number)) | 816 WfFailureGroup.Get(master_name_2, builder_name, build_number)) |
| 716 | 817 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 737 'last_pass': 1 | 838 'last_pass': 1 |
| 738 } | 839 } |
| 739 } | 840 } |
| 740 | 841 |
| 741 WfAnalysis.Create(master_name, builder_name, build_number).put() | 842 WfAnalysis.Create(master_name, builder_name, build_number).put() |
| 742 # Run pipeline with signals that have certain failed steps. | 843 # Run pipeline with signals that have certain failed steps. |
| 743 # Observe new group creation. | 844 # Observe new group creation. |
| 744 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( | 845 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 745 master_name, builder_name, build_number, failure_type.TEST, blame_list, | 846 master_name, builder_name, build_number, failure_type.TEST, blame_list, |
| 746 failed_steps_1, None, None)) | 847 failed_steps_1, None, None)) |
| 747 self.assertTrue(WfFailureGroup.Get(master_name, builder_name, build_number)) | 848 self.assertIsNotNone( |
| 849 WfFailureGroup.Get(master_name, builder_name, build_number)) |
| 748 | 850 |
| 749 WfAnalysis.Create(master_name_2, builder_name, build_number).put() | 851 WfAnalysis.Create(master_name_2, builder_name, build_number).put() |
| 750 # Run pipeline with signals that have different failed steps. | 852 # Run pipeline with signals that have different failed steps. |
| 751 # Observe new group creation. | 853 # Observe new group creation. |
| 752 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( | 854 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 753 master_name_2, builder_name, build_number, failure_type.TEST, | 855 master_name_2, builder_name, build_number, failure_type.TEST, |
| 754 blame_list, failed_steps_2, None, None)) | 856 blame_list, failed_steps_2, None, None)) |
| 755 self.assertTrue( | 857 self.assertTrue( |
| 756 WfFailureGroup.Get(master_name_2, builder_name, build_number)) | 858 WfFailureGroup.Get(master_name_2, builder_name, build_number)) |
| 757 | 859 |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1078 {'source': 'b.cc', 'target': 'b.o'}, | 1180 {'source': 'b.cc', 'target': 'b.o'}, |
| 1079 ] | 1181 ] |
| 1080 } | 1182 } |
| 1081 } | 1183 } |
| 1082 | 1184 |
| 1083 self.assertEqual( | 1185 self.assertEqual( |
| 1084 try_job_util._GetFailedTargetsFromSignals( | 1186 try_job_util._GetFailedTargetsFromSignals( |
| 1085 signals, 'master1', 'builder1'), | 1187 signals, 'master1', 'builder1'), |
| 1086 ['b.o']) | 1188 ['b.o']) |
| 1087 | 1189 |
| 1088 def testGenPotentialCulpritTupleListNoHeuristicResult(self): | 1190 def testGetSuspectedCLsWithFailuresNoHeuristicResult(self): |
| 1089 heuristic_result = None | 1191 heuristic_result = None |
| 1090 expected_suspected_revisions = [] | 1192 expected_suspected_revisions = [] |
| 1091 self.assertEqual( | 1193 self.assertEqual( |
| 1092 expected_suspected_revisions, | 1194 expected_suspected_revisions, |
| 1093 sorted(try_job_util.GenPotentialCulpritTupleList(heuristic_result))) | 1195 sorted(try_job_util.GetSuspectedCLsWithFailures(heuristic_result))) |
| 1094 | 1196 |
| 1095 def testGenPotentialCulpritTupleListEmptyHeuristicResult(self): | 1197 def testGetSuspectedCLsWithFailuresEmptyHeuristicResult(self): |
| 1096 heuristic_result = {} | 1198 heuristic_result = {} |
| 1097 expected_suspected_revisions = [] | 1199 expected_suspected_revisions = [] |
| 1098 self.assertEqual( | 1200 self.assertEqual( |
| 1099 expected_suspected_revisions, | 1201 expected_suspected_revisions, |
| 1100 sorted(try_job_util.GenPotentialCulpritTupleList(heuristic_result))) | 1202 sorted(try_job_util.GetSuspectedCLsWithFailures(heuristic_result))) |
| 1101 | 1203 |
| 1102 def testGenPotentialCulpritTupleList(self): | 1204 def testGetSuspectedCLsWithFailures(self): |
| 1103 heuristic_result = { | 1205 heuristic_result = { |
| 1104 'failures': [ | 1206 'failures': [ |
| 1105 { | 1207 { |
| 1106 'step_name': 'step1', | 1208 'step_name': 'step1', |
| 1107 'suspected_cls': [], | 1209 'suspected_cls': [], |
| 1108 }, | 1210 }, |
| 1109 { | 1211 { |
| 1110 'step_name': 'step2', | 1212 'step_name': 'step2', |
| 1111 'suspected_cls': [ | 1213 'suspected_cls': [ |
| 1112 { | 1214 { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1142 { | 1244 { |
| 1143 'revision': 'ghi' | 1245 'revision': 'ghi' |
| 1144 } | 1246 } |
| 1145 ] | 1247 ] |
| 1146 } | 1248 } |
| 1147 ] | 1249 ] |
| 1148 } | 1250 } |
| 1149 ] | 1251 ] |
| 1150 } | 1252 } |
| 1151 expected_suspected_revisions = [ | 1253 expected_suspected_revisions = [ |
| 1152 ('step2', 'r1', None), | 1254 ['step2', 'r1', None], |
| 1153 ('step2', 'r2', None), | 1255 ['step2', 'r2', None], |
| 1154 ('step3', 'abc', 'super_test_1'), | 1256 ['step3', 'abc', 'super_test_1'], |
| 1155 ('step3', 'def', 'super_test_2'), | 1257 ['step3', 'def', 'super_test_2'], |
| 1156 ('step3', 'ghi', 'super_test_2') | 1258 ['step3', 'ghi', 'super_test_2'] |
| 1157 ] | 1259 ] |
| 1158 self.assertEqual( | 1260 self.assertEqual( |
| 1159 expected_suspected_revisions, | 1261 expected_suspected_revisions, |
| 1160 sorted(try_job_util.GenPotentialCulpritTupleList(heuristic_result))) | 1262 sorted(try_job_util.GetSuspectedCLsWithFailures(heuristic_result))) |
| 1161 | 1263 |
| 1162 def testGetSuspectsFromHeuristicResultForCompile(self): | 1264 def testGetSuspectsFromHeuristicResultForCompile(self): |
| 1163 heuristic_result = { | 1265 heuristic_result = { |
| 1164 'failures': [ | 1266 'failures': [ |
| 1165 { | 1267 { |
| 1166 'step_name': 'compile', | 1268 'step_name': 'compile', |
| 1167 'suspected_cls': [ | 1269 'suspected_cls': [ |
| 1168 { | 1270 { |
| 1169 'revision': 'r1', | 1271 'revision': 'r1', |
| 1170 }, | 1272 }, |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1213 try_job_util._GetSuspectsFromHeuristicResult(heuristic_result)) | 1315 try_job_util._GetSuspectsFromHeuristicResult(heuristic_result)) |
| 1214 | 1316 |
| 1215 def testShouldBailOutforOutdatedBuild(self): | 1317 def testShouldBailOutforOutdatedBuild(self): |
| 1216 yesterday = datetime.utcnow() - timedelta(days=1) | 1318 yesterday = datetime.utcnow() - timedelta(days=1) |
| 1217 build = WfBuild.Create('m', 'b', 1) | 1319 build = WfBuild.Create('m', 'b', 1) |
| 1218 build.start_time = yesterday | 1320 build.start_time = yesterday |
| 1219 self.assertTrue(try_job_util._ShouldBailOutForOutdatedBuild(build)) | 1321 self.assertTrue(try_job_util._ShouldBailOutForOutdatedBuild(build)) |
| 1220 | 1322 |
| 1221 build.start_time = yesterday + timedelta(hours=1) | 1323 build.start_time = yesterday + timedelta(hours=1) |
| 1222 self.assertFalse(try_job_util._ShouldBailOutForOutdatedBuild(build)) | 1324 self.assertFalse(try_job_util._ShouldBailOutForOutdatedBuild(build)) |
| OLD | NEW |