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

Unified Diff: content/child/shared_memory_received_data_factory_unittest.cc

Issue 1103813002: Make WebURLLoader capable of retaining received buffers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
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 side-by-side diff with in-line comments
Download patch
Index: content/child/shared_memory_received_data_factory_unittest.cc
diff --git a/content/child/shared_memory_received_data_factory_unittest.cc b/content/child/shared_memory_received_data_factory_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..b197d4fdfd3ca0727808f5b10b3a4d1d71b09082
--- /dev/null
+++ b/content/child/shared_memory_received_data_factory_unittest.cc
@@ -0,0 +1,224 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/child/shared_memory_received_data_factory.h"
+
+#include "base/tuple.h"
+#include "content/common/resource_messages.h"
+#include "ipc/ipc_message.h"
+#include "ipc/ipc_sender.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace content {
+
+namespace {
+
+using ::testing::_;
+using ::testing::InSequence;
+using ::testing::MockFunction;
+using ::testing::Return;
+using ::testing::StrictMock;
+
+using Checkpoint = StrictMock<MockFunction<void(int)>>;
+using ReceivedData = RequestPeer::ReceivedData;
+
+class MockSender : public IPC::Sender {
+ public:
+ bool Send(IPC::Message* message) override {
+ bool result = false;
+ if (message->type() == ResourceHostMsg_DataReceived_ACK::ID) {
+ base::Tuple<int> args;
+ ResourceHostMsg_DataReceived_ACK::Read(message, &args);
+ result = SendAck(base::get<0>(args));
+ } else {
+ result = SendOtherwise(message);
+ }
+ delete message;
+ return result;
+ }
+ MOCK_METHOD1(SendAck, bool(int));
+ MOCK_METHOD1(SendOtherwise, bool(IPC::Message*));
+};
+
+class SharedMemoryReceivedDataFactoryTest : public ::testing::Test {
+ protected:
+ void SetUp() override {
+ sender_.reset(new StrictMock<MockSender>);
+ request_id_ = 0xdeadbeaf;
+ memory_.reset(new base::SharedMemory);
+ factory_ = make_scoped_refptr(new SharedMemoryReceivedDataFactory(
+ sender_.get(), request_id_, memory_));
+ ASSERT_TRUE(memory_->CreateAndMapAnonymous(memory_size));
+
+ ON_CALL(*sender_, SendAck(_)).WillByDefault(Return(true));
+ ON_CALL(*sender_, SendOtherwise(_)).WillByDefault(Return(true));
+ }
+
+ static const size_t memory_size = 4 * 1024;
+ scoped_ptr<MockSender> sender_;
+ int request_id_;
+ linked_ptr<base::SharedMemory> memory_;
+ scoped_refptr<SharedMemoryReceivedDataFactory> factory_;
+};
+
+TEST_F(SharedMemoryReceivedDataFactoryTest, Create) {
+ Checkpoint checkpoint;
+ InSequence s;
+ EXPECT_CALL(checkpoint, Call(0));
+ EXPECT_CALL(*sender_, SendAck(request_id_));
+ EXPECT_CALL(checkpoint, Call(1));
+
+ scoped_ptr<ReceivedData> data = factory_->Create(12, 34, 56);
+ const char* memory_start = static_cast<const char*>(memory_->memory());
+
+ ASSERT_TRUE(data);
+ EXPECT_EQ(memory_start + 12, data->payload());
+ EXPECT_EQ(34, data->length());
+ EXPECT_EQ(56, data->encoded_length());
+
+ checkpoint.Call(0);
+ data.reset();
+ checkpoint.Call(1);
+}
+
+TEST_F(SharedMemoryReceivedDataFactoryTest, CreateMultiple) {
+ Checkpoint checkpoint;
+ InSequence s;
+ EXPECT_CALL(checkpoint, Call(0));
+ EXPECT_CALL(*sender_, SendAck(request_id_));
+ EXPECT_CALL(checkpoint, Call(1));
+ EXPECT_CALL(*sender_, SendAck(request_id_));
+ EXPECT_CALL(checkpoint, Call(2));
+ EXPECT_CALL(*sender_, SendAck(request_id_));
+ EXPECT_CALL(checkpoint, Call(3));
+
+ scoped_ptr<ReceivedData> data1 = factory_->Create(0, 1, 1);
+ scoped_ptr<ReceivedData> data2 = factory_->Create(1, 1, 1);
+ scoped_ptr<ReceivedData> data3 = factory_->Create(2, 1, 1);
+
+ EXPECT_TRUE(data1);
+ EXPECT_TRUE(data2);
+ EXPECT_TRUE(data3);
+
+ checkpoint.Call(0);
+ data1.reset();
+ checkpoint.Call(1);
+ data2.reset();
+ checkpoint.Call(2);
+ data3.reset();
+ checkpoint.Call(3);
+}
+
+TEST_F(SharedMemoryReceivedDataFactoryTest, ReclaimOutOfOrder) {
+ Checkpoint checkpoint;
+ InSequence s;
+ EXPECT_CALL(checkpoint, Call(0));
+ EXPECT_CALL(checkpoint, Call(1));
+ EXPECT_CALL(checkpoint, Call(2));
+ EXPECT_CALL(*sender_, SendAck(request_id_));
+ EXPECT_CALL(*sender_, SendAck(request_id_));
+ EXPECT_CALL(*sender_, SendAck(request_id_));
+ EXPECT_CALL(checkpoint, Call(3));
+
+ scoped_ptr<ReceivedData> data1 = factory_->Create(0, 1, 1);
+ scoped_ptr<ReceivedData> data2 = factory_->Create(1, 1, 1);
+ scoped_ptr<ReceivedData> data3 = factory_->Create(2, 1, 1);
+
+ EXPECT_TRUE(data1);
+ EXPECT_TRUE(data2);
+ EXPECT_TRUE(data3);
+
+ checkpoint.Call(0);
+ data3.reset();
+ checkpoint.Call(1);
+ data2.reset();
+ checkpoint.Call(2);
+ data1.reset();
+ checkpoint.Call(3);
+}
+
+TEST_F(SharedMemoryReceivedDataFactoryTest, ReclaimOutOfOrderPartially) {
+ Checkpoint checkpoint;
+ InSequence s;
+ EXPECT_CALL(checkpoint, Call(0));
+ EXPECT_CALL(checkpoint, Call(1));
+ EXPECT_CALL(*sender_, SendAck(request_id_));
+ EXPECT_CALL(*sender_, SendAck(request_id_));
+ EXPECT_CALL(*sender_, SendAck(request_id_));
+ EXPECT_CALL(checkpoint, Call(2));
+ EXPECT_CALL(checkpoint, Call(3));
+ EXPECT_CALL(*sender_, SendAck(request_id_));
+ EXPECT_CALL(*sender_, SendAck(request_id_));
+ EXPECT_CALL(*sender_, SendAck(request_id_));
+ EXPECT_CALL(checkpoint, Call(4));
+
+ scoped_ptr<ReceivedData> data1 = factory_->Create(0, 1, 1);
+ scoped_ptr<ReceivedData> data2 = factory_->Create(1, 1, 1);
+ scoped_ptr<ReceivedData> data3 = factory_->Create(2, 1, 1);
+ scoped_ptr<ReceivedData> data4 = factory_->Create(3, 1, 1);
+ scoped_ptr<ReceivedData> data5 = factory_->Create(4, 1, 1);
+ scoped_ptr<ReceivedData> data6 = factory_->Create(5, 1, 1);
+
+ EXPECT_TRUE(data1);
+ EXPECT_TRUE(data2);
+ EXPECT_TRUE(data3);
+ EXPECT_TRUE(data4);
+ EXPECT_TRUE(data5);
+ EXPECT_TRUE(data6);
+
+ checkpoint.Call(0);
+ data3.reset();
+ data6.reset();
+ data2.reset();
+ checkpoint.Call(1);
+ data1.reset();
+ checkpoint.Call(2);
+ data5.reset();
+ checkpoint.Call(3);
+ data4.reset();
+ checkpoint.Call(4);
+}
+
+TEST_F(SharedMemoryReceivedDataFactoryTest, Stop) {
+ Checkpoint checkpoint;
+ InSequence s;
+ EXPECT_CALL(checkpoint, Call(0));
+ EXPECT_CALL(checkpoint, Call(1));
+ EXPECT_CALL(*sender_, SendAck(request_id_));
+ EXPECT_CALL(*sender_, SendAck(request_id_));
+ EXPECT_CALL(*sender_, SendAck(request_id_));
+ EXPECT_CALL(checkpoint, Call(2));
+ EXPECT_CALL(checkpoint, Call(3));
+
+ scoped_ptr<ReceivedData> data1 = factory_->Create(0, 1, 1);
+ scoped_ptr<ReceivedData> data2 = factory_->Create(1, 1, 1);
+ scoped_ptr<ReceivedData> data3 = factory_->Create(2, 1, 1);
+ scoped_ptr<ReceivedData> data4 = factory_->Create(3, 1, 1);
+ scoped_ptr<ReceivedData> data5 = factory_->Create(4, 1, 1);
+ scoped_ptr<ReceivedData> data6 = factory_->Create(5, 1, 1);
+
+ EXPECT_TRUE(data1);
+ EXPECT_TRUE(data2);
+ EXPECT_TRUE(data3);
+ EXPECT_TRUE(data4);
+ EXPECT_TRUE(data5);
+ EXPECT_TRUE(data6);
+
+ checkpoint.Call(0);
+ data3.reset();
+ data6.reset();
+ data2.reset();
+ checkpoint.Call(1);
+ data1.reset();
+ checkpoint.Call(2);
+ factory_->Stop();
+ data5.reset();
+ data4.reset();
+ checkpoint.Call(3);
+}
+
+} // namespace
+
+} // namespace content

Powered by Google App Engine
This is Rietveld 408576698