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

Side by Side Diff: content/browser/blob_storage/blob_async_transport_request_builder_unittest.cc

Issue 2448353002: [BlobAsync] Moving async handling into BlobStorageContext & quota out. (Closed)
Patch Set: Cleaned up more Created 4 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 <stddef.h>
6 #include <stdint.h>
7
8 #include <string>
9
10 #include "base/logging.h"
11 #include "storage/browser/blob/blob_async_transport_request_builder.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 namespace storage {
15 namespace {
16
17 const char kNewUUID[] = "newUUID";
18 const char kFakeBlobUUID[] = "fakeBlob";
19
20 void AddMemoryItem(size_t length, std::vector<DataElement>* out) {
21 DataElement bytes;
22 bytes.SetToBytesDescription(length);
23 out->push_back(bytes);
24 }
25
26 void AddShortcutMemoryItem(size_t length, std::vector<DataElement>* out) {
27 DataElement bytes;
28 bytes.SetToAllocatedBytes(length);
29 for (size_t i = 0; i < length; i++) {
30 bytes.mutable_bytes()[i] = static_cast<char>(i);
31 }
32 out->push_back(bytes);
33 }
34
35 void AddBlobItem(std::vector<DataElement>* out) {
36 DataElement blob;
37 blob.SetToBlob(kFakeBlobUUID);
38 out->push_back(blob);
39 }
40
41 TEST(BlobAsyncTransportRequestBuilderTest, TestNoMemoryItems) {
42 BlobAsyncTransportRequestBuilder strategy;
43 BlobDataBuilder builder(kNewUUID);
44 std::vector<DataElement> infos;
45
46 // Here we test that we don't do any requests when there are no memory items.
47 AddBlobItem(&infos);
48 AddBlobItem(&infos);
49 AddBlobItem(&infos);
50 strategy.InitializeForIPCRequests(100, // max_ipc_memory_size
51 0, // blob_total_size
52 infos, &builder);
53
54 EXPECT_EQ(0u, strategy.shared_memory_sizes().size());
55 EXPECT_EQ(0u, strategy.file_sizes().size());
56 EXPECT_EQ(0u, strategy.requests().size());
57
58 BlobDataBuilder expected_builder(kNewUUID);
59 expected_builder.AppendBlob(kFakeBlobUUID);
60 expected_builder.AppendBlob(kFakeBlobUUID);
61 expected_builder.AppendBlob(kFakeBlobUUID);
62 EXPECT_EQ(expected_builder, builder);
63 }
64
65 TEST(BlobAsyncTransportRequestBuilderTest, TestLargeBlockToFile) {
66 BlobAsyncTransportRequestBuilder strategy;
67 BlobDataBuilder builder(kNewUUID);
68 std::vector<DataElement> infos;
69
70 AddMemoryItem(305, &infos);
71 strategy.InitializeForFileRequests(400, // max_file_size
72 305, // blob_total_size
73 infos, &builder);
74
75 EXPECT_EQ(0u, strategy.shared_memory_sizes().size());
76 EXPECT_EQ(1u, strategy.file_sizes().size());
77 EXPECT_EQ(305ul, strategy.file_sizes().at(0));
78 EXPECT_EQ(1u, strategy.requests().size());
79
80 auto& memory_item_request = strategy.requests().at(0);
81 EXPECT_EQ(0u, memory_item_request.browser_item_index);
82 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
83 EXPECT_EQ(
84 BlobItemBytesRequest::CreateFileRequest(0u, 0u, 0ull, 305ull, 0u, 0ull),
85 memory_item_request.message);
86
87 BlobDataBuilder expected_builder(kNewUUID);
88 expected_builder.AppendFutureFile(0, 305, 0);
89 EXPECT_EQ(expected_builder, builder);
90 }
91
92 TEST(BlobAsyncTransportRequestBuilderTest, TestLargeBlockToFiles) {
93 BlobAsyncTransportRequestBuilder strategy;
94 BlobDataBuilder builder(kNewUUID);
95 std::vector<DataElement> infos;
96
97 AddMemoryItem(1000, &infos);
98 strategy.InitializeForFileRequests(400, // max_file_size
99 1000, // blob_total_size
100 infos, &builder);
101
102 EXPECT_EQ(0u, strategy.shared_memory_sizes().size());
103 EXPECT_EQ(3u, strategy.file_sizes().size());
104 EXPECT_EQ(400ul, strategy.file_sizes().at(0));
105 EXPECT_EQ(400ul, strategy.file_sizes().at(1));
106 EXPECT_EQ(200ul, strategy.file_sizes().at(2));
107 EXPECT_EQ(3u, strategy.requests().size());
108
109 auto memory_item_request = strategy.requests().at(0);
110 EXPECT_EQ(0u, memory_item_request.browser_item_index);
111 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
112 EXPECT_EQ(
113 BlobItemBytesRequest::CreateFileRequest(0u, 0u, 0ull, 400ull, 0u, 0ull),
114 memory_item_request.message);
115
116 memory_item_request = strategy.requests().at(1);
117 EXPECT_EQ(1u, memory_item_request.browser_item_index);
118 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
119 EXPECT_EQ(
120 BlobItemBytesRequest::CreateFileRequest(1u, 0u, 400ull, 400ull, 1u, 0ull),
121 memory_item_request.message);
122
123 memory_item_request = strategy.requests().at(2);
124 EXPECT_EQ(2u, memory_item_request.browser_item_index);
125 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
126 EXPECT_EQ(
127 BlobItemBytesRequest::CreateFileRequest(2u, 0u, 800ull, 200ull, 2u, 0ull),
128 memory_item_request.message);
129
130 BlobDataBuilder expected_builder(kNewUUID);
131 expected_builder.AppendFutureFile(0, 400, 0);
132 expected_builder.AppendFutureFile(0, 400, 1);
133 expected_builder.AppendFutureFile(0, 200, 2);
134 EXPECT_EQ(expected_builder, builder);
135 }
136
137 TEST(BlobAsyncTransportRequestBuilderTest,
138 TestLargeBlocksConsolidatingInFiles) {
139 BlobAsyncTransportRequestBuilder strategy;
140 BlobDataBuilder builder(kNewUUID);
141 std::vector<DataElement> infos;
142
143 // We should have 3 storage items for the memory, two files, 400 each.
144 // We end up with storage items:
145 // 1: File A, 300MB
146 // 2: Blob
147 // 3: File A, 100MB (300MB offset)
148 // 4: File B, 400MB
149 AddMemoryItem(300, &infos);
150 AddBlobItem(&infos);
151 AddMemoryItem(500, &infos);
152
153 strategy.InitializeForFileRequests(400, // max_file_size
154 800, // blob_total_size
155 infos, &builder);
156
157 EXPECT_EQ(0u, strategy.shared_memory_sizes().size());
158 EXPECT_EQ(2u, strategy.file_sizes().size());
159 EXPECT_EQ(400ul, strategy.file_sizes().at(0));
160 EXPECT_EQ(400ul, strategy.file_sizes().at(1));
161 EXPECT_EQ(3u, strategy.requests().size());
162
163 auto memory_item_request = strategy.requests().at(0);
164 EXPECT_EQ(0u, memory_item_request.browser_item_index);
165 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
166 EXPECT_EQ(
167 BlobItemBytesRequest::CreateFileRequest(0u, 0u, 0ull, 300ull, 0u, 0ull),
168 memory_item_request.message);
169
170 memory_item_request = strategy.requests().at(1);
171 EXPECT_EQ(2u, memory_item_request.browser_item_index);
172 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
173 EXPECT_EQ(
174 BlobItemBytesRequest::CreateFileRequest(1u, 2u, 0ull, 100ull, 0u, 300ull),
175 memory_item_request.message);
176
177 memory_item_request = strategy.requests().at(2);
178 EXPECT_EQ(3u, memory_item_request.browser_item_index);
179 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
180 EXPECT_EQ(
181 BlobItemBytesRequest::CreateFileRequest(2u, 2u, 100ull, 400ull, 1u, 0ull),
182 memory_item_request.message);
183 }
184
185 TEST(BlobAsyncTransportRequestBuilderTest, TestSharedMemorySegmentation) {
186 BlobAsyncTransportRequestBuilder strategy;
187 BlobDataBuilder builder(kNewUUID);
188 std::vector<DataElement> infos;
189
190 // For transport we should have 3 shared memories, and then storage in 3
191 // browser items.
192 AddMemoryItem(500, &infos);
193 strategy.InitializeForSharedMemoryRequests(200, // max_shared_memory_size
194 500, // total_blob_size
195 infos, &builder);
196
197 EXPECT_EQ(0u, strategy.file_sizes().size());
198 EXPECT_EQ(3u, strategy.shared_memory_sizes().size());
199 EXPECT_EQ(200u, strategy.shared_memory_sizes().at(0));
200 EXPECT_EQ(200u, strategy.shared_memory_sizes().at(1));
201 EXPECT_EQ(100u, strategy.shared_memory_sizes().at(2));
202 EXPECT_EQ(3u, strategy.requests().size());
203
204 auto memory_item_request = strategy.requests().at(0);
205 EXPECT_EQ(0u, memory_item_request.browser_item_index);
206 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
207 EXPECT_EQ(BlobItemBytesRequest::CreateSharedMemoryRequest(0u, 0u, 0ull,
208 200ull, 0u, 0ull),
209 memory_item_request.message);
210
211 memory_item_request = strategy.requests().at(1);
212 EXPECT_EQ(1u, memory_item_request.browser_item_index);
213 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
214 EXPECT_EQ(BlobItemBytesRequest::CreateSharedMemoryRequest(1u, 0u, 200ull,
215 200ull, 1u, 0ull),
216 memory_item_request.message);
217
218 memory_item_request = strategy.requests().at(2);
219 EXPECT_EQ(2u, memory_item_request.browser_item_index);
220 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
221 EXPECT_EQ(BlobItemBytesRequest::CreateSharedMemoryRequest(2u, 0u, 400ull,
222 100ull, 2u, 0ull),
223 memory_item_request.message);
224
225 BlobDataBuilder expected_builder(kNewUUID);
226 expected_builder.AppendFutureData(200);
227 expected_builder.AppendFutureData(200);
228 expected_builder.AppendFutureData(100);
229 EXPECT_EQ(expected_builder, builder);
230 }
231
232 TEST(BlobAsyncTransportRequestBuilderTest,
233 TestSharedMemorySegmentationAndStorage) {
234 BlobAsyncTransportRequestBuilder strategy;
235 BlobDataBuilder builder(kNewUUID);
236 std::vector<DataElement> infos;
237
238 // For transport, we should have 2 shared memories, where the first one
239 // have half 0 and half 3, and then the last one has half 3.
240 //
241 // For storage, we should have 3 browser items that match the pre-transport
242 // version:
243 // 1: Bytes 100MB
244 // 2: Blob
245 // 3: Bytes 200MB
246 AddShortcutMemoryItem(100, &infos); // should have no behavior change
247 AddBlobItem(&infos);
248 AddMemoryItem(200, &infos);
249
250 strategy.InitializeForSharedMemoryRequests(200, // max_shared_memory_size
251 300, // total_blob_size
252 infos, &builder);
253
254 EXPECT_EQ(0u, strategy.file_sizes().size());
255 EXPECT_EQ(2u, strategy.shared_memory_sizes().size());
256 EXPECT_EQ(200u, strategy.shared_memory_sizes().at(0));
257 EXPECT_EQ(100u, strategy.shared_memory_sizes().at(1));
258 EXPECT_EQ(3u, strategy.requests().size());
259
260 auto memory_item_request = strategy.requests().at(0);
261 EXPECT_EQ(0u, memory_item_request.browser_item_index);
262 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
263 EXPECT_EQ(BlobItemBytesRequest::CreateSharedMemoryRequest(0u, 0u, 0ull,
264 100ull, 0u, 0ull),
265 memory_item_request.message);
266
267 memory_item_request = strategy.requests().at(1);
268 EXPECT_EQ(2u, memory_item_request.browser_item_index);
269 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
270 EXPECT_EQ(BlobItemBytesRequest::CreateSharedMemoryRequest(1u, 2u, 0ull,
271 100ull, 0u, 100ull),
272 memory_item_request.message);
273
274 memory_item_request = strategy.requests().at(2);
275 EXPECT_EQ(2u, memory_item_request.browser_item_index);
276 EXPECT_EQ(100u, memory_item_request.browser_item_offset);
277 EXPECT_EQ(BlobItemBytesRequest::CreateSharedMemoryRequest(2u, 2u, 100ull,
278 100ull, 1u, 0ull),
279 memory_item_request.message);
280
281 BlobDataBuilder expected_builder(kNewUUID);
282 expected_builder.AppendFutureData(100);
283 expected_builder.AppendBlob(kFakeBlobUUID);
284 expected_builder.AppendFutureData(200);
285 EXPECT_EQ(expected_builder, builder);
286 }
287
288 TEST(BlobAsyncTransportRequestBuilderTest, TestSimpleIPC) {
289 // Test simple IPC strategy, where size < max_ipc_memory_size and we have
290 // just one item.
291 std::vector<DataElement> infos;
292 BlobAsyncTransportRequestBuilder strategy;
293 BlobDataBuilder builder(kNewUUID);
294 AddMemoryItem(10, &infos);
295 AddBlobItem(&infos);
296
297 strategy.InitializeForIPCRequests(100, // max_ipc_memory_size
298 10, // total_blob_size
299 infos, &builder);
300
301 EXPECT_EQ(0u, strategy.file_sizes().size());
302 EXPECT_EQ(0u, strategy.shared_memory_sizes().size());
303 ASSERT_EQ(1u, strategy.requests().size());
304
305 auto memory_item_request = strategy.requests().at(0);
306 EXPECT_EQ(0u, memory_item_request.browser_item_index);
307 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
308 EXPECT_EQ(BlobItemBytesRequest::CreateIPCRequest(0u, 0u, 0ull, 10ull),
309 memory_item_request.message);
310 }
311
312 TEST(BlobAsyncTransportRequestBuilderTest, TestMultipleIPC) {
313 // Same as above, but with 2 items and a blob in-between.
314 std::vector<DataElement> infos;
315 BlobAsyncTransportRequestBuilder strategy;
316 BlobDataBuilder builder(kNewUUID);
317 AddShortcutMemoryItem(10, &infos); // should have no behavior change
318 AddBlobItem(&infos);
319 AddMemoryItem(80, &infos);
320
321 strategy.InitializeForIPCRequests(100, // max_ipc_memory_size
322 90, // total_blob_size
323 infos, &builder);
324
325 EXPECT_EQ(0u, strategy.file_sizes().size());
326 EXPECT_EQ(0u, strategy.shared_memory_sizes().size());
327 ASSERT_EQ(2u, strategy.requests().size());
328
329 auto memory_item_request = strategy.requests().at(0);
330 EXPECT_EQ(0u, memory_item_request.browser_item_index);
331 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
332 EXPECT_EQ(BlobItemBytesRequest::CreateIPCRequest(0u, 0u, 0ull, 10ull),
333 memory_item_request.message);
334
335 memory_item_request = strategy.requests().at(1);
336 EXPECT_EQ(2u, memory_item_request.browser_item_index);
337 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
338 EXPECT_EQ(BlobItemBytesRequest::CreateIPCRequest(1u, 2u, 0ull, 80ull),
339 memory_item_request.message);
340
341 // We still populate future data, as the strategy assumes we will be
342 // requesting the data.
343 BlobDataBuilder expected_builder(kNewUUID);
344 expected_builder.AppendFutureData(10);
345 expected_builder.AppendBlob(kFakeBlobUUID);
346 expected_builder.AppendFutureData(80);
347 EXPECT_EQ(expected_builder, builder);
348 }
349 } // namespace
350 } // namespace storage
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698