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

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

Issue 2888043004: [cc] Add and plumb CFS::DidNotProduceFrame. (Closed)
Patch Set: remove ExternalBFS::OnDidFinishFrame and related ack tracking. Created 3 years, 7 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
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/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
10 #include "base/test/test_simple_task_runner.h" 10 #include "base/test/test_simple_task_runner.h"
(...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after
543 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); 543 now_src_->Advance(base::TimeDelta::FromInternalValue(5000));
544 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); 544 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false);
545 // Sequence number is incremented again, because the missed frame has 545 // Sequence number is incremented again, because the missed frame has
546 // different time/interval. 546 // different time/interval.
547 EXPECT_BEGIN_FRAME_USED_MISSED(obs, source_->source_id(), 3, 10000, 20000, 547 EXPECT_BEGIN_FRAME_USED_MISSED(obs, source_->source_id(), 3, 10000, 20000,
548 10000); 548 10000);
549 source_->AddObserver(&obs); 549 source_->AddObserver(&obs);
550 source_->RemoveObserver(&obs); 550 source_->RemoveObserver(&obs);
551 } 551 }
552 552
553 // BeginFrameObserverAckTracker testing ----------------------------------------
554 class TestBeginFrameConsumer : public BeginFrameObserverBase {
555 private:
556 bool OnBeginFrameDerivedImpl(const BeginFrameArgs& args) override {
557 // Consume the args.
558 return true;
559 }
560 void OnBeginFrameSourcePausedChanged(bool paused) override {}
561 };
562
563 // Use EXPECT_TRUE instead of EXPECT_EQ for |finished| and |damage| as gcc 4.7
564 // issues the following warning on EXPECT_EQ(false, x), which is turned into an
565 // error with -Werror=conversion-null:
566 //
567 // converting 'false' to pointer type for argument 1 of
568 // 'char testing::internal::IsNullLiteralHelper(testing::internal::Secret*)'
569 #define EXPECT_ACK_TRACKER_STATE(finished, damage, latest_confirmed) \
570 EXPECT_TRUE(finished == tracker_->AllObserversFinishedFrame()) \
571 << "expected: " << finished; \
572 EXPECT_TRUE(damage == tracker_->AnyObserversHadDamage()) << "expected: " \
573 << damage; \
574 EXPECT_EQ(latest_confirmed, tracker_->LatestConfirmedSequenceNumber())
575
576 class BeginFrameObserverAckTrackerTest : public ::testing::Test {
577 public:
578 BeginFrameArgs current_args_;
579 std::unique_ptr<BeginFrameObserverAckTracker> tracker_;
580 TestBeginFrameConsumer obs1_;
581 TestBeginFrameConsumer obs2_;
582
583 void SetUp() override {
584 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
585 tracker_.reset(new BeginFrameObserverAckTracker());
586 }
587 };
588
589 TEST_F(BeginFrameObserverAckTrackerTest, CorrectnessWithoutObservers) {
590 // Check initial state.
591 EXPECT_ACK_TRACKER_STATE(true, false, 1u);
592
593 // A new BeginFrame is immediately finished and confirmed.
594 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 2);
595 tracker_->OnBeginFrame(current_args_);
596 EXPECT_ACK_TRACKER_STATE(true, false, 2u);
597 }
598
599 TEST_F(BeginFrameObserverAckTrackerTest, CorrectnessWith1Observer) {
600 // Check initial state.
601 EXPECT_ACK_TRACKER_STATE(true, false, 1u);
602
603 // After adding an observer, the BeginFrame is not finished or confirmed.
604 tracker_->OnObserverAdded(&obs1_);
605 EXPECT_ACK_TRACKER_STATE(false, false, 0u); // up to date to previous frame.
606
607 // On removing it, the BeginFrame is back to original state.
608 tracker_->OnObserverRemoved(&obs1_);
609 EXPECT_ACK_TRACKER_STATE(true, false, 1u);
610
611 // After adding it back, the BeginFrame is again not finished or confirmed.
612 tracker_->OnObserverAdded(&obs1_);
613 EXPECT_ACK_TRACKER_STATE(false, false, 0u); // up to date to previous frame.
614
615 // When the observer finishes and confirms, the BeginFrame is finished
616 // and confirmed.
617 obs1_.OnBeginFrame(current_args_);
618 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 1, 1, false));
619 EXPECT_ACK_TRACKER_STATE(true, false, 1u);
620
621 // A new BeginFrame is initially not finished or confirmed.
622 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 2);
623 tracker_->OnBeginFrame(current_args_);
624 EXPECT_ACK_TRACKER_STATE(false, false, 1u);
625
626 // Stray ACK for an old BeginFrame is ignored.
627 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 1, 1, false));
628 EXPECT_ACK_TRACKER_STATE(false, false, 1u);
629
630 // When the observer finishes but doesn't confirm, the BeginFrame is finished
631 // but not confirmed.
632 obs1_.OnBeginFrame(current_args_);
633 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 2, 1, false));
634 EXPECT_ACK_TRACKER_STATE(true, false, 1u);
635
636 // Damage from ACK propagates.
637 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 3);
638 tracker_->OnBeginFrame(current_args_);
639 EXPECT_ACK_TRACKER_STATE(false, false, 1u);
640 obs1_.OnBeginFrame(current_args_);
641 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 3, 3, true));
642 EXPECT_ACK_TRACKER_STATE(true, true, 3u);
643
644 // Removing an out-of-date observer confirms the latest BeginFrame.
645 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 4);
646 tracker_->OnBeginFrame(current_args_);
647 EXPECT_ACK_TRACKER_STATE(false, false, 3u);
648 obs1_.OnBeginFrame(current_args_);
649 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 4, 3, false));
650 EXPECT_ACK_TRACKER_STATE(true, false, 3u);
651 tracker_->OnObserverRemoved(&obs1_);
652 EXPECT_ACK_TRACKER_STATE(true, false, 4u);
653 }
654
655 TEST_F(BeginFrameObserverAckTrackerTest, CorrectnessWith2Observers) {
656 // Check initial state.
657 EXPECT_ACK_TRACKER_STATE(true, false, 1u);
658
659 // After adding observers, the BeginFrame is not finished or confirmed.
660 tracker_->OnObserverAdded(&obs1_);
661 EXPECT_ACK_TRACKER_STATE(false, false, 0u); // up to date to previous frame.
662 tracker_->OnObserverAdded(&obs2_);
663 EXPECT_ACK_TRACKER_STATE(false, false, 0u); // up to date to previous frame.
664
665 // Removing one of them changes nothing. Same for adding back.
666 tracker_->OnObserverRemoved(&obs1_);
667 EXPECT_ACK_TRACKER_STATE(false, false, 0u);
668 tracker_->OnObserverAdded(&obs1_);
669 EXPECT_ACK_TRACKER_STATE(false, false, 0u);
670
671 // When one observer finishes and confirms, nothing changes.
672 obs1_.OnBeginFrame(current_args_);
673 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 1, 1, false));
674 EXPECT_ACK_TRACKER_STATE(false, false, 0u);
675 // When both finish and confirm, the BeginFrame is finished and confirmed.
676 obs2_.OnBeginFrame(current_args_);
677 tracker_->OnObserverFinishedFrame(&obs2_, BeginFrameAck(0, 1, 1, false));
678 EXPECT_ACK_TRACKER_STATE(true, false, 1u);
679
680 // A new BeginFrame is not finished or confirmed.
681 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 2);
682 tracker_->OnBeginFrame(current_args_);
683 EXPECT_ACK_TRACKER_STATE(false, false, 1u);
684
685 // When both observers finish but only one confirms, the BeginFrame is
686 // finished but not confirmed.
687 obs1_.OnBeginFrame(current_args_);
688 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 2, 2, false));
689 EXPECT_ACK_TRACKER_STATE(false, false, 1u);
690 obs2_.OnBeginFrame(current_args_);
691 tracker_->OnObserverFinishedFrame(&obs2_, BeginFrameAck(0, 2, 1, false));
692 EXPECT_ACK_TRACKER_STATE(true, false, 1u);
693
694 // With reversed confirmations in the next ACKs, the latest confirmed frame
695 // increases but the latest BeginFrame remains unconfirmed.
696 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 3);
697 tracker_->OnBeginFrame(current_args_);
698 EXPECT_ACK_TRACKER_STATE(false, false, 1u);
699 obs1_.OnBeginFrame(current_args_);
700 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 3, 2, false));
701 EXPECT_ACK_TRACKER_STATE(false, false, 1u);
702 obs2_.OnBeginFrame(current_args_);
703 tracker_->OnObserverFinishedFrame(&obs2_, BeginFrameAck(0, 3, 3, false));
704 EXPECT_ACK_TRACKER_STATE(true, false, 2u);
705
706 // Only a single ACK with damage suffices.
707 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 4);
708 tracker_->OnBeginFrame(current_args_);
709 EXPECT_ACK_TRACKER_STATE(false, false, 2u);
710 obs1_.OnBeginFrame(current_args_);
711 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 4, 4, true));
712 EXPECT_ACK_TRACKER_STATE(false, true, 3u);
713 obs2_.OnBeginFrame(current_args_);
714 tracker_->OnObserverFinishedFrame(&obs2_, BeginFrameAck(0, 4, 4, false));
715 EXPECT_ACK_TRACKER_STATE(true, true, 4u);
716
717 // Removing the damaging observer makes no difference in this case.
718 tracker_->OnObserverRemoved(&obs1_);
719 EXPECT_ACK_TRACKER_STATE(true, true, 4u);
720
721 // Adding the observer back considers it up to date up to the current
722 // BeginFrame, because it is the last used one. Thus, the current BeginFrame
723 // is still finished, too.
724 tracker_->OnObserverAdded(&obs1_);
725 EXPECT_ACK_TRACKER_STATE(true, true, 4u);
726
727 // Adding the observer back after the next BeginFrame considers it up to date
728 // up to last BeginFrame only.
729 tracker_->OnObserverRemoved(&obs1_);
730 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 5);
731 tracker_->OnBeginFrame(current_args_);
732 tracker_->OnObserverAdded(&obs1_);
733 EXPECT_ACK_TRACKER_STATE(false, false, 4u);
734 // Both observers need to finish for the BeginFrame to be finished.
735 obs1_.OnBeginFrame(current_args_);
736 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 5, 5, false));
737 EXPECT_ACK_TRACKER_STATE(false, false, 4u);
738 obs2_.OnBeginFrame(current_args_);
739 tracker_->OnObserverFinishedFrame(&obs2_, BeginFrameAck(0, 5, 5, false));
740 EXPECT_ACK_TRACKER_STATE(true, false, 5u);
741 }
742
743 TEST_F(BeginFrameObserverAckTrackerTest, ChangingSourceIdOnBeginFrame) {
744 // Check initial state.
745 EXPECT_ACK_TRACKER_STATE(true, false, 1u);
746
747 // Changing source id without observer updates confirmed BeginFrame.
748 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 1, 10);
749 tracker_->OnBeginFrame(current_args_);
750 EXPECT_ACK_TRACKER_STATE(true, false, 10u);
751
752 // Setup an observer for current BeginFrame.
753 tracker_->OnObserverAdded(&obs1_);
754 EXPECT_ACK_TRACKER_STATE(false, false, 9u); // up to date to previous frame.
755 obs1_.OnBeginFrame(current_args_);
756 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(1, 10, 10, true));
757 EXPECT_ACK_TRACKER_STATE(true, true, 10u);
758
759 // Changing source id with an observer sets confirmed BeginFrame to invalid.
760 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 2, 20);
761 tracker_->OnBeginFrame(current_args_);
762 EXPECT_ACK_TRACKER_STATE(false, false, BeginFrameArgs::kInvalidFrameNumber);
763 }
764
765 // ExternalBeginFrameSource testing -------------------------------------------- 553 // ExternalBeginFrameSource testing --------------------------------------------
766 class MockExternalBeginFrameSourceClient 554 class MockExternalBeginFrameSourceClient
767 : public ExternalBeginFrameSourceClient { 555 : public ExternalBeginFrameSourceClient {
768 public: 556 public:
769 MOCK_METHOD1(OnNeedsBeginFrames, void(bool)); 557 MOCK_METHOD1(OnNeedsBeginFrames, void(bool));
770 MOCK_METHOD1(OnDidFinishFrame, void(const BeginFrameAck&));
771 }; 558 };
772 559
773 class ExternalBeginFrameSourceTest : public ::testing::Test { 560 class ExternalBeginFrameSourceTest : public ::testing::Test {
774 public: 561 public:
775 std::unique_ptr<MockExternalBeginFrameSourceClient> client_; 562 std::unique_ptr<MockExternalBeginFrameSourceClient> client_;
776 std::unique_ptr<ExternalBeginFrameSource> source_; 563 std::unique_ptr<ExternalBeginFrameSource> source_;
777 std::unique_ptr<MockBeginFrameObserver> obs_; 564 std::unique_ptr<MockBeginFrameObserver> obs_;
778 565
779 void SetUp() override { 566 void SetUp() override {
780 client_.reset(new MockExternalBeginFrameSourceClient); 567 client_.reset(new MockExternalBeginFrameSourceClient);
781 source_.reset(new ExternalBeginFrameSource(client_.get())); 568 source_.reset(new ExternalBeginFrameSource(client_.get()));
782 obs_.reset(new MockBeginFrameObserver); 569 obs_.reset(new MockBeginFrameObserver);
783 } 570 }
784 571
785 void TearDown() override { 572 void TearDown() override {
786 client_.reset(); 573 client_.reset();
787 obs_.reset(); 574 obs_.reset();
788 } 575 }
789 }; 576 };
790 577
791 TEST_F(ExternalBeginFrameSourceTest, CallsOnDidFinishFrameWithoutObservers) {
792 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 2, 2, false)))
793 .Times(1);
794 source_->OnBeginFrame(CreateBeginFrameArgsForTesting(
795 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000)));
796 }
797
798 TEST_F(ExternalBeginFrameSourceTest,
799 CallsOnDidFinishFrameWhenObserverFinishes) {
800 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
801 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1);
802 source_->AddObserver(obs_.get());
803
804 BeginFrameArgs args = CreateBeginFrameArgsForTesting(
805 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000));
806 EXPECT_BEGIN_FRAME_ARGS_USED(*obs_, args);
807 source_->OnBeginFrame(args);
808
809 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 2, 2, true)))
810 .Times(1);
811 source_->DidFinishFrame(obs_.get(), BeginFrameAck(0, 2, 2, true));
812
813 args = CreateBeginFrameArgsForTesting(
814 BEGINFRAME_FROM_HERE, 0, 3, base::TimeTicks::FromInternalValue(20000));
815 EXPECT_BEGIN_FRAME_ARGS_USED(*obs_, args);
816 source_->OnBeginFrame(args);
817
818 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 3, 2, false)))
819 .Times(1);
820 source_->DidFinishFrame(obs_.get(), BeginFrameAck(0, 3, 2, false));
821 }
822
823 TEST_F(ExternalBeginFrameSourceTest,
824 CallsOnDidFinishFrameWhenObserverDropsBeginFrame) {
825 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
826 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1);
827 source_->AddObserver(obs_.get());
828
829 BeginFrameArgs args = CreateBeginFrameArgsForTesting(
830 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000));
831 EXPECT_BEGIN_FRAME_ARGS_DROP(*obs_, args);
832 source_->OnBeginFrame(args);
833 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 2, 0, false)))
834 .Times(1);
835 source_->DidFinishFrame(obs_.get(), BeginFrameAck(0, 2, 0, false));
836 }
837
838 TEST_F(ExternalBeginFrameSourceTest, CallsOnDidFinishFrameWhenObserverRemoved) {
839 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
840 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1);
841 source_->AddObserver(obs_.get());
842
843 BeginFrameArgs args = CreateBeginFrameArgsForTesting(
844 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000));
845 EXPECT_BEGIN_FRAME_ARGS_USED(*obs_, args);
846 source_->OnBeginFrame(args);
847
848 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 2, 2, false)))
849 .Times(1);
850 EXPECT_CALL((*client_), OnNeedsBeginFrames(false)).Times(1);
851 source_->RemoveObserver(obs_.get());
852 }
853
854 // https://crbug.com/690127: Duplicate BeginFrame caused DCHECK crash. 578 // https://crbug.com/690127: Duplicate BeginFrame caused DCHECK crash.
855 TEST_F(ExternalBeginFrameSourceTest, OnBeginFrameChecksBeginFrameContinuity) { 579 TEST_F(ExternalBeginFrameSourceTest, OnBeginFrameChecksBeginFrameContinuity) {
856 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 580 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
857 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1); 581 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1);
858 source_->AddObserver(obs_.get()); 582 source_->AddObserver(obs_.get());
859 583
860 BeginFrameArgs args = CreateBeginFrameArgsForTesting( 584 BeginFrameArgs args = CreateBeginFrameArgsForTesting(
861 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000)); 585 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000));
862 EXPECT_BEGIN_FRAME_ARGS_USED(*obs_, args); 586 EXPECT_BEGIN_FRAME_ARGS_USED(*obs_, args);
863 source_->OnBeginFrame(args); 587 source_->OnBeginFrame(args);
864 588
865 // Providing same args again to OnBeginFrame() should not notify observer. 589 // Providing same args again to OnBeginFrame() should not notify observer.
866 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 2, 0, false)))
867 .Times(1);
868 source_->OnBeginFrame(args); 590 source_->OnBeginFrame(args);
869 591
870 // Providing same args through a different ExternalBeginFrameSource also does 592 // Providing same args through a different ExternalBeginFrameSource also does
871 // not notify observer. 593 // not notify observer.
872 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 594 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
873 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1); 595 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1);
874 ExternalBeginFrameSource source2(client_.get()); 596 ExternalBeginFrameSource source2(client_.get());
875 source2.AddObserver(obs_.get()); 597 source2.AddObserver(obs_.get());
876 source2.OnBeginFrame(args); 598 source2.OnBeginFrame(args);
877 } 599 }
878 600
879 } // namespace 601 } // namespace
880 } // namespace cc 602 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698