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

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 unique policy, clean tests up a bit 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
55 virtual ~QueueMessageSwapPromiseTest() {}
56
57 scoped_ptr<cc::SwapPromise> QueueMessageImpl(IPC::Message* msg,
58 MessageDeliveryPolicy policy,
59 bool commit_requested,
60 int source_frame_number) {
61 return TestRenderWidget::QueueMessageImpl(msg,
62 policy,
63 frame_swap_message_queue_,
64 sync_message_filter_,
65 commit_requested,
66 source_frame_number).Pass();
67 }
68
69 ScopedVector<IPC::Message>& DirectSendMessages() {
70 return sync_message_filter_->messages();
71 }
72
73 ScopedVector<IPC::Message>& NextSwapMessages() {
74 next_swap_messages_.clear();
75 scoped_ptr<FrameSwapMessageQueue::SendMessageScope> send_message_scope =
76 frame_swap_message_queue_->AcquireSendMessageScope();
77 frame_swap_message_queue_->DrainMessages(&next_swap_messages_);
78 return next_swap_messages_;
79 }
80
81 bool ContainsMessage(const ScopedVector<IPC::Message>& messages,
82 const IPC::Message& message) {
83 if (messages.empty())
84 return false;
85 for (ScopedVector<IPC::Message>::const_iterator i = messages.begin();
86 i != messages.end();
87 ++i) {
88 if ((*i)->type() == message.type())
89 return true;
90 }
91 return false;
92 }
93
94 bool NextSwapHasMessage(const IPC::Message& message) {
95 return ContainsMessage(NextSwapMessages(), message);
96 }
97
98 void QueueMessages(QueueMessageData data[], size_t count) {
99 for (size_t i = 0; i < count; ++i) {
100 messages_.push_back(
101 IPC::Message(0, i + 1, IPC::Message::PRIORITY_NORMAL));
102 promises_.push_back(
103 QueueMessageImpl(new IPC::Message(messages_[i]),
104 data[i].policy,
105 data[i].commit_requested,
106 data[i].source_frame_number).release());
107 }
108 }
109
110 void CleanupPromises() {
111 for(ScopedVector<cc::SwapPromise>::iterator i = promises_.begin();
112 i != promises_.end();
113 ++i) {
114 if (*i)
115 (*i)->DidSwap(NULL);
116 }
117 }
118
119 protected:
120 void VisualStateSwapPromiseDidNotSwap(
121 cc::SwapPromise::DidNotSwapReason reason);
122
123 scoped_refptr<FrameSwapMessageQueue> frame_swap_message_queue_;
124 scoped_refptr<TestSyncMessageFilter> sync_message_filter_;
125 std::vector<IPC::Message> messages_;
126 ScopedVector<cc::SwapPromise> promises_;
127
128 private:
129 ScopedVector<IPC::Message> next_swap_messages_;
130
131 DISALLOW_COPY_AND_ASSIGN(QueueMessageSwapPromiseTest);
132 };
133
134 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySchedulesMessageForNextSwap) {
135 QueueMessageData data[] = {
136 /* { policy, commit_requested, source_frame_number } */
137 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, false, 1},
138 };
139 QueueMessages(data, arraysize(data));
140
141 ASSERT_TRUE(promises_[0]);
142 EXPECT_TRUE(DirectSendMessages().empty());
143 EXPECT_FALSE(frame_swap_message_queue_->Empty());
144 EXPECT_TRUE(NextSwapHasMessage(messages_[0]));
145
146 CleanupPromises();
147 }
148
149 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicyNeedsAtMostOnePromise) {
150 QueueMessageData data[] = {
151 /* { policy, commit_requested, source_frame_number } */
152 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, false, 1},
153 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, false, 1},
154 };
155 QueueMessages(data, arraysize(data));
156
157 ASSERT_TRUE(promises_[0]);
158 ASSERT_FALSE(promises_[1]);
159
160 CleanupPromises();
161 }
162
163 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySendsMessageOnNoUpdate) {
164 QueueMessageData data[] = {
165 /* { policy, commit_requested, source_frame_number } */
166 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, false, 1},
167 };
168 QueueMessages(data, arraysize(data));
169
170 promises_[0]->DidNotSwap(cc::SwapPromise::COMMIT_NO_UPDATE);
171 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[0]));
172 EXPECT_TRUE(NextSwapMessages().empty());
173 EXPECT_TRUE(frame_swap_message_queue_->Empty());
174 }
175
176 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySendsMessageOnSwapFails) {
177 QueueMessageData data[] = {
178 /* { policy, commit_requested, source_frame_number } */
179 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, false, 1},
180 };
181 QueueMessages(data, arraysize(data));
182
183 promises_[0]->DidNotSwap(cc::SwapPromise::SWAP_FAILS);
184 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[0]));
185 EXPECT_TRUE(NextSwapMessages().empty());
186 EXPECT_TRUE(frame_swap_message_queue_->Empty());
187 }
188
189 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicyRetainsMessageOnCommitFails) {
190 QueueMessageData data[] = {
191 /* { policy, commit_requested, source_frame_number } */
192 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, false, 1},
193 };
194 QueueMessages(data, arraysize(data));
195
196 promises_[0]->DidNotSwap(cc::SwapPromise::COMMIT_FAILS);
197 EXPECT_TRUE(DirectSendMessages().empty());
198 EXPECT_FALSE(frame_swap_message_queue_->Empty());
199 EXPECT_TRUE(NextSwapHasMessage(messages_[0]));
200 }
201
202 TEST_F(QueueMessageSwapPromiseTest, VisualStateDirectSend) {
203 QueueMessageData data[] = {
204 /* { policy, commit_requested, source_frame_number } */
205 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, false, 1},
206 };
207 QueueMessages(data, arraysize(data));
208
209 ASSERT_FALSE(promises_[0]);
210 EXPECT_FALSE(DirectSendMessages().empty());
211 EXPECT_TRUE(frame_swap_message_queue_->Empty());
212 EXPECT_TRUE(NextSwapMessages().empty());
213 }
214
215 TEST_F(QueueMessageSwapPromiseTest,
216 VisualStateQueuesMessageWhenCommitRequested) {
217 QueueMessageData data[] = {
218 /* { policy, commit_requested, source_frame_number } */
219 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, true, 1},
220 };
221 QueueMessages(data, arraysize(data));
222
223 ASSERT_TRUE(promises_[0]);
224 EXPECT_TRUE(DirectSendMessages().empty());
225 EXPECT_FALSE(frame_swap_message_queue_->Empty());
226 EXPECT_TRUE(NextSwapMessages().empty());
227
228 CleanupPromises();
229 }
230
231 TEST_F(QueueMessageSwapPromiseTest,
232 VisualStateQueuesMessageWhenOtherMessageAlreadyQueued) {
233 QueueMessageData data[] = {
234 /* { policy, commit_requested, source_frame_number } */
235 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, true, 1},
236 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, true, 1},
237 };
238 QueueMessages(data, arraysize(data));
239
240 EXPECT_TRUE(DirectSendMessages().empty());
241 EXPECT_FALSE(frame_swap_message_queue_->Empty());
242 EXPECT_FALSE(NextSwapHasMessage(messages_[1]));
243
244 CleanupPromises();
245 }
246
247 TEST_F(QueueMessageSwapPromiseTest, VisualStateSwapPromiseDidSwap) {
248 QueueMessageData data[] = {
249 /* { policy, commit_requested, source_frame_number } */
250 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, true, 1},
251 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, false, 1},
252 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, false, 2},
253 };
254 QueueMessages(data, arraysize(data));
255
256 promises_[0]->DidSwap(NULL);
257 ASSERT_FALSE(promises_[1]);
258 ScopedVector<IPC::Message> messages;
259 messages.swap(NextSwapMessages());
260 EXPECT_EQ(2u, messages.size());
261 EXPECT_TRUE(ContainsMessage(messages, messages_[0]));
262 EXPECT_TRUE(ContainsMessage(messages, messages_[1]));
263 EXPECT_FALSE(ContainsMessage(messages, messages_[2]));
264
265 promises_[2]->DidSwap(NULL);
266 messages.swap(NextSwapMessages());
267 EXPECT_EQ(1u, messages.size());
268 EXPECT_TRUE(ContainsMessage(messages, messages_[2]));
269
270 EXPECT_TRUE(DirectSendMessages().empty());
271 EXPECT_TRUE(NextSwapMessages().empty());
272 EXPECT_TRUE(frame_swap_message_queue_->Empty());
273 }
274
275 void QueueMessageSwapPromiseTest::VisualStateSwapPromiseDidNotSwap(
276 cc::SwapPromise::DidNotSwapReason reason) {
277 QueueMessageData data[] = {
278 /* { policy, commit_requested, source_frame_number } */
279 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, true, 1},
280 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, false, 1},
281 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, false, 2},
282 };
283 QueueMessages(data, arraysize(data));
284
285 promises_[0]->DidNotSwap(reason);
286 ASSERT_FALSE(promises_[1]);
287 EXPECT_TRUE(NextSwapMessages().empty());
288 EXPECT_EQ(2u, DirectSendMessages().size());
289 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[0]));
290 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[1]));
291 EXPECT_FALSE(ContainsMessage(DirectSendMessages(), messages_[2]));
292
293 promises_[2]->DidNotSwap(reason);
294 EXPECT_TRUE(NextSwapMessages().empty());
295 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[2]));
296
297 EXPECT_TRUE(NextSwapMessages().empty());
298 EXPECT_TRUE(frame_swap_message_queue_->Empty());
299 }
300
301 TEST_F(QueueMessageSwapPromiseTest, VisalStateSwapPromiseDidNotSwapNoUpdate) {
302 VisualStateSwapPromiseDidNotSwap(cc::SwapPromise::COMMIT_NO_UPDATE);
303 }
304
305 TEST_F(QueueMessageSwapPromiseTest,
306 VisalStateSwapPromiseDidNotSwapCommitFails) {
307 VisualStateSwapPromiseDidNotSwap(cc::SwapPromise::COMMIT_FAILS);
308 }
309
310 TEST_F(QueueMessageSwapPromiseTest, VisalStateSwapPromiseDidNotSwapSwapFails) {
311 VisualStateSwapPromiseDidNotSwap(cc::SwapPromise::SWAP_FAILS);
312 }
313
314 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698