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 |