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

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: introduce a separate queue for with_swap messages Created 6 years, 6 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 class QueueMessageSwapPromiseTest : public testing::Test {
43 public:
44 QueueMessageSwapPromiseTest()
45 : frame_swap_message_queue_(new FrameSwapMessageQueue()),
46 sync_message_filter_(new TestSyncMessageFilter()),
47 message_a_(42, 0, IPC::Message::PRIORITY_NORMAL),
48 message_b_(23, 0, IPC::Message::PRIORITY_NORMAL),
49 message_c_(37, 0, IPC::Message::PRIORITY_NORMAL) {}
50
51 virtual ~QueueMessageSwapPromiseTest() {}
52
53 scoped_ptr<cc::SwapPromise> QueueMessageImpl(IPC::Message* msg,
54 MessageDeliveryPolicy policy,
55 bool commit_requested,
56 int source_frame_number) {
57 return TestRenderWidget::QueueMessageImpl(msg,
58 policy,
59 frame_swap_message_queue_,
60 sync_message_filter_,
61 commit_requested,
62 source_frame_number).Pass();
63 }
64
65 ScopedVector<IPC::Message>& DirectSendMessages() {
66 return sync_message_filter_->messages();
67 }
68
69 ScopedVector<IPC::Message>& NextSwapMessages() {
70 next_swap_messages_.clear();
71 scoped_ptr<FrameSwapMessageQueue::SendMessageScope> send_message_scope =
72 frame_swap_message_queue_->AcquireSendMessageScope();
73 frame_swap_message_queue_->DrainMessages(&next_swap_messages_);
74 return next_swap_messages_;
75 }
76
77 bool ContainsMessage(const ScopedVector<IPC::Message>& messages,
78 const IPC::Message& message) {
79 if (messages.empty())
80 return false;
81 for (ScopedVector<IPC::Message>::const_iterator i = messages.begin();
82 i != messages.end();
83 ++i) {
84 if ((*i)->routing_id() == message.routing_id())
85 return true;
86 }
87 return false;
88 }
89
90 bool NextSwapHasMessage(const IPC::Message& message) {
91 return ContainsMessage(NextSwapMessages(), message);
92 }
93
94 protected:
95 scoped_refptr<FrameSwapMessageQueue> frame_swap_message_queue_;
96 scoped_refptr<TestSyncMessageFilter> sync_message_filter_;
97 IPC::Message message_a_;
98 IPC::Message message_b_;
99 IPC::Message message_c_;
100
101 private:
102 ScopedVector<IPC::Message> next_swap_messages_;
103
104 DISALLOW_COPY_AND_ASSIGN(QueueMessageSwapPromiseTest);
105 };
106
107 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySchedulesMessageForNextSwap) {
108 scoped_ptr<cc::SwapPromise> swap_promise =
109 QueueMessageImpl(new IPC::Message(message_a_),
110 MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP,
111 false, /* commit_requested */
112 1 /* source_frame_number */);
113 ASSERT_TRUE(swap_promise);
114 ASSERT_TRUE(DirectSendMessages().empty());
115 ASSERT_FALSE(frame_swap_message_queue_->Empty());
116 ASSERT_TRUE(NextSwapHasMessage(message_a_));
117
118 swap_promise->DidSwap(NULL);
119 }
120
121 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicyNeedsAtMostOnePromise) {
122 scoped_ptr<cc::SwapPromise> swap_promise_a =
123 QueueMessageImpl(new IPC::Message(message_a_),
124 MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP,
125 false, /* commit_requested */
126 1 /* source_frame_number */);
127 scoped_ptr<cc::SwapPromise> swap_promise_b =
128 QueueMessageImpl(new IPC::Message(message_b_),
129 MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP,
130 false, /* commit_requested */
131 1 /* source_frame_number */);
132 ASSERT_TRUE(swap_promise_a);
133 ASSERT_FALSE(swap_promise_b);
134
135 swap_promise_a->DidSwap(NULL);
136 }
137
138 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySendsMessageOnNoUpdate) {
139 scoped_ptr<cc::SwapPromise> swap_promise =
140 QueueMessageImpl(new IPC::Message(message_a_),
141 MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP,
142 false, /* commit_requested */
143 1 /* source_frame_number */);
144 swap_promise->DidNotSwap(cc::SwapPromise::COMMIT_NO_UPDATE);
145 ASSERT_TRUE(ContainsMessage(DirectSendMessages(), message_a_));
146 ASSERT_TRUE(NextSwapMessages().empty());
147 ASSERT_TRUE(frame_swap_message_queue_->Empty());
148 }
149
150 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySendsMessageOnSwapFails) {
151 scoped_ptr<cc::SwapPromise> swap_promise =
152 QueueMessageImpl(new IPC::Message(message_a_),
153 MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP,
154 false, /* commit_requested */
155 1 /* source_frame_number */);
156 swap_promise->DidNotSwap(cc::SwapPromise::SWAP_FAILS);
157 ASSERT_TRUE(ContainsMessage(DirectSendMessages(), message_a_));
158 ASSERT_TRUE(NextSwapMessages().empty());
159 ASSERT_TRUE(frame_swap_message_queue_->Empty());
160 }
161
162 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicyRetainsMessageOnCommitFails) {
163 scoped_ptr<cc::SwapPromise> swap_promise =
164 QueueMessageImpl(new IPC::Message(message_a_),
165 MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP,
166 false, /* commit_requested */
167 1 /* source_frame_number */);
168 swap_promise->DidNotSwap(cc::SwapPromise::COMMIT_FAILS);
169 ASSERT_TRUE(DirectSendMessages().empty());
170 ASSERT_FALSE(frame_swap_message_queue_->Empty());
171 ASSERT_TRUE(NextSwapHasMessage(message_a_));
172 }
173
174 TEST_F(QueueMessageSwapPromiseTest, VisualStateDirectSend) {
175 scoped_ptr<cc::SwapPromise> swap_promise =
176 QueueMessageImpl(new IPC::Message(message_a_),
177 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE,
178 false, /* commit_requested */
179 1 /* source_frame_number */);
180 ASSERT_FALSE(swap_promise);
181 ASSERT_FALSE(DirectSendMessages().empty());
182 ASSERT_TRUE(frame_swap_message_queue_->Empty());
183 ASSERT_TRUE(NextSwapMessages().empty());
184 }
185
186 TEST_F(QueueMessageSwapPromiseTest,
187 VisualStateQueuesMessageWhenCommitRequested) {
188 scoped_ptr<cc::SwapPromise> swap_promise =
189 QueueMessageImpl(new IPC::Message(message_a_),
190 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE,
191 true, /* commit_requested */
192 1 /* source_frame_number */);
193 ASSERT_TRUE(swap_promise);
194 ASSERT_TRUE(DirectSendMessages().empty());
195 ASSERT_FALSE(frame_swap_message_queue_->Empty());
196 ASSERT_TRUE(NextSwapMessages().empty());
197
198 swap_promise->DidSwap(NULL);
199 }
200
201 TEST_F(QueueMessageSwapPromiseTest,
202 VisualStateQueuesMessageWhenOtherMessageAlreadyQueued) {
203 scoped_ptr<cc::SwapPromise> swap_promise_a =
204 QueueMessageImpl(new IPC::Message(),
205 MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP,
206 false, /* commit_requested */
207 1 /* source_frame_number */);
208 scoped_ptr<cc::SwapPromise> swap_promise_b =
209 QueueMessageImpl(new IPC::Message(message_b_),
210 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE,
211 false, /* commit_requested */
212 1 /* source_frame_number */);
213 ASSERT_TRUE(DirectSendMessages().empty());
214 ASSERT_FALSE(frame_swap_message_queue_->Empty());
215 ASSERT_FALSE(NextSwapHasMessage(message_b_));
216
217 swap_promise_a->DidSwap(NULL);
218 swap_promise_b->DidSwap(NULL);
219 }
220
221 TEST_F(QueueMessageSwapPromiseTest, VisalStateSwapPromiseDidSwap) {
222 scoped_ptr<cc::SwapPromise> swap_promise_a =
223 QueueMessageImpl(new IPC::Message(message_a_),
224 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE,
225 true, /* commit_requested */
226 1 /* source_frame_number */);
227 scoped_ptr<cc::SwapPromise> swap_promise_b =
228 QueueMessageImpl(new IPC::Message(message_b_),
229 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE,
230 false, /* commit_requested */
231 1 /* source_frame_number */);
232 scoped_ptr<cc::SwapPromise> swap_promise_c =
233 QueueMessageImpl(new IPC::Message(message_c_),
234 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE,
235 false, /* commit_requested */
236 2 /* source_frame_number */);
237
238 swap_promise_a->DidSwap(NULL);
239 ASSERT_FALSE(swap_promise_b);
240 ScopedVector<IPC::Message> messages;
241 messages.swap(NextSwapMessages());
242 ASSERT_EQ(2u, messages.size());
243 ContainsMessage(messages, message_a_);
244 ContainsMessage(messages, message_b_);
245
246 swap_promise_c->DidSwap(NULL);
247 messages.swap(NextSwapMessages());
248 ASSERT_EQ(1u, messages.size());
249 ContainsMessage(messages, message_c_);
250
251 ASSERT_TRUE(DirectSendMessages().empty());
252 ASSERT_TRUE(NextSwapMessages().empty());
253 ASSERT_TRUE(frame_swap_message_queue_->Empty());
254 }
255
256 TEST_F(QueueMessageSwapPromiseTest, VisalStateSwapPromiseDidNotSwap) {
257 scoped_ptr<cc::SwapPromise> swap_promise_a =
258 QueueMessageImpl(new IPC::Message(message_a_),
259 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE,
260 true, /* commit_requested */
261 1 /* source_frame_number */);
262 scoped_ptr<cc::SwapPromise> swap_promise_b =
263 QueueMessageImpl(new IPC::Message(message_b_),
264 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE,
265 false, /* commit_requested */
266 1 /* source_frame_number */);
267 scoped_ptr<cc::SwapPromise> swap_promise_c =
268 QueueMessageImpl(new IPC::Message(message_c_),
269 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE,
270 false, /* commit_requested */
271 2 /* source_frame_number */);
272
273 swap_promise_a->DidSwap(NULL);
274 ASSERT_FALSE(swap_promise_b);
275 ScopedVector<IPC::Message> messages;
276 messages.swap(NextSwapMessages());
277 ASSERT_EQ(2u, messages.size());
278 ContainsMessage(messages, message_a_);
279 ContainsMessage(messages, message_b_);
280
281 swap_promise_c->DidSwap(NULL);
282 messages.swap(NextSwapMessages());
283 ASSERT_EQ(1u, messages.size());
284 ContainsMessage(messages, message_c_);
285
286 ASSERT_TRUE(DirectSendMessages().empty());
287 ASSERT_TRUE(NextSwapMessages().empty());
288 ASSERT_TRUE(frame_swap_message_queue_->Empty());
289 }
290
291 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698