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

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 and test 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
« no previous file with comments | « content/child/blob_storage/blob_transport_controller.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/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 scoped_ptr<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 std::vector<DataElement> out;
77 holder->GetDescriptions(consolidation.get(), kShortcutSize, &out);
78
79 std::vector<DataElement> expected;
80 expected.push_back(MakeBlobElement(KRefBlobUUID, 10, 10));
81 expected.push_back(MakeDataElement("HelloHello2"));
82 expected.push_back(MakeBlobElement(KRefBlobUUID, 0, 10));
83 expected.push_back(MakeDataDescriptionElement(6));
84 EXPECT_EQ(expected, out);
85 }
86
87 TEST_F(BlobTransportControllerTest, Responses) {
88 using ResponsesStatus = BlobTransportController::ResponsesStatus;
89 const std::string kBlobUUID = "uuid";
90 const std::string KRefBlobUUID = "refuuid";
91 const std::string kBadBlobUUID = "uuuidBad";
92 BlobTransportController* holder = BlobTransportController::GetInstance();
93
94 // The first two data elements should be combined.
95 BlobConsolidation* consolidation = new BlobConsolidation();
96 consolidation->AddBlobItem(KRefBlobUUID, 10, 10);
97 consolidation->AddDataItem(CreateData("Hello"));
98 consolidation->AddDataItem(CreateData("Hello2"));
99 consolidation->AddBlobItem(KRefBlobUUID, 0, 10);
100 consolidation->AddDataItem(CreateData("Hello3"));
101 // See the above test for the expected descriptions layout.
102
103 holder->blob_storage_.insert(kBlobUUID, make_scoped_ptr(consolidation));
104
105 std::vector<BlobItemBytesRequest> requests;
106 std::vector<base::SharedMemoryHandle> memory_handles;
107 std::vector<IPC::PlatformFileForTransit> file_handles;
108 std::vector<storage::BlobItemBytesResponse> output;
109
110 // Request for all of first data
111 requests.push_back(BlobItemBytesRequest::CreateIPCRequest(0, 1, 0, 11));
112 EXPECT_EQ(ResponsesStatus::SUCCESS,
113 holder->GetResponses(kBlobUUID, requests, &memory_handles,
114 file_handles, &output));
115 EXPECT_EQ(1u, output.size());
116 std::vector<storage::BlobItemBytesResponse> expected;
117 expected.push_back(ResponseWithData(0, "HelloHello2"));
118 EXPECT_EQ(expected, output);
119
120 // Part of second data
121 output.clear();
122 requests[0] = BlobItemBytesRequest::CreateIPCRequest(1000, 3, 1, 5);
123 EXPECT_EQ(ResponsesStatus::SUCCESS,
124 holder->GetResponses(kBlobUUID, requests, &memory_handles,
125 file_handles, &output));
126 EXPECT_EQ(1u, output.size());
127 expected.clear();
128 expected.push_back(ResponseWithData(1000, "ello3"));
129 EXPECT_EQ(expected, output);
130
131 // Both data segments
132 output.clear();
133 requests[0] = BlobItemBytesRequest::CreateIPCRequest(0, 1, 0, 11);
134 requests.push_back(BlobItemBytesRequest::CreateIPCRequest(1, 3, 0, 6));
135 EXPECT_EQ(ResponsesStatus::SUCCESS,
136 holder->GetResponses(kBlobUUID, requests, &memory_handles,
137 file_handles, &output));
138 EXPECT_EQ(2u, output.size());
139 expected.clear();
140 expected.push_back(ResponseWithData(0, "HelloHello2"));
141 expected.push_back(ResponseWithData(1, "Hello3"));
142 EXPECT_EQ(expected, output);
143 }
144
145 TEST_F(BlobTransportControllerTest, SharedMemory) {
146 using ResponsesStatus = BlobTransportController::ResponsesStatus;
147 const std::string kBlobUUID = "uuid";
148 const std::string KRefBlobUUID = "refuuid";
149 const std::string kBadBlobUUID = "uuuidBad";
150 BlobTransportController* holder = BlobTransportController::GetInstance();
151
152 // The first two data elements should be combined.
153 BlobConsolidation* consolidation = new BlobConsolidation();
154 consolidation->AddBlobItem(KRefBlobUUID, 10, 10);
155 consolidation->AddDataItem(CreateData("Hello"));
156 consolidation->AddDataItem(CreateData("Hello2"));
157 consolidation->AddBlobItem(KRefBlobUUID, 0, 10);
158 consolidation->AddDataItem(CreateData("Hello3"));
159 // See the above test for the expected descriptions layout.
160
161 holder->blob_storage_.insert(kBlobUUID, make_scoped_ptr(consolidation));
162
163 std::vector<BlobItemBytesRequest> requests;
164 std::vector<base::SharedMemoryHandle> memory_handles;
165 std::vector<IPC::PlatformFileForTransit> file_handles;
166 std::vector<storage::BlobItemBytesResponse> output;
167
168 // Request for all data in shared memory
169 requests.push_back(
170 BlobItemBytesRequest::CreateSharedMemoryRequest(0, 1, 0, 11, 0, 0));
171 requests.push_back(
172 BlobItemBytesRequest::CreateSharedMemoryRequest(1, 3, 0, 6, 0, 11));
173 base::SharedMemory memory;
174 memory.CreateAndMapAnonymous(11 + 6);
175 base::SharedMemoryHandle handle =
176 base::SharedMemory::DuplicateHandle(memory.handle());
177 CHECK(base::SharedMemory::NULLHandle() != handle);
178 memory_handles.push_back(handle);
179
180 EXPECT_EQ(ResponsesStatus::SUCCESS,
181 holder->GetResponses(kBlobUUID, requests, &memory_handles,
182 file_handles, &output));
183 EXPECT_EQ(2u, output.size());
184 std::vector<storage::BlobItemBytesResponse> expected;
185 expected.push_back(BlobItemBytesResponse(0));
186 expected.push_back(BlobItemBytesResponse(1));
187 EXPECT_EQ(expected, output);
188 std::string expected_memory = "HelloHello2Hello3";
189 const char* mem_location = static_cast<const char*>(memory.memory());
190 std::vector<char> value(mem_location, mem_location + memory.requested_size());
191 EXPECT_THAT(value, testing::ElementsAreArray(expected_memory.c_str(),
192 expected_memory.size()));
193 }
194
195 TEST_F(BlobTransportControllerTest, TestPublicMethods) {
196 const std::string kBlobUUID = "uuid";
197 const std::string KRefBlobUUID = "refuuid";
198 const std::string kBadBlobUUID = "uuuidBad";
199 BlobTransportController* holder = BlobTransportController::GetInstance();
200
201 BlobConsolidation* consolidation = new BlobConsolidation();
202 consolidation->AddBlobItem(KRefBlobUUID, 10, 10);
203 holder->InitiateBlobTransfer(kBlobUUID, "", make_scoped_ptr(consolidation),
204 nullptr);
205 holder->OnCancel(kBlobUUID,
206 storage::IPCBlobCreationCancelCode::OUT_OF_MEMORY);
207 EXPECT_FALSE(holder->IsTransporting(kBlobUUID));
208
209 consolidation = new BlobConsolidation();
210 consolidation->AddBlobItem(KRefBlobUUID, 10, 10);
211 holder->InitiateBlobTransfer(kBlobUUID, "", make_scoped_ptr(consolidation),
212 nullptr);
213 holder->OnDone(kBlobUUID);
214 EXPECT_FALSE(holder->IsTransporting(kBlobUUID));
215 }
216
217 TEST_F(BlobTransportControllerTest, ResponsesErrors) {
218 using ResponsesStatus = BlobTransportController::ResponsesStatus;
219 const std::string kBlobUUID = "uuid";
220 const std::string KRefBlobUUID = "refuuid";
221 const std::string kBadBlobUUID = "uuuidBad";
222 BlobTransportController* holder = BlobTransportController::GetInstance();
223
224 BlobConsolidation* consolidation = new BlobConsolidation();
225 consolidation->AddBlobItem(KRefBlobUUID, 10, 10);
226
227 holder->blob_storage_.insert(kBlobUUID, make_scoped_ptr(consolidation));
228
229 std::vector<BlobItemBytesRequest> requests;
230 std::vector<base::SharedMemoryHandle> memory_handles;
231 std::vector<IPC::PlatformFileForTransit> file_handles;
232 std::vector<storage::BlobItemBytesResponse> output;
233
234 // Error conditions
235 EXPECT_EQ(ResponsesStatus::BLOB_NOT_FOUND,
236 holder->GetResponses(kBadBlobUUID, requests, &memory_handles,
237 file_handles, &output));
238 EXPECT_EQ(0u, output.size());
239 }
240
241 } // namespace content
OLDNEW
« no previous file with comments | « content/child/blob_storage/blob_transport_controller.cc ('k') | content/content_child.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698