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

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

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

Powered by Google App Engine
This is Rietveld 408576698