Index: cc/scheduler/begin_frame_source_unittest.cc |
diff --git a/cc/scheduler/begin_frame_source_unittest.cc b/cc/scheduler/begin_frame_source_unittest.cc |
deleted file mode 100644 |
index 22126bead4504af443d585740c491a68710833a9..0000000000000000000000000000000000000000 |
--- a/cc/scheduler/begin_frame_source_unittest.cc |
+++ /dev/null |
@@ -1,775 +0,0 @@ |
-// Copyright 2011 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include <deque> |
-#include <string> |
- |
-#include "base/basictypes.h" |
-#include "base/gtest_prod_util.h" |
-#include "base/test/test_simple_task_runner.h" |
-#include "cc/scheduler/begin_frame_source.h" |
-#include "cc/test/begin_frame_args_test.h" |
-#include "cc/test/scheduler_test_common.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-// Macros to help set up expected calls on the MockBeginFrameObserver. |
-#define EXPECT_BEGIN_FRAME_DROP(obs, frame_time, deadline, interval) \ |
- { \ |
- ::testing::Expectation exp = \ |
- EXPECT_CALL((obs), OnBeginFrame(CreateBeginFrameArgsForTesting( \ |
- BEGINFRAME_FROM_HERE, frame_time, deadline, \ |
- interval))).InSequence((obs).sequence); \ |
- } |
- |
-#define EXPECT_BEGIN_FRAME_USED(obs, frame_time, deadline, interval) \ |
- { \ |
- BeginFrameArgs args = CreateBeginFrameArgsForTesting( \ |
- BEGINFRAME_FROM_HERE, frame_time, deadline, interval); \ |
- ::testing::Expectation exp = \ |
- EXPECT_CALL((obs), OnBeginFrame(args)).InSequence((obs).sequence); \ |
- EXPECT_CALL((obs), LastUsedBeginFrameArgs()) \ |
- .Times(::testing::AnyNumber()) \ |
- .After(exp) \ |
- .WillRepeatedly(::testing::Return(args)); \ |
- } |
- |
-// Macros to send BeginFrameArgs on a FakeBeginFrameSink (and verify resulting |
-// observer behaviour). |
-#define SEND_BEGIN_FRAME(args_equal_to, source, frame_time, deadline, \ |
- interval) \ |
- { \ |
- BeginFrameArgs old_args = (source).TestLastUsedBeginFrameArgs(); \ |
- BeginFrameArgs new_args = CreateBeginFrameArgsForTesting( \ |
- BEGINFRAME_FROM_HERE, frame_time, deadline, interval); \ |
- ASSERT_FALSE(old_args == new_args); \ |
- (source).TestOnBeginFrame(new_args); \ |
- EXPECT_EQ(args_equal_to, (source).TestLastUsedBeginFrameArgs()); \ |
- } |
- |
-// When dropping LastUsedBeginFrameArgs **shouldn't** change. |
-#define SEND_BEGIN_FRAME_DROP(source, frame_time, deadline, interval) \ |
- SEND_BEGIN_FRAME(old_args, source, frame_time, deadline, interval); |
- |
-// When used LastUsedBeginFrameArgs **should** be updated. |
-#define SEND_BEGIN_FRAME_USED(source, frame_time, deadline, interval) \ |
- SEND_BEGIN_FRAME(new_args, source, frame_time, deadline, interval); |
- |
-namespace cc { |
-namespace { |
- |
-class MockBeginFrameObserver : public BeginFrameObserver { |
- public: |
- MOCK_METHOD1(OnBeginFrame, void(const BeginFrameArgs&)); |
- MOCK_CONST_METHOD0(LastUsedBeginFrameArgs, const BeginFrameArgs()); |
- |
- virtual void AsValueInto(base::trace_event::TracedValue* dict) const { |
- dict->SetString("type", "MockBeginFrameObserver"); |
- dict->BeginDictionary("last_begin_frame_args"); |
- LastUsedBeginFrameArgs().AsValueInto(dict); |
- dict->EndDictionary(); |
- } |
- |
- // A value different from the normal default returned by a BeginFrameObserver |
- // so it is easiable traced back here. |
- static const BeginFrameArgs kDefaultBeginFrameArgs; |
- |
- MockBeginFrameObserver() { |
- // Set a "default" value returned by LastUsedBeginFrameArgs so that gMock |
- // doesn't fail an assert and instead returns useful information. |
- EXPECT_CALL(*this, LastUsedBeginFrameArgs()) |
- .Times(::testing::AnyNumber()) |
- .InSequence(sequence) |
- .WillRepeatedly(::testing::Return(kDefaultBeginFrameArgs)); |
- } |
- virtual ~MockBeginFrameObserver() {} |
- |
- ::testing::Sequence sequence; |
-}; |
- |
-TEST(MockBeginFrameObserverTest, ExpectOnBeginFrame) { |
- ::testing::NiceMock<MockBeginFrameObserver> obs; |
- EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); |
- EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300); |
- EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); |
- |
- EXPECT_EQ(obs.LastUsedBeginFrameArgs(), |
- MockBeginFrameObserver::kDefaultBeginFrameArgs); |
- |
- obs.OnBeginFrame(CreateBeginFrameArgsForTesting( |
- BEGINFRAME_FROM_HERE, 100, 200, |
- 300)); // One call to LastUsedBeginFrameArgs |
- EXPECT_EQ( |
- obs.LastUsedBeginFrameArgs(), |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300)); |
- |
- obs.OnBeginFrame(CreateBeginFrameArgsForTesting( |
- BEGINFRAME_FROM_HERE, 400, 600, |
- 300)); // Multiple calls to LastUsedBeginFrameArgs |
- EXPECT_EQ( |
- obs.LastUsedBeginFrameArgs(), |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 400, 600, 300)); |
- EXPECT_EQ( |
- obs.LastUsedBeginFrameArgs(), |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 400, 600, 300)); |
- |
- obs.OnBeginFrame(CreateBeginFrameArgsForTesting( |
- BEGINFRAME_FROM_HERE, 700, 900, |
- 300)); // No calls to LastUsedBeginFrameArgs |
-} |
- |
-TEST(MockBeginFrameObserverTest, ExpectOnBeginFrameStatus) { |
- ::testing::NiceMock<MockBeginFrameObserver> obs; |
- EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); |
- EXPECT_BEGIN_FRAME_DROP(obs, 400, 600, 300); |
- EXPECT_BEGIN_FRAME_DROP(obs, 450, 650, 300); |
- EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); |
- |
- EXPECT_EQ(obs.LastUsedBeginFrameArgs(), |
- MockBeginFrameObserver::kDefaultBeginFrameArgs); |
- |
- // Used |
- obs.OnBeginFrame( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300)); |
- EXPECT_EQ( |
- obs.LastUsedBeginFrameArgs(), |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300)); |
- |
- // Dropped |
- obs.OnBeginFrame( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 400, 600, 300)); |
- EXPECT_EQ( |
- obs.LastUsedBeginFrameArgs(), |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300)); |
- |
- // Dropped |
- obs.OnBeginFrame( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 450, 650, 300)); |
- EXPECT_EQ( |
- obs.LastUsedBeginFrameArgs(), |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300)); |
- |
- // Used |
- obs.OnBeginFrame( |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 700, 900, 300)); |
- EXPECT_EQ( |
- obs.LastUsedBeginFrameArgs(), |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 700, 900, 300)); |
-} |
- |
-const BeginFrameArgs MockBeginFrameObserver::kDefaultBeginFrameArgs = |
- CreateBeginFrameArgsForTesting( |
-#ifdef NDEBUG |
- nullptr, |
-#else |
- FROM_HERE_WITH_EXPLICIT_FUNCTION( |
- "MockBeginFrameObserver::kDefaultBeginFrameArgs"), |
-#endif |
- -1, |
- -1, |
- -1); |
- |
-// BeginFrameObserverMixIn testing --------------------------------------- |
-class MockMinimalBeginFrameObserverMixIn : public BeginFrameObserverMixIn { |
- public: |
- MOCK_METHOD1(OnBeginFrameMixInDelegate, bool(const BeginFrameArgs&)); |
- int64_t dropped_begin_frame_args() const { return dropped_begin_frame_args_; } |
-}; |
- |
-TEST(BeginFrameObserverMixInTest, OnBeginFrameImplementation) { |
- using ::testing::Return; |
- MockMinimalBeginFrameObserverMixIn obs; |
- ::testing::InSequence ordered; // These calls should be ordered |
- |
- // Initial conditions |
- EXPECT_EQ(BeginFrameArgs(), obs.LastUsedBeginFrameArgs()); |
- EXPECT_EQ(0, obs.dropped_begin_frame_args()); |
- |
-#ifndef NDEBUG |
- EXPECT_DEATH({ obs.OnBeginFrame(BeginFrameArgs()); }, ""); |
-#endif |
- |
- BeginFrameArgs args1 = |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300); |
- EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args1)).WillOnce(Return(true)); |
- obs.OnBeginFrame(args1); |
- EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs()); |
- EXPECT_EQ(0, obs.dropped_begin_frame_args()); |
- |
-#ifndef NDEBUG |
- EXPECT_DEATH({ |
- obs.OnBeginFrame(CreateBeginFrameArgsForTesting( |
- BEGINFRAME_FROM_HERE, 50, 200, 300)); |
- }, |
- ""); |
-#endif |
- |
- // Returning false shouldn't update the LastUsedBeginFrameArgs value. |
- BeginFrameArgs args2 = |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 200, 300, 400); |
- EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args2)).WillOnce(Return(false)); |
- obs.OnBeginFrame(args2); |
- EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs()); |
- EXPECT_EQ(1, obs.dropped_begin_frame_args()); |
- |
- BeginFrameArgs args3 = |
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 150, 300, 400); |
- EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args3)).WillOnce(Return(true)); |
- obs.OnBeginFrame(args3); |
- EXPECT_EQ(args3, obs.LastUsedBeginFrameArgs()); |
- EXPECT_EQ(1, obs.dropped_begin_frame_args()); |
-} |
- |
-// BeginFrameSource testing ---------------------------------------------- |
-TEST(BeginFrameSourceMixInTest, ObserverManipulation) { |
- MockBeginFrameObserver obs; |
- MockBeginFrameObserver otherObs; |
- FakeBeginFrameSource source; |
- |
- source.AddObserver(&obs); |
- EXPECT_EQ(&obs, source.GetObserver()); |
- |
-#ifndef NDEBUG |
- // Adding an observer when an observer already exists should DCHECK fail. |
- EXPECT_DEATH({ source.AddObserver(&otherObs); }, ""); |
- |
- // Removing wrong observer should DCHECK fail. |
- EXPECT_DEATH({ source.RemoveObserver(&otherObs); }, ""); |
- |
- // Removing an observer when there is no observer should DCHECK fail. |
- EXPECT_DEATH({ |
- source.RemoveObserver(&obs); |
- source.RemoveObserver(&obs); |
- }, |
- ""); |
-#endif |
- source.RemoveObserver(&obs); |
- |
- source.AddObserver(&otherObs); |
- EXPECT_EQ(&otherObs, source.GetObserver()); |
- source.RemoveObserver(&otherObs); |
-} |
- |
-TEST(BeginFrameSourceMixInTest, Observer) { |
- FakeBeginFrameSource source; |
- MockBeginFrameObserver obs; |
- source.AddObserver(&obs); |
- EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); |
- EXPECT_BEGIN_FRAME_DROP(obs, 400, 600, 300); |
- EXPECT_BEGIN_FRAME_DROP(obs, 450, 650, 300); |
- EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); |
- |
- SEND_BEGIN_FRAME_USED(source, 100, 200, 300); |
- SEND_BEGIN_FRAME_DROP(source, 400, 600, 300); |
- SEND_BEGIN_FRAME_DROP(source, 450, 650, 300); |
- SEND_BEGIN_FRAME_USED(source, 700, 900, 300); |
-} |
- |
-TEST(BeginFrameSourceMixInTest, NoObserver) { |
- FakeBeginFrameSource source; |
- SEND_BEGIN_FRAME_DROP(source, 100, 200, 300); |
-} |
- |
-TEST(BeginFrameSourceMixInTest, NeedsBeginFrames) { |
- FakeBeginFrameSource source; |
- EXPECT_FALSE(source.NeedsBeginFrames()); |
- source.SetNeedsBeginFrames(true); |
- EXPECT_TRUE(source.NeedsBeginFrames()); |
- source.SetNeedsBeginFrames(false); |
- EXPECT_FALSE(source.NeedsBeginFrames()); |
-} |
- |
-class LoopingBeginFrameObserver : public BeginFrameObserverMixIn { |
- public: |
- BeginFrameSource* source_; |
- |
- void AsValueInto(base::trace_event::TracedValue* dict) const override { |
- dict->SetString("type", "LoopingBeginFrameObserver"); |
- dict->BeginDictionary("source"); |
- source_->AsValueInto(dict); |
- dict->EndDictionary(); |
- } |
- |
- protected: |
- // BeginFrameObserverMixIn |
- bool OnBeginFrameMixInDelegate(const BeginFrameArgs& args) override { |
- return true; |
- } |
-}; |
- |
-TEST(BeginFrameSourceMixInTest, DetectAsValueIntoLoop) { |
- LoopingBeginFrameObserver obs; |
- FakeBeginFrameSource source; |
- |
- obs.source_ = &source; |
- source.AddObserver(&obs); |
- |
- scoped_refptr<base::trace_event::TracedValue> state = |
- new base::trace_event::TracedValue(); |
- source.AsValueInto(state.get()); |
-} |
- |
-// BackToBackBeginFrameSource testing ----------------------------------------- |
-class TestBackToBackBeginFrameSource : public BackToBackBeginFrameSource { |
- public: |
- static scoped_ptr<TestBackToBackBeginFrameSource> Create( |
- scoped_refptr<TestNowSource> now_src, |
- base::SingleThreadTaskRunner* task_runner) { |
- return make_scoped_ptr( |
- new TestBackToBackBeginFrameSource(now_src, task_runner)); |
- } |
- |
- protected: |
- TestBackToBackBeginFrameSource(scoped_refptr<TestNowSource> now_src, |
- base::SingleThreadTaskRunner* task_runner) |
- : BackToBackBeginFrameSource(task_runner), now_src_(now_src) {} |
- |
- base::TimeTicks Now() override { return now_src_->Now(); } |
- |
- scoped_refptr<TestNowSource> now_src_; |
-}; |
- |
-class BackToBackBeginFrameSourceTest : public ::testing::Test { |
- public: |
- static const int64_t kDeadline; |
- static const int64_t kInterval; |
- |
- scoped_refptr<TestNowSource> now_src_; |
- scoped_refptr<OrderedSimpleTaskRunner> task_runner_; |
- scoped_ptr<TestBackToBackBeginFrameSource> source_; |
- scoped_ptr<MockBeginFrameObserver> obs_; |
- |
- void SetUp() override { |
- now_src_ = TestNowSource::Create(1000); |
- task_runner_ = |
- make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_, false)); |
- task_runner_->SetRunTaskLimit(1); |
- source_ = |
- TestBackToBackBeginFrameSource::Create(now_src_, task_runner_.get()); |
- obs_ = make_scoped_ptr(new ::testing::StrictMock<MockBeginFrameObserver>()); |
- source_->AddObserver(obs_.get()); |
- } |
- |
- void TearDown() override { obs_.reset(); } |
-}; |
- |
-const int64_t BackToBackBeginFrameSourceTest::kDeadline = |
- BeginFrameArgs::DefaultInterval().ToInternalValue(); |
- |
-const int64_t BackToBackBeginFrameSourceTest::kInterval = |
- BeginFrameArgs::DefaultInterval().ToInternalValue(); |
- |
-TEST_F(BackToBackBeginFrameSourceTest, SetNeedsBeginFramesSendsBeginFrame) { |
- EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); |
- source_->SetNeedsBeginFrames(true); |
- EXPECT_TRUE(task_runner_->HasPendingTasks()); |
- task_runner_->RunUntilIdle(); |
- |
- EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval); |
- now_src_->AdvanceNowMicroseconds(100); |
- source_->DidFinishFrame(0); |
- task_runner_->RunUntilIdle(); |
-} |
- |
-TEST_F(BackToBackBeginFrameSourceTest, |
- DidFinishFrameThenSetNeedsBeginFramesProducesNoFrame) { |
- EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); |
- source_->SetNeedsBeginFrames(true); |
- task_runner_->RunUntilIdle(); |
- |
- source_->SetNeedsBeginFrames(false); |
- source_->DidFinishFrame(0); |
- |
- EXPECT_FALSE(task_runner_->HasPendingTasks()); |
-} |
- |
-TEST_F(BackToBackBeginFrameSourceTest, |
- SetNeedsBeginFramesThenDidFinishFrameProducesNoFrame) { |
- EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); |
- source_->SetNeedsBeginFrames(true); |
- task_runner_->RunUntilIdle(); |
- |
- now_src_->AdvanceNowMicroseconds(100); |
- source_->DidFinishFrame(0); |
- source_->SetNeedsBeginFrames(false); |
- |
- EXPECT_TRUE(task_runner_->HasPendingTasks()); |
- task_runner_->RunUntilIdle(); |
-} |
- |
-TEST_F(BackToBackBeginFrameSourceTest, |
- DidFinishFrameThenTogglingSetNeedsBeginFramesProducesCorrectFrame) { |
- EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); |
- source_->SetNeedsBeginFrames(true); |
- task_runner_->RunUntilIdle(); |
- |
- now_src_->AdvanceNowMicroseconds(100); |
- |
- source_->SetNeedsBeginFrames(false); |
- now_src_->AdvanceNowMicroseconds(10); |
- source_->DidFinishFrame(0); |
- now_src_->AdvanceNowMicroseconds(10); |
- source_->SetNeedsBeginFrames(false); |
- now_src_->AdvanceNowMicroseconds(10); |
- source_->SetNeedsBeginFrames(true); |
- |
- EXPECT_BEGIN_FRAME_USED(*obs_, 1130, 1130 + kDeadline, kInterval); |
- EXPECT_TRUE(task_runner_->HasPendingTasks()); |
- task_runner_->RunUntilIdle(); |
-} |
- |
-TEST_F(BackToBackBeginFrameSourceTest, |
- TogglingSetNeedsBeginFramesThenDidFinishFrameProducesCorrectFrame) { |
- EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); |
- source_->SetNeedsBeginFrames(true); |
- task_runner_->RunUntilIdle(); |
- |
- now_src_->AdvanceNowMicroseconds(100); |
- source_->DidFinishFrame(0); |
- now_src_->AdvanceNowMicroseconds(10); |
- source_->SetNeedsBeginFrames(false); |
- now_src_->AdvanceNowMicroseconds(10); |
- source_->SetNeedsBeginFrames(true); |
- now_src_->AdvanceNowMicroseconds(10); |
- |
- EXPECT_BEGIN_FRAME_USED(*obs_, 1130, 1130 + kDeadline, kInterval); |
- EXPECT_TRUE(task_runner_->HasPendingTasks()); |
- task_runner_->RunUntilIdle(); |
-} |
- |
-TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameNeedsBeginFrameFalse) { |
- source_->SetNeedsBeginFrames(false); |
- source_->DidFinishFrame(0); |
- EXPECT_FALSE(task_runner_->RunPendingTasks()); |
-} |
- |
-TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameRemainingFrames) { |
- EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); |
- source_->SetNeedsBeginFrames(true); |
- task_runner_->RunUntilIdle(); |
- |
- now_src_->AdvanceNowMicroseconds(100); |
- |
- source_->DidFinishFrame(3); |
- EXPECT_FALSE(task_runner_->HasPendingTasks()); |
- source_->DidFinishFrame(2); |
- EXPECT_FALSE(task_runner_->HasPendingTasks()); |
- source_->DidFinishFrame(1); |
- EXPECT_FALSE(task_runner_->HasPendingTasks()); |
- |
- EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval); |
- source_->DidFinishFrame(0); |
- EXPECT_EQ(base::TimeDelta(), task_runner_->DelayToNextTaskTime()); |
- task_runner_->RunUntilIdle(); |
-} |
- |
-TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameMultipleCallsIdempotent) { |
- source_->SetNeedsBeginFrames(true); |
- EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); |
- task_runner_->RunUntilIdle(); |
- |
- now_src_->AdvanceNowMicroseconds(100); |
- source_->DidFinishFrame(0); |
- source_->DidFinishFrame(0); |
- source_->DidFinishFrame(0); |
- EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval); |
- task_runner_->RunUntilIdle(); |
- |
- now_src_->AdvanceNowMicroseconds(100); |
- source_->DidFinishFrame(0); |
- source_->DidFinishFrame(0); |
- source_->DidFinishFrame(0); |
- EXPECT_BEGIN_FRAME_USED(*obs_, 1200, 1200 + kDeadline, kInterval); |
- task_runner_->RunUntilIdle(); |
-} |
- |
-TEST_F(BackToBackBeginFrameSourceTest, DelayInPostedTaskProducesCorrectFrame) { |
- EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); |
- source_->SetNeedsBeginFrames(true); |
- task_runner_->RunUntilIdle(); |
- |
- now_src_->AdvanceNowMicroseconds(100); |
- source_->DidFinishFrame(0); |
- now_src_->AdvanceNowMicroseconds(50); |
- EXPECT_BEGIN_FRAME_USED(*obs_, 1150, 1150 + kDeadline, kInterval); |
- |
- EXPECT_TRUE(task_runner_->HasPendingTasks()); |
- task_runner_->RunUntilIdle(); |
-} |
- |
-// SyntheticBeginFrameSource testing ------------------------------------------ |
-class SyntheticBeginFrameSourceTest : public ::testing::Test { |
- public: |
- scoped_refptr<TestNowSource> now_src_; |
- scoped_refptr<OrderedSimpleTaskRunner> task_runner_; |
- scoped_ptr<TestSyntheticBeginFrameSource> source_; |
- scoped_ptr<MockBeginFrameObserver> obs_; |
- |
- void SetUp() override { |
- now_src_ = TestNowSource::Create(1000); |
- task_runner_ = |
- make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_, false)); |
- source_ = TestSyntheticBeginFrameSource::Create( |
- now_src_, task_runner_.get(), base::TimeDelta::FromMicroseconds(10000)); |
- obs_ = make_scoped_ptr(new MockBeginFrameObserver()); |
- source_->AddObserver(obs_.get()); |
- } |
- |
- void TearDown() override { obs_.reset(); } |
-}; |
- |
-TEST_F(SyntheticBeginFrameSourceTest, |
- SetNeedsBeginFramesCallsOnBeginFrameWithMissedTick) { |
- now_src_->SetNowMicroseconds(10010); |
- EXPECT_CALL((*obs_), OnBeginFrame(CreateBeginFrameArgsForTesting( |
- BEGINFRAME_FROM_HERE, 10000, 20000, 10000, |
- BeginFrameArgs::MISSED))); |
- source_->SetNeedsBeginFrames(true); // Should cause the last tick to be sent |
- // No tasks should need to be run for this to occur. |
-} |
- |
-TEST_F(SyntheticBeginFrameSourceTest, |
- SetNeedsBeginFramesCallsCausesOnBeginFrame) { |
- source_->SetNeedsBeginFrames(true); |
- EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue()); |
- |
- EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); |
- now_src_->SetNowMicroseconds(10010); |
- task_runner_->RunPendingTasks(); |
-} |
- |
-TEST_F(SyntheticBeginFrameSourceTest, BasicOperation) { |
- task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
- |
- source_->SetNeedsBeginFrames(true); |
- EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); |
- EXPECT_BEGIN_FRAME_USED(*obs_, 20000, 30000, 10000); |
- EXPECT_BEGIN_FRAME_USED(*obs_, 30000, 40000, 10000); |
- task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001)); |
- |
- source_->SetNeedsBeginFrames(false); |
- // No new frames.... |
- task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000)); |
-} |
- |
-TEST_F(SyntheticBeginFrameSourceTest, VSyncChanges) { |
- task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
- source_->SetNeedsBeginFrames(true); |
- |
- EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); |
- EXPECT_BEGIN_FRAME_USED(*obs_, 20000, 30000, 10000); |
- EXPECT_BEGIN_FRAME_USED(*obs_, 30000, 40000, 10000); |
- task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001)); |
- |
- // Update the vsync information |
- source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(27500), |
- base::TimeDelta::FromMicroseconds(10001)); |
- |
- EXPECT_BEGIN_FRAME_USED(*obs_, 40000, 47502, 10001); |
- EXPECT_BEGIN_FRAME_USED(*obs_, 47502, 57503, 10001); |
- EXPECT_BEGIN_FRAME_USED(*obs_, 57503, 67504, 10001); |
- task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000)); |
-} |
- |
-// BeginFrameSourceMultiplexer testing ----------------------------------- |
-class BeginFrameSourceMultiplexerTest : public ::testing::Test { |
- protected: |
- void SetUp() override { |
- mux_ = BeginFrameSourceMultiplexer::Create(); |
- |
- source1_store_ = make_scoped_ptr(new FakeBeginFrameSource()); |
- source2_store_ = make_scoped_ptr(new FakeBeginFrameSource()); |
- source3_store_ = make_scoped_ptr(new FakeBeginFrameSource()); |
- |
- source1_ = source1_store_.get(); |
- source2_ = source2_store_.get(); |
- source3_ = source3_store_.get(); |
- } |
- |
- void TearDown() override { |
- // Make sure the mux is torn down before the sources. |
- mux_.reset(); |
- } |
- |
- scoped_ptr<BeginFrameSourceMultiplexer> mux_; |
- FakeBeginFrameSource* source1_; |
- FakeBeginFrameSource* source2_; |
- FakeBeginFrameSource* source3_; |
- |
- private: |
- scoped_ptr<FakeBeginFrameSource> source1_store_; |
- scoped_ptr<FakeBeginFrameSource> source2_store_; |
- scoped_ptr<FakeBeginFrameSource> source3_store_; |
-}; |
- |
-TEST_F(BeginFrameSourceMultiplexerTest, SourcesManipulation) { |
- EXPECT_EQ(NULL, mux_->ActiveSource()); |
- |
- mux_->AddSource(source1_); |
- EXPECT_EQ(source1_, mux_->ActiveSource()); |
- |
- mux_->SetActiveSource(NULL); |
- EXPECT_EQ(NULL, mux_->ActiveSource()); |
- |
- mux_->SetActiveSource(source1_); |
- |
-#ifndef NDEBUG |
- // Setting a source which isn't in the mux as active should DCHECK fail. |
- EXPECT_DEATH({ mux_->SetActiveSource(source2_); }, ""); |
- |
- // Adding a source which is already added should DCHECK fail. |
- EXPECT_DEATH({ mux_->AddSource(source1_); }, ""); |
- |
- // Removing a source which isn't in the mux should DCHECK fail. |
- EXPECT_DEATH({ mux_->RemoveSource(source2_); }, ""); |
- |
- // Removing the active source fails |
- EXPECT_DEATH({ mux_->RemoveSource(source1_); }, ""); |
-#endif |
- |
- // Test manipulation doesn't segfault. |
- mux_->AddSource(source2_); |
- mux_->RemoveSource(source2_); |
- |
- mux_->AddSource(source2_); |
- mux_->SetActiveSource(source2_); |
- EXPECT_EQ(source2_, mux_->ActiveSource()); |
- |
- mux_->RemoveSource(source1_); |
-} |
- |
-TEST_F(BeginFrameSourceMultiplexerTest, NeedsBeginFrames) { |
- mux_->AddSource(source1_); |
- mux_->AddSource(source2_); |
- mux_->SetActiveSource(source1_); |
- EXPECT_EQ(source1_->NeedsBeginFrames(), false); |
- EXPECT_EQ(source2_->NeedsBeginFrames(), false); |
- |
- // Check SetNeedsFrames works |
- mux_->SetNeedsBeginFrames(true); |
- EXPECT_EQ(source1_->NeedsBeginFrames(), true); |
- EXPECT_EQ(source2_->NeedsBeginFrames(), false); |
- |
- mux_->SetNeedsBeginFrames(false); |
- EXPECT_EQ(source1_->NeedsBeginFrames(), false); |
- EXPECT_EQ(source2_->NeedsBeginFrames(), false); |
- |
- // Checking that switching the source makes SetNeedsFrames on the |
- // subsources correctly. |
- mux_->SetNeedsBeginFrames(true); |
- |
- mux_->SetActiveSource(source1_); |
- EXPECT_EQ(source1_->NeedsBeginFrames(), true); |
- EXPECT_EQ(source2_->NeedsBeginFrames(), false); |
- |
- mux_->SetActiveSource(source2_); |
- EXPECT_EQ(source1_->NeedsBeginFrames(), false); |
- EXPECT_EQ(source2_->NeedsBeginFrames(), true); |
-} |
- |
-TEST_F(BeginFrameSourceMultiplexerTest, BeginFramesSimple) { |
- mux_->AddSource(source1_); |
- mux_->AddSource(source2_); |
- mux_->SetActiveSource(source1_); |
- |
- MockBeginFrameObserver obs; |
- mux_->AddObserver(&obs); |
- EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); |
- EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300); |
- |
- mux_->SetActiveSource(source1_); |
- |
- SEND_BEGIN_FRAME_USED(*source1_, 100, 200, 300); |
- SEND_BEGIN_FRAME_DROP(*source2_, 200, 500, 300); |
- |
- mux_->SetActiveSource(source2_); |
- SEND_BEGIN_FRAME_USED(*source2_, 400, 600, 300); |
- SEND_BEGIN_FRAME_DROP(*source1_, 500, 700, 300); |
-} |
- |
-TEST_F(BeginFrameSourceMultiplexerTest, BeginFramesBackwardsProtection) { |
- mux_->AddSource(source1_); |
- mux_->AddSource(source2_); |
- |
- MockBeginFrameObserver obs; |
- mux_->AddObserver(&obs); |
- EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300); |
- EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); |
- EXPECT_BEGIN_FRAME_USED(obs, 1000, 1200, 300); |
- EXPECT_BEGIN_FRAME_USED(obs, 1001, 1201, 301); |
- |
- mux_->SetActiveSource(source1_); |
- SEND_BEGIN_FRAME_USED(*source1_, 400, 600, 300); |
- SEND_BEGIN_FRAME_USED(*source1_, 700, 900, 300); |
- |
- mux_->SetActiveSource(source2_); |
- SEND_BEGIN_FRAME_DROP(*source2_, 699, 899, 300); |
- SEND_BEGIN_FRAME_USED(*source2_, 1000, 1200, 300); |
- |
- mux_->SetActiveSource(source1_); |
- SEND_BEGIN_FRAME_USED(*source1_, 1001, 1201, 301); |
-} |
- |
-TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalNegativeFails) { |
-#ifndef NDEBUG |
- EXPECT_DEATH( |
- { mux_->SetMinimumInterval(base::TimeDelta::FromInternalValue(-100)); }, |
- ""); |
-#endif |
-} |
- |
-TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalZero) { |
- mux_->SetMinimumInterval(base::TimeDelta()); |
- mux_->AddSource(source1_); |
- |
- MockBeginFrameObserver obs; |
- mux_->AddObserver(&obs); |
- EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); |
- EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300); |
- EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); |
- |
- SEND_BEGIN_FRAME_USED(*source1_, 100, 200, 300); |
- SEND_BEGIN_FRAME_USED(*source1_, 400, 600, 300); |
- SEND_BEGIN_FRAME_USED(*source1_, 700, 900, 300); |
-} |
- |
-TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalBasic) { |
- mux_->SetMinimumInterval(base::TimeDelta::FromInternalValue(600)); |
- mux_->AddSource(source1_); |
- |
- MockBeginFrameObserver obs; |
- mux_->AddObserver(&obs); |
- EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); |
- EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); |
- |
- SEND_BEGIN_FRAME_USED(*source1_, 100, 200, 300); |
- SEND_BEGIN_FRAME_DROP(*source1_, 400, 600, 300); |
- SEND_BEGIN_FRAME_USED(*source1_, 700, 900, 300); |
-} |
- |
-TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalWithMultipleSources) { |
- mux_->SetMinimumInterval(base::TimeDelta::FromMicroseconds(150)); |
- mux_->AddSource(source1_); |
- mux_->AddSource(source2_); |
- |
- MockBeginFrameObserver obs; |
- mux_->AddObserver(&obs); |
- EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300); |
- EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); |
- EXPECT_BEGIN_FRAME_USED(obs, 1050, 1250, 300); |
- |
- mux_->SetActiveSource(source1_); |
- SEND_BEGIN_FRAME_USED(*source1_, 400, 600, 300); |
- SEND_BEGIN_FRAME_USED(*source1_, 700, 900, 300); |
- |
- mux_->SetActiveSource(source2_); |
- SEND_BEGIN_FRAME_DROP(*source2_, 750, 1050, 300); |
- SEND_BEGIN_FRAME_USED(*source2_, 1050, 1250, 300); |
- |
- mux_->SetActiveSource(source1_); |
- SEND_BEGIN_FRAME_DROP(*source2_, 1100, 1400, 300); |
-} |
- |
-} // namespace |
-} // namespace cc |