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

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

Powered by Google App Engine
This is Rietveld 408576698