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

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

Issue 2899073006: Send FrameSwapMessageQueue's messages in QueueMessageSwapPromise (Closed)
Patch Set: Fixed memory leak Created 3 years, 7 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
OLDNEW
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/queue_message_swap_promise.h" 5 #include "content/renderer/gpu/queue_message_swap_promise.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <vector> 10 #include <vector>
11 11
12 #include "base/macros.h" 12 #include "base/macros.h"
13 #include "base/memory/ptr_util.h" 13 #include "base/memory/ptr_util.h"
14 #include "base/test/scoped_task_environment.h" 14 #include "base/test/scoped_task_environment.h"
15 #include "cc/output/swap_promise.h" 15 #include "cc/output/swap_promise.h"
16 #include "content/common/view_messages.h"
16 #include "content/renderer/gpu/frame_swap_message_queue.h" 17 #include "content/renderer/gpu/frame_swap_message_queue.h"
17 #include "content/renderer/gpu/render_widget_compositor.h" 18 #include "content/renderer/gpu/render_widget_compositor.h"
18 #include "content/renderer/render_widget.h" 19 #include "content/renderer/render_widget.h"
19 #include "content/test/mock_render_process.h" 20 #include "content/test/mock_render_process.h"
20 #include "ipc/ipc_message.h" 21 #include "ipc/ipc_message.h"
21 #include "ipc/ipc_sync_message_filter.h" 22 #include "ipc/ipc_sync_message_filter.h"
22 #include "ipc/ipc_test_sink.h" 23 #include "ipc/ipc_test_sink.h"
23 #include "testing/gtest/include/gtest/gtest.h" 24 #include "testing/gtest/include/gtest/gtest.h"
24 25
25 namespace content { 26 namespace content {
26 27
27 class TestRenderWidget : public RenderWidget { 28 class TestRenderWidget : public RenderWidget {
28 public: 29 public:
29 using RenderWidget::QueueMessageImpl; 30 using RenderWidget::QueueMessageImpl;
30 31
31 private: 32 private:
32 ~TestRenderWidget() override {} 33 ~TestRenderWidget() override {}
33 34
34 DISALLOW_COPY_AND_ASSIGN(TestRenderWidget); 35 DISALLOW_COPY_AND_ASSIGN(TestRenderWidget);
35 }; 36 };
36 37
37 class TestSyncMessageFilter : public IPC::SyncMessageFilter { 38 class TestSyncMessageFilter : public IPC::SyncMessageFilter {
38 public: 39 public:
39 TestSyncMessageFilter() : IPC::SyncMessageFilter(nullptr) {} 40 TestSyncMessageFilter() : IPC::SyncMessageFilter(nullptr) {}
40 41
41 bool Send(IPC::Message* message) override { 42 bool Send(IPC::Message* message) override {
42 messages_.push_back(base::WrapUnique(message)); 43 if (message->type() == ViewHostMsg_FrameSwapMessages::ID) {
44 ViewHostMsg_FrameSwapMessages::Param param;
45 ViewHostMsg_FrameSwapMessages::Read(message, &param);
46 std::vector<IPC::Message> messages = std::get<1>(param);
47 last_swap_messages_.clear();
48 for (const IPC::Message& message : messages) {
49 last_swap_messages_.push_back(base::MakeUnique<IPC::Message>(message));
50 }
51 delete message;
52 } else {
53 direct_send_messages_.push_back(base::WrapUnique(message));
54 }
43 return true; 55 return true;
44 } 56 }
45 57
46 std::vector<std::unique_ptr<IPC::Message>>& messages() { return messages_; } 58 std::vector<std::unique_ptr<IPC::Message>>& last_swap_messages() {
59 return last_swap_messages_;
60 }
61
62 const std::vector<std::unique_ptr<IPC::Message>>& direct_send_messages() {
63 return direct_send_messages_;
64 }
47 65
48 private: 66 private:
49 ~TestSyncMessageFilter() override {} 67 ~TestSyncMessageFilter() override {}
50 68
51 std::vector<std::unique_ptr<IPC::Message>> messages_; 69 std::vector<std::unique_ptr<IPC::Message>> direct_send_messages_;
70 std::vector<std::unique_ptr<IPC::Message>> last_swap_messages_;
52 71
53 DISALLOW_COPY_AND_ASSIGN(TestSyncMessageFilter); 72 DISALLOW_COPY_AND_ASSIGN(TestSyncMessageFilter);
54 }; 73 };
55 74
56 struct QueueMessageData { 75 struct QueueMessageData {
57 MessageDeliveryPolicy policy; 76 MessageDeliveryPolicy policy;
58 int source_frame_number; 77 int source_frame_number;
59 }; 78 };
60 79
61 class QueueMessageSwapPromiseTest : public testing::Test { 80 class QueueMessageSwapPromiseTest : public testing::Test {
62 public: 81 public:
63 QueueMessageSwapPromiseTest() 82 QueueMessageSwapPromiseTest()
64 : frame_swap_message_queue_(new FrameSwapMessageQueue()), 83 : frame_swap_message_queue_(new FrameSwapMessageQueue(0)),
65 sync_message_filter_(new TestSyncMessageFilter()) {} 84 sync_message_filter_(new TestSyncMessageFilter()) {}
66 85
67 ~QueueMessageSwapPromiseTest() override {} 86 ~QueueMessageSwapPromiseTest() override {}
68 87
69 std::unique_ptr<cc::SwapPromise> QueueMessageImpl( 88 std::unique_ptr<cc::SwapPromise> QueueMessageImpl(
70 IPC::Message* msg, 89 IPC::Message* msg,
71 MessageDeliveryPolicy policy, 90 MessageDeliveryPolicy policy,
72 int source_frame_number) { 91 int source_frame_number) {
73 return TestRenderWidget::QueueMessageImpl( 92 return TestRenderWidget::QueueMessageImpl(
74 msg, policy, frame_swap_message_queue_.get(), sync_message_filter_, 93 msg, policy, frame_swap_message_queue_.get(), sync_message_filter_,
75 source_frame_number); 94 source_frame_number);
76 } 95 }
77 96
78 const std::vector<std::unique_ptr<IPC::Message>>& DirectSendMessages() { 97 const std::vector<std::unique_ptr<IPC::Message>>& DirectSendMessages() {
79 return sync_message_filter_->messages(); 98 return sync_message_filter_->direct_send_messages();
99 }
100
101 std::vector<std::unique_ptr<IPC::Message>>& LastSwapMessages() {
102 return sync_message_filter_->last_swap_messages();
80 } 103 }
81 104
82 std::vector<std::unique_ptr<IPC::Message>>& NextSwapMessages() { 105 std::vector<std::unique_ptr<IPC::Message>>& NextSwapMessages() {
83 next_swap_messages_.clear(); 106 next_swap_messages_.clear();
84 std::unique_ptr<FrameSwapMessageQueue::SendMessageScope> 107 std::unique_ptr<FrameSwapMessageQueue::SendMessageScope>
85 send_message_scope = 108 send_message_scope =
86 frame_swap_message_queue_->AcquireSendMessageScope(); 109 frame_swap_message_queue_->AcquireSendMessageScope();
87 frame_swap_message_queue_->DrainMessages(&next_swap_messages_); 110 frame_swap_message_queue_->DrainMessages(&next_swap_messages_);
88 return next_swap_messages_; 111 return next_swap_messages_;
89 } 112 }
90 113
91 bool ContainsMessage( 114 bool ContainsMessage(
92 const std::vector<std::unique_ptr<IPC::Message>>& messages, 115 const std::vector<std::unique_ptr<IPC::Message>>& messages,
93 const IPC::Message& message) { 116 const IPC::Message& message) {
94 if (messages.empty()) 117 if (messages.empty())
95 return false; 118 return false;
96 for (const auto& msg : messages) { 119 for (const auto& msg : messages) {
97 if (msg->type() == message.type()) 120 if (msg->type() == message.type())
98 return true; 121 return true;
99 } 122 }
100 return false; 123 return false;
101 } 124 }
102 125
126 bool LastSwapHasMessage(const IPC::Message& message) {
127 return ContainsMessage(LastSwapMessages(), message);
128 }
129
103 bool NextSwapHasMessage(const IPC::Message& message) { 130 bool NextSwapHasMessage(const IPC::Message& message) {
104 return ContainsMessage(NextSwapMessages(), message); 131 return ContainsMessage(NextSwapMessages(), message);
105 } 132 }
106 133
107 void QueueMessages(QueueMessageData data[], size_t count) { 134 void QueueMessages(QueueMessageData data[], size_t count) {
108 for (size_t i = 0; i < count; ++i) { 135 for (size_t i = 0; i < count; ++i) {
109 messages_.push_back( 136 messages_.push_back(
110 IPC::Message(0, i + 1, IPC::Message::PRIORITY_NORMAL)); 137 IPC::Message(0, i + 1, IPC::Message::PRIORITY_NORMAL));
111 promises_.push_back(QueueMessageImpl(new IPC::Message(messages_[i]), 138 promises_.push_back(QueueMessageImpl(new IPC::Message(messages_[i]),
112 data[i].policy, 139 data[i].policy,
113 data[i].source_frame_number)); 140 data[i].source_frame_number));
114 } 141 }
115 } 142 }
116 143
117 void CleanupPromises() { 144 void CleanupPromises() {
118 for (const auto& promise : promises_) { 145 for (const auto& promise : promises_) {
119 if (promise.get()) { 146 if (promise.get()) {
120 promise->DidActivate(); 147 promise->DidActivate();
121 promise->WillSwap(NULL); 148 promise->WillSwap(&dummy_metadata_);
122 promise->DidSwap(); 149 promise->DidSwap();
123 } 150 }
124 } 151 }
125 } 152 }
126 153
127 protected: 154 protected:
128 void VisualStateSwapPromiseDidNotSwap( 155 void VisualStateSwapPromiseDidNotSwap(
129 cc::SwapPromise::DidNotSwapReason reason); 156 cc::SwapPromise::DidNotSwapReason reason);
130 157
131 base::test::ScopedTaskEnvironment scoped_task_environment_; 158 base::test::ScopedTaskEnvironment scoped_task_environment_;
132 scoped_refptr<FrameSwapMessageQueue> frame_swap_message_queue_; 159 scoped_refptr<FrameSwapMessageQueue> frame_swap_message_queue_;
133 scoped_refptr<TestSyncMessageFilter> sync_message_filter_; 160 scoped_refptr<TestSyncMessageFilter> sync_message_filter_;
134 std::vector<IPC::Message> messages_; 161 std::vector<IPC::Message> messages_;
135 std::vector<std::unique_ptr<cc::SwapPromise>> promises_; 162 std::vector<std::unique_ptr<cc::SwapPromise>> promises_;
163 cc::CompositorFrameMetadata dummy_metadata_;
136 164
137 private: 165 private:
138 std::vector<std::unique_ptr<IPC::Message>> next_swap_messages_; 166 std::vector<std::unique_ptr<IPC::Message>> next_swap_messages_;
139 167
140 DISALLOW_COPY_AND_ASSIGN(QueueMessageSwapPromiseTest); 168 DISALLOW_COPY_AND_ASSIGN(QueueMessageSwapPromiseTest);
141 }; 169 };
142 170
143 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySchedulesMessageForNextSwap) { 171 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySchedulesMessageForNextSwap) {
144 QueueMessageData data[] = { 172 QueueMessageData data[] = {
145 /* { policy, source_frame_number } */ 173 /* { policy, source_frame_number } */
146 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1}, 174 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1},
147 }; 175 };
148 QueueMessages(data, arraysize(data)); 176 QueueMessages(data, arraysize(data));
149 177
150 ASSERT_TRUE(promises_[0].get()); 178 ASSERT_TRUE(promises_[0].get());
151 promises_[0]->DidActivate(); 179 promises_[0]->DidActivate();
152 promises_[0]->WillSwap(NULL); 180 promises_[0]->WillSwap(&dummy_metadata_);
153 promises_[0]->DidSwap(); 181 promises_[0]->DidSwap();
154 182
155 EXPECT_TRUE(DirectSendMessages().empty()); 183 EXPECT_TRUE(DirectSendMessages().empty());
156 EXPECT_FALSE(frame_swap_message_queue_->Empty()); 184 EXPECT_TRUE(frame_swap_message_queue_->Empty());
157 // frame_swap_message_queue_->WillSwap(1); 185 EXPECT_TRUE(LastSwapHasMessage(messages_[0]));
158 EXPECT_TRUE(NextSwapHasMessage(messages_[0]));
159 } 186 }
160 187
161 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicyNeedsAtMostOnePromise) { 188 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicyNeedsAtMostOnePromise) {
162 QueueMessageData data[] = { 189 QueueMessageData data[] = {
163 /* { policy, source_frame_number } */ 190 /* { policy, source_frame_number } */
164 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1}, 191 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1},
165 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1}, 192 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1},
166 }; 193 };
167 QueueMessages(data, arraysize(data)); 194 QueueMessages(data, arraysize(data));
168 195
169 ASSERT_TRUE(promises_[0].get()); 196 ASSERT_TRUE(promises_[0].get());
170 ASSERT_FALSE(promises_[1].get()); 197 ASSERT_FALSE(promises_[1].get());
171 198
172 CleanupPromises(); 199 CleanupPromises();
173 } 200 }
174 201
175 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySendsMessageOnNoUpdate) { 202 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySendsMessageOnNoUpdate) {
176 QueueMessageData data[] = { 203 QueueMessageData data[] = {
177 /* { policy, source_frame_number } */ 204 /* { policy, source_frame_number } */
178 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1}, 205 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1},
179 }; 206 };
180 QueueMessages(data, arraysize(data)); 207 QueueMessages(data, arraysize(data));
181 208
182 promises_[0]->DidNotSwap(cc::SwapPromise::COMMIT_NO_UPDATE); 209 promises_[0]->DidNotSwap(cc::SwapPromise::COMMIT_NO_UPDATE);
183 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[0])); 210 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[0]));
184 EXPECT_TRUE(NextSwapMessages().empty()); 211 EXPECT_TRUE(LastSwapMessages().empty());
185 EXPECT_TRUE(frame_swap_message_queue_->Empty()); 212 EXPECT_TRUE(frame_swap_message_queue_->Empty());
186 } 213 }
187 214
188 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySendsMessageOnSwapFails) { 215 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySendsMessageOnSwapFails) {
189 QueueMessageData data[] = { 216 QueueMessageData data[] = {
190 /* { policy, source_frame_number } */ 217 /* { policy, source_frame_number } */
191 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1}, 218 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1},
192 }; 219 };
193 QueueMessages(data, arraysize(data)); 220 QueueMessages(data, arraysize(data));
194 221
195 promises_[0]->DidNotSwap(cc::SwapPromise::SWAP_FAILS); 222 promises_[0]->DidNotSwap(cc::SwapPromise::SWAP_FAILS);
196 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[0])); 223 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[0]));
197 EXPECT_TRUE(NextSwapMessages().empty()); 224 EXPECT_TRUE(LastSwapMessages().empty());
198 EXPECT_TRUE(frame_swap_message_queue_->Empty()); 225 EXPECT_TRUE(frame_swap_message_queue_->Empty());
199 } 226 }
200 227
201 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicyRetainsMessageOnCommitFails) { 228 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicyRetainsMessageOnCommitFails) {
202 QueueMessageData data[] = { 229 QueueMessageData data[] = {
203 /* { policy, source_frame_number } */ 230 /* { policy, source_frame_number } */
204 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1}, 231 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1},
205 }; 232 };
206 QueueMessages(data, arraysize(data)); 233 QueueMessages(data, arraysize(data));
207 234
208 promises_[0]->DidNotSwap(cc::SwapPromise::COMMIT_FAILS); 235 promises_[0]->DidNotSwap(cc::SwapPromise::COMMIT_FAILS);
209 EXPECT_TRUE(DirectSendMessages().empty()); 236 EXPECT_TRUE(DirectSendMessages().empty());
237 EXPECT_TRUE(LastSwapMessages().empty());
210 EXPECT_FALSE(frame_swap_message_queue_->Empty()); 238 EXPECT_FALSE(frame_swap_message_queue_->Empty());
211 frame_swap_message_queue_->DidSwap(2); 239 frame_swap_message_queue_->DidSwap(2);
212 EXPECT_TRUE(NextSwapHasMessage(messages_[0])); 240 EXPECT_TRUE(NextSwapHasMessage(messages_[0]));
213 } 241 }
214 242
215 TEST_F(QueueMessageSwapPromiseTest, 243 TEST_F(QueueMessageSwapPromiseTest,
216 VisualStateQueuesMessageWhenCommitRequested) { 244 VisualStateQueuesMessageWhenCommitRequested) {
217 QueueMessageData data[] = { 245 QueueMessageData data[] = {
218 /* { policy, source_frame_number } */ 246 /* { policy, source_frame_number } */
219 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1}, 247 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1},
(...skipping 27 matching lines...) Expand all
247 TEST_F(QueueMessageSwapPromiseTest, VisualStateSwapPromiseDidActivate) { 275 TEST_F(QueueMessageSwapPromiseTest, VisualStateSwapPromiseDidActivate) {
248 QueueMessageData data[] = { 276 QueueMessageData data[] = {
249 /* { policy, source_frame_number } */ 277 /* { policy, source_frame_number } */
250 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1}, 278 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1},
251 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1}, 279 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1},
252 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 2}, 280 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 2},
253 }; 281 };
254 QueueMessages(data, arraysize(data)); 282 QueueMessages(data, arraysize(data));
255 283
256 promises_[0]->DidActivate(); 284 promises_[0]->DidActivate();
257 promises_[0]->WillSwap(NULL); 285 promises_[0]->WillSwap(&dummy_metadata_);
258 promises_[0]->DidSwap(); 286 promises_[0]->DidSwap();
259 ASSERT_FALSE(promises_[1].get()); 287 ASSERT_FALSE(promises_[1].get());
260 std::vector<std::unique_ptr<IPC::Message>> messages; 288 std::vector<std::unique_ptr<IPC::Message>> messages;
261 messages.swap(NextSwapMessages()); 289 messages.swap(LastSwapMessages());
262 EXPECT_EQ(2u, messages.size()); 290 EXPECT_EQ(2u, messages.size());
263 EXPECT_TRUE(ContainsMessage(messages, messages_[0])); 291 EXPECT_TRUE(ContainsMessage(messages, messages_[0]));
264 EXPECT_TRUE(ContainsMessage(messages, messages_[1])); 292 EXPECT_TRUE(ContainsMessage(messages, messages_[1]));
265 EXPECT_FALSE(ContainsMessage(messages, messages_[2])); 293 EXPECT_FALSE(ContainsMessage(messages, messages_[2]));
266 294
267 promises_[2]->DidActivate(); 295 promises_[2]->DidActivate();
268 promises_[2]->DidNotSwap(cc::SwapPromise::SWAP_FAILS); 296 promises_[2]->DidNotSwap(cc::SwapPromise::SWAP_FAILS);
269 messages.swap(NextSwapMessages()); 297 messages.swap(NextSwapMessages());
270 EXPECT_TRUE(messages.empty()); 298 EXPECT_TRUE(messages.empty());
271 299
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 TEST_F(QueueMessageSwapPromiseTest, VisualStateSwapPromiseDidNotSwapSwapFails) { 347 TEST_F(QueueMessageSwapPromiseTest, VisualStateSwapPromiseDidNotSwapSwapFails) {
320 VisualStateSwapPromiseDidNotSwap(cc::SwapPromise::SWAP_FAILS); 348 VisualStateSwapPromiseDidNotSwap(cc::SwapPromise::SWAP_FAILS);
321 } 349 }
322 350
323 TEST_F(QueueMessageSwapPromiseTest, 351 TEST_F(QueueMessageSwapPromiseTest,
324 VisualStateSwapPromiseDidNotSwapActivationFails) { 352 VisualStateSwapPromiseDidNotSwapActivationFails) {
325 VisualStateSwapPromiseDidNotSwap(cc::SwapPromise::ACTIVATION_FAILS); 353 VisualStateSwapPromiseDidNotSwap(cc::SwapPromise::ACTIVATION_FAILS);
326 } 354 }
327 355
328 } // namespace content 356 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/gpu/queue_message_swap_promise.cc ('k') | content/renderer/gpu/renderer_compositor_frame_sink.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698