// Copyright 2015 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 "base/macros.h" #include "cc/animation/animation_events.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() : calls_received_(0) {} ~ThreadedChannelTest() override {} void BeginTest() override { DCHECK(HasImplThread()); BeginChannelTest(); }; virtual void BeginChannelTest() {} void PostOnImplThread() { ImplThreadTaskRunner()->PostTask( FROM_HERE, base::Bind(&ThreadedChannelTest::StartTestOnImplThread, base::Unretained(this))); } virtual void StartTestOnImplThread() { DCHECK(task_runner_provider()->IsImplThread()); } void AfterTest() override {} 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 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 { GetProxyImplForTest()->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 events(make_scoped_ptr(new AnimationEvents)); GetProxyImplForTest()->PostAnimationEventsToMainThreadOnImplThread( std::move(events)); } 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 { GetProxyImplForTest()->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 { GetProxyImplForTest()->DidCompletePageScaleAnimationOnImplThread(); } void ReceivedDidCompletePageScaleAnimation() override { calls_received_++; EndTest(); } void AfterTest() override { EXPECT_EQ(1, calls_received_); } }; MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestPageScaleAnimation); } // namespace cc