Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(235)

Side by Side Diff: cc/scheduler/begin_frame_source_unittest.cc

Issue 1765723002: Hoist begin frame sources out of scheduler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@scheduler_remove_throttle_flag
Patch Set: Rebase Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/scheduler/begin_frame_source.cc ('k') | cc/scheduler/scheduler.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
OLDNEW
« no previous file with comments | « cc/scheduler/begin_frame_source.cc ('k') | cc/scheduler/scheduler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698