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

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

Powered by Google App Engine
This is Rietveld 408576698