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

Side by Side Diff: content/renderer/gpu/frame_swap_message_queue_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/frame_swap_message_queue.h"
6 #include "ipc/ipc_message.h"
7 #include "testing/gtest/include/gtest/gtest.h"
8
9 namespace content {
10
11 class FrameSwapMessageQueueTest : public testing::Test {
12 public:
13 FrameSwapMessageQueueTest()
14 : first_message_(41, 1, IPC::Message::PRIORITY_NORMAL),
15 second_message_(42, 2, IPC::Message::PRIORITY_NORMAL),
16 third_message_(43, 3, IPC::Message::PRIORITY_NORMAL),
17 queue_(new FrameSwapMessageQueue()) {}
18
19 protected:
20 void QueueNextSwapMessage(scoped_ptr<IPC::Message> msg) {
21 queue_->QueueMessageForFrame(
22 MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 0, msg.Pass(), NULL);
23 }
24
25 void QueueNextSwapMessage(scoped_ptr<IPC::Message> msg, bool* first) {
26 queue_->QueueMessageForFrame(
27 MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 0, msg.Pass(), first);
28 }
29
30 void QueueUniqueMessage(scoped_ptr<IPC::Message> msg) {
31 queue_->QueueMessageForFrame(
32 MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP_UNIQUE, 0, msg.Pass(), NULL);
33 }
34
35 void QueueVisualStateMessage(int source_frame_number,
36 scoped_ptr<IPC::Message> msg) {
37 queue_->QueueMessageForFrame(MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE,
38 source_frame_number,
39 msg.Pass(),
40 NULL);
41 }
42
43 void QueueVisualStateMessage(int source_frame_number,
44 scoped_ptr<IPC::Message> msg,
45 bool* first) {
46 queue_->QueueMessageForFrame(MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE,
47 source_frame_number,
48 msg.Pass(),
49 first);
50 }
51
52 void DrainMessages(int source_frame_number,
53 ScopedVector<IPC::Message>* messages) {
54 messages->clear();
55 queue_->DidSwap(source_frame_number);
56 scoped_ptr<FrameSwapMessageQueue::SendMessageScope> send_message_scope =
57 queue_->AcquireSendMessageScope();
58 queue_->DrainMessages(messages);
59 }
60
61 bool HasMessageForId(const ScopedVector<IPC::Message>& messages,
62 int routing_id) {
63 for (ScopedVector<IPC::Message>::const_iterator i = messages.begin();
64 i != messages.end();
65 ++i) {
66 if ((*i)->routing_id() == routing_id)
67 return true;
68 }
69 return false;
70 }
71
72 scoped_ptr<IPC::Message> CloneMessage(const IPC::Message& other) {
73 return make_scoped_ptr(new IPC::Message(other)).Pass();
74 }
75
76 void TestDidNotSwap(cc::SwapPromise::DidNotSwapReason reason);
77
78 IPC::Message first_message_;
79 IPC::Message second_message_;
80 IPC::Message third_message_;
81 scoped_refptr<FrameSwapMessageQueue> queue_;
82 };
83
84 TEST_F(FrameSwapMessageQueueTest, TestEmptyQueueDrain) {
85 ScopedVector<IPC::Message> messages;
86
87 DrainMessages(0, &messages);
88 ASSERT_TRUE(messages.empty());
89 }
90
91 TEST_F(FrameSwapMessageQueueTest, TestEmpty) {
92 ScopedVector<IPC::Message> messages;
93 ASSERT_TRUE(queue_->Empty());
94 QueueNextSwapMessage(CloneMessage(first_message_));
95 ASSERT_FALSE(queue_->Empty());
96 DrainMessages(0, &messages);
97 ASSERT_TRUE(queue_->Empty());
98 QueueVisualStateMessage(1, CloneMessage(first_message_));
99 ASSERT_FALSE(queue_->Empty());
100 queue_->DidSwap(1);
101 ASSERT_FALSE(queue_->Empty());
102 }
103
104 TEST_F(FrameSwapMessageQueueTest, TestQueueMessageFirst) {
105 ScopedVector<IPC::Message> messages;
106 bool visual_state_first = false;
107 bool next_swap_first = false;
108
109 QueueVisualStateMessage(1, CloneMessage(first_message_), &visual_state_first);
110 ASSERT_TRUE(visual_state_first);
111 QueueVisualStateMessage(
112 1, CloneMessage(second_message_), &visual_state_first);
113 ASSERT_FALSE(visual_state_first);
114 QueueVisualStateMessage(2, CloneMessage(first_message_), &visual_state_first);
115 ASSERT_TRUE(visual_state_first);
116
117 QueueNextSwapMessage(CloneMessage(first_message_), &next_swap_first);
118 ASSERT_TRUE(next_swap_first);
119 QueueNextSwapMessage(CloneMessage(first_message_), &next_swap_first);
120 ASSERT_FALSE(next_swap_first);
121
122 DrainMessages(4, &messages);
123 QueueVisualStateMessage(4, CloneMessage(first_message_), &visual_state_first);
124 ASSERT_TRUE(visual_state_first);
125 }
126
127 TEST_F(FrameSwapMessageQueueTest, TestQueuedMessageSentWithNextFrame) {
128 ScopedVector<IPC::Message> messages;
129
130 DrainMessages(1, &messages);
131 QueueNextSwapMessage(CloneMessage(first_message_));
132 DrainMessages(2, &messages);
133 ASSERT_EQ(1u, messages.size());
134 ASSERT_EQ(first_message_.routing_id(), messages.front()->routing_id());
135 messages.clear();
136
137 DrainMessages(2, &messages);
138 ASSERT_TRUE(messages.empty());
139 }
140
141 TEST_F(FrameSwapMessageQueueTest, TestQueueMessageSentWithCurrentFrame) {
142 ScopedVector<IPC::Message> messages;
143
144 DrainMessages(1, &messages);
145 QueueNextSwapMessage(CloneMessage(first_message_));
146 DrainMessages(1, &messages);
147 ASSERT_EQ(1u, messages.size());
148 ASSERT_EQ(first_message_.routing_id(), messages.front()->routing_id());
149 messages.clear();
150
151 DrainMessages(1, &messages);
152 ASSERT_TRUE(messages.empty());
153 }
154
155 TEST_F(FrameSwapMessageQueueTest, TestDrainsMessagesForCorrespondingFrames) {
156 ScopedVector<IPC::Message> messages;
157
158 QueueVisualStateMessage(1, CloneMessage(first_message_));
159 QueueVisualStateMessage(2, CloneMessage(second_message_));
160 QueueVisualStateMessage(3, CloneMessage(third_message_));
161 DrainMessages(0, &messages);
162 ASSERT_TRUE(messages.empty());
163
164 DrainMessages(2, &messages);
165 ASSERT_EQ(2u, messages.size());
166 ASSERT_TRUE(HasMessageForId(messages, first_message_.routing_id()));
167 ASSERT_TRUE(HasMessageForId(messages, second_message_.routing_id()));
168 messages.clear();
169
170 DrainMessages(2, &messages);
171 ASSERT_TRUE(messages.empty());
172
173 DrainMessages(5, &messages);
174 ASSERT_EQ(1u, messages.size());
175 ASSERT_EQ(third_message_.routing_id(), messages.front()->routing_id());
176 }
177
178 TEST_F(FrameSwapMessageQueueTest, TestQueueMessagePreservesFifoOrdering) {
179 ScopedVector<IPC::Message> messages;
180
181 QueueNextSwapMessage(CloneMessage(first_message_));
182 QueueNextSwapMessage(CloneMessage(second_message_));
183 DrainMessages(1, &messages);
184 ASSERT_EQ(2u, messages.size());
185 ASSERT_EQ(first_message_.routing_id(), messages[0]->routing_id());
186 ASSERT_EQ(second_message_.routing_id(), messages[1]->routing_id());
187 }
188
189 TEST_F(FrameSwapMessageQueueTest, TestQueueUniqueMessage) {
190 ScopedVector<IPC::Message> messages;
191
192 QueueUniqueMessage(CloneMessage(third_message_));
193 QueueUniqueMessage(CloneMessage(first_message_));
194 QueueUniqueMessage(CloneMessage(second_message_));
195 QueueUniqueMessage(CloneMessage(third_message_));
196 DrainMessages(1, &messages);
197 ASSERT_EQ(3u, messages.size());
198 ASSERT_EQ(first_message_.routing_id(), messages[0]->routing_id());
199 ASSERT_EQ(second_message_.routing_id(), messages[1]->routing_id());
200 ASSERT_EQ(third_message_.routing_id(), messages[2]->routing_id());
201 }
202
203 void FrameSwapMessageQueueTest::TestDidNotSwap(
204 cc::SwapPromise::DidNotSwapReason reason) {
205 ScopedVector<IPC::Message> messages;
206
207 QueueNextSwapMessage(CloneMessage(first_message_));
208 QueueVisualStateMessage(2, CloneMessage(second_message_));
209 QueueVisualStateMessage(3, CloneMessage(third_message_));
210
211 queue_->DidNotSwap(2, cc::SwapPromise::COMMIT_NO_UPDATE, &messages);
212 ASSERT_EQ(2u, messages.size());
213 ASSERT_TRUE(HasMessageForId(messages, first_message_.routing_id()));
214 ASSERT_TRUE(HasMessageForId(messages, second_message_.routing_id()));
215 messages.clear();
216
217 queue_->DidNotSwap(3, cc::SwapPromise::COMMIT_NO_UPDATE, &messages);
218 ASSERT_EQ(1u, messages.size());
219 ASSERT_TRUE(HasMessageForId(messages, third_message_.routing_id()));
220 messages.clear();
221 }
222
223 TEST_F(FrameSwapMessageQueueTest, TestDidNotSwapNoUpdate) {
224 TestDidNotSwap(cc::SwapPromise::COMMIT_NO_UPDATE);
225 }
226
227 TEST_F(FrameSwapMessageQueueTest, TestDidNotSwapSwapFails) {
228 TestDidNotSwap(cc::SwapPromise::SWAP_FAILS);
229 }
230
231 TEST_F(FrameSwapMessageQueueTest, TestDidNotSwapCommitFails) {
232 ScopedVector<IPC::Message> messages;
233
234 QueueNextSwapMessage(CloneMessage(first_message_));
235 QueueVisualStateMessage(2, CloneMessage(second_message_));
236 QueueVisualStateMessage(3, CloneMessage(third_message_));
237
238 queue_->DidNotSwap(2, cc::SwapPromise::COMMIT_FAILS, &messages);
239 ASSERT_EQ(1u, messages.size());
240 ASSERT_TRUE(HasMessageForId(messages, second_message_.routing_id()));
241 messages.clear();
242
243 queue_->DidNotSwap(3, cc::SwapPromise::COMMIT_FAILS, &messages);
244 ASSERT_EQ(1u, messages.size());
245 ASSERT_TRUE(HasMessageForId(messages, third_message_.routing_id()));
246 messages.clear();
247
248 DrainMessages(1, &messages);
249 ASSERT_EQ(1u, messages.size());
250 ASSERT_TRUE(HasMessageForId(messages, first_message_.routing_id()));
251 }
252
253 class NotifiesDeletionMessage : public IPC::Message {
254 public:
255 NotifiesDeletionMessage(bool* deleted, const IPC::Message& other)
256 : IPC::Message(other), deleted_(deleted) {}
257 virtual ~NotifiesDeletionMessage() { *deleted_ = true; }
258
259 private:
260 bool* deleted_;
261 };
262
263 TEST_F(FrameSwapMessageQueueTest, TestDeletesMessage) {
264 bool message_deleted = false;
265 QueueNextSwapMessage(make_scoped_ptr(new NotifiesDeletionMessage(
266 &message_deleted, first_message_))
267 .PassAs<IPC::Message>());
268 queue_ = NULL;
269 ASSERT_TRUE(message_deleted);
270 }
271
272 TEST_F(FrameSwapMessageQueueTest, TestDeletesMessageQueuedForFrame) {
273 bool message_deleted = false;
274 QueueVisualStateMessage(1,
275 make_scoped_ptr(new NotifiesDeletionMessage(
276 &message_deleted, first_message_))
277 .PassAs<IPC::Message>());
278 queue_ = NULL;
279 ASSERT_TRUE(message_deleted);
280 }
281
282 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698