OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/download/base_file.h" | 5 #include "content/browser/download/base_file.h" |
6 | 6 |
7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "base/scoped_temp_dir.h" | 10 #include "base/scoped_temp_dir.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 BaseFileTest() | 44 BaseFileTest() |
45 : expect_file_survives_(false), | 45 : expect_file_survives_(false), |
46 expect_in_progress_(true), | 46 expect_in_progress_(true), |
47 expected_error_(false), | 47 expected_error_(false), |
48 file_thread_(BrowserThread::FILE, &message_loop_) { | 48 file_thread_(BrowserThread::FILE, &message_loop_) { |
49 } | 49 } |
50 | 50 |
51 virtual void SetUp() { | 51 virtual void SetUp() { |
52 ResetHash(); | 52 ResetHash(); |
53 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 53 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
54 base_file_.reset( | 54 base_file_.reset(new BaseFile(FilePath(), |
55 new BaseFile(FilePath(), GURL(), GURL(), 0, false, "", file_stream_)); | 55 GURL(), |
| 56 GURL(), |
| 57 0, |
| 58 false, |
| 59 "", |
| 60 file_stream_, |
| 61 net::BoundNetLog())); |
56 } | 62 } |
57 | 63 |
58 virtual void TearDown() { | 64 virtual void TearDown() { |
59 EXPECT_FALSE(base_file_->in_progress()); | 65 EXPECT_FALSE(base_file_->in_progress()); |
60 if (!expected_error_) { | 66 if (!expected_error_) { |
61 EXPECT_EQ(static_cast<int64>(expected_data_.size()), | 67 EXPECT_EQ(static_cast<int64>(expected_data_.size()), |
62 base_file_->bytes_so_far()); | 68 base_file_->bytes_so_far()); |
63 } | 69 } |
64 | 70 |
65 FilePath full_path = base_file_->full_path(); | 71 FilePath full_path = base_file_->full_path(); |
(...skipping 23 matching lines...) Expand all Loading... |
89 | 95 |
90 std::string GetFinalHash() { | 96 std::string GetFinalHash() { |
91 std::string hash; | 97 std::string hash; |
92 secure_hash_->Finish(sha256_hash_, kSha256HashLen); | 98 secure_hash_->Finish(sha256_hash_, kSha256HashLen); |
93 hash.assign(reinterpret_cast<const char*>(sha256_hash_), | 99 hash.assign(reinterpret_cast<const char*>(sha256_hash_), |
94 sizeof(sha256_hash_)); | 100 sizeof(sha256_hash_)); |
95 return hash; | 101 return hash; |
96 } | 102 } |
97 | 103 |
98 void MakeFileWithHash() { | 104 void MakeFileWithHash() { |
99 base_file_.reset( | 105 base_file_.reset(new BaseFile(FilePath(), |
100 new BaseFile(FilePath(), GURL(), GURL(), 0, true, "", file_stream_)); | 106 GURL(), |
| 107 GURL(), |
| 108 0, |
| 109 true, |
| 110 "", |
| 111 file_stream_, |
| 112 net::BoundNetLog())); |
101 } | 113 } |
102 | 114 |
103 bool OpenMockFileStream() { | 115 bool OpenMockFileStream() { |
104 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 116 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
105 | 117 |
106 FilePath path; | 118 FilePath path; |
107 if (!file_util::CreateTemporaryFile(&path)) | 119 if (!file_util::CreateTemporaryFile(&path)) |
108 return false; | 120 return false; |
109 | 121 |
110 // Create a new file stream. | 122 // Create a new file stream. |
(...skipping 30 matching lines...) Expand all Loading... |
141 return appended; | 153 return appended; |
142 } | 154 } |
143 | 155 |
144 void set_expected_data(const std::string& data) { expected_data_ = data; } | 156 void set_expected_data(const std::string& data) { expected_data_ = data; } |
145 | 157 |
146 // Helper functions. | 158 // Helper functions. |
147 // Create a file. Returns the complete file path. | 159 // Create a file. Returns the complete file path. |
148 static FilePath CreateTestFile() { | 160 static FilePath CreateTestFile() { |
149 FilePath file_name; | 161 FilePath file_name; |
150 linked_ptr<net::FileStream> dummy_file_stream; | 162 linked_ptr<net::FileStream> dummy_file_stream; |
151 BaseFile file(FilePath(), GURL(), GURL(), 0, false, "", dummy_file_stream); | 163 BaseFile file(FilePath(), |
| 164 GURL(), |
| 165 GURL(), |
| 166 0, |
| 167 false, |
| 168 "", |
| 169 dummy_file_stream, |
| 170 net::BoundNetLog()); |
152 | 171 |
153 EXPECT_EQ(net::OK, file.Initialize()); | 172 EXPECT_EQ(net::OK, file.Initialize()); |
154 file_name = file.full_path(); | 173 file_name = file.full_path(); |
155 EXPECT_NE(FilePath::StringType(), file_name.value()); | 174 EXPECT_NE(FilePath::StringType(), file_name.value()); |
156 | 175 |
157 EXPECT_EQ(net::OK, file.AppendDataToFile(kTestData4, kTestDataLength4)); | 176 EXPECT_EQ(net::OK, file.AppendDataToFile(kTestData4, kTestDataLength4)); |
158 | 177 |
159 // Keep the file from getting deleted when existing_file_name is deleted. | 178 // Keep the file from getting deleted when existing_file_name is deleted. |
160 file.Detach(); | 179 file.Detach(); |
161 | 180 |
162 return file_name; | 181 return file_name; |
163 } | 182 } |
164 | 183 |
165 // Create a file with the specified file name. | 184 // Create a file with the specified file name. |
166 static void CreateFileWithName(const FilePath& file_name) { | 185 static void CreateFileWithName(const FilePath& file_name) { |
167 EXPECT_NE(FilePath::StringType(), file_name.value()); | 186 EXPECT_NE(FilePath::StringType(), file_name.value()); |
168 linked_ptr<net::FileStream> dummy_file_stream; | 187 linked_ptr<net::FileStream> dummy_file_stream; |
169 BaseFile duplicate_file( | 188 BaseFile duplicate_file(file_name, |
170 file_name, GURL(), GURL(), 0, false, "", dummy_file_stream); | 189 GURL(), |
| 190 GURL(), |
| 191 0, |
| 192 false, |
| 193 "", |
| 194 dummy_file_stream, |
| 195 net::BoundNetLog()); |
171 EXPECT_EQ(net::OK, duplicate_file.Initialize()); | 196 EXPECT_EQ(net::OK, duplicate_file.Initialize()); |
172 // Write something into it. | 197 // Write something into it. |
173 duplicate_file.AppendDataToFile(kTestData4, kTestDataLength4); | 198 duplicate_file.AppendDataToFile(kTestData4, kTestDataLength4); |
174 // Detach the file so it isn't deleted on destruction of |duplicate_file|. | 199 // Detach the file so it isn't deleted on destruction of |duplicate_file|. |
175 duplicate_file.Detach(); | 200 duplicate_file.Detach(); |
176 } | 201 } |
177 | 202 |
178 int64 CurrentSpeedAtTime(base::TimeTicks current_time) { | 203 int64 CurrentSpeedAtTime(base::TimeTicks current_time) { |
179 EXPECT_TRUE(base_file_.get()); | 204 EXPECT_TRUE(base_file_.get()); |
180 return base_file_->CurrentSpeedAtTime(current_time); | 205 return base_file_->CurrentSpeedAtTime(current_time); |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 base_file_->Finish(); | 405 base_file_->Finish(); |
381 | 406 |
382 // Create another file | 407 // Create another file |
383 linked_ptr<net::FileStream> second_stream; | 408 linked_ptr<net::FileStream> second_stream; |
384 BaseFile second_file(FilePath(), | 409 BaseFile second_file(FilePath(), |
385 GURL(), | 410 GURL(), |
386 GURL(), | 411 GURL(), |
387 base_file_->bytes_so_far(), | 412 base_file_->bytes_so_far(), |
388 true, | 413 true, |
389 hash_state, | 414 hash_state, |
390 second_stream); | 415 second_stream, |
| 416 net::BoundNetLog()); |
391 ASSERT_EQ(net::OK, second_file.Initialize()); | 417 ASSERT_EQ(net::OK, second_file.Initialize()); |
392 std::string data(kTestData3); | 418 std::string data(kTestData3); |
393 EXPECT_EQ(net::OK, second_file.AppendDataToFile(data.data(), data.size())); | 419 EXPECT_EQ(net::OK, second_file.AppendDataToFile(data.data(), data.size())); |
394 second_file.Finish(); | 420 second_file.Finish(); |
395 | 421 |
396 std::string hash; | 422 std::string hash; |
397 EXPECT_TRUE(second_file.GetHash(&hash)); | 423 EXPECT_TRUE(second_file.GetHash(&hash)); |
398 // This will fail until getting the hash state is supported in SecureHash. | 424 // This will fail until getting the hash state is supported in SecureHash. |
399 EXPECT_STREQ(expected_hash_hex.c_str(), | 425 EXPECT_STREQ(expected_hash_hex.c_str(), |
400 base::HexEncode(hash.data(), hash.size()).c_str()); | 426 base::HexEncode(hash.data(), hash.size()).c_str()); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 | 467 |
442 // Write data to the file multiple times. | 468 // Write data to the file multiple times. |
443 TEST_F(BaseFileTest, MultipleWritesWithError) { | 469 TEST_F(BaseFileTest, MultipleWritesWithError) { |
444 ASSERT_TRUE(OpenMockFileStream()); | 470 ASSERT_TRUE(OpenMockFileStream()); |
445 base_file_.reset(new BaseFile(mock_file_stream_->get_path(), | 471 base_file_.reset(new BaseFile(mock_file_stream_->get_path(), |
446 GURL(), | 472 GURL(), |
447 GURL(), | 473 GURL(), |
448 0, | 474 0, |
449 false, | 475 false, |
450 "", | 476 "", |
451 mock_file_stream_)); | 477 mock_file_stream_, |
| 478 net::BoundNetLog())); |
452 EXPECT_EQ(net::OK, base_file_->Initialize()); | 479 EXPECT_EQ(net::OK, base_file_->Initialize()); |
453 ASSERT_EQ(net::OK, AppendDataToFile(kTestData1)); | 480 ASSERT_EQ(net::OK, AppendDataToFile(kTestData1)); |
454 ASSERT_EQ(net::OK, AppendDataToFile(kTestData2)); | 481 ASSERT_EQ(net::OK, AppendDataToFile(kTestData2)); |
455 ForceError(net::ERR_ACCESS_DENIED); | 482 ForceError(net::ERR_ACCESS_DENIED); |
456 ASSERT_NE(net::OK, AppendDataToFile(kTestData3)); | 483 ASSERT_NE(net::OK, AppendDataToFile(kTestData3)); |
457 std::string hash; | 484 std::string hash; |
458 EXPECT_FALSE(base_file_->GetHash(&hash)); | 485 EXPECT_FALSE(base_file_->GetHash(&hash)); |
459 base_file_->Finish(); | 486 base_file_->Finish(); |
460 } | 487 } |
461 | 488 |
(...skipping 23 matching lines...) Expand all Loading... |
485 | 512 |
486 set_expected_data(kTestData4); | 513 set_expected_data(kTestData4); |
487 | 514 |
488 // Use the file we've just created. | 515 // Use the file we've just created. |
489 base_file_.reset(new BaseFile(existing_file_name, | 516 base_file_.reset(new BaseFile(existing_file_name, |
490 GURL(), | 517 GURL(), |
491 GURL(), | 518 GURL(), |
492 kTestDataLength4, | 519 kTestDataLength4, |
493 false, | 520 false, |
494 "", | 521 "", |
495 file_stream_)); | 522 file_stream_, |
| 523 net::BoundNetLog())); |
496 | 524 |
497 EXPECT_EQ(net::OK, base_file_->Initialize()); | 525 EXPECT_EQ(net::OK, base_file_->Initialize()); |
498 | 526 |
499 const FilePath file_name = base_file_->full_path(); | 527 const FilePath file_name = base_file_->full_path(); |
500 EXPECT_NE(FilePath::StringType(), file_name.value()); | 528 EXPECT_NE(FilePath::StringType(), file_name.value()); |
501 | 529 |
502 // Write into the file. | 530 // Write into the file. |
503 EXPECT_EQ(net::OK, AppendDataToFile(kTestData1)); | 531 EXPECT_EQ(net::OK, AppendDataToFile(kTestData1)); |
504 | 532 |
505 base_file_->Finish(); | 533 base_file_->Finish(); |
506 base_file_->Detach(); | 534 base_file_->Detach(); |
507 expect_file_survives_ = true; | 535 expect_file_survives_ = true; |
508 } | 536 } |
509 | 537 |
510 // Create a read-only file and attempt to write to it. | 538 // Create a read-only file and attempt to write to it. |
511 TEST_F(BaseFileTest, ReadonlyBaseFile) { | 539 TEST_F(BaseFileTest, ReadonlyBaseFile) { |
512 // Create a new file. | 540 // Create a new file. |
513 FilePath readonly_file_name = CreateTestFile(); | 541 FilePath readonly_file_name = CreateTestFile(); |
514 | 542 |
515 // Make it read-only. | 543 // Make it read-only. |
516 EXPECT_TRUE(file_util::MakeFileUnwritable(readonly_file_name)); | 544 EXPECT_TRUE(file_util::MakeFileUnwritable(readonly_file_name)); |
517 | 545 |
518 // Try to overwrite it. | 546 // Try to overwrite it. |
519 base_file_.reset(new BaseFile(readonly_file_name, | 547 base_file_.reset(new BaseFile(readonly_file_name, |
520 GURL(), | 548 GURL(), |
521 GURL(), | 549 GURL(), |
522 0, | 550 0, |
523 false, | 551 false, |
524 "", | 552 "", |
525 file_stream_)); | 553 file_stream_, |
| 554 net::BoundNetLog())); |
526 | 555 |
527 expect_in_progress_ = false; | 556 expect_in_progress_ = false; |
528 | 557 |
529 int init_error = base_file_->Initialize(); | 558 int init_error = base_file_->Initialize(); |
530 DVLOG(1) << " init_error = " << init_error; | 559 DVLOG(1) << " init_error = " << init_error; |
531 EXPECT_NE(net::OK, init_error); | 560 EXPECT_NE(net::OK, init_error); |
532 | 561 |
533 const FilePath file_name = base_file_->full_path(); | 562 const FilePath file_name = base_file_->full_path(); |
534 EXPECT_NE(FilePath::StringType(), file_name.value()); | 563 EXPECT_NE(FilePath::StringType(), file_name.value()); |
535 | 564 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 base_file_->Finish(); | 610 base_file_->Finish(); |
582 } | 611 } |
583 | 612 |
584 // Test that calculating speed after no delay - should not divide by 0. | 613 // Test that calculating speed after no delay - should not divide by 0. |
585 TEST_F(BaseFileTest, SpeedAfterNoElapsedTime) { | 614 TEST_F(BaseFileTest, SpeedAfterNoElapsedTime) { |
586 ASSERT_EQ(net::OK, base_file_->Initialize()); | 615 ASSERT_EQ(net::OK, base_file_->Initialize()); |
587 ASSERT_EQ(net::OK, AppendDataToFile(kTestData1)); | 616 ASSERT_EQ(net::OK, AppendDataToFile(kTestData1)); |
588 ASSERT_EQ(0, CurrentSpeedAtTime(StartTick())); | 617 ASSERT_EQ(0, CurrentSpeedAtTime(StartTick())); |
589 base_file_->Finish(); | 618 base_file_->Finish(); |
590 } | 619 } |
OLD | NEW |