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

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

Issue 1118233002: Introduce SharedMemoryDataConsumerHandle. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@data-received-with-ack
Patch Set: Created 5 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "content/child/shared_memory_data_consumer_handle.h"
6
7 #include <string.h>
8 #include <string>
9 #include <vector>
10
11 #include "testing/gmock/include/gmock/gmock.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 namespace content {
15
16 namespace {
17 using blink::WebDataConsumerHandle;
18 using Result = WebDataConsumerHandle::Result;
19 using Writer = SharedMemoryDataConsumerHandle::Writer;
20 using BackpressureMode = SharedMemoryDataConsumerHandle::BackpressureMode;
21 const BackpressureMode kApplyBackpressure =
22 SharedMemoryDataConsumerHandle::kApplyBackpressure;
23 const BackpressureMode kDoNotApplyBackpressure =
24 SharedMemoryDataConsumerHandle::kDoNotApplyBackpressure;
25
26 const WebDataConsumerHandle::Flags kNone = WebDataConsumerHandle::FlagNone;
27 const Result kOk = WebDataConsumerHandle::Ok;
28 const Result kDone = WebDataConsumerHandle::Done;
29 const Result kShouldWait = WebDataConsumerHandle::ShouldWait;
30
31 using ::testing::_;
32 using ::testing::InSequence;
33 using ::testing::MockFunction;
34 using ::testing::Return;
35 using ::testing::StrictMock;
36
37 using Checkpoint = StrictMock<MockFunction<void(int)>>;
38 using ReceivedData = RequestPeer::ReceivedData;
39
40 class Logger final : public base::RefCounted<Logger> {
41 public:
42 Logger() {}
43 void Add(const std::string& entry) { log_ += entry + "\n"; }
44 const std::string& log() const { return log_; }
45
46 private:
47 friend class base::RefCounted<Logger>;
48 ~Logger() {}
49 std::string log_;
50
51 DISALLOW_COPY_AND_ASSIGN(Logger);
52 };
53
54 class LoggingFixedReceivedData final : public RequestPeer::ReceivedData {
55 public:
56 LoggingFixedReceivedData(const char* name,
57 const char* s,
58 scoped_refptr<Logger> logger)
59 : name_(name), data_(s, s + strlen(s)), logger_(logger) {}
60 ~LoggingFixedReceivedData() override {
61 logger_->Add(name_ + " is destructed.");
62 }
63
64 const char* payload() const override {
65 return data_.empty() ? nullptr : &data_[0];
66 }
67 int length() const override { return static_cast<int>(data_.size()); }
68 int encoded_length() const override { return static_cast<int>(data_.size()); }
69
70 private:
71 const std::string name_;
72 const std::vector<char> data_;
73 scoped_refptr<Logger> logger_;
74
75 DISALLOW_COPY_AND_ASSIGN(LoggingFixedReceivedData);
76 };
77
78 class FixedReceivedData final : public RequestPeer::ReceivedData {
79 public:
80 explicit FixedReceivedData(const char* s)
81 : data_(s, s + strlen(s)), encoded_length_(strlen(s)) {}
82
83 const char* payload() const override {
84 return data_.empty() ? nullptr : &data_[0];
85 }
86 int length() const override { return static_cast<int>(data_.size()); }
87 int encoded_length() const override { return encoded_length_; }
88
89 private:
90 const std::vector<char> data_;
91 int encoded_length_;
92
93 DISALLOW_COPY_AND_ASSIGN(FixedReceivedData);
94 };
95
96 class MockClient : public WebDataConsumerHandle::Client {
97 public:
98 MOCK_METHOD0(didGetReadable, void());
99 };
100
101 std::string ToString(const void* p, size_t size) {
102 const char* q = static_cast<const char*>(p);
103 return std::string(q, q + size);
104 }
105
106 class SharedMemoryDataConsumerHandleTest
107 : public ::testing::TestWithParam<BackpressureMode> {
108 protected:
109 void SetUp() override {
110 handle_.reset(new SharedMemoryDataConsumerHandle(GetParam(), &writer_));
111 }
112
113 StrictMock<MockClient> client_;
114 scoped_ptr<SharedMemoryDataConsumerHandle> handle_;
115 scoped_ptr<Writer> writer_;
116 };
117
118 TEST_P(SharedMemoryDataConsumerHandleTest, ReadFromEmpty) {
119 char buffer[4];
120 size_t read = 88;
121 Result result = handle_->read(buffer, 4, kNone, &read);
122
123 EXPECT_EQ(result, kShouldWait);
124 EXPECT_EQ(0u, read);
125 }
126
127 TEST_P(SharedMemoryDataConsumerHandleTest, AutoClose) {
128 char buffer[4];
129 size_t read = 88;
130
131 writer_.reset();
132 Result result = handle_->read(buffer, 4, kNone, &read);
133
134 EXPECT_EQ(result, kDone);
135 EXPECT_EQ(0u, read);
136 }
137
138 TEST_P(SharedMemoryDataConsumerHandleTest, ReadSimple) {
139 writer_->AddData(make_scoped_ptr(new FixedReceivedData("hello")));
140
141 char buffer[4] = {};
142 size_t read = 88;
143 Result result = handle_->read(buffer, 3, kNone, &read);
144
145 EXPECT_EQ(kOk, result);
146 EXPECT_EQ(3u, read);
147 EXPECT_STREQ("hel", buffer);
148
149 result = handle_->read(buffer, 3, kNone, &read);
150 EXPECT_EQ(kOk, result);
151 EXPECT_EQ(2u, read);
152 EXPECT_STREQ("lol", buffer);
153
154 result = handle_->read(buffer, 3, kNone, &read);
155 EXPECT_EQ(kShouldWait, result);
156 EXPECT_EQ(0u, read);
157
158 writer_->Close();
159
160 result = handle_->read(buffer, 3, kNone, &read);
161 EXPECT_EQ(kDone, result);
162 EXPECT_EQ(0u, read);
163 }
164
165 TEST_P(SharedMemoryDataConsumerHandleTest, CloseBeforeReading) {
166 writer_->AddData(make_scoped_ptr(new FixedReceivedData("hello")));
167 writer_->Close();
168
169 char buffer[20] = {};
170 size_t read = 88;
171 Result result = handle_->read(buffer, arraysize(buffer), kNone, &read);
172
173 EXPECT_EQ(kOk, result);
174 EXPECT_EQ(5u, read);
175 EXPECT_STREQ("hello", buffer);
176
177 result = handle_->read(buffer, arraysize(buffer), kNone, &read);
178 EXPECT_EQ(kDone, result);
179 EXPECT_EQ(0u, read);
180 }
181
182 TEST_P(SharedMemoryDataConsumerHandleTest, AddMultipleData) {
183 writer_->AddData(make_scoped_ptr(new FixedReceivedData("Once ")));
184 writer_->AddData(make_scoped_ptr(new FixedReceivedData("upon ")));
185 writer_->AddData(make_scoped_ptr(new FixedReceivedData("a ")));
186 writer_->AddData(make_scoped_ptr(new FixedReceivedData("time ")));
187 writer_->AddData(make_scoped_ptr(new FixedReceivedData("there ")));
188 writer_->AddData(make_scoped_ptr(new FixedReceivedData("was ")));
189 writer_->AddData(make_scoped_ptr(new FixedReceivedData("a ")));
190 writer_->Close();
191
192 char buffer[20];
193 size_t read;
194 Result result;
195
196 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
197 result = handle_->read(buffer, 6, kNone, &read);
198 EXPECT_EQ(kOk, result);
199 EXPECT_EQ(6u, read);
200 EXPECT_STREQ("Once u", buffer);
201
202 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
203 result = handle_->read(buffer, 2, kNone, &read);
204 EXPECT_EQ(kOk, result);
205 EXPECT_EQ(2u, read);
206 EXPECT_STREQ("po", buffer);
207
208 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
209 result = handle_->read(buffer, 9, kNone, &read);
210 EXPECT_EQ(kOk, result);
211 EXPECT_EQ(9u, read);
212 EXPECT_STREQ("n a time ", buffer);
213
214 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
215 result = handle_->read(buffer, 3, kNone, &read);
216 EXPECT_EQ(kOk, result);
217 EXPECT_EQ(3u, read);
218 EXPECT_STREQ("the", buffer);
219
220 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
221 result = handle_->read(buffer, 20, kNone, &read);
222 EXPECT_EQ(kOk, result);
223 EXPECT_EQ(9u, read);
224 EXPECT_STREQ("re was a ", buffer);
225
226 result = handle_->read(buffer, arraysize(buffer), kNone, &read);
227 EXPECT_EQ(kDone, result);
228 EXPECT_EQ(0u, read);
229 }
230
231 TEST_P(SharedMemoryDataConsumerHandleTest, AddMultipleDataInteractively) {
232 writer_->AddData(make_scoped_ptr(new FixedReceivedData("Once ")));
233 writer_->AddData(make_scoped_ptr(new FixedReceivedData("upon ")));
234
235 char buffer[20];
236 size_t read;
237 Result result;
238
239 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
240 result = handle_->read(buffer, 6, kNone, &read);
241 EXPECT_EQ(kOk, result);
242 EXPECT_EQ(6u, read);
243 EXPECT_STREQ("Once u", buffer);
244
245 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
246 result = handle_->read(buffer, 2, kNone, &read);
247 EXPECT_EQ(kOk, result);
248 EXPECT_EQ(2u, read);
249 EXPECT_STREQ("po", buffer);
250
251 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
252 result = handle_->read(buffer, 9, kNone, &read);
253 EXPECT_EQ(kOk, result);
254 EXPECT_EQ(2u, read);
255 EXPECT_STREQ("n ", buffer);
256
257 writer_->AddData(make_scoped_ptr(new FixedReceivedData("a ")));
258
259 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
260 result = handle_->read(buffer, 1, kNone, &read);
261 EXPECT_EQ(kOk, result);
262 EXPECT_EQ(1u, read);
263 EXPECT_STREQ("a", buffer);
264
265 writer_->AddData(make_scoped_ptr(new FixedReceivedData("time ")));
266 writer_->AddData(make_scoped_ptr(new FixedReceivedData("there ")));
267 writer_->AddData(make_scoped_ptr(new FixedReceivedData("was ")));
268 writer_->AddData(make_scoped_ptr(new FixedReceivedData("a ")));
269 writer_->Close();
270
271 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
272 result = handle_->read(buffer, 9, kNone, &read);
273 EXPECT_EQ(kOk, result);
274 EXPECT_EQ(9u, read);
275 EXPECT_STREQ(" time the", buffer);
276
277 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0);
278 result = handle_->read(buffer, 20, kNone, &read);
279 EXPECT_EQ(kOk, result);
280 EXPECT_EQ(9u, read);
281 EXPECT_STREQ("re was a ", buffer);
282
283 result = handle_->read(buffer, arraysize(buffer), kNone, &read);
284 EXPECT_EQ(kDone, result);
285 EXPECT_EQ(0u, read);
286 }
287
288 TEST_P(SharedMemoryDataConsumerHandleTest, RegisterClient) {
289 Checkpoint checkpoint;
290
291 InSequence s;
292 EXPECT_CALL(checkpoint, Call(0));
293 EXPECT_CALL(checkpoint, Call(1));
294 EXPECT_CALL(client_, didGetReadable());
295 EXPECT_CALL(checkpoint, Call(2));
296
297 checkpoint.Call(0);
298 handle_->registerClient(&client_);
299 checkpoint.Call(1);
300 writer_->Close();
301 checkpoint.Call(2);
302 }
303
304 TEST_P(SharedMemoryDataConsumerHandleTest, RegisterClientWhenDataExists) {
305 Checkpoint checkpoint;
306
307 InSequence s;
308 EXPECT_CALL(checkpoint, Call(0));
309 EXPECT_CALL(checkpoint, Call(1));
310 EXPECT_CALL(client_, didGetReadable());
311 EXPECT_CALL(checkpoint, Call(2));
312
313 checkpoint.Call(0);
314 writer_->AddData(make_scoped_ptr(new FixedReceivedData("Once ")));
315 checkpoint.Call(1);
316 handle_->registerClient(&client_);
317 checkpoint.Call(2);
318 }
319
320 TEST_P(SharedMemoryDataConsumerHandleTest, AddDataWhenClientIsRegistered) {
321 Checkpoint checkpoint;
322 char buffer[20];
323 Result result;
324 size_t size;
325
326 InSequence s;
327 EXPECT_CALL(checkpoint, Call(0));
328 EXPECT_CALL(checkpoint, Call(1));
329 EXPECT_CALL(client_, didGetReadable());
330 EXPECT_CALL(checkpoint, Call(2));
331 EXPECT_CALL(checkpoint, Call(3));
332 EXPECT_CALL(checkpoint, Call(4));
333 EXPECT_CALL(client_, didGetReadable());
334 EXPECT_CALL(checkpoint, Call(5));
335
336 checkpoint.Call(0);
337 handle_->registerClient(&client_);
338 checkpoint.Call(1);
339 writer_->AddData(make_scoped_ptr(new FixedReceivedData("Once ")));
340 checkpoint.Call(2);
341 writer_->AddData(make_scoped_ptr(new FixedReceivedData("upon ")));
342 checkpoint.Call(3);
343 result = handle_->read(buffer, arraysize(buffer), kNone, &size);
344 EXPECT_EQ(kOk, result);
345 EXPECT_EQ(10u, size);
346 checkpoint.Call(4);
347 writer_->AddData(make_scoped_ptr(new FixedReceivedData("a ")));
348 checkpoint.Call(5);
349 }
350
351 TEST_P(SharedMemoryDataConsumerHandleTest, CloseWithClientAndData) {
352 Checkpoint checkpoint;
353
354 InSequence s;
355 EXPECT_CALL(checkpoint, Call(0));
356 EXPECT_CALL(checkpoint, Call(1));
357 EXPECT_CALL(client_, didGetReadable());
358 EXPECT_CALL(checkpoint, Call(2));
359 EXPECT_CALL(checkpoint, Call(3));
360
361 checkpoint.Call(0);
362 handle_->registerClient(&client_);
363 checkpoint.Call(1);
364 writer_->AddData(make_scoped_ptr(new FixedReceivedData("Once ")));
365 checkpoint.Call(2);
366 writer_->Close();
367 checkpoint.Call(3);
368 }
369
370 TEST_P(SharedMemoryDataConsumerHandleTest, UnregisterClient) {
371 Checkpoint checkpoint;
372
373 InSequence s;
374 EXPECT_CALL(checkpoint, Call(0));
375 EXPECT_CALL(checkpoint, Call(1));
376 EXPECT_CALL(checkpoint, Call(2));
377
378 checkpoint.Call(0);
379 handle_->registerClient(&client_);
380 checkpoint.Call(1);
381 handle_->unregisterClient();
382 writer_->AddData(make_scoped_ptr(new FixedReceivedData("Once ")));
383 checkpoint.Call(2);
384 }
385
386 TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadShouldWait) {
387 Result result;
388 const void* buffer = &result;
389 size_t size = 99;
390
391 result = handle_->beginRead(&buffer, kNone, &size);
392 EXPECT_EQ(kShouldWait, result);
393 EXPECT_EQ(nullptr, buffer);
394 EXPECT_EQ(0u, size);
395 }
396
397 TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadSimple) {
398 writer_->AddData(make_scoped_ptr(new FixedReceivedData("Once ")));
399
400 Result result;
401 const void* buffer = &result;
402 size_t size = 99;
403
404 result = handle_->beginRead(&buffer, kNone, &size);
405 EXPECT_EQ(kOk, result);
406 EXPECT_EQ(5u, size);
407 EXPECT_EQ("Once ", ToString(buffer, 5));
408
409 handle_->endRead(1);
410
411 result = handle_->beginRead(&buffer, kNone, &size);
412 EXPECT_EQ(kOk, result);
413 EXPECT_EQ(4u, size);
414 EXPECT_EQ("nce ", ToString(buffer, 4));
415
416 handle_->endRead(4);
417
418 result = handle_->beginRead(&buffer, kNone, &size);
419 EXPECT_EQ(kShouldWait, result);
420 EXPECT_EQ(0u, size);
421 EXPECT_EQ(nullptr, buffer);
422
423 writer_->Close();
424
425 result = handle_->beginRead(&buffer, kNone, &size);
426 EXPECT_EQ(kDone, result);
427 EXPECT_EQ(0u, size);
428 EXPECT_EQ(nullptr, buffer);
429 }
430
431 TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadWithMultipleData) {
432 writer_->AddData(make_scoped_ptr(new FixedReceivedData("Once ")));
433 writer_->AddData(make_scoped_ptr(new FixedReceivedData("upon ")));
434
435 Result result;
436 const void* buffer = &result;
437 size_t size = 99;
438
439 result = handle_->beginRead(&buffer, kNone, &size);
440 EXPECT_EQ(kOk, result);
441 EXPECT_EQ(5u, size);
442 EXPECT_EQ("Once ", ToString(buffer, 5));
443
444 handle_->endRead(1);
445
446 result = handle_->beginRead(&buffer, kNone, &size);
447 EXPECT_EQ(kOk, result);
448 EXPECT_EQ(4u, size);
449 EXPECT_EQ("nce ", ToString(buffer, 4));
450
451 handle_->endRead(4);
452
453 result = handle_->beginRead(&buffer, kNone, &size);
454 EXPECT_EQ(kOk, result);
455 EXPECT_EQ(5u, size);
456 EXPECT_EQ("upon ", ToString(buffer, 5));
457
458 handle_->endRead(5);
459
460 result = handle_->beginRead(&buffer, kNone, &size);
461 EXPECT_EQ(kShouldWait, result);
462 EXPECT_EQ(0u, size);
463 EXPECT_EQ(nullptr, buffer);
464
465 writer_->Close();
466
467 result = handle_->beginRead(&buffer, kNone, &size);
468 EXPECT_EQ(kDone, result);
469 EXPECT_EQ(0u, size);
470 EXPECT_EQ(nullptr, buffer);
471 }
472
473 TEST(SharedMemoryDataConsumerHandleBackpressureTest, Read) {
474 char buffer[20];
475 Result result;
476 size_t size;
477
478 scoped_ptr<Writer> writer;
479 auto handle = make_scoped_ptr(
480 new SharedMemoryDataConsumerHandle(kApplyBackpressure, &writer));
481 scoped_refptr<Logger> logger(new Logger);
482 writer->AddData(
483 make_scoped_ptr(new LoggingFixedReceivedData("data1", "Once ", logger)));
484 writer->AddData(
485 make_scoped_ptr(new LoggingFixedReceivedData("data2", "upon ", logger)));
486 writer->AddData(
487 make_scoped_ptr(new LoggingFixedReceivedData("data3", "a ", logger)));
488 writer->AddData(
489 make_scoped_ptr(new LoggingFixedReceivedData("data4", "time ", logger)));
490
491 logger->Add("1");
492 result = handle->read(buffer, 2, kNone, &size);
493 EXPECT_EQ(kOk, result);
494 EXPECT_EQ(2u, size);
495 logger->Add("2");
496 result = handle->read(buffer, 5, kNone, &size);
497 EXPECT_EQ(kOk, result);
498 EXPECT_EQ(5u, size);
499 logger->Add("3");
500 result = handle->read(buffer, 6, kNone, &size);
501 EXPECT_EQ(kOk, result);
502 EXPECT_EQ(6u, size);
503 logger->Add("4");
504
505 EXPECT_EQ(
506 "1\n"
507 "2\n"
508 "data1 is destructed.\n"
509 "3\n"
510 "data2 is destructed.\n"
511 "data3 is destructed.\n"
512 "4\n",
513 logger->log());
514 }
515
516 TEST(SharedMemoryDataConsumerHandleBackpressureTest, CloseAndReset) {
517 char buffer[20];
518 Result result;
519 size_t size;
520
521 scoped_ptr<Writer> writer;
522 auto handle = make_scoped_ptr(
523 new SharedMemoryDataConsumerHandle(kApplyBackpressure, &writer));
524 scoped_refptr<Logger> logger(new Logger);
525 writer->AddData(
526 make_scoped_ptr(new LoggingFixedReceivedData("data1", "Once ", logger)));
527 writer->AddData(
528 make_scoped_ptr(new LoggingFixedReceivedData("data2", "upon ", logger)));
529 writer->AddData(
530 make_scoped_ptr(new LoggingFixedReceivedData("data3", "a ", logger)));
531
532 logger->Add("1");
533 result = handle->read(buffer, 2, kNone, &size);
534 EXPECT_EQ(kOk, result);
535 EXPECT_EQ(2u, size);
536 logger->Add("2");
537 writer->Close();
538 logger->Add("3");
539 handle.reset();
540 logger->Add("4");
541
542 EXPECT_EQ(
543 "1\n"
544 "2\n"
545 "3\n"
546 "data1 is destructed.\n"
547 "data2 is destructed.\n"
548 "data3 is destructed.\n"
549 "4\n",
550 logger->log());
551 }
552
553 TEST(SharedMemoryDataConsumerHandleWithoutBackpressureTest, AddData) {
554 scoped_ptr<Writer> writer;
555 auto handle = make_scoped_ptr(
556 new SharedMemoryDataConsumerHandle(kDoNotApplyBackpressure, &writer));
557 scoped_refptr<Logger> logger(new Logger);
558
559 logger->Add("1");
560 writer->AddData(
561 make_scoped_ptr(new LoggingFixedReceivedData("data1", "Once ", logger)));
562 logger->Add("2");
563 writer->AddData(
564 make_scoped_ptr(new LoggingFixedReceivedData("data2", "upon ", logger)));
565 logger->Add("3");
566
567 EXPECT_EQ(
568 "1\n"
569 "data1 is destructed.\n"
570 "2\n"
571 "data2 is destructed.\n"
572 "3\n",
573 logger->log());
574 }
575
576 INSTANTIATE_TEST_CASE_P(SharedMemoryDataConsumerHandleTest,
577 SharedMemoryDataConsumerHandleTest,
578 ::testing::Values(kApplyBackpressure,
579 kDoNotApplyBackpressure));
580 } // namespace
581
582 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698