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

Side by Side Diff: content/child/shared_memory_data_consumer_handle_unittest.cc

Issue 1164493008: Implement WebDataConsumerHandle::Reader. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/child/shared_memory_data_consumer_handle.h" 5 #include "content/child/shared_memory_data_consumer_handle.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/callback.h" 12 #include "base/callback.h"
13 #include "base/location.h"
13 #include "base/message_loop/message_loop.h" 14 #include "base/message_loop/message_loop.h"
14 #include "base/run_loop.h" 15 #include "base/run_loop.h"
16 #include "base/task_runner.h"
15 #include "base/threading/thread.h" 17 #include "base/threading/thread.h"
16 #include "content/public/child/fixed_received_data.h" 18 #include "content/public/child/fixed_received_data.h"
17 #include "testing/gmock/include/gmock/gmock.h" 19 #include "testing/gmock/include/gmock/gmock.h"
18 #include "testing/gtest/include/gtest/gtest.h" 20 #include "testing/gtest/include/gtest/gtest.h"
19 21
20 namespace content { 22 namespace content {
21 23
22 namespace { 24 namespace {
23 using blink::WebDataConsumerHandle; 25 using blink::WebDataConsumerHandle;
24 using Result = WebDataConsumerHandle::Result; 26 using Result = WebDataConsumerHandle::Result;
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 102
101 void didGetReadable() override { operation_->ReadData(); } 103 void didGetReadable() override { operation_->ReadData(); }
102 104
103 private: 105 private:
104 ReadDataOperation* operation_; 106 ReadDataOperation* operation_;
105 }; 107 };
106 108
107 class ReadDataOperation final { 109 class ReadDataOperation final {
108 public: 110 public:
109 typedef WebDataConsumerHandle::Result Result; 111 typedef WebDataConsumerHandle::Result Result;
110 ReadDataOperation(scoped_ptr<WebDataConsumerHandle> handle, 112 ReadDataOperation(scoped_ptr<SharedMemoryDataConsumerHandle> handle,
111 base::MessageLoop* main_message_loop, 113 base::MessageLoop* main_message_loop,
112 const base::Closure& on_done) 114 const base::Closure& on_done)
113 : handle_(handle.Pass()), 115 : handle_(handle.Pass()),
114 main_message_loop_(main_message_loop), 116 main_message_loop_(main_message_loop),
115 on_done_(on_done) {} 117 on_done_(on_done) {}
116 118
117 const std::string& result() const { return result_; } 119 const std::string& result() const { return result_; }
118 120
119 void ReadData() { 121 void ReadData() {
120 if (!client_) { 122 if (!client_) {
121 client_.reset(new ClientImpl(this)); 123 client_.reset(new ClientImpl(this));
122 handle_->registerClient(client_.get()); 124 reader_ = handle_->ObtainReader(client_.get());
123 } 125 }
124 126
125 Result rv = kOk; 127 Result rv = kOk;
126 size_t read_size = 0; 128 size_t read_size = 0;
127 129
128 while (true) { 130 while (true) {
129 char buffer[16]; 131 char buffer[16];
130 rv = handle_->read(&buffer, sizeof(buffer), kNone, &read_size); 132 rv = reader_->read(&buffer, sizeof(buffer), kNone, &read_size);
131 if (rv != kOk) 133 if (rv != kOk)
132 break; 134 break;
133 result_.insert(result_.size(), &buffer[0], read_size); 135 result_.insert(result_.size(), &buffer[0], read_size);
134 } 136 }
135 137
136 if (rv == kShouldWait) { 138 if (rv == kShouldWait) {
137 // Wait a while... 139 // Wait a while...
138 return; 140 return;
139 } 141 }
140 142
141 if (rv != kDone) { 143 if (rv != kDone) {
142 // Something is wrong. 144 // Something is wrong.
143 result_ = "error"; 145 result_ = "error";
144 } 146 }
145 147
146 // The operation is done. 148 // The operation is done.
149 reader_.reset();
147 main_message_loop_->PostTask(FROM_HERE, on_done_); 150 main_message_loop_->PostTask(FROM_HERE, on_done_);
148 } 151 }
149 152
150 private: 153 private:
151 scoped_ptr<WebDataConsumerHandle> handle_; 154 scoped_ptr<SharedMemoryDataConsumerHandle> handle_;
155 scoped_ptr<WebDataConsumerHandle::Reader> reader_;
152 scoped_ptr<WebDataConsumerHandle::Client> client_; 156 scoped_ptr<WebDataConsumerHandle::Client> client_;
153 base::MessageLoop* main_message_loop_; 157 base::MessageLoop* main_message_loop_;
154 base::Closure on_done_; 158 base::Closure on_done_;
155 std::string result_; 159 std::string result_;
156 }; 160 };
157 161
158 void SetUp() override { 162 void SetUp() override {
159 handle_.reset( 163 handle_.reset(
160 new SharedMemoryDataConsumerHandle(kApplyBackpressure, &writer_)); 164 new SharedMemoryDataConsumerHandle(kApplyBackpressure, &writer_));
161 } 165 }
162 166
163 StrictMock<MockClient> client_; 167 StrictMock<MockClient> client_;
164 scoped_ptr<WebDataConsumerHandle> handle_; 168 scoped_ptr<SharedMemoryDataConsumerHandle> handle_;
165 scoped_ptr<Writer> writer_; 169 scoped_ptr<Writer> writer_;
166 base::MessageLoop loop_; 170 base::MessageLoop loop_;
167 }; 171 };
168 172
169 class SharedMemoryDataConsumerHandleTest 173 class SharedMemoryDataConsumerHandleTest
170 : public ::testing::TestWithParam<BackpressureMode> { 174 : public ::testing::TestWithParam<BackpressureMode> {
171 protected: 175 protected:
172 void SetUp() override { 176 void SetUp() override {
173 handle_.reset(new SharedMemoryDataConsumerHandle(GetParam(), &writer_)); 177 handle_.reset(new SharedMemoryDataConsumerHandle(GetParam(), &writer_));
174 } 178 }
175 scoped_ptr<FixedReceivedData> NewFixedData(const char* s) { 179 scoped_ptr<FixedReceivedData> NewFixedData(const char* s) {
176 return make_scoped_ptr(new FixedReceivedData(s, strlen(s), strlen(s))); 180 return make_scoped_ptr(new FixedReceivedData(s, strlen(s), strlen(s)));
177 } 181 }
178 182
179 StrictMock<MockClient> client_; 183 StrictMock<MockClient> client_;
180 scoped_ptr<SharedMemoryDataConsumerHandle> handle_; 184 scoped_ptr<SharedMemoryDataConsumerHandle> handle_;
181 scoped_ptr<Writer> writer_; 185 scoped_ptr<Writer> writer_;
182 base::MessageLoop loop_; 186 base::MessageLoop loop_;
183 }; 187 };
184 188
189 void RunPostedTasks() {
190 base::RunLoop run_loop;
191 base::MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
192 run_loop.QuitClosure());
193 run_loop.Run();
194 }
195
185 TEST_P(SharedMemoryDataConsumerHandleTest, ReadFromEmpty) { 196 TEST_P(SharedMemoryDataConsumerHandleTest, ReadFromEmpty) {
186 char buffer[4]; 197 char buffer[4];
187 size_t read = 88; 198 size_t read = 88;
188 Result result = handle_->read(buffer, 4, kNone, &read); 199 auto reader = handle_->ObtainReader(nullptr);
200 Result result = reader->read(buffer, 4, kNone, &read);
189 201
190 EXPECT_EQ(kShouldWait, result); 202 EXPECT_EQ(kShouldWait, result);
191 EXPECT_EQ(0u, read); 203 EXPECT_EQ(0u, read);
192 } 204 }
193 205
194 TEST_P(SharedMemoryDataConsumerHandleTest, AutoClose) { 206 TEST_P(SharedMemoryDataConsumerHandleTest, AutoClose) {
195 char buffer[4]; 207 char buffer[4];
196 size_t read = 88; 208 size_t read = 88;
197 209
198 writer_.reset(); 210 writer_.reset();
199 Result result = handle_->read(buffer, 4, kNone, &read); 211 auto reader = handle_->ObtainReader(nullptr);
212 Result result = reader->read(buffer, 4, kNone, &read);
200 213
201 EXPECT_EQ(kDone, result); 214 EXPECT_EQ(kDone, result);
202 EXPECT_EQ(0u, read); 215 EXPECT_EQ(0u, read);
203 } 216 }
204 217
205 TEST_P(SharedMemoryDataConsumerHandleTest, ReadSimple) { 218 TEST_P(SharedMemoryDataConsumerHandleTest, ReadSimple) {
206 writer_->AddData(NewFixedData("hello")); 219 writer_->AddData(NewFixedData("hello"));
207 220
208 char buffer[4] = {}; 221 char buffer[4] = {};
209 size_t read = 88; 222 size_t read = 88;
210 Result result = handle_->read(buffer, 3, kNone, &read); 223 auto reader = handle_->ObtainReader(nullptr);
224 Result result = reader->read(buffer, 3, kNone, &read);
211 225
212 EXPECT_EQ(kOk, result); 226 EXPECT_EQ(kOk, result);
213 EXPECT_EQ(3u, read); 227 EXPECT_EQ(3u, read);
214 EXPECT_STREQ("hel", buffer); 228 EXPECT_STREQ("hel", buffer);
215 229
216 result = handle_->read(buffer, 3, kNone, &read); 230 result = reader->read(buffer, 3, kNone, &read);
217 EXPECT_EQ(kOk, result); 231 EXPECT_EQ(kOk, result);
218 EXPECT_EQ(2u, read); 232 EXPECT_EQ(2u, read);
219 EXPECT_STREQ("lol", buffer); 233 EXPECT_STREQ("lol", buffer);
220 234
221 result = handle_->read(buffer, 3, kNone, &read); 235 result = reader->read(buffer, 3, kNone, &read);
222 EXPECT_EQ(kShouldWait, result); 236 EXPECT_EQ(kShouldWait, result);
223 EXPECT_EQ(0u, read); 237 EXPECT_EQ(0u, read);
224 238
225 writer_->Close(); 239 writer_->Close();
226 240
227 result = handle_->read(buffer, 3, kNone, &read); 241 result = reader->read(buffer, 3, kNone, &read);
228 EXPECT_EQ(kDone, result); 242 EXPECT_EQ(kDone, result);
229 EXPECT_EQ(0u, read); 243 EXPECT_EQ(0u, read);
230 } 244 }
245
246 TEST_P(SharedMemoryDataConsumerHandleTest, ReadAfterHandleIsGone) {
247 writer_->AddData(NewFixedData("hello"));
248
249 char buffer[8] = {};
250 size_t read = 88;
251 auto reader = handle_->ObtainReader(nullptr);
252
253 handle_.reset();
254
255 Result result = reader->read(buffer, sizeof(buffer), kNone, &read);
256
257 EXPECT_EQ(kOk, result);
258 EXPECT_EQ(5u, read);
259 EXPECT_STREQ("hello", buffer);
260
261 result = reader->read(buffer, 3, kNone, &read);
262 EXPECT_EQ(kShouldWait, result);
263 EXPECT_EQ(0u, read);
264
265 writer_->Close();
266
267 result = reader->read(buffer, 3, kNone, &read);
268 EXPECT_EQ(kDone, result);
269 EXPECT_EQ(0u, read);
270 }
271
272 TEST_P(SharedMemoryDataConsumerHandleTest, ReObtainReader) {
273 writer_->AddData(NewFixedData("hello"));
274
275 char buffer[4] = {};
276 size_t read = 88;
277 auto reader = handle_->ObtainReader(nullptr);
278 Result result = reader->read(buffer, 3, kNone, &read);
279
280 EXPECT_EQ(kOk, result);
281 EXPECT_EQ(3u, read);
282 EXPECT_STREQ("hel", buffer);
283
284 reader.reset();
285 reader = handle_->ObtainReader(nullptr);
286
287 result = reader->read(buffer, 3, kNone, &read);
288 EXPECT_EQ(kOk, result);
289 EXPECT_EQ(2u, read);
290 EXPECT_STREQ("lol", buffer);
291
292 result = reader->read(buffer, 3, kNone, &read);
293 EXPECT_EQ(kShouldWait, result);
294 EXPECT_EQ(0u, read);
295
296 writer_->Close();
297
298 result = reader->read(buffer, 3, kNone, &read);
299 EXPECT_EQ(kDone, result);
300 EXPECT_EQ(0u, read);
301 }
231 302
232 TEST_P(SharedMemoryDataConsumerHandleTest, CloseBeforeReading) { 303 TEST_P(SharedMemoryDataConsumerHandleTest, CloseBeforeReading) {
233 writer_->AddData(NewFixedData("hello")); 304 writer_->AddData(NewFixedData("hello"));
234 writer_->Close(); 305 writer_->Close();
235 306
236 char buffer[20] = {}; 307 char buffer[20] = {};
237 size_t read = 88; 308 size_t read = 88;
238 Result result = handle_->read(buffer, sizeof(buffer), kNone, &read); 309 auto reader = handle_->ObtainReader(nullptr);
310 Result result = reader->read(buffer, sizeof(buffer), kNone, &read);
239 311
240 EXPECT_EQ(kOk, result); 312 EXPECT_EQ(kOk, result);
241 EXPECT_EQ(5u, read); 313 EXPECT_EQ(5u, read);
242 EXPECT_STREQ("hello", buffer); 314 EXPECT_STREQ("hello", buffer);
243 315
244 result = handle_->read(buffer, sizeof(buffer), kNone, &read); 316 result = reader->read(buffer, sizeof(buffer), kNone, &read);
245 EXPECT_EQ(kDone, result); 317 EXPECT_EQ(kDone, result);
246 EXPECT_EQ(0u, read); 318 EXPECT_EQ(0u, read);
247 } 319 }
248 320
249 TEST_P(SharedMemoryDataConsumerHandleTest, AddMultipleData) { 321 TEST_P(SharedMemoryDataConsumerHandleTest, AddMultipleData) {
250 writer_->AddData(NewFixedData("Once ")); 322 writer_->AddData(NewFixedData("Once "));
251 writer_->AddData(NewFixedData("upon ")); 323 writer_->AddData(NewFixedData("upon "));
252 writer_->AddData(NewFixedData("a ")); 324 writer_->AddData(NewFixedData("a "));
253 writer_->AddData(NewFixedData("time ")); 325 writer_->AddData(NewFixedData("time "));
254 writer_->AddData(NewFixedData("there ")); 326 writer_->AddData(NewFixedData("there "));
255 writer_->AddData(NewFixedData("was ")); 327 writer_->AddData(NewFixedData("was "));
256 writer_->AddData(NewFixedData("a ")); 328 writer_->AddData(NewFixedData("a "));
257 writer_->Close(); 329 writer_->Close();
258 330
259 char buffer[20]; 331 char buffer[20];
260 size_t read; 332 size_t read;
261 Result result; 333 Result result;
262 334
335 auto reader = handle_->ObtainReader(nullptr);
263 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); 336 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
264 result = handle_->read(buffer, 6, kNone, &read); 337 result = reader->read(buffer, 6, kNone, &read);
265 EXPECT_EQ(kOk, result); 338 EXPECT_EQ(kOk, result);
266 EXPECT_EQ(6u, read); 339 EXPECT_EQ(6u, read);
267 EXPECT_STREQ("Once u", buffer); 340 EXPECT_STREQ("Once u", buffer);
268 341
269 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); 342 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
270 result = handle_->read(buffer, 2, kNone, &read); 343 result = reader->read(buffer, 2, kNone, &read);
271 EXPECT_EQ(kOk, result); 344 EXPECT_EQ(kOk, result);
272 EXPECT_EQ(2u, read); 345 EXPECT_EQ(2u, read);
273 EXPECT_STREQ("po", buffer); 346 EXPECT_STREQ("po", buffer);
274 347
275 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); 348 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
276 result = handle_->read(buffer, 9, kNone, &read); 349 result = reader->read(buffer, 9, kNone, &read);
277 EXPECT_EQ(kOk, result); 350 EXPECT_EQ(kOk, result);
278 EXPECT_EQ(9u, read); 351 EXPECT_EQ(9u, read);
279 EXPECT_STREQ("n a time ", buffer); 352 EXPECT_STREQ("n a time ", buffer);
280 353
281 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); 354 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
282 result = handle_->read(buffer, 3, kNone, &read); 355 result = reader->read(buffer, 3, kNone, &read);
283 EXPECT_EQ(kOk, result); 356 EXPECT_EQ(kOk, result);
284 EXPECT_EQ(3u, read); 357 EXPECT_EQ(3u, read);
285 EXPECT_STREQ("the", buffer); 358 EXPECT_STREQ("the", buffer);
286 359
287 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); 360 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
288 result = handle_->read(buffer, 20, kNone, &read); 361 result = reader->read(buffer, 20, kNone, &read);
289 EXPECT_EQ(kOk, result); 362 EXPECT_EQ(kOk, result);
290 EXPECT_EQ(9u, read); 363 EXPECT_EQ(9u, read);
291 EXPECT_STREQ("re was a ", buffer); 364 EXPECT_STREQ("re was a ", buffer);
292 365
293 result = handle_->read(buffer, sizeof(buffer), kNone, &read); 366 result = reader->read(buffer, sizeof(buffer), kNone, &read);
294 EXPECT_EQ(kDone, result); 367 EXPECT_EQ(kDone, result);
295 EXPECT_EQ(0u, read); 368 EXPECT_EQ(0u, read);
296 } 369 }
297 370
298 TEST_P(SharedMemoryDataConsumerHandleTest, AddMultipleDataInteractively) { 371 TEST_P(SharedMemoryDataConsumerHandleTest, AddMultipleDataInteractively) {
299 writer_->AddData(NewFixedData("Once ")); 372 writer_->AddData(NewFixedData("Once "));
300 writer_->AddData(NewFixedData("upon ")); 373 writer_->AddData(NewFixedData("upon "));
301 374
302 char buffer[20]; 375 char buffer[20];
303 size_t read; 376 size_t read;
304 Result result; 377 Result result;
305 378
379 auto reader = handle_->ObtainReader(nullptr);
306 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); 380 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
307 result = handle_->read(buffer, 6, kNone, &read); 381 result = reader->read(buffer, 6, kNone, &read);
308 EXPECT_EQ(kOk, result); 382 EXPECT_EQ(kOk, result);
309 EXPECT_EQ(6u, read); 383 EXPECT_EQ(6u, read);
310 EXPECT_STREQ("Once u", buffer); 384 EXPECT_STREQ("Once u", buffer);
311 385
312 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); 386 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
313 result = handle_->read(buffer, 2, kNone, &read); 387 result = reader->read(buffer, 2, kNone, &read);
314 EXPECT_EQ(kOk, result); 388 EXPECT_EQ(kOk, result);
315 EXPECT_EQ(2u, read); 389 EXPECT_EQ(2u, read);
316 EXPECT_STREQ("po", buffer); 390 EXPECT_STREQ("po", buffer);
317 391
318 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); 392 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
319 result = handle_->read(buffer, 9, kNone, &read); 393 result = reader->read(buffer, 9, kNone, &read);
320 EXPECT_EQ(kOk, result); 394 EXPECT_EQ(kOk, result);
321 EXPECT_EQ(2u, read); 395 EXPECT_EQ(2u, read);
322 EXPECT_STREQ("n ", buffer); 396 EXPECT_STREQ("n ", buffer);
323 397
324 writer_->AddData(NewFixedData("a ")); 398 writer_->AddData(NewFixedData("a "));
325 399
326 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); 400 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
327 result = handle_->read(buffer, 1, kNone, &read); 401 result = reader->read(buffer, 1, kNone, &read);
328 EXPECT_EQ(kOk, result); 402 EXPECT_EQ(kOk, result);
329 EXPECT_EQ(1u, read); 403 EXPECT_EQ(1u, read);
330 EXPECT_STREQ("a", buffer); 404 EXPECT_STREQ("a", buffer);
331 405
332 writer_->AddData(NewFixedData("time ")); 406 writer_->AddData(NewFixedData("time "));
333 writer_->AddData(NewFixedData("there ")); 407 writer_->AddData(NewFixedData("there "));
334 writer_->AddData(NewFixedData("was ")); 408 writer_->AddData(NewFixedData("was "));
335 writer_->AddData(NewFixedData("a ")); 409 writer_->AddData(NewFixedData("a "));
336 writer_->Close(); 410 writer_->Close();
337 411
338 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); 412 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
339 result = handle_->read(buffer, 9, kNone, &read); 413 result = reader->read(buffer, 9, kNone, &read);
340 EXPECT_EQ(kOk, result); 414 EXPECT_EQ(kOk, result);
341 EXPECT_EQ(9u, read); 415 EXPECT_EQ(9u, read);
342 EXPECT_STREQ(" time the", buffer); 416 EXPECT_STREQ(" time the", buffer);
343 417
344 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); 418 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
345 result = handle_->read(buffer, 20, kNone, &read); 419 result = reader->read(buffer, 20, kNone, &read);
346 EXPECT_EQ(kOk, result); 420 EXPECT_EQ(kOk, result);
347 EXPECT_EQ(9u, read); 421 EXPECT_EQ(9u, read);
348 EXPECT_STREQ("re was a ", buffer); 422 EXPECT_STREQ("re was a ", buffer);
349 423
350 result = handle_->read(buffer, sizeof(buffer), kNone, &read); 424 result = reader->read(buffer, sizeof(buffer), kNone, &read);
351 EXPECT_EQ(kDone, result); 425 EXPECT_EQ(kDone, result);
352 EXPECT_EQ(0u, read); 426 EXPECT_EQ(0u, read);
353 } 427 }
354 428
355 TEST_P(SharedMemoryDataConsumerHandleTest, RegisterClient) { 429 TEST_P(SharedMemoryDataConsumerHandleTest, RegisterClient) {
356 Checkpoint checkpoint; 430 Checkpoint checkpoint;
357 431
358 InSequence s; 432 InSequence s;
359 EXPECT_CALL(checkpoint, Call(0)); 433 EXPECT_CALL(checkpoint, Call(0));
360 EXPECT_CALL(checkpoint, Call(1)); 434 EXPECT_CALL(checkpoint, Call(1));
435 EXPECT_CALL(checkpoint, Call(2));
361 EXPECT_CALL(client_, didGetReadable()); 436 EXPECT_CALL(client_, didGetReadable());
362 EXPECT_CALL(checkpoint, Call(2)); 437 EXPECT_CALL(checkpoint, Call(3));
363 438
364 checkpoint.Call(0); 439 checkpoint.Call(0);
365 handle_->registerClient(&client_); 440 auto reader = handle_->ObtainReader(&client_);
366 checkpoint.Call(1); 441 checkpoint.Call(1);
442 RunPostedTasks();
443 checkpoint.Call(2);
367 writer_->Close(); 444 writer_->Close();
368 checkpoint.Call(2); 445 checkpoint.Call(3);
369 } 446 }
370 447
371 TEST_P(SharedMemoryDataConsumerHandleTest, RegisterClientWhenDataExists) { 448 TEST_P(SharedMemoryDataConsumerHandleTest, RegisterClientWhenDataExists) {
372 Checkpoint checkpoint; 449 Checkpoint checkpoint;
373 450
374 InSequence s; 451 InSequence s;
375 EXPECT_CALL(checkpoint, Call(0)); 452 EXPECT_CALL(checkpoint, Call(0));
376 EXPECT_CALL(checkpoint, Call(1)); 453 EXPECT_CALL(checkpoint, Call(1));
454 EXPECT_CALL(checkpoint, Call(2));
377 EXPECT_CALL(client_, didGetReadable()); 455 EXPECT_CALL(client_, didGetReadable());
378 EXPECT_CALL(checkpoint, Call(2)); 456 EXPECT_CALL(checkpoint, Call(3));
379 457
380 checkpoint.Call(0); 458 checkpoint.Call(0);
381 writer_->AddData(NewFixedData("Once ")); 459 writer_->AddData(NewFixedData("Once "));
382 checkpoint.Call(1); 460 checkpoint.Call(1);
383 handle_->registerClient(&client_); 461 auto reader = handle_->ObtainReader(&client_);
384 checkpoint.Call(2); 462 checkpoint.Call(2);
463 RunPostedTasks();
464 checkpoint.Call(3);
385 } 465 }
386 466
387 TEST_P(SharedMemoryDataConsumerHandleTest, AddDataWhenClientIsRegistered) { 467 TEST_P(SharedMemoryDataConsumerHandleTest, AddDataWhenClientIsRegistered) {
388 Checkpoint checkpoint; 468 Checkpoint checkpoint;
389 char buffer[20]; 469 char buffer[20];
390 Result result; 470 Result result;
391 size_t size; 471 size_t size;
392 472
393 InSequence s; 473 InSequence s;
394 EXPECT_CALL(checkpoint, Call(0)); 474 EXPECT_CALL(checkpoint, Call(0));
395 EXPECT_CALL(checkpoint, Call(1)); 475 EXPECT_CALL(checkpoint, Call(1));
396 EXPECT_CALL(client_, didGetReadable()); 476 EXPECT_CALL(client_, didGetReadable());
397 EXPECT_CALL(checkpoint, Call(2)); 477 EXPECT_CALL(checkpoint, Call(2));
398 EXPECT_CALL(checkpoint, Call(3)); 478 EXPECT_CALL(checkpoint, Call(3));
399 EXPECT_CALL(checkpoint, Call(4)); 479 EXPECT_CALL(checkpoint, Call(4));
400 EXPECT_CALL(client_, didGetReadable()); 480 EXPECT_CALL(client_, didGetReadable());
401 EXPECT_CALL(checkpoint, Call(5)); 481 EXPECT_CALL(checkpoint, Call(5));
402 482
403 checkpoint.Call(0); 483 checkpoint.Call(0);
404 handle_->registerClient(&client_); 484 auto reader = handle_->ObtainReader(&client_);
405 checkpoint.Call(1); 485 checkpoint.Call(1);
406 writer_->AddData(NewFixedData("Once ")); 486 writer_->AddData(NewFixedData("Once "));
407 checkpoint.Call(2); 487 checkpoint.Call(2);
408 writer_->AddData(NewFixedData("upon ")); 488 writer_->AddData(NewFixedData("upon "));
409 checkpoint.Call(3); 489 checkpoint.Call(3);
410 result = handle_->read(buffer, sizeof(buffer), kNone, &size); 490 result = reader->read(buffer, sizeof(buffer), kNone, &size);
411 EXPECT_EQ(kOk, result); 491 EXPECT_EQ(kOk, result);
412 EXPECT_EQ(10u, size); 492 EXPECT_EQ(10u, size);
413 checkpoint.Call(4); 493 checkpoint.Call(4);
414 writer_->AddData(NewFixedData("a ")); 494 writer_->AddData(NewFixedData("a "));
415 checkpoint.Call(5); 495 checkpoint.Call(5);
416 } 496 }
417 497
418 TEST_P(SharedMemoryDataConsumerHandleTest, CloseWithClientAndData) { 498 TEST_P(SharedMemoryDataConsumerHandleTest, CloseWithClientAndData) {
419 Checkpoint checkpoint; 499 Checkpoint checkpoint;
420 500
421 InSequence s; 501 InSequence s;
422 EXPECT_CALL(checkpoint, Call(0)); 502 EXPECT_CALL(checkpoint, Call(0));
423 EXPECT_CALL(checkpoint, Call(1)); 503 EXPECT_CALL(checkpoint, Call(1));
424 EXPECT_CALL(client_, didGetReadable()); 504 EXPECT_CALL(client_, didGetReadable());
425 EXPECT_CALL(checkpoint, Call(2)); 505 EXPECT_CALL(checkpoint, Call(2));
426 EXPECT_CALL(checkpoint, Call(3)); 506 EXPECT_CALL(checkpoint, Call(3));
427 507
428 checkpoint.Call(0); 508 checkpoint.Call(0);
429 handle_->registerClient(&client_); 509 auto reader = handle_->ObtainReader(&client_);
430 checkpoint.Call(1); 510 checkpoint.Call(1);
431 writer_->AddData(NewFixedData("Once ")); 511 writer_->AddData(NewFixedData("Once "));
432 checkpoint.Call(2); 512 checkpoint.Call(2);
433 writer_->Close(); 513 writer_->Close();
434 checkpoint.Call(3); 514 checkpoint.Call(3);
435 } 515 }
436 516
437 TEST_P(SharedMemoryDataConsumerHandleTest, UnregisterClient) { 517 TEST_P(SharedMemoryDataConsumerHandleTest, ReleaseReader) {
438 Checkpoint checkpoint; 518 Checkpoint checkpoint;
439 519
440 InSequence s; 520 InSequence s;
441 EXPECT_CALL(checkpoint, Call(0)); 521 EXPECT_CALL(checkpoint, Call(0));
442 EXPECT_CALL(checkpoint, Call(1)); 522 EXPECT_CALL(checkpoint, Call(1));
443 EXPECT_CALL(checkpoint, Call(2)); 523 EXPECT_CALL(checkpoint, Call(2));
444 524
445 checkpoint.Call(0); 525 checkpoint.Call(0);
446 handle_->registerClient(&client_); 526 auto reader = handle_->ObtainReader(&client_);
447 checkpoint.Call(1); 527 checkpoint.Call(1);
448 handle_->unregisterClient(); 528 reader.reset();
449 writer_->AddData(NewFixedData("Once ")); 529 writer_->AddData(NewFixedData("Once "));
450 checkpoint.Call(2); 530 checkpoint.Call(2);
451 } 531 }
452 532
453 TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadShouldWait) { 533 TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadShouldWait) {
454 Result result; 534 Result result;
455 const void* buffer = &result; 535 const void* buffer = &result;
456 size_t size = 99; 536 size_t size = 99;
457 537
458 result = handle_->beginRead(&buffer, kNone, &size); 538 auto reader = handle_->ObtainReader(nullptr);
539 result = reader->beginRead(&buffer, kNone, &size);
459 EXPECT_EQ(kShouldWait, result); 540 EXPECT_EQ(kShouldWait, result);
460 EXPECT_EQ(nullptr, buffer); 541 EXPECT_EQ(nullptr, buffer);
461 EXPECT_EQ(0u, size); 542 EXPECT_EQ(0u, size);
462 } 543 }
463 544
464 TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadSimple) { 545 TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadSimple) {
465 writer_->AddData(NewFixedData("Once ")); 546 writer_->AddData(NewFixedData("Once "));
466 547
467 Result result; 548 Result result;
468 const void* buffer = &result; 549 const void* buffer = &result;
469 size_t size = 99; 550 size_t size = 99;
470 551
471 result = handle_->beginRead(&buffer, kNone, &size); 552 auto reader = handle_->ObtainReader(nullptr);
553 result = reader->beginRead(&buffer, kNone, &size);
472 EXPECT_EQ(kOk, result); 554 EXPECT_EQ(kOk, result);
473 EXPECT_EQ(5u, size); 555 EXPECT_EQ(5u, size);
474 EXPECT_EQ("Once ", ToString(buffer, 5)); 556 EXPECT_EQ("Once ", ToString(buffer, 5));
475 557
476 handle_->endRead(1); 558 reader->endRead(1);
477 559
478 result = handle_->beginRead(&buffer, kNone, &size); 560 result = reader->beginRead(&buffer, kNone, &size);
479 EXPECT_EQ(kOk, result); 561 EXPECT_EQ(kOk, result);
480 EXPECT_EQ(4u, size); 562 EXPECT_EQ(4u, size);
481 EXPECT_EQ("nce ", ToString(buffer, 4)); 563 EXPECT_EQ("nce ", ToString(buffer, 4));
482 564
483 handle_->endRead(4); 565 reader->endRead(4);
484 566
485 result = handle_->beginRead(&buffer, kNone, &size); 567 result = reader->beginRead(&buffer, kNone, &size);
486 EXPECT_EQ(kShouldWait, result); 568 EXPECT_EQ(kShouldWait, result);
487 EXPECT_EQ(0u, size); 569 EXPECT_EQ(0u, size);
488 EXPECT_EQ(nullptr, buffer); 570 EXPECT_EQ(nullptr, buffer);
489 571
490 writer_->Close(); 572 writer_->Close();
491 573
492 result = handle_->beginRead(&buffer, kNone, &size); 574 result = reader->beginRead(&buffer, kNone, &size);
493 EXPECT_EQ(kDone, result); 575 EXPECT_EQ(kDone, result);
494 EXPECT_EQ(0u, size); 576 EXPECT_EQ(0u, size);
495 EXPECT_EQ(nullptr, buffer); 577 EXPECT_EQ(nullptr, buffer);
496 } 578 }
497 579
498 TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadWithMultipleData) { 580 TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadWithMultipleData) {
499 writer_->AddData(NewFixedData("Once ")); 581 writer_->AddData(NewFixedData("Once "));
500 writer_->AddData(NewFixedData("upon ")); 582 writer_->AddData(NewFixedData("upon "));
501 583
502 Result result; 584 Result result;
503 const void* buffer = &result; 585 const void* buffer = &result;
504 size_t size = 99; 586 size_t size = 99;
505 587
506 result = handle_->beginRead(&buffer, kNone, &size); 588 auto reader = handle_->ObtainReader(nullptr);
589 result = reader->beginRead(&buffer, kNone, &size);
507 EXPECT_EQ(kOk, result); 590 EXPECT_EQ(kOk, result);
508 EXPECT_EQ(5u, size); 591 EXPECT_EQ(5u, size);
509 EXPECT_EQ("Once ", ToString(buffer, 5)); 592 EXPECT_EQ("Once ", ToString(buffer, 5));
510 593
511 handle_->endRead(1); 594 reader->endRead(1);
512 595
513 result = handle_->beginRead(&buffer, kNone, &size); 596 result = reader->beginRead(&buffer, kNone, &size);
514 EXPECT_EQ(kOk, result); 597 EXPECT_EQ(kOk, result);
515 EXPECT_EQ(4u, size); 598 EXPECT_EQ(4u, size);
516 EXPECT_EQ("nce ", ToString(buffer, 4)); 599 EXPECT_EQ("nce ", ToString(buffer, 4));
517 600
518 handle_->endRead(4); 601 reader->endRead(4);
519 602
520 result = handle_->beginRead(&buffer, kNone, &size); 603 result = reader->beginRead(&buffer, kNone, &size);
521 EXPECT_EQ(kOk, result); 604 EXPECT_EQ(kOk, result);
522 EXPECT_EQ(5u, size); 605 EXPECT_EQ(5u, size);
523 EXPECT_EQ("upon ", ToString(buffer, 5)); 606 EXPECT_EQ("upon ", ToString(buffer, 5));
524 607
525 handle_->endRead(5); 608 reader->endRead(5);
526 609
527 result = handle_->beginRead(&buffer, kNone, &size); 610 result = reader->beginRead(&buffer, kNone, &size);
528 EXPECT_EQ(kShouldWait, result); 611 EXPECT_EQ(kShouldWait, result);
529 EXPECT_EQ(0u, size); 612 EXPECT_EQ(0u, size);
530 EXPECT_EQ(nullptr, buffer); 613 EXPECT_EQ(nullptr, buffer);
531 614
532 writer_->Close(); 615 writer_->Close();
533 616
534 result = handle_->beginRead(&buffer, kNone, &size); 617 result = reader->beginRead(&buffer, kNone, &size);
535 EXPECT_EQ(kDone, result); 618 EXPECT_EQ(kDone, result);
536 EXPECT_EQ(0u, size); 619 EXPECT_EQ(0u, size);
537 EXPECT_EQ(nullptr, buffer); 620 EXPECT_EQ(nullptr, buffer);
538 } 621 }
539 622
540 TEST(SharedMemoryDataConsumerHandleBackpressureTest, Read) { 623 TEST(SharedMemoryDataConsumerHandleBackpressureTest, Read) {
541 base::MessageLoop loop; 624 base::MessageLoop loop;
542 char buffer[20]; 625 char buffer[20];
543 Result result; 626 Result result;
544 size_t size; 627 size_t size;
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
685 logger->log()); 768 logger->log());
686 } 769 }
687 770
688 INSTANTIATE_TEST_CASE_P(SharedMemoryDataConsumerHandleTest, 771 INSTANTIATE_TEST_CASE_P(SharedMemoryDataConsumerHandleTest,
689 SharedMemoryDataConsumerHandleTest, 772 SharedMemoryDataConsumerHandleTest,
690 ::testing::Values(kApplyBackpressure, 773 ::testing::Values(kApplyBackpressure,
691 kDoNotApplyBackpressure)); 774 kDoNotApplyBackpressure));
692 } // namespace 775 } // namespace
693 776
694 } // namespace content 777 } // namespace content
OLDNEW
« no previous file with comments | « content/child/shared_memory_data_consumer_handle.cc ('k') | content/child/web_data_consumer_handle_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698