OLD | NEW |
| (Empty) |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "cc/trees/threaded_channel.h" | |
6 | |
7 #include "base/macros.h" | |
8 #include "base/memory/ptr_util.h" | |
9 #include "cc/animation/animation_events.h" | |
10 #include "cc/test/layer_tree_test.h" | |
11 #include "cc/trees/single_thread_proxy.h" | |
12 #include "testing/gtest/include/gtest/gtest.h" | |
13 | |
14 namespace cc { | |
15 | |
16 // The ThreadedChannel tests are run only for threaded and direct mode. | |
17 class ThreadedChannelTest : public LayerTreeTest { | |
18 protected: | |
19 ThreadedChannelTest() : calls_received_(0) {} | |
20 | |
21 ~ThreadedChannelTest() override {} | |
22 | |
23 void BeginTest() override { | |
24 DCHECK(HasImplThread()); | |
25 BeginChannelTest(); | |
26 }; | |
27 virtual void BeginChannelTest() {} | |
28 | |
29 void PostOnImplThread() { | |
30 ImplThreadTaskRunner()->PostTask( | |
31 FROM_HERE, base::Bind(&ThreadedChannelTest::StartTestOnImplThread, | |
32 base::Unretained(this))); | |
33 } | |
34 | |
35 virtual void StartTestOnImplThread() { | |
36 DCHECK(task_runner_provider()->IsImplThread()); | |
37 } | |
38 | |
39 void AfterTest() override {} | |
40 | |
41 int calls_received_; | |
42 | |
43 private: | |
44 DISALLOW_COPY_AND_ASSIGN(ThreadedChannelTest); | |
45 }; | |
46 | |
47 class ThreadedChannelTestInitializationAndShutdown | |
48 : public ThreadedChannelTest { | |
49 void SetVisibleOnImpl(bool visible) override { calls_received_++; } | |
50 | |
51 void ReceivedRequestNewOutputSurface() override { calls_received_++; } | |
52 | |
53 void InitializeOutputSurfaceOnImpl(OutputSurface* output_surface) override { | |
54 calls_received_++; | |
55 } | |
56 | |
57 void ReceivedSetRendererCapabilitiesMainCopy( | |
58 const RendererCapabilities& capabilities) override { | |
59 calls_received_++; | |
60 } | |
61 | |
62 void ReceivedDidInitializeOutputSurface( | |
63 bool success, | |
64 const RendererCapabilities& capabilities) override { | |
65 calls_received_++; | |
66 EndTest(); | |
67 } | |
68 | |
69 void FinishGLOnImpl() override { calls_received_++; } | |
70 | |
71 void AfterTest() override { EXPECT_EQ(6, calls_received_); } | |
72 }; | |
73 | |
74 MULTI_THREAD_DIRECT_RENDERER_TEST_F( | |
75 ThreadedChannelTestInitializationAndShutdown); | |
76 | |
77 class ThreadedChannelTestTopControlsState : public ThreadedChannelTest { | |
78 void BeginChannelTest() override { | |
79 proxy()->UpdateTopControlsState(TopControlsState::BOTH, | |
80 TopControlsState::BOTH, true); | |
81 } | |
82 | |
83 void UpdateTopControlsStateOnImpl(TopControlsState constraints, | |
84 TopControlsState current, | |
85 bool animate) override { | |
86 calls_received_++; | |
87 EndTest(); | |
88 } | |
89 | |
90 void AfterTest() override { EXPECT_EQ(1, calls_received_); } | |
91 }; | |
92 | |
93 MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestTopControlsState); | |
94 | |
95 class ThreadedChannelTestMainThreadStoppedFlinging | |
96 : public ThreadedChannelTest { | |
97 void BeginChannelTest() override { proxy()->MainThreadHasStoppedFlinging(); } | |
98 | |
99 void MainThreadHasStoppedFlingingOnImpl() override { | |
100 calls_received_++; | |
101 EndTest(); | |
102 } | |
103 | |
104 void AfterTest() override { EXPECT_EQ(1, calls_received_); } | |
105 }; | |
106 | |
107 MULTI_THREAD_DIRECT_RENDERER_TEST_F( | |
108 ThreadedChannelTestMainThreadStoppedFlinging); | |
109 | |
110 class ThreadedChannelTestDeferCommits : public ThreadedChannelTest { | |
111 void BeginChannelTest() override { DispatchSetDeferCommits(true); } | |
112 | |
113 void SetDeferCommitsOnImpl(bool defer_commits) override { | |
114 ASSERT_TRUE(defer_commits); | |
115 calls_received_++; | |
116 EndTest(); | |
117 } | |
118 | |
119 void AfterTest() override { EXPECT_EQ(1, calls_received_); } | |
120 }; | |
121 | |
122 MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestDeferCommits); | |
123 | |
124 class ThreadedChannelTestInputThrottled : public ThreadedChannelTest { | |
125 void BeginChannelTest() override { | |
126 proxy()->NotifyInputThrottledUntilCommit(); | |
127 } | |
128 | |
129 void SetInputThrottledUntilCommitOnImpl(bool is_throttled) override { | |
130 calls_received_++; | |
131 EndTest(); | |
132 } | |
133 | |
134 void AfterTest() override { EXPECT_EQ(1, calls_received_); } | |
135 }; | |
136 | |
137 MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestInputThrottled); | |
138 | |
139 class ThreadedChannelTestNeedsRedraw : public ThreadedChannelTest { | |
140 void BeginChannelTest() override { DispatchSetNeedsRedraw(); } | |
141 | |
142 void SetNeedsRedrawOnImpl(const gfx::Rect& damage_rect) override { | |
143 calls_received_++; | |
144 EndTest(); | |
145 } | |
146 | |
147 void AfterTest() override { EXPECT_EQ(1, calls_received_); } | |
148 }; | |
149 | |
150 MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestNeedsRedraw); | |
151 | |
152 class ThreadedChannelTestFinishAllRendering : public ThreadedChannelTest { | |
153 void BeginChannelTest() override { proxy()->FinishAllRendering(); } | |
154 | |
155 void FinishAllRenderingOnImpl() override { | |
156 calls_received_++; | |
157 EndTest(); | |
158 } | |
159 | |
160 void AfterTest() override { EXPECT_EQ(1, calls_received_); } | |
161 }; | |
162 | |
163 MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestFinishAllRendering); | |
164 | |
165 class ThreadedChannelTestReleaseOutputSurface : public ThreadedChannelTest { | |
166 void BeginChannelTest() override { proxy()->ReleaseOutputSurface(); } | |
167 | |
168 void ReleaseOutputSurfaceOnImpl() override { | |
169 calls_received_++; | |
170 EndTest(); | |
171 } | |
172 | |
173 void AfterTest() override { EXPECT_EQ(1, calls_received_); } | |
174 }; | |
175 | |
176 MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestReleaseOutputSurface); | |
177 | |
178 class ThreadedChannelTestCommit : public ThreadedChannelTest { | |
179 void BeginChannelTest() override { PostSetNeedsCommitToMainThread(); } | |
180 | |
181 void SetNeedsCommitOnImpl() override { EXPECT_EQ(0, calls_received_++); } | |
182 | |
183 void ReceivedBeginMainFrame() override { EXPECT_EQ(1, calls_received_++); } | |
184 | |
185 void StartCommitOnImpl() override { EXPECT_EQ(2, calls_received_++); } | |
186 | |
187 void ReceivedDidCommitAndDrawFrame() override { | |
188 EXPECT_EQ(3, calls_received_++); | |
189 } | |
190 | |
191 void ReceivedDidCompleteSwapBuffers() override { | |
192 EXPECT_EQ(4, calls_received_++); | |
193 EndTest(); | |
194 } | |
195 | |
196 void AfterTest() override { EXPECT_EQ(5, calls_received_); } | |
197 }; | |
198 | |
199 MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestCommit); | |
200 | |
201 class ThreadedChannelTestBeginMainFrameAborted : public ThreadedChannelTest { | |
202 void BeginChannelTest() override { PostSetNeedsCommitToMainThread(); } | |
203 | |
204 void ScheduledActionWillSendBeginMainFrame() override { | |
205 // Set visible to false to abort the commit. | |
206 MainThreadTaskRunner()->PostTask( | |
207 FROM_HERE, | |
208 base::Bind(&ThreadedChannelTestBeginMainFrameAborted::SetVisibleFalse, | |
209 base::Unretained(this))); | |
210 } | |
211 | |
212 void SetVisibleFalse() { layer_tree_host()->SetVisible(false); } | |
213 | |
214 void BeginMainFrameAbortedOnImpl(CommitEarlyOutReason reason) override { | |
215 calls_received_++; | |
216 EndTest(); | |
217 } | |
218 | |
219 void AfterTest() override { EXPECT_EQ(1, calls_received_); } | |
220 }; | |
221 | |
222 MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestBeginMainFrameAborted); | |
223 | |
224 class ThreadedChannelTestBeginMainFrameNotExpectedSoon | |
225 : public ThreadedChannelTest { | |
226 void BeginChannelTest() override { PostOnImplThread(); } | |
227 | |
228 void StartTestOnImplThread() override { | |
229 GetProxyImplForTest()->SendBeginMainFrameNotExpectedSoon(); | |
230 } | |
231 | |
232 void ReceivedBeginMainFrameNotExpectedSoon() override { | |
233 calls_received_++; | |
234 EndTest(); | |
235 } | |
236 | |
237 void AfterTest() override { EXPECT_EQ(1, calls_received_); } | |
238 }; | |
239 | |
240 MULTI_THREAD_DIRECT_RENDERER_TEST_F( | |
241 ThreadedChannelTestBeginMainFrameNotExpectedSoon); | |
242 | |
243 class ThreadedChannelTestSetAnimationEvents : public ThreadedChannelTest { | |
244 void BeginChannelTest() override { PostOnImplThread(); } | |
245 | |
246 void StartTestOnImplThread() override { | |
247 std::unique_ptr<AnimationEvents> events( | |
248 base::WrapUnique(new AnimationEvents)); | |
249 GetProxyImplForTest()->PostAnimationEventsToMainThreadOnImplThread( | |
250 std::move(events)); | |
251 } | |
252 | |
253 void ReceivedSetAnimationEvents() override { | |
254 calls_received_++; | |
255 EndTest(); | |
256 } | |
257 | |
258 void AfterTest() override { EXPECT_EQ(1, calls_received_); } | |
259 }; | |
260 | |
261 MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestSetAnimationEvents); | |
262 | |
263 class ThreadedChannelTestLoseOutputSurface : public ThreadedChannelTest { | |
264 void BeginChannelTest() override { PostOnImplThread(); } | |
265 | |
266 void StartTestOnImplThread() override { | |
267 GetProxyImplForTest()->DidLoseOutputSurfaceOnImplThread(); | |
268 } | |
269 | |
270 void ReceivedDidLoseOutputSurface() override { | |
271 calls_received_++; | |
272 EndTest(); | |
273 } | |
274 | |
275 void AfterTest() override { EXPECT_EQ(1, calls_received_); } | |
276 }; | |
277 | |
278 MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestLoseOutputSurface); | |
279 | |
280 class ThreadedChannelTestPageScaleAnimation : public ThreadedChannelTest { | |
281 void BeginChannelTest() override { PostOnImplThread(); } | |
282 | |
283 void StartTestOnImplThread() override { | |
284 GetProxyImplForTest()->DidCompletePageScaleAnimationOnImplThread(); | |
285 } | |
286 | |
287 void ReceivedDidCompletePageScaleAnimation() override { | |
288 calls_received_++; | |
289 EndTest(); | |
290 } | |
291 | |
292 void AfterTest() override { EXPECT_EQ(1, calls_received_); } | |
293 }; | |
294 | |
295 MULTI_THREAD_DIRECT_RENDERER_TEST_F(ThreadedChannelTestPageScaleAnimation); | |
296 | |
297 } // namespace cc | |
OLD | NEW |