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

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

Powered by Google App Engine
This is Rietveld 408576698