| Index: content/browser/download/base_file_unittest.cc
|
| diff --git a/content/browser/download/base_file_unittest.cc b/content/browser/download/base_file_unittest.cc
|
| index 6b07d8d1315cc0b3fa6f58abba4f35f515dffcf8..3dad6688c25aa89f073ac2618044d6d734e1c48d 100644
|
| --- a/content/browser/download/base_file_unittest.cc
|
| +++ b/content/browser/download/base_file_unittest.cc
|
| @@ -31,6 +31,7 @@ const char kTestData3[] = "Final line.";
|
| const char kTestData4[] = "supercalifragilisticexpialidocious";
|
| const int kTestDataLength1 = arraysize(kTestData1) - 1;
|
| const int kTestDataLength2 = arraysize(kTestData2) - 1;
|
| +const int kTestDataLength3 = arraysize(kTestData3) - 1;
|
| const int kTestDataLength4 = arraysize(kTestData4) - 1;
|
|
|
| // SHA-256 hash of kTestData1 (excluding terminating NUL).
|
| @@ -88,7 +89,7 @@ class BaseFileTest : public testing::Test {
|
| bool InitializeFile() {
|
| DownloadInterruptReason result = base_file_->Initialize(
|
| base::FilePath(), temp_dir_.GetPath(), base::File(), 0, std::string(),
|
| - std::unique_ptr<crypto::SecureHash>());
|
| + std::unique_ptr<crypto::SecureHash>(), false);
|
| EXPECT_EQ(expected_error_, result);
|
| return result == DOWNLOAD_INTERRUPT_REASON_NONE;
|
| }
|
| @@ -122,7 +123,8 @@ class BaseFileTest : public testing::Test {
|
| EXPECT_EQ(
|
| DOWNLOAD_INTERRUPT_REASON_NONE,
|
| file.Initialize(base::FilePath(), temp_dir_.GetPath(), base::File(), 0,
|
| - std::string(), std::unique_ptr<crypto::SecureHash>()));
|
| + std::string(), std::unique_ptr<crypto::SecureHash>(),
|
| + false));
|
| file_name = file.full_path();
|
| EXPECT_NE(base::FilePath::StringType(), file_name.value());
|
|
|
| @@ -142,7 +144,8 @@ class BaseFileTest : public testing::Test {
|
| EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE,
|
| duplicate_file.Initialize(file_name, temp_dir_.GetPath(),
|
| base::File(), 0, std::string(),
|
| - std::unique_ptr<crypto::SecureHash>()));
|
| + std::unique_ptr<crypto::SecureHash>(),
|
| + false));
|
| // Write something into it.
|
| duplicate_file.AppendDataToFile(kTestData4, kTestDataLength4);
|
| // Detach the file so it isn't deleted on destruction of |duplicate_file|.
|
| @@ -296,7 +299,8 @@ TEST_F(BaseFileTest, MultipleWritesInterruptedWithHash) {
|
| base::File(),
|
| base_file_->bytes_so_far(),
|
| std::string(),
|
| - std::move(hash_state)));
|
| + std::move(hash_state),
|
| + false));
|
| std::string data(kTestData3);
|
| EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE,
|
| second_file.AppendDataToFile(data.data(), data.size()));
|
| @@ -418,7 +422,8 @@ TEST_F(BaseFileTest, WriteWithError) {
|
| EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE,
|
| base_file_->Initialize(path, base::FilePath(), std::move(file), 0,
|
| std::string(),
|
| - std::unique_ptr<crypto::SecureHash>()));
|
| + std::unique_ptr<crypto::SecureHash>(),
|
| + false));
|
| #if defined(OS_WIN)
|
| set_expected_error(DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED);
|
| #elif defined (OS_POSIX)
|
| @@ -460,7 +465,8 @@ TEST_F(BaseFileTest, AppendToBaseFile) {
|
| DOWNLOAD_INTERRUPT_REASON_NONE,
|
| base_file_->Initialize(existing_file_name, base::FilePath(), base::File(),
|
| kTestDataLength4, std::string(),
|
| - std::unique_ptr<crypto::SecureHash>()));
|
| + std::unique_ptr<crypto::SecureHash>(),
|
| + false));
|
|
|
| const base::FilePath file_name = base_file_->full_path();
|
| EXPECT_NE(base::FilePath::StringType(), file_name.value());
|
| @@ -489,7 +495,8 @@ TEST_F(BaseFileTest, ReadonlyBaseFile) {
|
| EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED,
|
| base_file_->Initialize(readonly_file_name, base::FilePath(),
|
| base::File(), 0, std::string(),
|
| - std::unique_ptr<crypto::SecureHash>()));
|
| + std::unique_ptr<crypto::SecureHash>(),
|
| + false));
|
|
|
| expect_in_progress_ = false;
|
|
|
| @@ -517,7 +524,8 @@ TEST_F(BaseFileTest, ExistingBaseFileKnownHash) {
|
| EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE,
|
| base_file_->Initialize(file_path, base::FilePath(), base::File(),
|
| kTestDataLength1, hash_so_far,
|
| - std::unique_ptr<crypto::SecureHash>()));
|
| + std::unique_ptr<crypto::SecureHash>(),
|
| + false));
|
| set_expected_data(kTestData1);
|
| ASSERT_TRUE(AppendDataToFile(kTestData2));
|
| ASSERT_TRUE(AppendDataToFile(kTestData3));
|
| @@ -534,7 +542,8 @@ TEST_F(BaseFileTest, ExistingBaseFileUnknownHash) {
|
| EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE,
|
| base_file_->Initialize(file_path, base::FilePath(), base::File(),
|
| kTestDataLength1, std::string(),
|
| - std::unique_ptr<crypto::SecureHash>()));
|
| + std::unique_ptr<crypto::SecureHash>(),
|
| + false));
|
| set_expected_data(kTestData1);
|
| ASSERT_TRUE(AppendDataToFile(kTestData2));
|
| ASSERT_TRUE(AppendDataToFile(kTestData3));
|
| @@ -552,7 +561,8 @@ TEST_F(BaseFileTest, ExistingBaseFileIncorrectHash) {
|
| EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_HASH_MISMATCH,
|
| base_file_->Initialize(file_path, base::FilePath(), base::File(),
|
| kTestDataLength2, hash_so_far,
|
| - std::unique_ptr<crypto::SecureHash>()));
|
| + std::unique_ptr<crypto::SecureHash>(),
|
| + false));
|
| set_expected_error(DOWNLOAD_INTERRUPT_REASON_FILE_HASH_MISMATCH);
|
| }
|
|
|
| @@ -580,7 +590,8 @@ TEST_F(BaseFileTest, ExistingBaseFileLargeSizeKnownHash) {
|
| big_buffer.size(),
|
| std::string(std::begin(kExpectedPartialHash),
|
| std::end(kExpectedPartialHash)),
|
| - std::unique_ptr<crypto::SecureHash>()));
|
| + std::unique_ptr<crypto::SecureHash>(),
|
| + false));
|
| set_expected_data(big_buffer); // Contents of the file on Open.
|
| ASSERT_TRUE(AppendDataToFile(big_buffer));
|
| ExpectHashValue(kExpectedFullHash, base_file_->Finish());
|
| @@ -604,7 +615,8 @@ TEST_F(BaseFileTest, ExistingBaseFileLargeSizeIncorrectHash) {
|
| big_buffer.size(),
|
| std::string(std::begin(kExpectedPartialHash),
|
| std::end(kExpectedPartialHash)),
|
| - std::unique_ptr<crypto::SecureHash>()));
|
| + std::unique_ptr<crypto::SecureHash>(),
|
| + false));
|
| set_expected_error(DOWNLOAD_INTERRUPT_REASON_FILE_HASH_MISMATCH);
|
| }
|
|
|
| @@ -617,7 +629,8 @@ TEST_F(BaseFileTest, ExistingBaseFileTooShort) {
|
| EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_TOO_SHORT,
|
| base_file_->Initialize(file_path, base::FilePath(), base::File(),
|
| kTestDataLength1 + 1, std::string(),
|
| - std::unique_ptr<crypto::SecureHash>()));
|
| + std::unique_ptr<crypto::SecureHash>(),
|
| + false));
|
| set_expected_error(DOWNLOAD_INTERRUPT_REASON_FILE_TOO_SHORT);
|
| }
|
|
|
| @@ -635,7 +648,8 @@ TEST_F(BaseFileTest, ExistingBaseFileKnownHashTooLong) {
|
| EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE,
|
| base_file_->Initialize(file_path, base::FilePath(), base::File(),
|
| kTestDataLength1, hash_so_far,
|
| - std::unique_ptr<crypto::SecureHash>()));
|
| + std::unique_ptr<crypto::SecureHash>(),
|
| + false));
|
| set_expected_data(kTestData1); // Our starting position.
|
| ASSERT_TRUE(AppendDataToFile(kTestData2));
|
| ASSERT_TRUE(AppendDataToFile(kTestData3));
|
| @@ -655,7 +669,8 @@ TEST_F(BaseFileTest, ExistingBaseFileUnknownHashTooLong) {
|
| EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE,
|
| base_file_->Initialize(file_path, base::FilePath(), base::File(),
|
| kTestDataLength1, std::string(),
|
| - std::unique_ptr<crypto::SecureHash>()));
|
| + std::unique_ptr<crypto::SecureHash>(),
|
| + false));
|
| set_expected_data(kTestData1);
|
| ASSERT_TRUE(AppendDataToFile(kTestData2));
|
| ASSERT_TRUE(AppendDataToFile(kTestData3));
|
| @@ -678,7 +693,8 @@ TEST_F(BaseFileTest, ExistingBaseFileUnknownHashTooLongForLargeFile) {
|
| EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE,
|
| base_file_->Initialize(file_path, base::FilePath(), base::File(),
|
| kIntermediateSize, std::string(),
|
| - std::unique_ptr<crypto::SecureHash>()));
|
| + std::unique_ptr<crypto::SecureHash>(),
|
| + false));
|
| // The extra bytes should be stripped during Initialize().
|
| contents.resize(kIntermediateSize, 'a');
|
| set_expected_data(contents);
|
| @@ -728,4 +744,28 @@ TEST_F(BaseFileTest, NoDoubleDeleteAfterCancel) {
|
| expect_file_survives_ = true;
|
| }
|
|
|
| +// Test that writing data to a sparse file works.
|
| +TEST_F(BaseFileTest, WriteDataToSparseFile) {
|
| + base::FilePath file_path = temp_dir_.GetPath().AppendASCII("existing");
|
| + std::string contents = kTestData1;
|
| + ASSERT_EQ(static_cast<int>(contents.size()),
|
| + base::WriteFile(file_path, contents.data(), contents.size()));
|
| +
|
| + base_file_->Initialize(file_path, base::FilePath(), base::File(),
|
| + kTestDataLength1,
|
| + std::string(),
|
| + std::unique_ptr<crypto::SecureHash>(),
|
| + true);
|
| + // This will create a hole in the file.
|
| + base_file_->WriteDataToFile(kTestDataLength1 + kTestDataLength2,
|
| + kTestData3,
|
| + kTestDataLength3);
|
| + // This should fill the hole.
|
| + base_file_->WriteDataToFile(kTestDataLength1,
|
| + kTestData2,
|
| + kTestDataLength2);
|
| + set_expected_data(contents + kTestData2 + kTestData3);
|
| + ExpectHashValue(kHashOfTestData1To3, base_file_->Finish());
|
| +}
|
| +
|
| } // namespace content
|
|
|