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

Side by Side Diff: content/child/blob_storage/blob_transport_controller_unittest.cc

Issue 1292523002: [BlobAsync] Patch 3: Renderer Classes & Logic (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@async2
Patch Set: comments Created 5 years, 1 month 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/blob_storage/blob_transport_controller.h"
6
7 #include "base/memory/shared_memory.h"
8 #include "content/child/blob_storage/blob_consolidation.h"
9 #include "storage/common/blob_storage/blob_item_bytes_request.h"
10 #include "storage/common/blob_storage/blob_item_bytes_response.h"
11 #include "testing/gmock/include/gmock/gmock.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 using storage::BlobItemBytesRequest;
15 using storage::BlobItemBytesResponse;
16 using storage::DataElement;
17
18 namespace content {
19 namespace {
20
21 BlobItemBytesResponse ResponseWithData(size_t request_number,
22 const std::string& str) {
23 BlobItemBytesResponse response(request_number);
24 response.inline_data.assign(str.begin(), str.end());
25 return response;
26 }
27
28 static DataElement MakeBlobElement(const std::string& uuid,
29 uint64_t offset,
30 uint64_t size) {
31 DataElement element;
32 element.SetToBlobRange(uuid, offset, size);
33 return element;
34 }
35
36 static DataElement MakeDataDescriptionElement(size_t size) {
37 DataElement element;
38 element.SetToBytesDescription(size);
39 return element;
40 }
41
42 static DataElement MakeDataElement(const std::string& str) {
43 DataElement element;
44 element.SetToBytes(str.c_str(), str.size());
45 return element;
46 }
47
48 static blink::WebThreadSafeData CreateData(const std::string& str) {
49 return blink::WebThreadSafeData(str.c_str(), str.size());
50 }
51
52 } // namespace
53
54 class BlobTransportControllerTest : public testing::Test {
55 public:
56 void SetUp() override { BlobTransportController::GetInstance()->Clear(); }
57
58 void TearDown() override { BlobTransportController::GetInstance()->Clear(); }
59 };
60
61 TEST_F(BlobTransportControllerTest, Descriptions) {
62 const std::string kBlobUUID = "uuid";
63 const std::string KRefBlobUUID = "refuuid";
64 const std::string kBadBlobUUID = "uuuidBad";
65 const size_t kShortcutSize = 11;
66 BlobTransportController* holder = BlobTransportController::GetInstance();
67
68 // The first two data elements should be combined and the data shortcut.
69 BlobConsolidation* consolidation = new BlobConsolidation();
70 consolidation->AddBlobItem(KRefBlobUUID, 10, 10);
71 consolidation->AddDataItem(CreateData("Hello"));
72 consolidation->AddDataItem(CreateData("Hello2"));
73 consolidation->AddBlobItem(KRefBlobUUID, 0, 10);
74 consolidation->AddDataItem(CreateData("Hello3"));
75
76 ASSERT_TRUE(
77 holder->HoldBlobConsolidation(kBlobUUID, make_scoped_ptr(consolidation)));
78
79 std::vector<DataElement> out;
80 holder->GetDescriptions(kBlobUUID, kShortcutSize, &out);
81
82 std::vector<DataElement> expected;
83 expected.push_back(MakeBlobElement(KRefBlobUUID, 10, 10));
84 expected.push_back(MakeDataElement("HelloHello2"));
85 expected.push_back(MakeBlobElement(KRefBlobUUID, 0, 10));
86 expected.push_back(MakeDataDescriptionElement(6));
87 EXPECT_EQ(expected, out);
88 }
89
90 TEST_F(BlobTransportControllerTest, Responses) {
91 using ResponsesStatus = BlobTransportController::ResponsesStatus;
92 const std::string kBlobUUID = "uuid";
93 const std::string KRefBlobUUID = "refuuid";
94 const std::string kBadBlobUUID = "uuuidBad";
95 BlobTransportController* holder = BlobTransportController::GetInstance();
96
97 // The first two data elements should be combined.
98 BlobConsolidation* consolidation = new BlobConsolidation();
99 consolidation->AddBlobItem(KRefBlobUUID, 10, 10);
100 consolidation->AddDataItem(CreateData("Hello"));
101 consolidation->AddDataItem(CreateData("Hello2"));
102 consolidation->AddBlobItem(KRefBlobUUID, 0, 10);
103 consolidation->AddDataItem(CreateData("Hello3"));
104 // See the above test for the expected descriptions layout.
105
106 ASSERT_TRUE(
107 holder->HoldBlobConsolidation(kBlobUUID, make_scoped_ptr(consolidation)));
108
109 std::vector<BlobItemBytesRequest> requests;
110 std::vector<base::SharedMemoryHandle> memory_handles;
111 std::vector<IPC::PlatformFileForTransit> file_handles;
112 std::vector<storage::BlobItemBytesResponse> output;
113
114 // Request for all of first data
115 requests.push_back(BlobItemBytesRequest::CreateIPCRequest(0, 1, 0, 11));
116 EXPECT_EQ(ResponsesStatus::SUCCESS,
117 holder->GetResponses(kBlobUUID, requests, &memory_handles,
118 file_handles, &output));
119 EXPECT_EQ(1u, output.size());
120 std::vector<storage::BlobItemBytesResponse> expected;
121 expected.push_back(ResponseWithData(0, "HelloHello2"));
122 EXPECT_EQ(expected, output);
123
124 // Part of second data
125 output.clear();
126 requests[0] = BlobItemBytesRequest::CreateIPCRequest(1000, 3, 1, 5);
127 EXPECT_EQ(ResponsesStatus::SUCCESS,
128 holder->GetResponses(kBlobUUID, requests, &memory_handles,
129 file_handles, &output));
130 EXPECT_EQ(1u, output.size());
131 expected.clear();
132 expected.push_back(ResponseWithData(1000, "ello3"));
133 EXPECT_EQ(expected, output);
134
135 // Both data segments
136 output.clear();
137 requests[0] = BlobItemBytesRequest::CreateIPCRequest(0, 1, 0, 11);
138 requests.push_back(BlobItemBytesRequest::CreateIPCRequest(1, 3, 0, 6));
139 EXPECT_EQ(ResponsesStatus::SUCCESS,
140 holder->GetResponses(kBlobUUID, requests, &memory_handles,
141 file_handles, &output));
142 EXPECT_EQ(2u, output.size());
143 expected.clear();
144 expected.push_back(ResponseWithData(0, "HelloHello2"));
145 expected.push_back(ResponseWithData(1, "Hello3"));
146 EXPECT_EQ(expected, output);
147 }
148
149 TEST_F(BlobTransportControllerTest, SharedMemory) {
150 using ResponsesStatus = BlobTransportController::ResponsesStatus;
151 const std::string kBlobUUID = "uuid";
152 const std::string KRefBlobUUID = "refuuid";
153 const std::string kBadBlobUUID = "uuuidBad";
154 BlobTransportController* holder = BlobTransportController::GetInstance();
155
156 // The first two data elements should be combined.
157 BlobConsolidation* consolidation = new BlobConsolidation();
158 consolidation->AddBlobItem(KRefBlobUUID, 10, 10);
159 consolidation->AddDataItem(CreateData("Hello"));
160 consolidation->AddDataItem(CreateData("Hello2"));
161 consolidation->AddBlobItem(KRefBlobUUID, 0, 10);
162 consolidation->AddDataItem(CreateData("Hello3"));
163 // See the above test for the expected descriptions layout.
164
165 ASSERT_TRUE(
166 holder->HoldBlobConsolidation(kBlobUUID, make_scoped_ptr(consolidation)));
167
168 std::vector<BlobItemBytesRequest> requests;
169 std::vector<base::SharedMemoryHandle> memory_handles;
170 std::vector<IPC::PlatformFileForTransit> file_handles;
171 std::vector<storage::BlobItemBytesResponse> output;
172
173 // Request for all data in shared memory
174 requests.push_back(
175 BlobItemBytesRequest::CreateSharedMemoryRequest(0, 1, 0, 11, 0, 0));
176 requests.push_back(
177 BlobItemBytesRequest::CreateSharedMemoryRequest(1, 3, 0, 6, 0, 11));
178 base::SharedMemory memory;
179 memory.CreateAndMapAnonymous(11 + 6);
180 base::SharedMemoryHandle handle =
181 base::SharedMemory::DuplicateHandle(memory.handle());
182 CHECK(base::SharedMemory::NULLHandle() != handle);
183 memory_handles.push_back(handle);
184
185 EXPECT_EQ(ResponsesStatus::SUCCESS,
186 holder->GetResponses(kBlobUUID, requests, &memory_handles,
187 file_handles, &output));
188 EXPECT_EQ(2u, output.size());
189 std::vector<storage::BlobItemBytesResponse> expected;
190 expected.push_back(BlobItemBytesResponse(0));
191 expected.push_back(BlobItemBytesResponse(1));
192 EXPECT_EQ(expected, output);
193 std::string expected_memory = "HelloHello2Hello3";
194 const char* mem_location = static_cast<const char*>(memory.memory());
195 std::vector<char> value(mem_location, mem_location + memory.requested_size());
196 EXPECT_THAT(value, testing::ElementsAreArray(expected_memory.c_str(),
197 expected_memory.size()));
198 }
199
200 TEST_F(BlobTransportControllerTest, ResponsesErrors) {
201 using ResponsesStatus = BlobTransportController::ResponsesStatus;
202 const std::string kBlobUUID = "uuid";
203 const std::string KRefBlobUUID = "refuuid";
204 const std::string kBadBlobUUID = "uuuidBad";
205 BlobTransportController* holder = BlobTransportController::GetInstance();
206
207 // The first two data elements should be combined.
208 BlobConsolidation* consolidation = new BlobConsolidation();
209 consolidation->AddBlobItem(KRefBlobUUID, 10, 10);
210 consolidation->AddDataItem(CreateData("Hello"));
211 consolidation->AddDataItem(CreateData("Hello2"));
212 consolidation->AddBlobItem(KRefBlobUUID, 0, 10);
213 consolidation->AddDataItem(CreateData("Hello3"));
214 // See the above test for the expected descriptions layout.
215
216 ASSERT_TRUE(
217 holder->HoldBlobConsolidation(kBlobUUID, make_scoped_ptr(consolidation)));
218
219 std::vector<BlobItemBytesRequest> requests;
220 std::vector<base::SharedMemoryHandle> memory_handles;
221 std::vector<IPC::PlatformFileForTransit> file_handles;
222 std::vector<storage::BlobItemBytesResponse> output;
223
224 // Error conditions
225 EXPECT_EQ(ResponsesStatus::BLOB_NOT_FOUND,
226 holder->GetResponses(kBadBlobUUID, requests, &memory_handles,
227 file_handles, &output));
228
229 requests.push_back(BlobItemBytesRequest::CreateIPCRequest(0, 5, 0, 10));
230 EXPECT_EQ(ResponsesStatus::INVALID_ITEM_INDEX,
231 holder->GetResponses(kBlobUUID, requests, &memory_handles,
232 file_handles, &output));
233 EXPECT_EQ(0u, output.size());
234
235 requests[0] = BlobItemBytesRequest::CreateIPCRequest(0, 0, 0, 10);
236 EXPECT_EQ(ResponsesStatus::INVALID_ITEM,
237 holder->GetResponses(kBlobUUID, requests, &memory_handles,
238 file_handles, &output));
239 EXPECT_EQ(0u, output.size());
240
241 requests[0] = BlobItemBytesRequest::CreateIPCRequest(0, 1, 0, 20);
242 EXPECT_EQ(ResponsesStatus::INVALID_DATA_RANGE,
243 holder->GetResponses(kBlobUUID, requests, &memory_handles,
244 file_handles, &output));
245 EXPECT_EQ(0u, output.size());
246 }
247
248 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698