| 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
|
| index 22126bead4504af443d585740c491a68710833a9..9ee777c9969591e44abe85e1c9d18eea46253d19 100644
|
| --- a/cc/scheduler/begin_frame_source_unittest.cc
|
| +++ b/cc/scheduler/begin_frame_source_unittest.cc
|
| @@ -221,6 +221,176 @@ TEST(BeginFrameObserverMixInTest, OnBeginFrameImplementation) {
|
| EXPECT_EQ(1, obs.dropped_begin_frame_args());
|
| }
|
|
|
| +// BeginFrameObserverMultiplexer testing ---------------------------------
|
| +
|
| +class MockHasObserversCallback {
|
| + public:
|
| + MOCK_METHOD1(Callback, void(bool));
|
| +
|
| + BeginFrameObserverMultiplexer::HasObserversCallback Get() {
|
| + return base::Bind(&MockHasObserversCallback::Callback,
|
| + base::Unretained(this));
|
| + }
|
| +};
|
| +
|
| +TEST(BeginFrameObserverMultiplexerTest, ObserverManipulation) {
|
| + scoped_ptr<BeginFrameObserverMultiplexer> obs =
|
| + BeginFrameObserverMultiplexer::Create();
|
| +
|
| + ::testing::StrictMock<MockMinimalBeginFrameObserverMixIn> obs_child1;
|
| + ::testing::StrictMock<MockMinimalBeginFrameObserverMixIn> obs_child2;
|
| +
|
| + // Initial conditions
|
| + EXPECT_EQ(BeginFrameArgs(), obs->LastUsedBeginFrameArgs());
|
| +
|
| + // Calling without any observers, should be fine
|
| + BeginFrameArgs args1 =
|
| + CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300);
|
| + obs->OnBeginFrame(args1);
|
| + EXPECT_EQ(args1, obs->LastUsedBeginFrameArgs());
|
| +
|
| + // Adding an observer triggers a MISSED frame for that observer if they have
|
| + // never receive the BeginFrameArgs before.
|
| + EXPECT_CALL(obs_child1,
|
| + OnBeginFrameMixInDelegate(CreateBeginFrameArgsForTesting(
|
| + BEGINFRAME_FROM_HERE, 100, 200, 300, BeginFrameArgs::MISSED)))
|
| + .WillOnce(::testing::Return(true));
|
| + obs->AddObserver(&obs_child1);
|
| +
|
| +#ifndef NDEBUG
|
| + EXPECT_DEATH({ obs->AddObserver(&obs_child1); }, "");
|
| +
|
| + EXPECT_DEATH({ obs->RemoveObserver(&obs_child2); }, "");
|
| +#endif
|
| +
|
| + EXPECT_CALL(obs_child2,
|
| + OnBeginFrameMixInDelegate(CreateBeginFrameArgsForTesting(
|
| + BEGINFRAME_FROM_HERE, 100, 200, 300, BeginFrameArgs::MISSED)))
|
| + .WillOnce(::testing::Return(false));
|
| + obs->AddObserver(&obs_child2);
|
| +
|
| + // Re-adding the observer shouldn't cause OnBeginFrame to get called again if
|
| + // it was used.
|
| + obs->RemoveObserver(&obs_child1);
|
| + obs->AddObserver(&obs_child1);
|
| +
|
| + // This observer dropped the last missed frames so should get it again.
|
| + EXPECT_CALL(obs_child2,
|
| + OnBeginFrameMixInDelegate(CreateBeginFrameArgsForTesting(
|
| + BEGINFRAME_FROM_HERE, 100, 200, 300, BeginFrameArgs::MISSED)))
|
| + .WillOnce(::testing::Return(false));
|
| + obs->RemoveObserver(&obs_child2);
|
| + obs->AddObserver(&obs_child2);
|
| +}
|
| +
|
| +TEST(BeginFrameObserverMultiplexerTest, HasObserverCallback) {
|
| + {
|
| + ::testing::StrictMock<MockHasObserversCallback> cb;
|
| + EXPECT_CALL(cb, Callback(false));
|
| +
|
| + scoped_ptr<BeginFrameObserverMultiplexer> obs =
|
| + BeginFrameObserverMultiplexer::Create();
|
| + obs->SetHasObserverCallback(cb.Get());
|
| + }
|
| +
|
| + {
|
| + ::testing::StrictMock<MockHasObserversCallback> cb;
|
| + EXPECT_CALL(cb, Callback(true));
|
| + EXPECT_CALL(cb, Callback(false)); // Destructor
|
| +
|
| + scoped_ptr<BeginFrameObserverMultiplexer> obs =
|
| + BeginFrameObserverMultiplexer::Create();
|
| + MockMinimalBeginFrameObserverMixIn obs_child;
|
| + obs->AddObserver(&obs_child);
|
| + obs->SetHasObserverCallback(cb.Get());
|
| + }
|
| +
|
| + {
|
| + ::testing::InSequence ordered;
|
| +
|
| + ::testing::StrictMock<MockHasObserversCallback> cb;
|
| + EXPECT_CALL(cb, Callback(false));
|
| + EXPECT_CALL(cb, Callback(true));
|
| + EXPECT_CALL(cb, Callback(false));
|
| +
|
| + scoped_ptr<BeginFrameObserverMultiplexer> obs =
|
| + BeginFrameObserverMultiplexer::Create();
|
| + MockMinimalBeginFrameObserverMixIn obs_child;
|
| + obs->SetHasObserverCallback(cb.Get());
|
| + obs->AddObserver(&obs_child);
|
| + obs->RemoveObserver(&obs_child);
|
| + }
|
| +
|
| + {
|
| + ::testing::InSequence ordered;
|
| +
|
| + ::testing::StrictMock<MockHasObserversCallback> cb;
|
| + EXPECT_CALL(cb, Callback(false));
|
| + EXPECT_CALL(cb, Callback(true));
|
| + EXPECT_CALL(cb, Callback(false));
|
| +
|
| + scoped_ptr<BeginFrameObserverMultiplexer> obs =
|
| + BeginFrameObserverMultiplexer::Create();
|
| + MockMinimalBeginFrameObserverMixIn obs_child1;
|
| + MockMinimalBeginFrameObserverMixIn obs_child2;
|
| + obs->SetHasObserverCallback(cb.Get());
|
| + obs->AddObserver(&obs_child1);
|
| + obs->AddObserver(&obs_child2);
|
| + obs->RemoveObserver(&obs_child1);
|
| + obs->RemoveObserver(&obs_child2);
|
| + }
|
| +
|
| + {
|
| + ::testing::InSequence ordered;
|
| + ::testing::StrictMock<MockHasObserversCallback> cb1;
|
| + EXPECT_CALL(cb1, Callback(false));
|
| + EXPECT_CALL(cb1, Callback(true));
|
| + EXPECT_CALL(cb1, Callback(false));
|
| +
|
| + ::testing::StrictMock<MockHasObserversCallback> cb2;
|
| + EXPECT_CALL(cb2, Callback(true));
|
| + EXPECT_CALL(cb2, Callback(false));
|
| +
|
| + ::testing::StrictMock<MockHasObserversCallback> cb3;
|
| + EXPECT_CALL(cb3, Callback(false));
|
| +
|
| + scoped_ptr<BeginFrameObserverMultiplexer> obs =
|
| + BeginFrameObserverMultiplexer::Create();
|
| + MockMinimalBeginFrameObserverMixIn obs_child;
|
| + obs->SetHasObserverCallback(cb1.Get());
|
| + obs->AddObserver(&obs_child);
|
| + obs->SetHasObserverCallback(cb2.Get());
|
| + obs->RemoveObserver(&obs_child);
|
| + obs->SetHasObserverCallback(cb3.Get());
|
| + }
|
| +}
|
| +
|
| +TEST(BeginFrameObserverMultiplexerTest, OnBeginFrame) {
|
| + scoped_ptr<BeginFrameObserverMultiplexer> obs =
|
| + BeginFrameObserverMultiplexer::Create();
|
| +
|
| + MockBeginFrameObserver obs_child1;
|
| + EXPECT_BEGIN_FRAME_USED(obs_child1, 100, 200, 300);
|
| + EXPECT_BEGIN_FRAME_USED(obs_child1, 400, 600, 300);
|
| + MockBeginFrameObserver obs_child2;
|
| + EXPECT_CALL(obs_child2,
|
| + OnBeginFrame(CreateBeginFrameArgsForTesting(
|
| + BEGINFRAME_FROM_HERE, 100, 200, 300, BeginFrameArgs::MISSED)))
|
| + .InSequence(obs_child2.sequence);
|
| + EXPECT_BEGIN_FRAME_USED(obs_child2, 400, 600, 300);
|
| + EXPECT_BEGIN_FRAME_USED(obs_child2, 700, 800, 300);
|
| +
|
| + obs->AddObserver(&obs_child1);
|
| + obs->OnBeginFrame(
|
| + CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300));
|
| + obs->AddObserver(&obs_child2);
|
| + obs->OnBeginFrame(
|
| + CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 400, 600, 300));
|
| + obs->RemoveObserver(&obs_child1);
|
| + obs->OnBeginFrame(
|
| + CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 700, 800, 300));
|
| +}
|
| +
|
| // BeginFrameSource testing ----------------------------------------------
|
| TEST(BeginFrameSourceMixInTest, ObserverManipulation) {
|
| MockBeginFrameObserver obs;
|
|
|