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

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

Issue 1144033002: Make SharedMemoryDataConsumerHandle thread-safe. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@ipc-data-consumer
Patch Set: rebase 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"
12 #include "base/callback.h"
13 #include "base/message_loop/message_loop.h"
14 #include "base/run_loop.h"
15 #include "base/threading/thread.h"
11 #include "content/public/child/fixed_received_data.h" 16 #include "content/public/child/fixed_received_data.h"
12 #include "testing/gmock/include/gmock/gmock.h" 17 #include "testing/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
14 19
15 namespace content { 20 namespace content {
16 21
17 namespace { 22 namespace {
18 using blink::WebDataConsumerHandle; 23 using blink::WebDataConsumerHandle;
19 using Result = WebDataConsumerHandle::Result; 24 using Result = WebDataConsumerHandle::Result;
20 using Writer = SharedMemoryDataConsumerHandle::Writer; 25 using Writer = SharedMemoryDataConsumerHandle::Writer;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 class MockClient : public WebDataConsumerHandle::Client { 84 class MockClient : public WebDataConsumerHandle::Client {
80 public: 85 public:
81 MOCK_METHOD0(didGetReadable, void()); 86 MOCK_METHOD0(didGetReadable, void());
82 }; 87 };
83 88
84 std::string ToString(const void* p, size_t size) { 89 std::string ToString(const void* p, size_t size) {
85 const char* q = static_cast<const char*>(p); 90 const char* q = static_cast<const char*>(p);
86 return std::string(q, q + size); 91 return std::string(q, q + size);
87 } 92 }
88 93
94 class ThreadedSharedMemoryDataConsumerHandleTest : public ::testing::Test {
95 protected:
96 class ReadDataOperation;
97 class ClientImpl final : public WebDataConsumerHandle::Client {
98 public:
99 explicit ClientImpl(ReadDataOperation* operation) : operation_(operation) {}
100
101 void didGetReadable() override { operation_->ReadData(); }
102
103 private:
104 ReadDataOperation* operation_;
105 };
106
107 class ReadDataOperation final {
108 public:
109 typedef WebDataConsumerHandle::Result Result;
110 ReadDataOperation(scoped_ptr<WebDataConsumerHandle> handle,
111 base::MessageLoop* main_message_loop,
112 const base::Closure& on_done)
113 : handle_(handle.Pass()),
114 main_message_loop_(main_message_loop),
115 on_done_(on_done) {}
116
117 const std::string& result() const { return result_; }
118
119 void ReadData() {
120 if (!client_) {
121 client_.reset(new ClientImpl(this));
122 handle_->registerClient(client_.get());
123 }
124
125 Result rv = kOk;
126 size_t read_size = 0;
127
128 while (true) {
129 char buffer[16];
130 rv = handle_->read(&buffer, sizeof(buffer), kNone, &read_size);
131 if (rv != kOk)
132 break;
133 result_.insert(result_.size(), &buffer[0], read_size);
134 }
135
136 if (rv == kShouldWait) {
137 // Wait a while...
138 return;
139 }
140
141 if (rv != kDone) {
142 // Something is wrong.
143 result_ = "error";
144 }
145
146 // The operation is done.
147 main_message_loop_->PostTask(FROM_HERE, on_done_);
148 }
149
150 private:
151 scoped_ptr<WebDataConsumerHandle> handle_;
152 scoped_ptr<WebDataConsumerHandle::Client> client_;
153 base::MessageLoop* main_message_loop_;
154 base::Closure on_done_;
155 std::string result_;
156 };
157
158 void SetUp() override {
159 handle_.reset(
160 new SharedMemoryDataConsumerHandle(kApplyBackpressure, &writer_));
161 }
162
163 StrictMock<MockClient> client_;
164 scoped_ptr<WebDataConsumerHandle> handle_;
165 scoped_ptr<Writer> writer_;
166 base::MessageLoop loop_;
167 };
168
89 class SharedMemoryDataConsumerHandleTest 169 class SharedMemoryDataConsumerHandleTest
90 : public ::testing::TestWithParam<BackpressureMode> { 170 : public ::testing::TestWithParam<BackpressureMode> {
91 protected: 171 protected:
92 void SetUp() override { 172 void SetUp() override {
93 handle_.reset(new SharedMemoryDataConsumerHandle(GetParam(), &writer_)); 173 handle_.reset(new SharedMemoryDataConsumerHandle(GetParam(), &writer_));
94 } 174 }
95 scoped_ptr<FixedReceivedData> NewFixedData(const char* s) { 175 scoped_ptr<FixedReceivedData> NewFixedData(const char* s) {
96 return make_scoped_ptr(new FixedReceivedData(s, strlen(s), strlen(s))); 176 return make_scoped_ptr(new FixedReceivedData(s, strlen(s), strlen(s)));
97 } 177 }
98 178
99 StrictMock<MockClient> client_; 179 StrictMock<MockClient> client_;
100 scoped_ptr<SharedMemoryDataConsumerHandle> handle_; 180 scoped_ptr<SharedMemoryDataConsumerHandle> handle_;
101 scoped_ptr<Writer> writer_; 181 scoped_ptr<Writer> writer_;
182 base::MessageLoop loop_;
102 }; 183 };
103 184
104 TEST_P(SharedMemoryDataConsumerHandleTest, ReadFromEmpty) { 185 TEST_P(SharedMemoryDataConsumerHandleTest, ReadFromEmpty) {
105 char buffer[4]; 186 char buffer[4];
106 size_t read = 88; 187 size_t read = 88;
107 Result result = handle_->read(buffer, 4, kNone, &read); 188 Result result = handle_->read(buffer, 4, kNone, &read);
108 189
109 EXPECT_EQ(result, kShouldWait); 190 EXPECT_EQ(result, kShouldWait);
110 EXPECT_EQ(0u, read); 191 EXPECT_EQ(0u, read);
111 } 192 }
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after
450 531
451 writer_->Close(); 532 writer_->Close();
452 533
453 result = handle_->beginRead(&buffer, kNone, &size); 534 result = handle_->beginRead(&buffer, kNone, &size);
454 EXPECT_EQ(kDone, result); 535 EXPECT_EQ(kDone, result);
455 EXPECT_EQ(0u, size); 536 EXPECT_EQ(0u, size);
456 EXPECT_EQ(nullptr, buffer); 537 EXPECT_EQ(nullptr, buffer);
457 } 538 }
458 539
459 TEST(SharedMemoryDataConsumerHandleBackpressureTest, Read) { 540 TEST(SharedMemoryDataConsumerHandleBackpressureTest, Read) {
541 base::MessageLoop loop;
460 char buffer[20]; 542 char buffer[20];
461 Result result; 543 Result result;
462 size_t size; 544 size_t size;
463 545
464 scoped_ptr<Writer> writer; 546 scoped_ptr<Writer> writer;
465 auto handle = make_scoped_ptr( 547 auto handle = make_scoped_ptr(
466 new SharedMemoryDataConsumerHandle(kApplyBackpressure, &writer)); 548 new SharedMemoryDataConsumerHandle(kApplyBackpressure, &writer));
467 scoped_refptr<Logger> logger(new Logger); 549 scoped_refptr<Logger> logger(new Logger);
468 writer->AddData( 550 writer->AddData(
469 make_scoped_ptr(new LoggingFixedReceivedData("data1", "Once ", logger))); 551 make_scoped_ptr(new LoggingFixedReceivedData("data1", "Once ", logger)));
(...skipping 23 matching lines...) Expand all
493 "2\n" 575 "2\n"
494 "data1 is destructed.\n" 576 "data1 is destructed.\n"
495 "3\n" 577 "3\n"
496 "data2 is destructed.\n" 578 "data2 is destructed.\n"
497 "data3 is destructed.\n" 579 "data3 is destructed.\n"
498 "4\n", 580 "4\n",
499 logger->log()); 581 logger->log());
500 } 582 }
501 583
502 TEST(SharedMemoryDataConsumerHandleBackpressureTest, CloseAndReset) { 584 TEST(SharedMemoryDataConsumerHandleBackpressureTest, CloseAndReset) {
585 base::MessageLoop loop;
503 char buffer[20]; 586 char buffer[20];
504 Result result; 587 Result result;
505 size_t size; 588 size_t size;
506 589
507 scoped_ptr<Writer> writer; 590 scoped_ptr<Writer> writer;
508 auto handle = make_scoped_ptr( 591 auto handle = make_scoped_ptr(
509 new SharedMemoryDataConsumerHandle(kApplyBackpressure, &writer)); 592 new SharedMemoryDataConsumerHandle(kApplyBackpressure, &writer));
510 scoped_refptr<Logger> logger(new Logger); 593 scoped_refptr<Logger> logger(new Logger);
511 writer->AddData( 594 writer->AddData(
512 make_scoped_ptr(new LoggingFixedReceivedData("data1", "Once ", logger))); 595 make_scoped_ptr(new LoggingFixedReceivedData("data1", "Once ", logger)));
(...skipping 17 matching lines...) Expand all
530 "2\n" 613 "2\n"
531 "3\n" 614 "3\n"
532 "data1 is destructed.\n" 615 "data1 is destructed.\n"
533 "data2 is destructed.\n" 616 "data2 is destructed.\n"
534 "data3 is destructed.\n" 617 "data3 is destructed.\n"
535 "4\n", 618 "4\n",
536 logger->log()); 619 logger->log());
537 } 620 }
538 621
539 TEST(SharedMemoryDataConsumerHandleWithoutBackpressureTest, AddData) { 622 TEST(SharedMemoryDataConsumerHandleWithoutBackpressureTest, AddData) {
623 base::MessageLoop loop;
540 scoped_ptr<Writer> writer; 624 scoped_ptr<Writer> writer;
541 auto handle = make_scoped_ptr( 625 auto handle = make_scoped_ptr(
542 new SharedMemoryDataConsumerHandle(kDoNotApplyBackpressure, &writer)); 626 new SharedMemoryDataConsumerHandle(kDoNotApplyBackpressure, &writer));
543 scoped_refptr<Logger> logger(new Logger); 627 scoped_refptr<Logger> logger(new Logger);
544 628
545 logger->Add("1"); 629 logger->Add("1");
546 writer->AddData( 630 writer->AddData(
547 make_scoped_ptr(new LoggingFixedReceivedData("data1", "Once ", logger))); 631 make_scoped_ptr(new LoggingFixedReceivedData("data1", "Once ", logger)));
548 logger->Add("2"); 632 logger->Add("2");
549 writer->AddData( 633 writer->AddData(
550 make_scoped_ptr(new LoggingFixedReceivedData("data2", "upon ", logger))); 634 make_scoped_ptr(new LoggingFixedReceivedData("data2", "upon ", logger)));
551 logger->Add("3"); 635 logger->Add("3");
552 636
553 EXPECT_EQ( 637 EXPECT_EQ(
554 "1\n" 638 "1\n"
555 "data1 is destructed.\n" 639 "data1 is destructed.\n"
556 "2\n" 640 "2\n"
557 "data2 is destructed.\n" 641 "data2 is destructed.\n"
558 "3\n", 642 "3\n",
559 logger->log()); 643 logger->log());
560 } 644 }
561 645
646 TEST_F(ThreadedSharedMemoryDataConsumerHandleTest, Read) {
647 base::RunLoop run_loop;
648 auto operation = make_scoped_ptr(
649 new ReadDataOperation(handle_.Pass(), &loop_, run_loop.QuitClosure()));
650 scoped_refptr<Logger> logger(new Logger);
651
652 base::Thread t("DataConsumerHandle test thread");
653 ASSERT_TRUE(t.Start());
654
655 t.message_loop()->PostTask(FROM_HERE,
656 base::Bind(&ReadDataOperation::ReadData,
657 base::Unretained(operation.get())));
658
659 logger->Add("1");
660 writer_->AddData(
661 make_scoped_ptr(new LoggingFixedReceivedData("data1", "Once ", logger)));
662 writer_->AddData(
663 make_scoped_ptr(new LoggingFixedReceivedData("data2", "upon ", logger)));
664 writer_->AddData(make_scoped_ptr(
665 new LoggingFixedReceivedData("data3", "a time ", logger)));
666 writer_->AddData(
667 make_scoped_ptr(new LoggingFixedReceivedData("data4", "there ", logger)));
668 writer_->AddData(
669 make_scoped_ptr(new LoggingFixedReceivedData("data5", "was ", logger)));
670 writer_->Close();
671 logger->Add("2");
672
673 run_loop.Run();
674 t.Stop();
675
676 EXPECT_EQ("Once upon a time there was ", operation->result());
677 EXPECT_EQ(
678 "1\n"
679 "2\n"
680 "data1 is destructed.\n"
681 "data2 is destructed.\n"
682 "data3 is destructed.\n"
683 "data4 is destructed.\n"
684 "data5 is destructed.\n",
685 logger->log());
686 }
687
562 INSTANTIATE_TEST_CASE_P(SharedMemoryDataConsumerHandleTest, 688 INSTANTIATE_TEST_CASE_P(SharedMemoryDataConsumerHandleTest,
563 SharedMemoryDataConsumerHandleTest, 689 SharedMemoryDataConsumerHandleTest,
564 ::testing::Values(kApplyBackpressure, 690 ::testing::Values(kApplyBackpressure,
565 kDoNotApplyBackpressure)); 691 kDoNotApplyBackpressure));
566 } // namespace 692 } // namespace
567 693
568 } // namespace content 694 } // namespace content
OLDNEW
« no previous file with comments | « content/child/shared_memory_data_consumer_handle.cc ('k') | content/public/child/fixed_received_data.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698