Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Side by Side Diff: content/renderer/gpu/queue_message_swap_promise_unittest.cc

Issue 240163005: Deliver IPC messages together with SwapCompositorFrame (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove accidentally checked in android_aosp manifest Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2014 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 "content/renderer/gpu/queue_message_swap_promise.h"
6
7 #include <vector>
8
9 #include "base/memory/scoped_vector.h"
10 #include "cc/base/swap_promise.h"
11 #include "content/renderer/gpu/frame_swap_message_queue.h"
12 #include "content/renderer/gpu/render_widget_compositor.h"
13 #include "content/renderer/render_widget.h"
14 #include "content/test/mock_render_process.h"
15 #include "ipc/ipc_message.h"
16 #include "ipc/ipc_sync_message_filter.h"
17 #include "ipc/ipc_test_sink.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19
20 namespace content {
21
22 class TestRenderWidget : public RenderWidget {
23 public:
24 using RenderWidget::QueueMessageImpl;
25 };
26
27 class TestSyncMessageFilter : public IPC::SyncMessageFilter {
28 public:
29 TestSyncMessageFilter() : IPC::SyncMessageFilter(NULL) {}
30
31 virtual bool Send(IPC::Message* message) OVERRIDE {
32 messages_.push_back(message);
33 return true;
34 }
35
36 ScopedVector<IPC::Message>& messages() { return messages_; }
37
38 private:
39 ScopedVector<IPC::Message> messages_;
40 };
41
42 struct QueueMessageData {
43 MessageDeliveryPolicy policy;
44 bool commit_requested;
45 int source_frame_number;
46 };
47
48 class QueueMessageSwapPromiseTest : public testing::Test {
49 public:
50 QueueMessageSwapPromiseTest()
51 : frame_swap_message_queue_(new FrameSwapMessageQueue()),
52 sync_message_filter_(new TestSyncMessageFilter()) {}
53
54 virtual ~QueueMessageSwapPromiseTest() {}
55
56 scoped_ptr<cc::SwapPromise> QueueMessageImpl(IPC::Message* msg,
57 MessageDeliveryPolicy policy,
58 bool commit_requested,
59 int source_frame_number) {
60 return TestRenderWidget::QueueMessageImpl(msg,
61 policy,
62 frame_swap_message_queue_,
63 sync_message_filter_,
64 commit_requested,
65 source_frame_number).Pass();
66 }
67
68 ScopedVector<IPC::Message>& DirectSendMessages() {
69 return sync_message_filter_->messages();
70 }
71
72 ScopedVector<IPC::Message>& NextSwapMessages() {
73 next_swap_messages_.clear();
74 scoped_ptr<FrameSwapMessageQueue::SendMessageScope> send_message_scope =
75 frame_swap_message_queue_->AcquireSendMessageScope();
76 frame_swap_message_queue_->DrainMessages(&next_swap_messages_);
77 return next_swap_messages_;
78 }
79
80 bool ContainsMessage(const ScopedVector<IPC::Message>& messages,
81 const IPC::Message& message) {
82 if (messages.empty())
83 return false;
84 for (ScopedVector<IPC::Message>::const_iterator i = messages.begin();
85 i != messages.end();
86 ++i) {
87 if ((*i)->type() == message.type())
88 return true;
89 }
90 return false;
91 }
92
93 bool NextSwapHasMessage(const IPC::Message& message) {
94 return ContainsMessage(NextSwapMessages(), message);
95 }
96
97 void QueueMessages(QueueMessageData data[], size_t count) {
98 for (size_t i = 0; i < count; ++i) {
99 messages_.push_back(
100 IPC::Message(0, i + 1, IPC::Message::PRIORITY_NORMAL));
101 promises_.push_back(
102 QueueMessageImpl(new IPC::Message(messages_[i]),
103 data[i].policy,
104 data[i].commit_requested,
105 data[i].source_frame_number).release());
106 }
107 }
108
109 void CleanupPromises() {
110 for (ScopedVector<cc::SwapPromise>::iterator i = promises_.begin();
111 i != promises_.end();
112 ++i) {
113 if (*i)
114 (*i)->DidSwap(NULL);
115 }
116 }
117
118 protected:
119 void VisualStateSwapPromiseDidNotSwap(
120 cc::SwapPromise::DidNotSwapReason reason);
121
122 scoped_refptr<FrameSwapMessageQueue> frame_swap_message_queue_;
123 scoped_refptr<TestSyncMessageFilter> sync_message_filter_;
124 std::vector<IPC::Message> messages_;
125 ScopedVector<cc::SwapPromise> promises_;
126
127 private:
128 ScopedVector<IPC::Message> next_swap_messages_;
129
130 DISALLOW_COPY_AND_ASSIGN(QueueMessageSwapPromiseTest);
131 };
132
133 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySchedulesMessageForNextSwap) {
134 QueueMessageData data[] = {
135 /* { policy, commit_requested, source_frame_number } */
136 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, false, 1},
piman 2014/06/27 19:17:30 nit: indent looked correct before (also everywhere
mkosiba (inactive) 2014/06/30 16:28:09 thanks! I didn't notice format-patch changed this.
137 };
138 QueueMessages(data, arraysize(data));
139
140 ASSERT_TRUE(promises_[0]);
141 EXPECT_TRUE(DirectSendMessages().empty());
142 EXPECT_FALSE(frame_swap_message_queue_->Empty());
143 EXPECT_TRUE(NextSwapHasMessage(messages_[0]));
144
145 CleanupPromises();
146 }
147
148 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicyNeedsAtMostOnePromise) {
149 QueueMessageData data[] = {
150 /* { policy, commit_requested, source_frame_number } */
151 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, false, 1},
152 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, false, 1},
153 };
154 QueueMessages(data, arraysize(data));
155
156 ASSERT_TRUE(promises_[0]);
157 ASSERT_FALSE(promises_[1]);
158
159 CleanupPromises();
160 }
161
162 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySendsMessageOnNoUpdate) {
163 QueueMessageData data[] = {
164 /* { policy, commit_requested, source_frame_number } */
165 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, false, 1},
166 };
167 QueueMessages(data, arraysize(data));
168
169 promises_[0]->DidNotSwap(cc::SwapPromise::COMMIT_NO_UPDATE);
170 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[0]));
171 EXPECT_TRUE(NextSwapMessages().empty());
172 EXPECT_TRUE(frame_swap_message_queue_->Empty());
173 }
174
175 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySendsMessageOnSwapFails) {
176 QueueMessageData data[] = {
177 /* { policy, commit_requested, source_frame_number } */
178 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, false, 1},
179 };
180 QueueMessages(data, arraysize(data));
181
182 promises_[0]->DidNotSwap(cc::SwapPromise::SWAP_FAILS);
183 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[0]));
184 EXPECT_TRUE(NextSwapMessages().empty());
185 EXPECT_TRUE(frame_swap_message_queue_->Empty());
186 }
187
188 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicyRetainsMessageOnCommitFails) {
189 QueueMessageData data[] = {
190 /* { policy, commit_requested, source_frame_number } */
191 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, false, 1},
192 };
193 QueueMessages(data, arraysize(data));
194
195 promises_[0]->DidNotSwap(cc::SwapPromise::COMMIT_FAILS);
196 EXPECT_TRUE(DirectSendMessages().empty());
197 EXPECT_FALSE(frame_swap_message_queue_->Empty());
198 EXPECT_TRUE(NextSwapHasMessage(messages_[0]));
199 }
200
201 TEST_F(QueueMessageSwapPromiseTest, VisualStateDirectSend) {
202 QueueMessageData data[] = {
203 /* { policy, commit_requested, source_frame_number } */
204 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, false, 1},
205 };
206 QueueMessages(data, arraysize(data));
207
208 ASSERT_FALSE(promises_[0]);
209 EXPECT_FALSE(DirectSendMessages().empty());
210 EXPECT_TRUE(frame_swap_message_queue_->Empty());
211 EXPECT_TRUE(NextSwapMessages().empty());
212 }
213
214 TEST_F(QueueMessageSwapPromiseTest,
215 VisualStateQueuesMessageWhenCommitRequested) {
216 QueueMessageData data[] = {
217 /* { policy, commit_requested, source_frame_number } */
218 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, true, 1},
219 };
220 QueueMessages(data, arraysize(data));
221
222 ASSERT_TRUE(promises_[0]);
223 EXPECT_TRUE(DirectSendMessages().empty());
224 EXPECT_FALSE(frame_swap_message_queue_->Empty());
225 EXPECT_TRUE(NextSwapMessages().empty());
226
227 CleanupPromises();
228 }
229
230 TEST_F(QueueMessageSwapPromiseTest,
231 VisualStateQueuesMessageWhenOtherMessageAlreadyQueued) {
232 QueueMessageData data[] = {
233 /* { policy, commit_requested, source_frame_number } */
234 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, true, 1},
235 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, true, 1},
236 };
237 QueueMessages(data, arraysize(data));
238
239 EXPECT_TRUE(DirectSendMessages().empty());
240 EXPECT_FALSE(frame_swap_message_queue_->Empty());
241 EXPECT_FALSE(NextSwapHasMessage(messages_[1]));
242
243 CleanupPromises();
244 }
245
246 TEST_F(QueueMessageSwapPromiseTest, VisualStateSwapPromiseDidSwap) {
247 QueueMessageData data[] = {
248 /* { policy, commit_requested, source_frame_number } */
249 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, true, 1},
250 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, false, 1},
251 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, false, 2},
252 };
253 QueueMessages(data, arraysize(data));
254
255 promises_[0]->DidSwap(NULL);
256 ASSERT_FALSE(promises_[1]);
257 ScopedVector<IPC::Message> messages;
258 messages.swap(NextSwapMessages());
259 EXPECT_EQ(2u, messages.size());
260 EXPECT_TRUE(ContainsMessage(messages, messages_[0]));
261 EXPECT_TRUE(ContainsMessage(messages, messages_[1]));
262 EXPECT_FALSE(ContainsMessage(messages, messages_[2]));
263
264 promises_[2]->DidSwap(NULL);
265 messages.swap(NextSwapMessages());
266 EXPECT_EQ(1u, messages.size());
267 EXPECT_TRUE(ContainsMessage(messages, messages_[2]));
268
269 EXPECT_TRUE(DirectSendMessages().empty());
270 EXPECT_TRUE(NextSwapMessages().empty());
271 EXPECT_TRUE(frame_swap_message_queue_->Empty());
272 }
273
274 void QueueMessageSwapPromiseTest::VisualStateSwapPromiseDidNotSwap(
275 cc::SwapPromise::DidNotSwapReason reason) {
276 QueueMessageData data[] = {
277 /* { policy, commit_requested, source_frame_number } */
278 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, true, 1},
279 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, false, 1},
280 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, false, 2},
281 };
282 QueueMessages(data, arraysize(data));
283
284 promises_[0]->DidNotSwap(reason);
285 ASSERT_FALSE(promises_[1]);
286 EXPECT_TRUE(NextSwapMessages().empty());
287 EXPECT_EQ(2u, DirectSendMessages().size());
288 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[0]));
289 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[1]));
290 EXPECT_FALSE(ContainsMessage(DirectSendMessages(), messages_[2]));
291
292 promises_[2]->DidNotSwap(reason);
293 EXPECT_TRUE(NextSwapMessages().empty());
294 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[2]));
295
296 EXPECT_TRUE(NextSwapMessages().empty());
297 EXPECT_TRUE(frame_swap_message_queue_->Empty());
298 }
299
300 TEST_F(QueueMessageSwapPromiseTest, VisalStateSwapPromiseDidNotSwapNoUpdate) {
301 VisualStateSwapPromiseDidNotSwap(cc::SwapPromise::COMMIT_NO_UPDATE);
302 }
303
304 TEST_F(QueueMessageSwapPromiseTest,
305 VisalStateSwapPromiseDidNotSwapCommitFails) {
306 VisualStateSwapPromiseDidNotSwap(cc::SwapPromise::COMMIT_FAILS);
307 }
308
309 TEST_F(QueueMessageSwapPromiseTest, VisalStateSwapPromiseDidNotSwapSwapFails) {
310 VisualStateSwapPromiseDidNotSwap(cc::SwapPromise::SWAP_FAILS);
311 }
312
313 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/gpu/queue_message_swap_promise.cc ('k') | content/renderer/gpu/render_widget_compositor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698