| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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 #include "cc/scheduler/begin_frame_source.h" | 5 #include "cc/scheduler/begin_frame_source.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include "base/test/test_simple_task_runner.h" | 9 #include "base/test/test_simple_task_runner.h" |
| 10 #include "cc/test/begin_frame_args_test.h" | 10 #include "cc/test/begin_frame_args_test.h" |
| (...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 559 // Missed frame received. | 559 // Missed frame received. |
| 560 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(10000), | 560 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(10000), |
| 561 base::TimeDelta::FromInternalValue(10000)); | 561 base::TimeDelta::FromInternalValue(10000)); |
| 562 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); | 562 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); |
| 563 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | 563 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); |
| 564 EXPECT_BEGIN_FRAME_USED_MISSED(obs, 10000, 20000, 10000); | 564 EXPECT_BEGIN_FRAME_USED_MISSED(obs, 10000, 20000, 10000); |
| 565 source_->AddObserver(&obs); | 565 source_->AddObserver(&obs); |
| 566 source_->RemoveObserver(&obs); | 566 source_->RemoveObserver(&obs); |
| 567 } | 567 } |
| 568 | 568 |
| 569 // BeginFrameSourceMultiplexer testing ----------------------------------- | |
| 570 class BeginFrameSourceMultiplexerTest : public ::testing::Test { | |
| 571 protected: | |
| 572 void SetUp() override { | |
| 573 mux_ = BeginFrameSourceMultiplexer::Create(); | |
| 574 | |
| 575 source1_store_ = make_scoped_ptr(new FakeBeginFrameSource()); | |
| 576 source2_store_ = make_scoped_ptr(new FakeBeginFrameSource()); | |
| 577 source3_store_ = make_scoped_ptr(new FakeBeginFrameSource()); | |
| 578 | |
| 579 source1_ = source1_store_.get(); | |
| 580 source2_ = source2_store_.get(); | |
| 581 source3_ = source3_store_.get(); | |
| 582 } | |
| 583 | |
| 584 void TearDown() override { | |
| 585 // Make sure the mux is torn down before the sources. | |
| 586 mux_.reset(); | |
| 587 } | |
| 588 | |
| 589 scoped_ptr<BeginFrameSourceMultiplexer> mux_; | |
| 590 FakeBeginFrameSource* source1_; | |
| 591 FakeBeginFrameSource* source2_; | |
| 592 FakeBeginFrameSource* source3_; | |
| 593 | |
| 594 private: | |
| 595 scoped_ptr<FakeBeginFrameSource> source1_store_; | |
| 596 scoped_ptr<FakeBeginFrameSource> source2_store_; | |
| 597 scoped_ptr<FakeBeginFrameSource> source3_store_; | |
| 598 }; | |
| 599 | |
| 600 TEST_F(BeginFrameSourceMultiplexerTest, SourcesManipulation) { | |
| 601 EXPECT_EQ(NULL, mux_->ActiveSource()); | |
| 602 | |
| 603 mux_->AddSource(source1_); | |
| 604 EXPECT_EQ(source1_, mux_->ActiveSource()); | |
| 605 | |
| 606 mux_->SetActiveSource(NULL); | |
| 607 EXPECT_EQ(NULL, mux_->ActiveSource()); | |
| 608 | |
| 609 mux_->SetActiveSource(source1_); | |
| 610 | |
| 611 #ifndef NDEBUG | |
| 612 // Setting a source which isn't in the mux as active should DCHECK fail. | |
| 613 EXPECT_DEATH({ mux_->SetActiveSource(source2_); }, ""); | |
| 614 | |
| 615 // Adding a source which is already added should DCHECK fail. | |
| 616 EXPECT_DEATH({ mux_->AddSource(source1_); }, ""); | |
| 617 | |
| 618 // Removing a source which isn't in the mux should DCHECK fail. | |
| 619 EXPECT_DEATH({ mux_->RemoveSource(source2_); }, ""); | |
| 620 | |
| 621 // Removing the active source fails | |
| 622 EXPECT_DEATH({ mux_->RemoveSource(source1_); }, ""); | |
| 623 #endif | |
| 624 | |
| 625 // Test manipulation doesn't segfault. | |
| 626 mux_->AddSource(source2_); | |
| 627 mux_->RemoveSource(source2_); | |
| 628 | |
| 629 mux_->AddSource(source2_); | |
| 630 mux_->SetActiveSource(source2_); | |
| 631 EXPECT_EQ(source2_, mux_->ActiveSource()); | |
| 632 | |
| 633 mux_->RemoveSource(source1_); | |
| 634 } | |
| 635 | |
| 636 TEST_F(BeginFrameSourceMultiplexerTest, SwitchActiveSource) { | |
| 637 mux_->AddSource(source1_); | |
| 638 mux_->AddSource(source2_); | |
| 639 | |
| 640 EXPECT_FALSE(source1_->has_observers()); | |
| 641 EXPECT_FALSE(source2_->has_observers()); | |
| 642 | |
| 643 MockBeginFrameObserver obs; | |
| 644 mux_->AddObserver(&obs); | |
| 645 | |
| 646 mux_->SetActiveSource(source1_); | |
| 647 EXPECT_TRUE(source1_->has_observers()); | |
| 648 EXPECT_FALSE(source2_->has_observers()); | |
| 649 | |
| 650 mux_->SetActiveSource(source2_); | |
| 651 EXPECT_FALSE(source1_->has_observers()); | |
| 652 EXPECT_TRUE(source2_->has_observers()); | |
| 653 } | |
| 654 | |
| 655 TEST_F(BeginFrameSourceMultiplexerTest, SingleObserver) { | |
| 656 mux_->AddSource(source1_); | |
| 657 mux_->AddSource(source2_); | |
| 658 mux_->SetActiveSource(source1_); | |
| 659 | |
| 660 EXPECT_FALSE(source1_->has_observers()); | |
| 661 EXPECT_FALSE(source2_->has_observers()); | |
| 662 | |
| 663 MockBeginFrameObserver obs; | |
| 664 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | |
| 665 mux_->AddObserver(&obs); | |
| 666 EXPECT_TRUE(source1_->has_observers()); | |
| 667 EXPECT_FALSE(source2_->has_observers()); | |
| 668 | |
| 669 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 100); | |
| 670 SEND_BEGIN_FRAME_USED(*source1_, 100, 200, 100); | |
| 671 SEND_BEGIN_FRAME_DROP(*source2_, 150, 250, 100); | |
| 672 | |
| 673 mux_->RemoveObserver(&obs); | |
| 674 EXPECT_FALSE(source1_->has_observers()); | |
| 675 EXPECT_FALSE(source2_->has_observers()); | |
| 676 } | |
| 677 | |
| 678 TEST_F(BeginFrameSourceMultiplexerTest, MultipleObservers) { | |
| 679 mux_->AddSource(source1_); | |
| 680 mux_->AddSource(source2_); | |
| 681 mux_->SetActiveSource(source1_); | |
| 682 | |
| 683 EXPECT_FALSE(source1_->has_observers()); | |
| 684 EXPECT_FALSE(source2_->has_observers()); | |
| 685 | |
| 686 StrictMock<MockBeginFrameObserver> obs1, obs2; | |
| 687 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); | |
| 688 mux_->AddObserver(&obs1); | |
| 689 EXPECT_TRUE(source1_->has_observers()); | |
| 690 EXPECT_FALSE(source2_->has_observers()); | |
| 691 | |
| 692 EXPECT_BEGIN_FRAME_USED(obs1, 100, 200, 100); | |
| 693 SEND_BEGIN_FRAME_USED(*source1_, 100, 200, 100); | |
| 694 SEND_BEGIN_FRAME_DROP(*source2_, 200, 300, 100); | |
| 695 | |
| 696 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); | |
| 697 mux_->AddObserver(&obs2); | |
| 698 | |
| 699 EXPECT_BEGIN_FRAME_USED(obs1, 300, 400, 100); | |
| 700 EXPECT_BEGIN_FRAME_USED(obs2, 300, 400, 100); | |
| 701 SEND_BEGIN_FRAME_USED(*source1_, 300, 400, 100); | |
| 702 SEND_BEGIN_FRAME_DROP(*source2_, 400, 500, 100); | |
| 703 | |
| 704 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, true); | |
| 705 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, true); | |
| 706 source1_->SetBeginFrameSourcePaused(true); | |
| 707 | |
| 708 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); | |
| 709 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); | |
| 710 mux_->SetActiveSource(source2_); | |
| 711 EXPECT_FALSE(source1_->has_observers()); | |
| 712 EXPECT_TRUE(source2_->has_observers()); | |
| 713 | |
| 714 EXPECT_BEGIN_FRAME_USED(obs1, 600, 700, 100); | |
| 715 EXPECT_BEGIN_FRAME_USED(obs2, 600, 700, 100); | |
| 716 SEND_BEGIN_FRAME_DROP(*source1_, 500, 600, 100); | |
| 717 SEND_BEGIN_FRAME_USED(*source2_, 600, 700, 100); | |
| 718 | |
| 719 mux_->RemoveObserver(&obs1); | |
| 720 EXPECT_FALSE(source1_->has_observers()); | |
| 721 EXPECT_TRUE(source2_->has_observers()); | |
| 722 | |
| 723 EXPECT_BEGIN_FRAME_USED(obs2, 800, 900, 100); | |
| 724 SEND_BEGIN_FRAME_DROP(*source1_, 700, 800, 100); | |
| 725 SEND_BEGIN_FRAME_USED(*source2_, 800, 900, 100); | |
| 726 | |
| 727 mux_->RemoveObserver(&obs2); | |
| 728 EXPECT_FALSE(source1_->has_observers()); | |
| 729 EXPECT_FALSE(source2_->has_observers()); | |
| 730 } | |
| 731 | |
| 732 TEST_F(BeginFrameSourceMultiplexerTest, BeginFramesSimple) { | |
| 733 mux_->AddSource(source1_); | |
| 734 mux_->AddSource(source2_); | |
| 735 mux_->SetActiveSource(source1_); | |
| 736 | |
| 737 MockBeginFrameObserver obs; | |
| 738 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | |
| 739 mux_->AddObserver(&obs); | |
| 740 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); | |
| 741 EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300); | |
| 742 | |
| 743 mux_->SetActiveSource(source1_); | |
| 744 | |
| 745 SEND_BEGIN_FRAME_USED(*source1_, 100, 200, 300); | |
| 746 SEND_BEGIN_FRAME_DROP(*source2_, 200, 500, 300); | |
| 747 | |
| 748 mux_->SetActiveSource(source2_); | |
| 749 SEND_BEGIN_FRAME_USED(*source2_, 400, 600, 300); | |
| 750 SEND_BEGIN_FRAME_DROP(*source1_, 500, 700, 300); | |
| 751 } | |
| 752 | |
| 753 TEST_F(BeginFrameSourceMultiplexerTest, BeginFramesBackwardsProtection) { | |
| 754 mux_->AddSource(source1_); | |
| 755 mux_->AddSource(source2_); | |
| 756 | |
| 757 MockBeginFrameObserver obs; | |
| 758 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | |
| 759 mux_->AddObserver(&obs); | |
| 760 EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300); | |
| 761 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); | |
| 762 EXPECT_BEGIN_FRAME_USED(obs, 1000, 1200, 300); | |
| 763 EXPECT_BEGIN_FRAME_USED(obs, 1001, 1201, 301); | |
| 764 | |
| 765 mux_->SetActiveSource(source1_); | |
| 766 SEND_BEGIN_FRAME_USED(*source1_, 400, 600, 300); | |
| 767 SEND_BEGIN_FRAME_USED(*source1_, 700, 900, 300); | |
| 768 | |
| 769 mux_->SetActiveSource(source2_); | |
| 770 SEND_BEGIN_FRAME_DROP(*source2_, 699, 899, 300); | |
| 771 SEND_BEGIN_FRAME_USED(*source2_, 1000, 1200, 300); | |
| 772 | |
| 773 mux_->SetActiveSource(source1_); | |
| 774 SEND_BEGIN_FRAME_USED(*source1_, 1001, 1201, 301); | |
| 775 } | |
| 776 | |
| 777 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalNegativeFails) { | |
| 778 #ifndef NDEBUG | |
| 779 EXPECT_DEATH( | |
| 780 { mux_->SetMinimumInterval(base::TimeDelta::FromInternalValue(-100)); }, | |
| 781 ""); | |
| 782 #endif | |
| 783 } | |
| 784 | |
| 785 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalZero) { | |
| 786 mux_->SetMinimumInterval(base::TimeDelta()); | |
| 787 mux_->AddSource(source1_); | |
| 788 | |
| 789 MockBeginFrameObserver obs; | |
| 790 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | |
| 791 mux_->AddObserver(&obs); | |
| 792 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); | |
| 793 EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300); | |
| 794 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); | |
| 795 | |
| 796 SEND_BEGIN_FRAME_USED(*source1_, 100, 200, 300); | |
| 797 SEND_BEGIN_FRAME_USED(*source1_, 400, 600, 300); | |
| 798 SEND_BEGIN_FRAME_USED(*source1_, 700, 900, 300); | |
| 799 } | |
| 800 | |
| 801 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalBasic) { | |
| 802 mux_->SetMinimumInterval(base::TimeDelta::FromInternalValue(600)); | |
| 803 mux_->AddSource(source1_); | |
| 804 | |
| 805 MockBeginFrameObserver obs; | |
| 806 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | |
| 807 mux_->AddObserver(&obs); | |
| 808 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); | |
| 809 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); | |
| 810 | |
| 811 SEND_BEGIN_FRAME_USED(*source1_, 100, 200, 300); | |
| 812 SEND_BEGIN_FRAME_DROP(*source1_, 400, 600, 300); | |
| 813 SEND_BEGIN_FRAME_USED(*source1_, 700, 900, 300); | |
| 814 } | |
| 815 | |
| 816 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalWithMultipleSources) { | |
| 817 mux_->SetMinimumInterval(base::TimeDelta::FromMicroseconds(150)); | |
| 818 mux_->AddSource(source1_); | |
| 819 mux_->AddSource(source2_); | |
| 820 | |
| 821 MockBeginFrameObserver obs; | |
| 822 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | |
| 823 mux_->AddObserver(&obs); | |
| 824 EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300); | |
| 825 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); | |
| 826 EXPECT_BEGIN_FRAME_USED(obs, 1050, 1250, 300); | |
| 827 | |
| 828 mux_->SetActiveSource(source1_); | |
| 829 SEND_BEGIN_FRAME_USED(*source1_, 400, 600, 300); | |
| 830 SEND_BEGIN_FRAME_USED(*source1_, 700, 900, 300); | |
| 831 | |
| 832 mux_->SetActiveSource(source2_); | |
| 833 SEND_BEGIN_FRAME_DROP(*source2_, 750, 1050, 300); | |
| 834 SEND_BEGIN_FRAME_USED(*source2_, 1050, 1250, 300); | |
| 835 | |
| 836 mux_->SetActiveSource(source1_); | |
| 837 SEND_BEGIN_FRAME_DROP(*source2_, 1100, 1400, 300); | |
| 838 } | |
| 839 | |
| 840 TEST_F(BeginFrameSourceMultiplexerTest, BeginFrameSourcePaused) { | |
| 841 mux_->AddSource(source1_); | |
| 842 mux_->AddSource(source2_); | |
| 843 mux_->SetActiveSource(source1_); | |
| 844 | |
| 845 MockBeginFrameObserver obs; | |
| 846 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | |
| 847 mux_->AddObserver(&obs); | |
| 848 Mock::VerifyAndClearExpectations(&obs); | |
| 849 | |
| 850 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, true); | |
| 851 source1_->SetBeginFrameSourcePaused(true); | |
| 852 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | |
| 853 source1_->SetBeginFrameSourcePaused(false); | |
| 854 Mock::VerifyAndClearExpectations(&obs); | |
| 855 | |
| 856 mux_->SetActiveSource(source2_); | |
| 857 Mock::VerifyAndClearExpectations(&obs); | |
| 858 | |
| 859 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, true); | |
| 860 source2_->SetBeginFrameSourcePaused(true); | |
| 861 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | |
| 862 source2_->SetBeginFrameSourcePaused(false); | |
| 863 } | |
| 864 | |
| 865 TEST_F(BeginFrameSourceMultiplexerTest, | |
| 866 BeginFrameSourcePausedUpdateOnSourceTransition) { | |
| 867 mux_->AddSource(source1_); | |
| 868 mux_->AddSource(source2_); | |
| 869 source1_->SetBeginFrameSourcePaused(true); | |
| 870 source2_->SetBeginFrameSourcePaused(false); | |
| 871 mux_->SetActiveSource(source1_); | |
| 872 | |
| 873 MockBeginFrameObserver obs; | |
| 874 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, true); | |
| 875 mux_->AddObserver(&obs); | |
| 876 Mock::VerifyAndClearExpectations(&obs); | |
| 877 | |
| 878 // Paused to not paused. | |
| 879 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | |
| 880 mux_->SetActiveSource(source2_); | |
| 881 Mock::VerifyAndClearExpectations(&obs); | |
| 882 | |
| 883 // Not paused to paused. | |
| 884 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, true); | |
| 885 mux_->SetActiveSource(source1_); | |
| 886 Mock::VerifyAndClearExpectations(&obs); | |
| 887 | |
| 888 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | |
| 889 source1_->SetBeginFrameSourcePaused(false); | |
| 890 Mock::VerifyAndClearExpectations(&obs); | |
| 891 | |
| 892 // Not paused to not paused. | |
| 893 mux_->SetActiveSource(source2_); | |
| 894 Mock::VerifyAndClearExpectations(&obs); | |
| 895 | |
| 896 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, true); | |
| 897 source2_->SetBeginFrameSourcePaused(true); | |
| 898 Mock::VerifyAndClearExpectations(&obs); | |
| 899 source1_->SetBeginFrameSourcePaused(true); | |
| 900 | |
| 901 // Paused to paused. | |
| 902 mux_->SetActiveSource(source1_); | |
| 903 Mock::VerifyAndClearExpectations(&obs); | |
| 904 } | |
| 905 | |
| 906 } // namespace | 569 } // namespace |
| 907 } // namespace cc | 570 } // namespace cc |
| OLD | NEW |