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

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

Powered by Google App Engine
This is Rietveld 408576698