OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/gpu/frame_swap_message_queue.h" | 5 #include "content/renderer/gpu/frame_swap_message_queue.h" |
6 #include "ipc/ipc_message.h" | 6 #include "ipc/ipc_message.h" |
7 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
8 | 8 |
9 namespace content { | 9 namespace content { |
10 | 10 |
11 class FrameSwapMessageQueueTest : public testing::Test { | 11 class FrameSwapMessageQueueTest : public testing::Test { |
12 public: | 12 public: |
13 FrameSwapMessageQueueTest() | 13 FrameSwapMessageQueueTest() |
14 : first_message_(41, 1, IPC::Message::PRIORITY_NORMAL), | 14 : first_message_(41, 0xdecaf001, IPC::Message::PRIORITY_NORMAL), |
15 second_message_(42, 2, IPC::Message::PRIORITY_NORMAL), | 15 second_message_(42, 0xdecaf002, IPC::Message::PRIORITY_NORMAL), |
16 third_message_(43, 3, IPC::Message::PRIORITY_NORMAL), | 16 third_message_(43, 0xdecaf003, IPC::Message::PRIORITY_NORMAL), |
17 queue_(new FrameSwapMessageQueue()) {} | 17 queue_(new FrameSwapMessageQueue()) {} |
18 | 18 |
19 protected: | 19 protected: |
20 void QueueNextSwapMessage(scoped_ptr<IPC::Message> msg) { | 20 void QueueNextSwapMessage(scoped_ptr<IPC::Message> msg) { |
21 queue_->QueueMessageForFrame( | 21 queue_->QueueMessageForFrame( |
22 MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 0, msg.Pass(), NULL); | 22 MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 0, msg.Pass(), NULL); |
23 } | 23 } |
24 | 24 |
25 void QueueNextSwapMessage(scoped_ptr<IPC::Message> msg, bool* first) { | 25 void QueueNextSwapMessage(scoped_ptr<IPC::Message> msg, bool* first) { |
26 queue_->QueueMessageForFrame( | 26 queue_->QueueMessageForFrame( |
(...skipping 19 matching lines...) Expand all Loading... |
46 | 46 |
47 void DrainMessages(int source_frame_number, | 47 void DrainMessages(int source_frame_number, |
48 ScopedVector<IPC::Message>* messages) { | 48 ScopedVector<IPC::Message>* messages) { |
49 messages->clear(); | 49 messages->clear(); |
50 queue_->DidSwap(source_frame_number); | 50 queue_->DidSwap(source_frame_number); |
51 scoped_ptr<FrameSwapMessageQueue::SendMessageScope> send_message_scope = | 51 scoped_ptr<FrameSwapMessageQueue::SendMessageScope> send_message_scope = |
52 queue_->AcquireSendMessageScope(); | 52 queue_->AcquireSendMessageScope(); |
53 queue_->DrainMessages(messages); | 53 queue_->DrainMessages(messages); |
54 } | 54 } |
55 | 55 |
| 56 int ExpectedMessageCount(const ScopedVector<IPC::Message>& messages) { |
| 57 return std::count_if(messages.begin(), messages.end(), |
| 58 [](IPC::Message* msg) -> bool { |
| 59 return (msg->type() & 0xfffff000) == 0xdecaf000; |
| 60 }); |
| 61 } |
| 62 |
56 bool HasMessageForId(const ScopedVector<IPC::Message>& messages, | 63 bool HasMessageForId(const ScopedVector<IPC::Message>& messages, |
57 int routing_id) { | 64 int routing_id) { |
58 for (ScopedVector<IPC::Message>::const_iterator i = messages.begin(); | 65 for (ScopedVector<IPC::Message>::const_iterator i = messages.begin(); |
59 i != messages.end(); | 66 i != messages.end(); |
60 ++i) { | 67 ++i) { |
61 if ((*i)->routing_id() == routing_id) | 68 if ((*i)->routing_id() == routing_id) |
62 return true; | 69 return true; |
63 } | 70 } |
64 return false; | 71 return false; |
65 } | 72 } |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 TestDrainsVisualStateMessagesForCorrespondingFrames) { | 164 TestDrainsVisualStateMessagesForCorrespondingFrames) { |
158 ScopedVector<IPC::Message> messages; | 165 ScopedVector<IPC::Message> messages; |
159 | 166 |
160 QueueVisualStateMessage(1, CloneMessage(first_message_)); | 167 QueueVisualStateMessage(1, CloneMessage(first_message_)); |
161 QueueVisualStateMessage(2, CloneMessage(second_message_)); | 168 QueueVisualStateMessage(2, CloneMessage(second_message_)); |
162 QueueVisualStateMessage(3, CloneMessage(third_message_)); | 169 QueueVisualStateMessage(3, CloneMessage(third_message_)); |
163 DrainMessages(0, &messages); | 170 DrainMessages(0, &messages); |
164 ASSERT_TRUE(messages.empty()); | 171 ASSERT_TRUE(messages.empty()); |
165 | 172 |
166 DrainMessages(2, &messages); | 173 DrainMessages(2, &messages); |
167 ASSERT_EQ(2u, messages.size()); | 174 ASSERT_EQ(2, ExpectedMessageCount(messages)); |
168 ASSERT_TRUE(HasMessageForId(messages, first_message_.routing_id())); | 175 ASSERT_TRUE(HasMessageForId(messages, first_message_.routing_id())); |
169 ASSERT_TRUE(HasMessageForId(messages, second_message_.routing_id())); | 176 ASSERT_TRUE(HasMessageForId(messages, second_message_.routing_id())); |
170 messages.clear(); | 177 messages.clear(); |
171 | 178 |
172 DrainMessages(2, &messages); | 179 DrainMessages(2, &messages); |
173 ASSERT_TRUE(messages.empty()); | 180 ASSERT_TRUE(messages.empty()); |
174 | 181 |
175 DrainMessages(5, &messages); | 182 DrainMessages(5, &messages); |
176 ASSERT_EQ(1u, messages.size()); | 183 ASSERT_EQ(1, ExpectedMessageCount(messages)); |
177 ASSERT_EQ(third_message_.routing_id(), messages.front()->routing_id()); | 184 ASSERT_EQ(third_message_.routing_id(), messages.front()->routing_id()); |
178 } | 185 } |
179 | 186 |
180 TEST_F(FrameSwapMessageQueueTest, | 187 TEST_F(FrameSwapMessageQueueTest, |
181 TestQueueNextSwapMessagePreservesFifoOrdering) { | 188 TestQueueNextSwapMessagePreservesFifoOrdering) { |
182 ScopedVector<IPC::Message> messages; | 189 ScopedVector<IPC::Message> messages; |
183 | 190 |
184 QueueNextSwapMessage(CloneMessage(first_message_)); | 191 QueueNextSwapMessage(CloneMessage(first_message_)); |
185 QueueNextSwapMessage(CloneMessage(second_message_)); | 192 QueueNextSwapMessage(CloneMessage(second_message_)); |
186 DrainMessages(1, &messages); | 193 DrainMessages(1, &messages); |
187 ASSERT_EQ(2u, messages.size()); | 194 ASSERT_EQ(2u, messages.size()); |
188 ASSERT_EQ(first_message_.routing_id(), messages[0]->routing_id()); | 195 ASSERT_EQ(first_message_.routing_id(), messages[0]->routing_id()); |
189 ASSERT_EQ(second_message_.routing_id(), messages[1]->routing_id()); | 196 ASSERT_EQ(second_message_.routing_id(), messages[1]->routing_id()); |
190 } | 197 } |
191 | 198 |
192 TEST_F(FrameSwapMessageQueueTest, | 199 TEST_F(FrameSwapMessageQueueTest, |
193 TestQueueVisualStateMessagePreservesFifoOrdering) { | 200 TestQueueVisualStateMessagePreservesFifoOrdering) { |
194 ScopedVector<IPC::Message> messages; | 201 ScopedVector<IPC::Message> messages; |
195 | 202 |
196 QueueVisualStateMessage(1, CloneMessage(first_message_)); | 203 QueueVisualStateMessage(1, CloneMessage(first_message_)); |
197 QueueVisualStateMessage(1, CloneMessage(second_message_)); | 204 QueueVisualStateMessage(1, CloneMessage(second_message_)); |
198 DrainMessages(1, &messages); | 205 DrainMessages(1, &messages); |
199 ASSERT_EQ(2u, messages.size()); | 206 ASSERT_EQ(2, ExpectedMessageCount(messages)); |
200 ASSERT_EQ(first_message_.routing_id(), messages[0]->routing_id()); | 207 ASSERT_EQ(first_message_.routing_id(), messages[0]->routing_id()); |
201 ASSERT_EQ(second_message_.routing_id(), messages[1]->routing_id()); | 208 ASSERT_EQ(second_message_.routing_id(), messages[1]->routing_id()); |
202 } | 209 } |
203 | 210 |
204 void FrameSwapMessageQueueTest::TestDidNotSwap( | 211 void FrameSwapMessageQueueTest::TestDidNotSwap( |
205 cc::SwapPromise::DidNotSwapReason reason) { | 212 cc::SwapPromise::DidNotSwapReason reason) { |
206 ScopedVector<IPC::Message> messages; | 213 ScopedVector<IPC::Message> messages; |
207 | 214 |
208 QueueNextSwapMessage(CloneMessage(first_message_)); | 215 QueueNextSwapMessage(CloneMessage(first_message_)); |
209 QueueVisualStateMessage(2, CloneMessage(second_message_)); | 216 QueueVisualStateMessage(2, CloneMessage(second_message_)); |
210 QueueVisualStateMessage(3, CloneMessage(third_message_)); | 217 QueueVisualStateMessage(3, CloneMessage(third_message_)); |
211 | 218 |
212 queue_->DidNotSwap(2, cc::SwapPromise::COMMIT_NO_UPDATE, &messages); | 219 queue_->DidNotSwap(2, cc::SwapPromise::COMMIT_NO_UPDATE, &messages); |
213 ASSERT_EQ(2u, messages.size()); | 220 ASSERT_EQ(2, ExpectedMessageCount(messages)); |
214 ASSERT_TRUE(HasMessageForId(messages, first_message_.routing_id())); | 221 ASSERT_TRUE(HasMessageForId(messages, first_message_.routing_id())); |
215 ASSERT_TRUE(HasMessageForId(messages, second_message_.routing_id())); | 222 ASSERT_TRUE(HasMessageForId(messages, second_message_.routing_id())); |
216 messages.clear(); | 223 messages.clear(); |
217 | 224 |
218 queue_->DidNotSwap(3, cc::SwapPromise::COMMIT_NO_UPDATE, &messages); | 225 queue_->DidNotSwap(3, cc::SwapPromise::COMMIT_NO_UPDATE, &messages); |
219 ASSERT_EQ(1u, messages.size()); | 226 ASSERT_EQ(1, ExpectedMessageCount(messages)); |
220 ASSERT_TRUE(HasMessageForId(messages, third_message_.routing_id())); | 227 ASSERT_TRUE(HasMessageForId(messages, third_message_.routing_id())); |
221 messages.clear(); | 228 messages.clear(); |
222 } | 229 } |
223 | 230 |
224 TEST_F(FrameSwapMessageQueueTest, TestDidNotSwapNoUpdate) { | 231 TEST_F(FrameSwapMessageQueueTest, TestDidNotSwapNoUpdate) { |
225 TestDidNotSwap(cc::SwapPromise::COMMIT_NO_UPDATE); | 232 TestDidNotSwap(cc::SwapPromise::COMMIT_NO_UPDATE); |
226 } | 233 } |
227 | 234 |
228 TEST_F(FrameSwapMessageQueueTest, TestDidNotSwapSwapFails) { | 235 TEST_F(FrameSwapMessageQueueTest, TestDidNotSwapSwapFails) { |
229 TestDidNotSwap(cc::SwapPromise::SWAP_FAILS); | 236 TestDidNotSwap(cc::SwapPromise::SWAP_FAILS); |
230 } | 237 } |
231 | 238 |
232 TEST_F(FrameSwapMessageQueueTest, TestDidNotSwapCommitFails) { | 239 TEST_F(FrameSwapMessageQueueTest, TestDidNotSwapCommitFails) { |
233 ScopedVector<IPC::Message> messages; | 240 ScopedVector<IPC::Message> messages; |
234 | 241 |
235 QueueNextSwapMessage(CloneMessage(first_message_)); | 242 QueueNextSwapMessage(CloneMessage(first_message_)); |
236 QueueVisualStateMessage(2, CloneMessage(second_message_)); | 243 QueueVisualStateMessage(2, CloneMessage(second_message_)); |
237 QueueVisualStateMessage(3, CloneMessage(third_message_)); | 244 QueueVisualStateMessage(3, CloneMessage(third_message_)); |
238 | 245 |
239 queue_->DidNotSwap(2, cc::SwapPromise::COMMIT_FAILS, &messages); | 246 queue_->DidNotSwap(2, cc::SwapPromise::COMMIT_FAILS, &messages); |
240 ASSERT_EQ(1u, messages.size()); | 247 ASSERT_EQ(1, ExpectedMessageCount(messages)); |
241 ASSERT_TRUE(HasMessageForId(messages, second_message_.routing_id())); | 248 ASSERT_TRUE(HasMessageForId(messages, second_message_.routing_id())); |
242 messages.clear(); | 249 messages.clear(); |
243 | 250 |
244 queue_->DidNotSwap(3, cc::SwapPromise::COMMIT_FAILS, &messages); | 251 queue_->DidNotSwap(3, cc::SwapPromise::COMMIT_FAILS, &messages); |
245 ASSERT_EQ(1u, messages.size()); | 252 ASSERT_EQ(1, ExpectedMessageCount(messages)); |
246 ASSERT_TRUE(HasMessageForId(messages, third_message_.routing_id())); | 253 ASSERT_TRUE(HasMessageForId(messages, third_message_.routing_id())); |
247 messages.clear(); | 254 messages.clear(); |
248 | 255 |
249 DrainMessages(1, &messages); | 256 DrainMessages(1, &messages); |
250 ASSERT_EQ(1u, messages.size()); | 257 ASSERT_EQ(1, ExpectedMessageCount(messages)); |
251 ASSERT_TRUE(HasMessageForId(messages, first_message_.routing_id())); | 258 ASSERT_TRUE(HasMessageForId(messages, first_message_.routing_id())); |
252 } | 259 } |
253 | 260 |
254 class NotifiesDeletionMessage : public IPC::Message { | 261 class NotifiesDeletionMessage : public IPC::Message { |
255 public: | 262 public: |
256 NotifiesDeletionMessage(bool* deleted, const IPC::Message& other) | 263 NotifiesDeletionMessage(bool* deleted, const IPC::Message& other) |
257 : IPC::Message(other), deleted_(deleted) {} | 264 : IPC::Message(other), deleted_(deleted) {} |
258 ~NotifiesDeletionMessage() override { *deleted_ = true; } | 265 ~NotifiesDeletionMessage() override { *deleted_ = true; } |
259 | 266 |
260 private: | 267 private: |
(...skipping 21 matching lines...) Expand all Loading... |
282 bool message_deleted = false; | 289 bool message_deleted = false; |
283 QueueVisualStateMessage(1, | 290 QueueVisualStateMessage(1, |
284 make_scoped_ptr(new NotifiesDeletionMessage( | 291 make_scoped_ptr(new NotifiesDeletionMessage( |
285 &message_deleted, first_message_))); | 292 &message_deleted, first_message_))); |
286 queue_->DidSwap(1); | 293 queue_->DidSwap(1); |
287 queue_ = NULL; | 294 queue_ = NULL; |
288 ASSERT_TRUE(message_deleted); | 295 ASSERT_TRUE(message_deleted); |
289 } | 296 } |
290 | 297 |
291 } // namespace content | 298 } // namespace content |
OLD | NEW |