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

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

Issue 1098853003: [BlobAsync] Patch 4: Browser Classes & Logic. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: windows & asan fix Created 5 years 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 "storage/browser/blob/blob_async_transport_strategy.h"
6
7 #include <string>
8
9 #include "base/logging.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11
12 namespace storage {
13 namespace {
14
15 const char kNewUUID[] = "newUUID";
16 const base::FilePath kFuturePopulatingFilePath = base::FilePath::FromUTF8Unsafe(
17 std::string(BlobDataBuilder::kAppendFutureFileTemporaryFileName));
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(BlobAsyncTransportStrategyTest, TestNoMemoryItems) {
42 BlobAsyncTransportStrategy strategy;
43 std::vector<DataElement> infos;
44
45 // Here we test our size > max_blob_in_memory_size (300),
46 // and we save to one file. (size < max_file_size)
kinuko 2015/11/26 04:58:17 Um, is this comment right? Also we no longer seem
dmurph 2015/11/30 21:33:28 Whoops, yes, thanks.
47 AddBlobItem(&infos);
48 AddBlobItem(&infos);
49 AddBlobItem(&infos);
50 strategy.Initialize(100, // max_ipc_memory_size
51 200, // max_shared_memory_size
52 400, // max_file_size
53 5000, // disk_space_left
54 100, // memory_available
55 kNewUUID, infos);
56
57 EXPECT_EQ(BlobAsyncTransportStrategy::ERROR_NONE, strategy.error());
58
59 EXPECT_EQ(0u, strategy.file_handle_sizes().size());
60 EXPECT_EQ(0u, strategy.requests().size());
61
62 BlobDataBuilder builder(kNewUUID);
63 builder.AppendBlob(kFakeBlobUUID);
64 builder.AppendBlob(kFakeBlobUUID);
65 builder.AppendBlob(kFakeBlobUUID);
66 EXPECT_EQ(builder, *strategy.blob_builder());
67 }
68
69 TEST(BlobAsyncTransportStrategyTest, TestLargeBlockToFile) {
70 BlobAsyncTransportStrategy strategy;
71 std::vector<DataElement> infos;
72
73 // Here we test our size > max_blob_in_memory_size (300),
74 // and we save to one file. (size < max_file_size)
kinuko 2015/11/26 04:58:17 ditto, here and below. comment looks stale to me?
dmurph 2015/11/30 21:33:28 It was a little stale, thanks.
75 AddMemoryItem(305, &infos);
76 strategy.Initialize(100, // max_ipc_memory_size
77 200, // max_shared_memory_size
78 400, // max_file_size
79 5000, // disk_space_left
80 100, // memory_available
81 kNewUUID, infos);
82
83 EXPECT_EQ(BlobAsyncTransportStrategy::ERROR_NONE, strategy.error());
84
85 EXPECT_EQ(1u, strategy.file_handle_sizes().size());
86 EXPECT_EQ(305ul, strategy.file_handle_sizes().at(0));
87 EXPECT_EQ(1u, strategy.requests().size());
88
89 auto& memory_item_request = strategy.requests().at(0);
90 EXPECT_EQ(0u, memory_item_request.browser_item_index);
91 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
92 EXPECT_EQ(
93 BlobItemBytesRequest::CreateFileRequest(0u, 0u, 0ull, 305ull, 0u, 0ull),
94 memory_item_request.message);
95
96 BlobDataBuilder builder(kNewUUID);
97 builder.AppendFile(kFuturePopulatingFilePath, 0, 305,
98 base::Time::FromDoubleT(0));
99 EXPECT_EQ(builder, *strategy.blob_builder());
100 }
101
102 TEST(BlobAsyncTransportStrategyTest, TestLargeBlockToFiles) {
103 BlobAsyncTransportStrategy strategy;
104 std::vector<DataElement> infos;
105
106 // Here we test our size > max_blob_in_memory_size (300),
107 // and we save 3 files. (size > max_file_size)
108 AddMemoryItem(1000, &infos);
109 strategy.Initialize(100, // max_ipc_memory_size
110 200, // max_shared_memory_size
111 400, // max_file_size
112 5000, // disk_space_left
113 100, // memory_available
114 kNewUUID, infos);
115 EXPECT_EQ(BlobAsyncTransportStrategy::ERROR_NONE, strategy.error());
116
117 EXPECT_EQ(3u, strategy.file_handle_sizes().size());
118 EXPECT_EQ(400ul, strategy.file_handle_sizes().at(0));
119 EXPECT_EQ(400ul, strategy.file_handle_sizes().at(1));
120 EXPECT_EQ(200ul, strategy.file_handle_sizes().at(2));
121 EXPECT_EQ(3u, strategy.requests().size());
122
123 auto memory_item_request = strategy.requests().at(0);
124 EXPECT_EQ(0u, memory_item_request.browser_item_index);
125 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
126 EXPECT_EQ(
127 BlobItemBytesRequest::CreateFileRequest(0u, 0u, 0ull, 400ull, 0u, 0ull),
128 memory_item_request.message);
129
130 memory_item_request = strategy.requests().at(1);
131 EXPECT_EQ(1u, memory_item_request.browser_item_index);
132 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
133 EXPECT_EQ(
134 BlobItemBytesRequest::CreateFileRequest(1u, 0u, 400ull, 400ull, 1u, 0ull),
135 memory_item_request.message);
136
137 memory_item_request = strategy.requests().at(2);
138 EXPECT_EQ(2u, memory_item_request.browser_item_index);
139 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
140 EXPECT_EQ(
141 BlobItemBytesRequest::CreateFileRequest(2u, 0u, 800ull, 200ull, 2u, 0ull),
142 memory_item_request.message);
143
144 BlobDataBuilder builder(kNewUUID);
145 builder.AppendFile(kFuturePopulatingFilePath, 0, 400,
146 base::Time::FromDoubleT(0));
147 builder.AppendFile(kFuturePopulatingFilePath, 0, 400,
148 base::Time::FromDoubleT(0));
149 builder.AppendFile(kFuturePopulatingFilePath, 0, 200,
150 base::Time::FromDoubleT(0));
151 EXPECT_EQ(builder, *strategy.blob_builder());
152 }
153
154 TEST(BlobAsyncTransportStrategyTest, TestLargeBlocksConsolidatingInFiles) {
155 BlobAsyncTransportStrategy strategy;
156 std::vector<DataElement> infos;
157
158 // We should have 3 storage items for the memory, two files, 400 each.
159 // We end up with storage items:
160 // 1: File A, 300MB
161 // 2: Blob
162 // 3: File A, 100MB (300MB offset)
163 // 4: File B, 400MB
164 AddMemoryItem(300, &infos);
165 AddBlobItem(&infos);
166 AddMemoryItem(500, &infos);
167
168 strategy.Initialize(100, // max_ipc_memory_size
169 200, // max_shared_memory_size
170 400, // max_file_size
171 5000, // disk_space_left
172 100, // memory_available
173 kNewUUID, infos);
174 EXPECT_EQ(BlobAsyncTransportStrategy::ERROR_NONE, strategy.error());
175
176 EXPECT_EQ(2u, strategy.file_handle_sizes().size());
177 EXPECT_EQ(400ul, strategy.file_handle_sizes().at(0));
178 EXPECT_EQ(400ul, strategy.file_handle_sizes().at(1));
179 EXPECT_EQ(3u, strategy.requests().size());
180
181 auto memory_item_request = strategy.requests().at(0);
182 EXPECT_EQ(0u, memory_item_request.browser_item_index);
183 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
184 EXPECT_EQ(
185 BlobItemBytesRequest::CreateFileRequest(0u, 0u, 0ull, 300ull, 0u, 0ull),
186 memory_item_request.message);
187
188 memory_item_request = strategy.requests().at(1);
189 EXPECT_EQ(2u, memory_item_request.browser_item_index);
190 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
191 EXPECT_EQ(
192 BlobItemBytesRequest::CreateFileRequest(1u, 2u, 0ull, 100ull, 0u, 300ull),
193 memory_item_request.message);
194
195 memory_item_request = strategy.requests().at(2);
196 EXPECT_EQ(3u, memory_item_request.browser_item_index);
197 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
198 EXPECT_EQ(
199 BlobItemBytesRequest::CreateFileRequest(2u, 2u, 100ull, 400ull, 1u, 0ull),
200 memory_item_request.message);
201 }
202
203 TEST(BlobAsyncTransportStrategyTest, TestSharedMemorySegmentation) {
204 BlobAsyncTransportStrategy strategy;
205 std::vector<DataElement> infos;
206
207 // For transport we should have 3 shared memories, and then storage in 3
208 // browser items.
209 // (size > max_shared_memory_size and size < max_blob_in_memory_size
210 AddMemoryItem(500, &infos);
211 strategy.Initialize(100, // max_ipc_memory_size
212 200, // max_shared_memory_size
213 300, // max_file_size
214 5000, // disk_space_left
215 500, // memory_available
216 kNewUUID, infos);
217 EXPECT_EQ(BlobAsyncTransportStrategy::ERROR_NONE, strategy.error());
218
219 EXPECT_EQ(3u, strategy.shared_memory_handle_sizes().size());
220 EXPECT_EQ(200u, strategy.shared_memory_handle_sizes().at(0));
221 EXPECT_EQ(200u, strategy.shared_memory_handle_sizes().at(1));
222 EXPECT_EQ(100u, strategy.shared_memory_handle_sizes().at(2));
223 EXPECT_EQ(3u, strategy.requests().size());
224
225 auto memory_item_request = strategy.requests().at(0);
226 EXPECT_EQ(0u, memory_item_request.browser_item_index);
227 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
228 EXPECT_EQ(BlobItemBytesRequest::CreateSharedMemoryRequest(0u, 0u, 0ull,
229 200ull, 0u, 0ull),
230 memory_item_request.message);
231
232 memory_item_request = strategy.requests().at(1);
233 EXPECT_EQ(1u, memory_item_request.browser_item_index);
234 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
235 EXPECT_EQ(BlobItemBytesRequest::CreateSharedMemoryRequest(1u, 0u, 200ull,
236 200ull, 1u, 0ull),
237 memory_item_request.message);
238
239 memory_item_request = strategy.requests().at(2);
240 EXPECT_EQ(2u, memory_item_request.browser_item_index);
241 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
242 EXPECT_EQ(BlobItemBytesRequest::CreateSharedMemoryRequest(2u, 0u, 400ull,
243 100ull, 2u, 0ull),
244 memory_item_request.message);
245
246 BlobDataBuilder builder(kNewUUID);
247 builder.AppendFutureData(200);
248 builder.AppendFutureData(200);
249 builder.AppendFutureData(100);
250
251 EXPECT_EQ(builder, *strategy.blob_builder());
252 }
253
254 TEST(BlobAsyncTransportStrategyTest, TestSharedMemorySegmentationAndStorage) {
255 BlobAsyncTransportStrategy strategy;
256 std::vector<DataElement> infos;
257
258 // For transport, we should have 2 shared memories, where the first one
259 // have half 0 and half 3, and then the last one has half 3.
260 //
261 // For storage, we should have 3 browser items that match the pre-transport
262 // version:
263 // 1: Bytes 100MB
264 // 2: Blob
265 // 3: Bytes 200MB
266 AddShortcutMemoryItem(100, &infos); // should have no behavior change
267 AddBlobItem(&infos);
268 AddMemoryItem(200, &infos);
269
270 strategy.Initialize(100, // max_ipc_memory_size
271 200, // max_shared_memory_size
272 300, // max_file_size
273 5000, // disk_space_left
274 300, // memory_available
275 kNewUUID, infos);
276 EXPECT_EQ(BlobAsyncTransportStrategy::ERROR_NONE, strategy.error());
277
278 EXPECT_EQ(2u, strategy.shared_memory_handle_sizes().size());
279 EXPECT_EQ(200u, strategy.shared_memory_handle_sizes().at(0));
280 EXPECT_EQ(100u, strategy.shared_memory_handle_sizes().at(1));
281 EXPECT_EQ(3u, strategy.requests().size());
282
283 auto memory_item_request = strategy.requests().at(0);
284 EXPECT_EQ(0u, memory_item_request.browser_item_index);
285 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
286 EXPECT_EQ(BlobItemBytesRequest::CreateSharedMemoryRequest(0u, 0u, 0ull,
287 100ull, 0u, 0ull),
288 memory_item_request.message);
289
290 memory_item_request = strategy.requests().at(1);
291 EXPECT_EQ(2u, memory_item_request.browser_item_index);
292 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
293 EXPECT_EQ(BlobItemBytesRequest::CreateSharedMemoryRequest(1u, 2u, 0ull,
294 100ull, 0u, 100ull),
295 memory_item_request.message);
296
297 memory_item_request = strategy.requests().at(2);
298 EXPECT_EQ(2u, memory_item_request.browser_item_index);
299 EXPECT_EQ(100u, memory_item_request.browser_item_offset);
300 EXPECT_EQ(BlobItemBytesRequest::CreateSharedMemoryRequest(2u, 2u, 100ull,
301 100ull, 1u, 0ull),
302 memory_item_request.message);
303
304 BlobDataBuilder builder(kNewUUID);
305 builder.AppendFutureData(100);
306 builder.AppendBlob(kFakeBlobUUID);
307 builder.AppendFutureData(200);
308
309 EXPECT_EQ(builder, *strategy.blob_builder());
310 }
311
312 TEST(BlobAsyncTransportStrategyTest, TestTooLarge) {
313 BlobAsyncTransportStrategy strategy;
314 std::vector<DataElement> infos;
315
316 // Our item is too large for disk, so error out.
317 AddMemoryItem(5001, &infos);
318
319 strategy.Initialize(100, // max_ipc_memory_size
320 200, // max_shared_memory_size
321 400, // max_file_size
322 5000, // disk_space_left
323 100, // memory_left
324 kNewUUID, infos);
325
326 EXPECT_EQ(0u, strategy.file_handle_sizes().size());
327 EXPECT_EQ(0u, strategy.shared_memory_handle_sizes().size());
328 EXPECT_EQ(0u, strategy.requests().size());
329 EXPECT_EQ(BlobAsyncTransportStrategy::ERROR_TOO_LARGE, strategy.error());
330 }
331
332 TEST(BlobAsyncTransportStrategyTest, TestNoDisk) {
333 BlobAsyncTransportStrategy strategy;
334 std::vector<DataElement> infos;
335
336 // Our item is too large for memory, and we are in no_disk mode (incognito)
337 AddMemoryItem(301, &infos);
338
339 strategy.Initialize(100, // max_ipc_memory_size
340 200, // max_shared_memory_size
341 400, // max_file_size
342 0, // disk_space_left
343 300, // memory_available
344 kNewUUID, infos);
345
346 EXPECT_EQ(0u, strategy.file_handle_sizes().size());
347 EXPECT_EQ(0u, strategy.shared_memory_handle_sizes().size());
348 EXPECT_EQ(0u, strategy.requests().size());
349 EXPECT_EQ(BlobAsyncTransportStrategy::ERROR_TOO_LARGE, strategy.error());
350 }
351
352 TEST(BlobAsyncTransportStrategyTest, TestNoDiskFits) {
353 BlobAsyncTransportStrategy strategy;
354 std::vector<DataElement> infos;
355
356 // Test that we ignore the max_blob_in_memory_size param when we're in
357 // no-disk mode, as we can never hit disk anyways.
358 AddMemoryItem(301, &infos);
359
360 strategy.Initialize(100, // max_ipc_memory_size
361 200, // max_shared_memory_size
362 400, // max_file_size
363 0, // disk_space_left
364 301, // memory_left
365 kNewUUID, infos);
366
367 EXPECT_EQ(0u, strategy.file_handle_sizes().size());
368 EXPECT_EQ(2u, strategy.shared_memory_handle_sizes().size());
369 EXPECT_EQ(2u, strategy.requests().size());
370 EXPECT_EQ(BlobAsyncTransportStrategy::ERROR_NONE, strategy.error());
371 }
372
373 TEST(BlobAsyncTransportStrategyTest, TestSimpleIPC) {
374 // Test simple IPC strategy, where size < max_ipc_memory_size and we have
375 // just one item.
376 std::vector<DataElement> infos;
377 BlobAsyncTransportStrategy strategy;
378 AddMemoryItem(10, &infos);
379 AddBlobItem(&infos);
380
381 strategy.Initialize(100, // max_ipc_memory_size
382 200, // max_shared_memory_size
383 400, // max_file_size
384 5000, // disk_space_left
385 100, // memory_left
386 kNewUUID, infos);
387 EXPECT_EQ(BlobAsyncTransportStrategy::ERROR_NONE, strategy.error());
388
389 ASSERT_EQ(1u, strategy.requests().size());
390
391 auto memory_item_request = strategy.requests().at(0);
392 EXPECT_EQ(0u, memory_item_request.browser_item_index);
393 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
394 EXPECT_EQ(BlobItemBytesRequest::CreateIPCRequest(0u, 0u, 0ull, 10ull),
395 memory_item_request.message);
396 }
397
398 TEST(BlobAsyncTransportStrategyTest, TestMultipleIPC) {
399 // Same as above, but with 2 items and a blob in-between.
400 std::vector<DataElement> infos;
401 BlobAsyncTransportStrategy strategy;
402 infos.clear();
403 AddShortcutMemoryItem(10, &infos); // should have no behavior change
404 AddBlobItem(&infos);
405 AddMemoryItem(80, &infos);
406
407 strategy.Initialize(100, // max_ipc_memory_size
408 200, // max_shared_memory_size
409 400, // max_file_size
410 5000, // disk_space_left
411 100, // memory_left
412 kNewUUID, infos);
413 EXPECT_EQ(BlobAsyncTransportStrategy::ERROR_NONE, strategy.error());
414
415 ASSERT_EQ(2u, strategy.requests().size());
416
417 auto memory_item_request = strategy.requests().at(0);
418 EXPECT_EQ(0u, memory_item_request.browser_item_index);
419 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
420 EXPECT_EQ(BlobItemBytesRequest::CreateIPCRequest(0u, 0u, 0ull, 10ull),
421 memory_item_request.message);
422
423 memory_item_request = strategy.requests().at(1);
424 EXPECT_EQ(2u, memory_item_request.browser_item_index);
425 EXPECT_EQ(0u, memory_item_request.browser_item_offset);
426 EXPECT_EQ(BlobItemBytesRequest::CreateIPCRequest(1u, 2u, 0ull, 80ull),
427 memory_item_request.message);
428
429 // We still populate future data, as the strategy assumes we will be
430 // requesting the data.
431 BlobDataBuilder builder(kNewUUID);
432 builder.AppendFutureData(10);
433 builder.AppendBlob(kFakeBlobUUID);
434 builder.AppendFutureData(80);
435
436 EXPECT_EQ(builder, *strategy.blob_builder());
437 }
438
439 TEST(BlobAsyncTransportStrategyTest, Shortcut) {
440 std::vector<DataElement> infos;
441 AddMemoryItem(100, &infos);
442 AddBlobItem(&infos);
443 EXPECT_FALSE(BlobAsyncTransportStrategy::ShouldBeShortcut(infos, 200));
444
445 infos.clear();
446 AddShortcutMemoryItem(100, &infos);
447 AddBlobItem(&infos);
448 EXPECT_TRUE(BlobAsyncTransportStrategy::ShouldBeShortcut(infos, 200));
449
450 infos.clear();
451 AddShortcutMemoryItem(100, &infos);
452 EXPECT_FALSE(BlobAsyncTransportStrategy::ShouldBeShortcut(infos, 99));
453 }
454
455 TEST(BlobAsyncTransportStrategyTest, TestInvalidParams) {
456 std::vector<DataElement> infos;
457 {
458 // Test uint64_t overflow.
459 BlobAsyncTransportStrategy strategy;
460 uint64_t iters = std::numeric_limits<uint64_t>::max() /
461 std::numeric_limits<size_t>::max();
462 for (uint64_t i = 0; i <= iters; i++) {
463 AddMemoryItem(std::numeric_limits<size_t>::max(), &infos);
464 }
465
466 strategy.Initialize(100, // max_ipc_memory_size
467 200, // max_shared_memory_size
468 400, // max_file_size
469 5000, // disk_space_left
470 100, // memory_left
471 kNewUUID, infos);
472 EXPECT_EQ(BlobAsyncTransportStrategy::ERROR_INVALID_PARAMS,
473 strategy.error());
474 }
475 {
476 // Test size_t overflow.
477 infos.clear();
478 BlobAsyncTransportStrategy strategy;
479 AddMemoryItem(std::numeric_limits<size_t>::max(), &infos);
480 AddMemoryItem(1, &infos);
481
482 strategy.Initialize(100, // max_ipc_memory_size
483 200, // max_shared_memory_size
484 400, // max_file_size
485 5000, // disk_space_left
486 100, // memory_left
487 kNewUUID, infos);
488 EXPECT_EQ(BlobAsyncTransportStrategy::ERROR_INVALID_PARAMS,
489 strategy.error());
490 }
491 }
492
493 } // namespace
494 } // namespace storage
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698