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

Side by Side Diff: content/browser/fileapi/blob_url_request_job_unittest.cc

Issue 1108083002: Create blobs from Disk Cache entries. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: unconfuzinate Created 5 years, 6 months 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
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/basictypes.h" 5 #include "base/basictypes.h"
6 #include "base/bind.h" 6 #include "base/bind.h"
7 #include "base/files/file_path.h" 7 #include "base/files/file_path.h"
8 #include "base/files/file_util.h" 8 #include "base/files/file_util.h"
9 #include "base/files/scoped_temp_dir.h" 9 #include "base/files/scoped_temp_dir.h"
10 #include "base/macros.h"
10 #include "base/memory/ref_counted.h" 11 #include "base/memory/ref_counted.h"
11 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/scoped_ptr.h"
12 #include "base/numerics/safe_conversions.h" 13 #include "base/numerics/safe_conversions.h"
13 #include "base/run_loop.h" 14 #include "base/run_loop.h"
14 #include "base/thread_task_runner_handle.h" 15 #include "base/thread_task_runner_handle.h"
15 #include "base/time/time.h" 16 #include "base/time/time.h"
16 #include "content/browser/fileapi/mock_url_request_delegate.h" 17 #include "content/browser/fileapi/mock_url_request_delegate.h"
17 #include "content/public/test/async_file_test_helper.h" 18 #include "content/public/test/async_file_test_helper.h"
18 #include "content/public/test/test_file_system_context.h" 19 #include "content/public/test/test_file_system_context.h"
20 #include "net/base/net_errors.h"
19 #include "net/base/request_priority.h" 21 #include "net/base/request_priority.h"
22 #include "net/base/test_completion_callback.h"
23 #include "net/disk_cache/disk_cache.h"
20 #include "net/http/http_byte_range.h" 24 #include "net/http/http_byte_range.h"
21 #include "net/http/http_request_headers.h" 25 #include "net/http/http_request_headers.h"
22 #include "net/http/http_response_headers.h" 26 #include "net/http/http_response_headers.h"
23 #include "net/url_request/url_request.h" 27 #include "net/url_request/url_request.h"
24 #include "net/url_request/url_request_context.h" 28 #include "net/url_request/url_request_context.h"
25 #include "net/url_request/url_request_job_factory_impl.h" 29 #include "net/url_request/url_request_job_factory_impl.h"
26 #include "storage/browser/blob/blob_data_builder.h" 30 #include "storage/browser/blob/blob_data_builder.h"
27 #include "storage/browser/blob/blob_data_handle.h" 31 #include "storage/browser/blob/blob_data_handle.h"
28 #include "storage/browser/blob/blob_data_snapshot.h" 32 #include "storage/browser/blob/blob_data_snapshot.h"
29 #include "storage/browser/blob/blob_storage_context.h" 33 #include "storage/browser/blob/blob_storage_context.h"
(...skipping 11 matching lines...) Expand all
41 45
42 namespace { 46 namespace {
43 47
44 const int kBufferSize = 1024; 48 const int kBufferSize = 1024;
45 const char kTestData1[] = "Hello"; 49 const char kTestData1[] = "Hello";
46 const char kTestData2[] = "Here it is data."; 50 const char kTestData2[] = "Here it is data.";
47 const char kTestFileData1[] = "0123456789"; 51 const char kTestFileData1[] = "0123456789";
48 const char kTestFileData2[] = "This is sample file."; 52 const char kTestFileData2[] = "This is sample file.";
49 const char kTestFileSystemFileData1[] = "abcdefghijklmnop"; 53 const char kTestFileSystemFileData1[] = "abcdefghijklmnop";
50 const char kTestFileSystemFileData2[] = "File system file test data."; 54 const char kTestFileSystemFileData2[] = "File system file test data.";
55 const char kTestDiskCacheKey[] = "pipe";
56 const char kTestDiskCacheData[] = "Ceci n'est pas un pamplemousse.";
51 const char kTestContentType[] = "foo/bar"; 57 const char kTestContentType[] = "foo/bar";
52 const char kTestContentDisposition[] = "attachment; filename=foo.txt"; 58 const char kTestContentDisposition[] = "attachment; filename=foo.txt";
53 59
54 const char kFileSystemURLOrigin[] = "http://remote"; 60 const char kFileSystemURLOrigin[] = "http://remote";
55 const storage::FileSystemType kFileSystemType = 61 const storage::FileSystemType kFileSystemType =
56 storage::kFileSystemTypeTemporary; 62 storage::kFileSystemTypeTemporary;
57 63
64 const int kTestDiskCacheStreamIndex = 0;
65
66 // Our disk cache tests don't need a real data handle since the tests themselves
67 // scope the disk cache and entries.
68 class EmptyDataHandle : public storage::BlobDataBuilder::DataHandle {
69 private:
70 ~EmptyDataHandle() override {}
71 };
72
73 scoped_ptr<disk_cache::Backend> CreateInMemoryDiskCache() {
74 scoped_ptr<disk_cache::Backend> cache;
75 net::TestCompletionCallback callback;
76 int rv = disk_cache::CreateCacheBackend(net::MEMORY_CACHE,
77 net::CACHE_BACKEND_DEFAULT,
78 base::FilePath(), 0,
79 false, NULL, NULL, &cache,
mmenke 2015/06/18 20:49:05 nit: nullptr (x2)
gavinp 2015/06/18 22:52:50 I found quite a few more of these. Thanks for the
80 callback.callback());
81 EXPECT_EQ(net::OK, callback.GetResult(rv));
82
83 return cache.Pass();
84 }
85
86 disk_cache::ScopedEntryPtr CreateDiskCacheEntry(disk_cache::Backend* cache,
87 const char* key,
88 const std::string& data) {
89 disk_cache::Entry* temp_entry = nullptr;
90 net::TestCompletionCallback callback;
91 int rv = cache->CreateEntry(key, &temp_entry, callback.callback());
92 if (callback.GetResult(rv) != net::OK)
93 return nullptr;
94 disk_cache::ScopedEntryPtr entry(temp_entry);
95
96 scoped_refptr<net::StringIOBuffer> iobuffer = new net::StringIOBuffer(data);
97 rv = entry->WriteData(kTestDiskCacheStreamIndex, 0, iobuffer.get(),
98 iobuffer->size(), callback.callback(), false);
99 EXPECT_EQ(static_cast<int>(data.size()), callback.GetResult(rv));
100 return entry.Pass();
101 }
102
58 } // namespace 103 } // namespace
59 104
60 class BlobURLRequestJobTest : public testing::Test { 105 class BlobURLRequestJobTest : public testing::Test {
61 public: 106 public:
62 // A simple ProtocolHandler implementation to create BlobURLRequestJob. 107 // A simple ProtocolHandler implementation to create BlobURLRequestJob.
63 class MockProtocolHandler : 108 class MockProtocolHandler :
64 public net::URLRequestJobFactory::ProtocolHandler { 109 public net::URLRequestJobFactory::ProtocolHandler {
65 public: 110 public:
66 MockProtocolHandler(BlobURLRequestJobTest* test) : test_(test) {} 111 MockProtocolHandler(BlobURLRequestJobTest* test) : test_(test) {}
67 112
(...skipping 26 matching lines...) Expand all
94 temp_file_modification_time1_ = file_info1.last_modified; 139 temp_file_modification_time1_ = file_info1.last_modified;
95 140
96 temp_file2_ = temp_dir_.path().AppendASCII("BlobFile2.dat"); 141 temp_file2_ = temp_dir_.path().AppendASCII("BlobFile2.dat");
97 ASSERT_EQ(static_cast<int>(arraysize(kTestFileData2) - 1), 142 ASSERT_EQ(static_cast<int>(arraysize(kTestFileData2) - 1),
98 base::WriteFile(temp_file2_, kTestFileData2, 143 base::WriteFile(temp_file2_, kTestFileData2,
99 arraysize(kTestFileData2) - 1)); 144 arraysize(kTestFileData2) - 1));
100 base::File::Info file_info2; 145 base::File::Info file_info2;
101 base::GetFileInfo(temp_file2_, &file_info2); 146 base::GetFileInfo(temp_file2_, &file_info2);
102 temp_file_modification_time2_ = file_info2.last_modified; 147 temp_file_modification_time2_ = file_info2.last_modified;
103 148
149 disk_cache_backend_ = CreateInMemoryDiskCache();
150 disk_cache_entry_ = CreateDiskCacheEntry(
151 disk_cache_backend_.get(), kTestDiskCacheKey, kTestDiskCacheData);
152
104 url_request_job_factory_.SetProtocolHandler("blob", 153 url_request_job_factory_.SetProtocolHandler("blob",
105 new MockProtocolHandler(this)); 154 new MockProtocolHandler(this));
106 url_request_context_.set_job_factory(&url_request_job_factory_); 155 url_request_context_.set_job_factory(&url_request_job_factory_);
107 } 156 }
108 157
109 void TearDown() override { 158 void TearDown() override {
110 blob_handle_.reset(); 159 blob_handle_.reset();
111 // Clean up for ASAN 160 // Clean up for ASAN
112 base::RunLoop run_loop; 161 base::RunLoop run_loop;
113 run_loop.RunUntilIdle(); 162 run_loop.RunUntilIdle();
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 250
202 // Verify response. 251 // Verify response.
203 EXPECT_TRUE(request_->status().is_success()); 252 EXPECT_TRUE(request_->status().is_success());
204 EXPECT_EQ(expected_status_code_, 253 EXPECT_EQ(expected_status_code_,
205 request_->response_headers()->response_code()); 254 request_->response_headers()->response_code());
206 EXPECT_EQ(expected_response_, url_request_delegate_.response_data()); 255 EXPECT_EQ(expected_response_, url_request_delegate_.response_data());
207 } 256 }
208 257
209 void BuildComplicatedData(std::string* expected_result) { 258 void BuildComplicatedData(std::string* expected_result) {
210 blob_data_->AppendData(kTestData1 + 1, 2); 259 blob_data_->AppendData(kTestData1 + 1, 2);
260 *expected_result = std::string(kTestData1 + 1, 2);
261
211 blob_data_->AppendFile(temp_file1_, 2, 3, temp_file_modification_time1_); 262 blob_data_->AppendFile(temp_file1_, 2, 3, temp_file_modification_time1_);
263 *expected_result += std::string(kTestFileData1 + 2, 3);
264
265 blob_data_->AppendDiskCacheEntry(new EmptyDataHandle(),
266 disk_cache_entry_.get(),
267 kTestDiskCacheStreamIndex);
268 *expected_result += std::string(kTestDiskCacheData);
269
212 blob_data_->AppendFileSystemFile(temp_file_system_file1_, 3, 4, 270 blob_data_->AppendFileSystemFile(temp_file_system_file1_, 3, 4,
213 temp_file_system_file_modification_time1_); 271 temp_file_system_file_modification_time1_);
272 *expected_result += std::string(kTestFileSystemFileData1 + 3, 4);
273
214 blob_data_->AppendData(kTestData2 + 4, 5); 274 blob_data_->AppendData(kTestData2 + 4, 5);
275 *expected_result += std::string(kTestData2 + 4, 5);
276
215 blob_data_->AppendFile(temp_file2_, 5, 6, temp_file_modification_time2_); 277 blob_data_->AppendFile(temp_file2_, 5, 6, temp_file_modification_time2_);
278 *expected_result += std::string(kTestFileData2 + 5, 6);
279
216 blob_data_->AppendFileSystemFile(temp_file_system_file2_, 6, 7, 280 blob_data_->AppendFileSystemFile(temp_file_system_file2_, 6, 7,
217 temp_file_system_file_modification_time2_); 281 temp_file_system_file_modification_time2_);
218 *expected_result = std::string(kTestData1 + 1, 2);
219 *expected_result += std::string(kTestFileData1 + 2, 3);
220 *expected_result += std::string(kTestFileSystemFileData1 + 3, 4);
221 *expected_result += std::string(kTestData2 + 4, 5);
222 *expected_result += std::string(kTestFileData2 + 5, 6);
223 *expected_result += std::string(kTestFileSystemFileData2 + 6, 7); 282 *expected_result += std::string(kTestFileSystemFileData2 + 6, 7);
224 } 283 }
225 284
226 scoped_ptr<BlobDataSnapshot> GetSnapshotFromBuilder() { 285 scoped_ptr<BlobDataSnapshot> GetSnapshotFromBuilder() {
227 if (!blob_handle_) { 286 if (!blob_handle_) {
228 blob_handle_ = blob_context_.AddFinishedBlob(blob_data_.get()).Pass(); 287 blob_handle_ = blob_context_.AddFinishedBlob(blob_data_.get()).Pass();
229 } 288 }
230 return blob_handle_->CreateSnapshot().Pass(); 289 return blob_handle_->CreateSnapshot().Pass();
231 } 290 }
232 291
(...skipping 16 matching lines...) Expand all
249 base::FilePath temp_file1_; 308 base::FilePath temp_file1_;
250 base::FilePath temp_file2_; 309 base::FilePath temp_file2_;
251 base::Time temp_file_modification_time1_; 310 base::Time temp_file_modification_time1_;
252 base::Time temp_file_modification_time2_; 311 base::Time temp_file_modification_time2_;
253 GURL file_system_root_url_; 312 GURL file_system_root_url_;
254 GURL temp_file_system_file1_; 313 GURL temp_file_system_file1_;
255 GURL temp_file_system_file2_; 314 GURL temp_file_system_file2_;
256 base::Time temp_file_system_file_modification_time1_; 315 base::Time temp_file_system_file_modification_time1_;
257 base::Time temp_file_system_file_modification_time2_; 316 base::Time temp_file_system_file_modification_time2_;
258 317
318 scoped_ptr<disk_cache::Backend> disk_cache_backend_;
319 disk_cache::ScopedEntryPtr disk_cache_entry_;
320
259 base::MessageLoopForIO message_loop_; 321 base::MessageLoopForIO message_loop_;
260 scoped_refptr<storage::FileSystemContext> file_system_context_; 322 scoped_refptr<storage::FileSystemContext> file_system_context_;
261 323
262 storage::BlobStorageContext blob_context_; 324 storage::BlobStorageContext blob_context_;
263 scoped_ptr<storage::BlobDataHandle> blob_handle_; 325 scoped_ptr<storage::BlobDataHandle> blob_handle_;
264 scoped_ptr<BlobDataBuilder> blob_data_; 326 scoped_ptr<BlobDataBuilder> blob_data_;
265 scoped_ptr<BlobDataSnapshot> blob_data_snapshot_; 327 scoped_ptr<BlobDataSnapshot> blob_data_snapshot_;
266 net::URLRequestJobFactoryImpl url_request_job_factory_; 328 net::URLRequestJobFactoryImpl url_request_job_factory_;
267 net::URLRequestContext url_request_context_; 329 net::URLRequestContext url_request_context_;
268 MockURLRequestDelegate url_request_delegate_; 330 MockURLRequestDelegate url_request_delegate_;
(...skipping 15 matching lines...) Expand all
284 346
285 TEST_F(BlobURLRequestJobTest, TestGetLargeFileRequest) { 347 TEST_F(BlobURLRequestJobTest, TestGetLargeFileRequest) {
286 base::FilePath large_temp_file = 348 base::FilePath large_temp_file =
287 temp_dir_.path().AppendASCII("LargeBlob.dat"); 349 temp_dir_.path().AppendASCII("LargeBlob.dat");
288 std::string large_data; 350 std::string large_data;
289 large_data.reserve(kBufferSize * 5); 351 large_data.reserve(kBufferSize * 5);
290 for (int i = 0; i < kBufferSize * 5; ++i) 352 for (int i = 0; i < kBufferSize * 5; ++i)
291 large_data.append(1, static_cast<char>(i % 256)); 353 large_data.append(1, static_cast<char>(i % 256));
292 ASSERT_EQ(static_cast<int>(large_data.size()), 354 ASSERT_EQ(static_cast<int>(large_data.size()),
293 base::WriteFile(large_temp_file, large_data.data(), 355 base::WriteFile(large_temp_file, large_data.data(),
294 large_data.size())); 356 large_data.size()));
295 blob_data_->AppendFile(large_temp_file, 0, kuint64max, base::Time()); 357 blob_data_->AppendFile(large_temp_file, 0, kuint64max, base::Time());
296 TestSuccessNonrangeRequest(large_data, large_data.size()); 358 TestSuccessNonrangeRequest(large_data, large_data.size());
297 } 359 }
298 360
299 TEST_F(BlobURLRequestJobTest, TestGetNonExistentFileRequest) { 361 TEST_F(BlobURLRequestJobTest, TestGetNonExistentFileRequest) {
300 base::FilePath non_existent_file = 362 base::FilePath non_existent_file =
301 temp_file1_.InsertBeforeExtension(FILE_PATH_LITERAL("-na")); 363 temp_file1_.InsertBeforeExtension(FILE_PATH_LITERAL("-na"));
302 blob_data_->AppendFile(non_existent_file, 0, kuint64max, base::Time()); 364 blob_data_->AppendFile(non_existent_file, 0, kuint64max, base::Time());
303 TestErrorRequest(404); 365 TestErrorRequest(404);
304 } 366 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 } 426 }
365 427
366 TEST_F(BlobURLRequestJobTest, TestGetSlicedFileSystemFileRequest) { 428 TEST_F(BlobURLRequestJobTest, TestGetSlicedFileSystemFileRequest) {
367 SetUpFileSystem(); 429 SetUpFileSystem();
368 blob_data_->AppendFileSystemFile(temp_file_system_file1_, 2, 4, 430 blob_data_->AppendFileSystemFile(temp_file_system_file1_, 2, 4,
369 temp_file_system_file_modification_time1_); 431 temp_file_system_file_modification_time1_);
370 std::string result(kTestFileSystemFileData1 + 2, 4); 432 std::string result(kTestFileSystemFileData1 + 2, 4);
371 TestSuccessNonrangeRequest(result, 4); 433 TestSuccessNonrangeRequest(result, 4);
372 } 434 }
373 435
374 TEST_F(BlobURLRequestJobTest, TestGetComplicatedDataAndFileRequest) { 436 TEST_F(BlobURLRequestJobTest, TestGetSimpleDiskCacheRequest) {
437 blob_data_->AppendDiskCacheEntry(new EmptyDataHandle(),
438 disk_cache_entry_.get(),
439 kTestDiskCacheStreamIndex);
440 TestSuccessNonrangeRequest(kTestDiskCacheData,
441 arraysize(kTestDiskCacheData) - 1);
442 }
443
444 TEST_F(BlobURLRequestJobTest, TestGetComplicatedDataFileAndDiskCacheRequest) {
375 SetUpFileSystem(); 445 SetUpFileSystem();
376 std::string result; 446 std::string result;
377 BuildComplicatedData(&result); 447 BuildComplicatedData(&result);
378 TestSuccessNonrangeRequest(result, GetTotalBlobLength()); 448 TestSuccessNonrangeRequest(result, GetTotalBlobLength());
379 } 449 }
380 450
381 TEST_F(BlobURLRequestJobTest, TestGetRangeRequest1) { 451 TEST_F(BlobURLRequestJobTest, TestGetRangeRequest1) {
382 SetUpFileSystem(); 452 SetUpFileSystem();
383 std::string result; 453 std::string result;
384 BuildComplicatedData(&result); 454 BuildComplicatedData(&result);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 EXPECT_TRUE(request_->response_headers()->GetMimeType(&content_type)); 503 EXPECT_TRUE(request_->response_headers()->GetMimeType(&content_type));
434 EXPECT_EQ(kTestContentType, content_type); 504 EXPECT_EQ(kTestContentType, content_type);
435 void* iter = NULL; 505 void* iter = NULL;
436 std::string content_disposition; 506 std::string content_disposition;
437 EXPECT_TRUE(request_->response_headers()->EnumerateHeader( 507 EXPECT_TRUE(request_->response_headers()->EnumerateHeader(
438 &iter, "Content-Disposition", &content_disposition)); 508 &iter, "Content-Disposition", &content_disposition));
439 EXPECT_EQ(kTestContentDisposition, content_disposition); 509 EXPECT_EQ(kTestContentDisposition, content_disposition);
440 } 510 }
441 511
442 } // namespace content 512 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/fileapi/blob_storage_context_unittest.cc ('k') | content/browser/loader/upload_data_stream_builder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698