Index: cc/trees/threaded_channel_unittest.cc |
diff --git a/cc/trees/threaded_channel_unittest.cc b/cc/trees/threaded_channel_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..09c2322ee656f77f2b95c1ba5ff084d793faedd2 |
--- /dev/null |
+++ b/cc/trees/threaded_channel_unittest.cc |
@@ -0,0 +1,311 @@ |
+// Copyright 2014 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 "cc/trees/threaded_channel.h" |
+ |
+#include "cc/test/layer_tree_test.h" |
+#include "cc/trees/single_thread_proxy.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace cc { |
+ |
+// The ThreadedChannel tests are run only for threaded and direct mode. |
+class ThreadedChannelTest : public LayerTreeTest { |
+ protected: |
+ ThreadedChannelTest() : thread_proxy_(nullptr), calls_received_(0) {} |
+ |
+ ~ThreadedChannelTest() override {} |
+ |
+ void BeginTest() override { |
+ DCHECK(HasImplThread()); |
+ thread_proxy_ = static_cast<ThreadProxy*>(proxy()); |
+ BeginChannelTest(); |
+ }; |
+ virtual void BeginChannelTest() {} |
+ |
+ void PostOnImplThread() { |
+ ImplThreadTaskRunner()->PostTask( |
+ FROM_HERE, base::Bind(&ThreadedChannelTest::StartTestOnImplThread, |
+ base::Unretained(this))); |
+ } |
+ |
+ virtual void StartTestOnImplThread() { DCHECK(proxy()->IsImplThread()); } |
+ |
+ void AfterTest() override {} |
+ |
+ // TODO(khushalsagar): Remove this once ProxyImpl is added to the |
+ // LayerTreeTest. |
+ ThreadProxy* thread_proxy_; |
+ int calls_received_; |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(ThreadedChannelTest); |
+}; |
+ |
+class ThreadedChannelTestInitializationAndShutdown |
+ : public ThreadedChannelTest { |
+ void SetVisibleOnImpl(bool visible) override { calls_received_++; } |
+ |
+ void ReceivedRequestNewOutputSurface() override { calls_received_++; } |
+ |
+ void InitializeOutputSurfaceOnImpl(OutputSurface* output_surface) override { |
+ calls_received_++; |
+ } |
+ |
+ void ReceivedSetRendererCapabilitiesMainCopy( |
+ const RendererCapabilities& capabilities) override { |
+ calls_received_++; |
+ } |
+ |
+ void ReceivedDidInitializeOutputSurface( |
+ bool success, |
+ const RendererCapabilities& capabilities) override { |
+ calls_received_++; |
+ EndTest(); |
+ } |
+ |
+ void FinishGLOnImpl() override { calls_received_++; } |
+ |
+ void AfterTest() override { EXPECT_EQ(6, calls_received_); } |
+}; |
+ |
+MULTI_THREAD_DIRECT_RENDERER_TEST_F( |
+ ThreadedChannelTestInitializationAndShutdown); |
+ |
+class ThreadedChannelTestThrottleFrameProduction : public ThreadedChannelTest { |
+ void BeginChannelTest() override { |
+ proxy()->SetThrottleFrameProduction(true); |
+ } |
+ |
+ void SetThrottleFrameProductionOnImpl(bool throttle) override { |
+ ASSERT_TRUE(throttle); |
+ calls_received_++; |
+ EndTest(); |
+ } |
+ |
+ void AfterTest() override { EXPECT_EQ(1, calls_received_); } |
+}; |
+ |
+MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestThrottleFrameProduction); |
+ |
+class ThreadedChannelTestTopControlsState : public ThreadedChannelTest { |
+ void BeginChannelTest() override { |
+ proxy()->UpdateTopControlsState(TopControlsState::BOTH, |
+ TopControlsState::BOTH, true); |
+ } |
+ |
+ void UpdateTopControlsStateOnImpl(TopControlsState constraints, |
+ TopControlsState current, |
+ bool animate) override { |
+ calls_received_++; |
+ EndTest(); |
+ } |
+ |
+ void AfterTest() override { EXPECT_EQ(1, calls_received_); } |
+}; |
+ |
+MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestTopControlsState); |
+ |
+class ThreadedChannelTestMainThreadStoppedFlinging |
+ : public ThreadedChannelTest { |
+ void BeginChannelTest() override { proxy()->MainThreadHasStoppedFlinging(); } |
+ |
+ void MainThreadHasStoppedFlingingOnImpl() override { |
+ calls_received_++; |
+ EndTest(); |
+ } |
+ |
+ void AfterTest() override { EXPECT_EQ(1, calls_received_); } |
+}; |
+ |
+MULTI_THREAD_DIRECT_RENDERER_TEST_F( |
+ ThreadedChannelTestMainThreadStoppedFlinging); |
+ |
+class ThreadedChannelTestDeferCommits : public ThreadedChannelTest { |
+ void BeginChannelTest() override { DispatchSetDeferCommits(true); } |
+ |
+ void SetDeferCommitsOnImpl(bool defer_commits) override { |
+ ASSERT_TRUE(defer_commits); |
+ calls_received_++; |
+ EndTest(); |
+ } |
+ |
+ void AfterTest() override { EXPECT_EQ(1, calls_received_); } |
+}; |
+ |
+MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestDeferCommits); |
+ |
+class ThreadedChannelTestInputThrottled : public ThreadedChannelTest { |
+ void BeginChannelTest() override { |
+ proxy()->NotifyInputThrottledUntilCommit(); |
+ } |
+ |
+ void SetInputThrottledUntilCommitOnImpl(bool is_throttled) override { |
+ calls_received_++; |
+ EndTest(); |
+ } |
+ |
+ void AfterTest() override { EXPECT_EQ(1, calls_received_); } |
+}; |
+ |
+MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestInputThrottled); |
+ |
+class ThreadedChannelTestNeedsRedraw : public ThreadedChannelTest { |
+ void BeginChannelTest() override { DispatchSetNeedsRedraw(); } |
+ |
+ void SetNeedsRedrawOnImpl(const gfx::Rect& damage_rect) override { |
+ calls_received_++; |
+ EndTest(); |
+ } |
+ |
+ void AfterTest() override { EXPECT_EQ(1, calls_received_); } |
+}; |
+ |
+MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestNeedsRedraw); |
+ |
+class ThreadedChannelTestFinishAllRendering : public ThreadedChannelTest { |
+ void BeginChannelTest() override { proxy()->FinishAllRendering(); } |
+ |
+ void FinishAllRenderingOnImpl() override { |
+ calls_received_++; |
+ EndTest(); |
+ } |
+ |
+ void AfterTest() override { EXPECT_EQ(1, calls_received_); } |
+}; |
+ |
+MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestFinishAllRendering); |
+ |
+class ThreadedChannelTestReleaseOutputSurface : public ThreadedChannelTest { |
+ void BeginChannelTest() override { proxy()->ReleaseOutputSurface(); } |
+ |
+ void ReleaseOutputSurfaceOnImpl() override { |
+ calls_received_++; |
+ EndTest(); |
+ } |
+ |
+ void AfterTest() override { EXPECT_EQ(1, calls_received_); } |
+}; |
+ |
+MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestReleaseOutputSurface); |
+ |
+class ThreadedChannelTestCommit : public ThreadedChannelTest { |
+ void BeginChannelTest() override { PostSetNeedsCommitToMainThread(); } |
+ |
+ void SetNeedsCommitOnImpl() override { EXPECT_EQ(0, calls_received_++); } |
+ |
+ void ReceivedBeginMainFrame() override { EXPECT_EQ(1, calls_received_++); } |
+ |
+ void StartCommitOnImpl() override { EXPECT_EQ(2, calls_received_++); } |
+ |
+ void ReceivedDidCommitAndDrawFrame() override { |
+ EXPECT_EQ(3, calls_received_++); |
+ } |
+ |
+ void ReceivedDidCompleteSwapBuffers() override { |
+ EXPECT_EQ(4, calls_received_++); |
+ EndTest(); |
+ } |
+ |
+ void AfterTest() override { EXPECT_EQ(5, calls_received_); } |
+}; |
+ |
+MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestCommit); |
+ |
+class ThreadedChannelTestBeginMainFrameAborted : public ThreadedChannelTest { |
+ void BeginChannelTest() override { PostSetNeedsCommitToMainThread(); } |
+ |
+ void ScheduledActionWillSendBeginMainFrame() override { |
+ // Set visible to false to abort the commit. |
+ MainThreadTaskRunner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&ThreadedChannelTestBeginMainFrameAborted::SetVisibleFalse, |
+ base::Unretained(this))); |
+ } |
+ |
+ void SetVisibleFalse() { layer_tree_host()->SetVisible(false); } |
+ |
+ void BeginMainFrameAbortedOnImpl(CommitEarlyOutReason reason) override { |
+ calls_received_++; |
+ EndTest(); |
+ } |
+ |
+ void AfterTest() override { EXPECT_EQ(1, calls_received_); } |
+}; |
+ |
+MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestBeginMainFrameAborted); |
+ |
+class ThreadedChannelTestBeginMainFrameNotExpectedSoon |
+ : public ThreadedChannelTest { |
+ void BeginChannelTest() override { PostOnImplThread(); } |
+ |
+ void StartTestOnImplThread() override { |
+ thread_proxy_->SendBeginMainFrameNotExpectedSoon(); |
+ } |
+ |
+ void ReceivedBeginMainFrameNotExpectedSoon() override { |
+ calls_received_++; |
+ EndTest(); |
+ } |
+ |
+ void AfterTest() override { EXPECT_EQ(1, calls_received_); } |
+}; |
+ |
+MULTI_THREAD_DIRECT_RENDERER_TEST_F( |
+ ThreadedChannelTestBeginMainFrameNotExpectedSoon); |
+ |
+class ThreadedChannelTestSetAnimationEvents : public ThreadedChannelTest { |
+ void BeginChannelTest() override { PostOnImplThread(); } |
+ |
+ void StartTestOnImplThread() override { |
+ scoped_ptr<AnimationEventsVector> events( |
+ make_scoped_ptr(new AnimationEventsVector)); |
+ thread_proxy_->PostAnimationEventsToMainThreadOnImplThread(events.Pass()); |
+ } |
+ |
+ void ReceivedSetAnimationEvents() override { |
+ calls_received_++; |
+ EndTest(); |
+ } |
+ |
+ void AfterTest() override { EXPECT_EQ(1, calls_received_); } |
+}; |
+ |
+MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestSetAnimationEvents); |
+ |
+class ThreadedChannelTestLoseOutputSurface : public ThreadedChannelTest { |
+ void BeginChannelTest() override { PostOnImplThread(); } |
+ |
+ void StartTestOnImplThread() override { |
+ thread_proxy_->DidLoseOutputSurfaceOnImplThread(); |
+ } |
+ |
+ void ReceivedDidLoseOutputSurface() override { |
+ calls_received_++; |
+ EndTest(); |
+ } |
+ |
+ void AfterTest() override { EXPECT_EQ(1, calls_received_); } |
+}; |
+ |
+MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestLoseOutputSurface); |
+ |
+class ThreadedChannelTestPageScaleAnimation : public ThreadedChannelTest { |
+ void BeginChannelTest() override { PostOnImplThread(); } |
+ |
+ void StartTestOnImplThread() override { |
+ thread_proxy_->DidCompletePageScaleAnimationOnImplThread(); |
+ } |
+ |
+ void ReceivedDidCompletePageScaleAnimation() override { |
+ calls_received_++; |
+ EndTest(); |
+ } |
+ |
+ void AfterTest() override { EXPECT_EQ(1, calls_received_); } |
+}; |
+ |
+MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestPageScaleAnimation); |
+ |
+} // namespace cc |