Index: ui/compositor/compositor_unittest.cc |
diff --git a/ui/compositor/compositor_unittest.cc b/ui/compositor/compositor_unittest.cc |
index 810f1c96d0875938de0b2460aaddcb4eaf4568f4..6b42e62199f5505dd9ba90fc2efae6ea25044cec 100644 |
--- a/ui/compositor/compositor_unittest.cc |
+++ b/ui/compositor/compositor_unittest.cc |
@@ -3,13 +3,24 @@ |
// found in the LICENSE file. |
#include "base/test/test_simple_task_runner.h" |
+#include "cc/output/begin_frame_args.h" |
+#include "cc/test/begin_frame_args_test.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "ui/compositor/compositor.h" |
#include "ui/compositor/test/context_factories_for_test.h" |
+using testing::Mock; |
+using testing::_; |
+ |
namespace ui { |
namespace { |
+class MockCompositorBeginFrameObserver : public CompositorBeginFrameObserver { |
+ public: |
+ MOCK_METHOD1(OnSendBeginFrame, void(const cc::BeginFrameArgs&)); |
+}; |
+ |
// Test fixture for tests that require a ui::Compositor with a real task |
// runner. |
class CompositorTest : public testing::Test { |
@@ -61,4 +72,45 @@ TEST_F(CompositorTest, LocksTimeOut) { |
EXPECT_TRUE(compositor()->IsLocked()); |
} |
+TEST_F(CompositorTest, AddAndRemoveBeginFrameObserver) { |
+ cc::BeginFrameArgs args = |
+ cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, |
+ base::TimeTicks::FromInternalValue(33)); |
+ |
+ // Simulate to trigger new BeginFrame by using |args|. |
+ compositor()->SendBeginFramesToChildren(args); |
+ |
+ // When |missed_begin_frame_args_| is sent, its type is set to MISSED. |
+ cc::BeginFrameArgs expected_args(args); |
+ expected_args.type = cc::BeginFrameArgs::MISSED; |
+ |
+ MockCompositorBeginFrameObserver test_observer; |
+ MockCompositorBeginFrameObserver test_observer2; |
+ EXPECT_CALL(test_observer, OnSendBeginFrame(expected_args)); |
+ EXPECT_CALL(test_observer2, OnSendBeginFrame(expected_args)); |
+ |
+ // When new observer is added, Compositor immediately calls OnSendBeginFrame |
+ // with |missed_begin_frame_args_|. |
+ compositor()->AddBeginFrameObserver(&test_observer); |
+ compositor()->AddBeginFrameObserver(&test_observer2); |
+ Mock::VerifyAndClearExpectations(&test_observer); |
+ Mock::VerifyAndClearExpectations(&test_observer2); |
+ |
+ // When |test_observer2| is removed and added again, it will be called again. |
+ EXPECT_CALL(test_observer2, OnSendBeginFrame(expected_args)); |
+ compositor()->RemoveBeginFrameObserver(&test_observer2); |
+ compositor()->AddBeginFrameObserver(&test_observer2); |
+ Mock::VerifyAndClearExpectations(&test_observer2); |
+ |
+ // When all observer is removed, |missed_begin_frame_args_| is invalidated. |
+ // So, it is not used for newly added observer. |
+ EXPECT_CALL(test_observer2, OnSendBeginFrame(_)).Times(0); |
+ compositor()->RemoveBeginFrameObserver(&test_observer); |
+ compositor()->RemoveBeginFrameObserver(&test_observer2); |
+ compositor()->AddBeginFrameObserver(&test_observer2); |
+ Mock::VerifyAndClearExpectations(&test_observer2); |
+ |
+ compositor()->RemoveBeginFrameObserver(&test_observer2); |
+} |
+ |
} // namespace ui |