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 a6ce347c189430202da7b7618c089a8c642d2a2d..8f2412b17d96e0c067b92dc2b5d43671563af97f 100644 |
--- a/content/browser/download/base_file_unittest.cc |
+++ b/content/browser/download/base_file_unittest.cc |
@@ -32,12 +32,24 @@ 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; |
const int kElapsedTimeSeconds = 5; |
const base::TimeDelta kElapsedTimeDelta = base::TimeDelta::FromSeconds( |
kElapsedTimeSeconds); |
+// SHA-256 hash of kTestData1 (excluding terminating NUL). |
+const uint8_t kHashOfTestData1[] = { |
+ 0x0b, 0x2d, 0x3f, 0x3f, 0x79, 0x43, 0xad, 0x64, 0xb8, 0x60, 0xdf, |
+ 0x94, 0xd0, 0x5c, 0xb5, 0x6a, 0x8a, 0x97, 0xc6, 0xec, 0x57, 0x68, |
+ 0xb5, 0xb7, 0x0b, 0x93, 0x0c, 0x5a, 0xa7, 0xfa, 0x9a, 0xde}; |
+ |
+// SHA-256 hash of kTestData1 ++ kTestData2 ++ kTestData3 (excluding terminating |
+// NUL). |
+const uint8_t kHashOfTestData1To3[] = { |
+ 0xcb, 0xf6, 0x8b, 0xf1, 0x0f, 0x80, 0x03, 0xdb, 0x86, 0xb3, 0x13, |
+ 0x43, 0xaf, 0xac, 0x8c, 0x71, 0x75, 0xbd, 0x03, 0xfb, 0x5f, 0xc9, |
+ 0x05, 0x65, 0x0f, 0x8c, 0x80, 0xaf, 0x08, 0x74, 0x43, 0xa8}; |
+ |
} // namespace |
class BaseFileTest : public testing::Test { |
@@ -52,16 +64,8 @@ class BaseFileTest : public testing::Test { |
} |
void SetUp() override { |
- ResetHash(); |
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
- base_file_.reset(new BaseFile(base::FilePath(), |
- GURL(), |
- GURL(), |
- 0, |
- false, |
- std::string(), |
- base::File(), |
- net::BoundNetLog())); |
+ base_file_.reset(new BaseFile(net::BoundNetLog())); |
} |
void TearDown() override { |
@@ -87,36 +91,14 @@ class BaseFileTest : public testing::Test { |
EXPECT_EQ(expect_file_survives_, base::PathExists(full_path)); |
} |
- void ResetHash() { |
- secure_hash_.reset(crypto::SecureHash::Create(crypto::SecureHash::SHA256)); |
- memcpy(sha256_hash_, kEmptySha256Hash, crypto::kSHA256Length); |
- } |
- |
- void UpdateHash(const char* data, size_t length) { |
- secure_hash_->Update(data, length); |
- } |
- |
- std::string GetFinalHash() { |
- std::string hash; |
- secure_hash_->Finish(sha256_hash_, crypto::kSHA256Length); |
- hash.assign(reinterpret_cast<const char*>(sha256_hash_), |
- sizeof(sha256_hash_)); |
- return hash; |
- } |
- |
- void MakeFileWithHash() { |
- base_file_.reset(new BaseFile(base::FilePath(), |
- GURL(), |
- GURL(), |
- 0, |
- true, |
- std::string(), |
- base::File(), |
- net::BoundNetLog())); |
- } |
- |
bool InitializeFile() { |
- DownloadInterruptReason result = base_file_->Initialize(temp_dir_.path()); |
+ DownloadInterruptReason result = |
+ base_file_->Initialize(base::FilePath(), |
+ temp_dir_.path(), |
+ base::File(), |
+ 0, |
+ std::string(), |
+ scoped_ptr<crypto::SecureHash>()); |
EXPECT_EQ(expected_error_, result); |
return result == DOWNLOAD_INTERRUPT_REASON_NONE; |
} |
@@ -145,17 +127,15 @@ class BaseFileTest : public testing::Test { |
// Create a file. Returns the complete file path. |
base::FilePath CreateTestFile() { |
base::FilePath file_name; |
- BaseFile file(base::FilePath(), |
- GURL(), |
- GURL(), |
- 0, |
- false, |
- std::string(), |
- base::File(), |
- net::BoundNetLog()); |
+ BaseFile file((net::BoundNetLog())); |
EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, |
- file.Initialize(temp_dir_.path())); |
+ file.Initialize(base::FilePath(), |
+ temp_dir_.path(), |
+ base::File(), |
+ 0, |
+ std::string(), |
+ scoped_ptr<crypto::SecureHash>())); |
file_name = file.full_path(); |
EXPECT_NE(base::FilePath::StringType(), file_name.value()); |
@@ -171,16 +151,14 @@ class BaseFileTest : public testing::Test { |
// Create a file with the specified file name. |
void CreateFileWithName(const base::FilePath& file_name) { |
EXPECT_NE(base::FilePath::StringType(), file_name.value()); |
- BaseFile duplicate_file(file_name, |
- GURL(), |
- GURL(), |
- 0, |
- false, |
- std::string(), |
- base::File(), |
- net::BoundNetLog()); |
+ BaseFile duplicate_file((net::BoundNetLog())); |
EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, |
- duplicate_file.Initialize(temp_dir_.path())); |
+ duplicate_file.Initialize(file_name, |
+ temp_dir_.path(), |
+ base::File(), |
+ 0, |
+ std::string(), |
+ scoped_ptr<crypto::SecureHash>())); |
// Write something into it. |
duplicate_file.AppendDataToFile(kTestData4, kTestDataLength4); |
// Detach the file so it isn't deleted on destruction of |duplicate_file|. |
@@ -207,6 +185,15 @@ class BaseFileTest : public testing::Test { |
<< "Interrupt reason = " << err; |
} |
+ template <size_t SZ> |
+ static void ExpectHashValue(const uint8_t (&expected_hash)[SZ], |
+ scoped_ptr<crypto::SecureHash> hash_state) { |
+ std::vector<uint8_t> hash_value(hash_state->GetHashLength()); |
+ hash_state->Finish(&hash_value.front(), hash_value.size()); |
+ ASSERT_EQ(SZ, hash_value.size()); |
+ EXPECT_EQ(0, memcmp(expected_hash, &hash_value.front(), hash_value.size())); |
+ } |
+ |
protected: |
// BaseClass instance we are testing. |
scoped_ptr<BaseFile> base_file_; |
@@ -220,11 +207,6 @@ class BaseFileTest : public testing::Test { |
// Expect the file to be in progress. |
bool expect_in_progress_; |
- // Hash calculator. |
- scoped_ptr<crypto::SecureHash> secure_hash_; |
- |
- unsigned char sha256_hash_[crypto::kSHA256Length]; |
- |
private: |
// Keep track of what data should be saved to the disk file. |
std::string expected_data_; |
@@ -266,24 +248,9 @@ TEST_F(BaseFileTest, WriteAndDetach) { |
// Write data to the file and detach it, and calculate its sha256 hash. |
TEST_F(BaseFileTest, WriteWithHashAndDetach) { |
- // Calculate the final hash. |
- ResetHash(); |
- UpdateHash(kTestData1, kTestDataLength1); |
- std::string expected_hash = GetFinalHash(); |
- std::string expected_hash_hex = |
- base::HexEncode(expected_hash.data(), expected_hash.size()); |
- |
- MakeFileWithHash(); |
ASSERT_TRUE(InitializeFile()); |
ASSERT_TRUE(AppendDataToFile(kTestData1)); |
- base_file_->Finish(); |
- |
- std::string hash; |
- base_file_->GetHash(&hash); |
- EXPECT_EQ("0B2D3F3F7943AD64B860DF94D05CB56A8A97C6EC5768B5B70B930C5AA7FA9ADE", |
- expected_hash_hex); |
- EXPECT_EQ(expected_hash_hex, base::HexEncode(hash.data(), hash.size())); |
- |
+ ExpectHashValue(kHashOfTestData1, base_file_->Finish()); |
base_file_->Detach(); |
expect_file_survives_ = true; |
} |
@@ -303,7 +270,7 @@ TEST_F(BaseFileTest, WriteThenRenameAndDetach) { |
EXPECT_FALSE(base::PathExists(initial_path)); |
EXPECT_TRUE(base::PathExists(new_path)); |
- base_file_->Finish(); |
+ ExpectHashValue(kHashOfTestData1, base_file_->Finish()); |
base_file_->Detach(); |
expect_file_survives_ = true; |
} |
@@ -312,7 +279,7 @@ TEST_F(BaseFileTest, WriteThenRenameAndDetach) { |
TEST_F(BaseFileTest, SingleWrite) { |
ASSERT_TRUE(InitializeFile()); |
ASSERT_TRUE(AppendDataToFile(kTestData1)); |
- base_file_->Finish(); |
+ ExpectHashValue(kHashOfTestData1, base_file_->Finish()); |
} |
// Write data to the file multiple times. |
@@ -321,82 +288,18 @@ TEST_F(BaseFileTest, MultipleWrites) { |
ASSERT_TRUE(AppendDataToFile(kTestData1)); |
ASSERT_TRUE(AppendDataToFile(kTestData2)); |
ASSERT_TRUE(AppendDataToFile(kTestData3)); |
- std::string hash; |
- EXPECT_FALSE(base_file_->GetHash(&hash)); |
- base_file_->Finish(); |
-} |
- |
-// Write data to the file once and calculate its sha256 hash. |
-TEST_F(BaseFileTest, SingleWriteWithHash) { |
- // Calculate the final hash. |
- ResetHash(); |
- UpdateHash(kTestData1, kTestDataLength1); |
- std::string expected_hash = GetFinalHash(); |
- std::string expected_hash_hex = |
- base::HexEncode(expected_hash.data(), expected_hash.size()); |
- |
- MakeFileWithHash(); |
- ASSERT_TRUE(InitializeFile()); |
- // Can get partial hash states before Finish() is called. |
- EXPECT_STRNE(std::string().c_str(), base_file_->GetHashState().c_str()); |
- ASSERT_TRUE(AppendDataToFile(kTestData1)); |
- EXPECT_STRNE(std::string().c_str(), base_file_->GetHashState().c_str()); |
- base_file_->Finish(); |
- |
- std::string hash; |
- base_file_->GetHash(&hash); |
- EXPECT_EQ(expected_hash_hex, base::HexEncode(hash.data(), hash.size())); |
-} |
- |
-// Write data to the file multiple times and calculate its sha256 hash. |
-TEST_F(BaseFileTest, MultipleWritesWithHash) { |
- // Calculate the final hash. |
- ResetHash(); |
- UpdateHash(kTestData1, kTestDataLength1); |
- UpdateHash(kTestData2, kTestDataLength2); |
- UpdateHash(kTestData3, kTestDataLength3); |
- std::string expected_hash = GetFinalHash(); |
- std::string expected_hash_hex = |
- base::HexEncode(expected_hash.data(), expected_hash.size()); |
- |
- std::string hash; |
- MakeFileWithHash(); |
- ASSERT_TRUE(InitializeFile()); |
- ASSERT_TRUE(AppendDataToFile(kTestData1)); |
- ASSERT_TRUE(AppendDataToFile(kTestData2)); |
- ASSERT_TRUE(AppendDataToFile(kTestData3)); |
- // No hash before Finish() is called. |
- EXPECT_FALSE(base_file_->GetHash(&hash)); |
- base_file_->Finish(); |
- |
- EXPECT_TRUE(base_file_->GetHash(&hash)); |
- EXPECT_EQ("CBF68BF10F8003DB86B31343AFAC8C7175BD03FB5FC905650F8C80AF087443A8", |
- expected_hash_hex); |
- EXPECT_EQ(expected_hash_hex, base::HexEncode(hash.data(), hash.size())); |
+ ExpectHashValue(kHashOfTestData1To3, base_file_->Finish()); |
} |
// Write data to the file multiple times, interrupt it, and continue using |
// another file. Calculate the resulting combined sha256 hash. |
TEST_F(BaseFileTest, MultipleWritesInterruptedWithHash) { |
- // Calculate the final hash. |
- ResetHash(); |
- UpdateHash(kTestData1, kTestDataLength1); |
- UpdateHash(kTestData2, kTestDataLength2); |
- UpdateHash(kTestData3, kTestDataLength3); |
- std::string expected_hash = GetFinalHash(); |
- std::string expected_hash_hex = |
- base::HexEncode(expected_hash.data(), expected_hash.size()); |
- |
- MakeFileWithHash(); |
ASSERT_TRUE(InitializeFile()); |
// Write some data |
ASSERT_TRUE(AppendDataToFile(kTestData1)); |
ASSERT_TRUE(AppendDataToFile(kTestData2)); |
// Get the hash state and file name. |
- std::string hash_state; |
- hash_state = base_file_->GetHashState(); |
- // Finish the file. |
- base_file_->Finish(); |
+ scoped_ptr<crypto::SecureHash> hash_state = base_file_->Finish(); |
base::FilePath new_file_path(temp_dir_.path().Append( |
base::FilePath(FILE_PATH_LITERAL("second_file")))); |
@@ -404,26 +307,18 @@ TEST_F(BaseFileTest, MultipleWritesInterruptedWithHash) { |
ASSERT_TRUE(base::CopyFile(base_file_->full_path(), new_file_path)); |
// Create another file |
- BaseFile second_file(new_file_path, |
- GURL(), |
- GURL(), |
- base_file_->bytes_so_far(), |
- true, |
- hash_state, |
- base::File(), |
- net::BoundNetLog()); |
+ BaseFile second_file((net::BoundNetLog())); |
ASSERT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, |
- second_file.Initialize(base::FilePath())); |
+ second_file.Initialize(new_file_path, |
+ base::FilePath(), |
+ base::File(), |
+ base_file_->bytes_so_far(), |
+ std::string(), |
+ std::move(hash_state))); |
std::string data(kTestData3); |
EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, |
second_file.AppendDataToFile(data.data(), data.size())); |
- second_file.Finish(); |
- |
- std::string hash; |
- EXPECT_TRUE(second_file.GetHash(&hash)); |
- // This will fail until getting the hash state is supported in SecureHash. |
- EXPECT_STREQ(expected_hash_hex.c_str(), |
- base::HexEncode(hash.data(), hash.size()).c_str()); |
+ ExpectHashValue(kHashOfTestData1To3, second_file.Finish()); |
} |
// Rename the file after all writes to it. |
@@ -442,7 +337,7 @@ TEST_F(BaseFileTest, WriteThenRename) { |
EXPECT_FALSE(base::PathExists(initial_path)); |
EXPECT_TRUE(base::PathExists(new_path)); |
- base_file_->Finish(); |
+ ExpectHashValue(kHashOfTestData1, base_file_->Finish()); |
} |
// Rename the file while the download is still in progress. |
@@ -462,8 +357,9 @@ TEST_F(BaseFileTest, RenameWhileInProgress) { |
EXPECT_TRUE(base::PathExists(new_path)); |
ASSERT_TRUE(AppendDataToFile(kTestData2)); |
+ ASSERT_TRUE(AppendDataToFile(kTestData3)); |
- base_file_->Finish(); |
+ ExpectHashValue(kHashOfTestData1To3, base_file_->Finish()); |
} |
// Test that a failed rename reports the correct error. |
@@ -525,15 +421,7 @@ TEST_F(BaseFileTest, RenameWithErrorInProgress) { |
ASSERT_EQ(new_path.value(), base_file_->full_path().value()); |
ASSERT_TRUE(AppendDataToFile(kTestData3)); |
- base_file_->Finish(); |
- |
- // The contents of the file should be intact. |
- std::string file_contents; |
- std::string expected_contents(kTestData1); |
- expected_contents += kTestData2; |
- expected_contents += kTestData3; |
- ASSERT_TRUE(base::ReadFileToString(new_path, &file_contents)); |
- EXPECT_EQ(expected_contents, file_contents); |
+ ExpectHashValue(kHashOfTestData1To3, base_file_->Finish()); |
} |
// Test that a failed write reports an error. |
@@ -544,9 +432,14 @@ TEST_F(BaseFileTest, WriteWithError) { |
// Pass a file handle which was opened without the WRITE flag. |
// This should result in an error when writing. |
base::File file(path, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ); |
- base_file_.reset(new BaseFile(path, GURL(), GURL(), 0, false, std::string(), |
- std::move(file), net::BoundNetLog())); |
- ASSERT_TRUE(InitializeFile()); |
+ base_file_.reset(new BaseFile(net::BoundNetLog())); |
+ EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, |
+ base_file_->Initialize(path, |
+ base::FilePath(), |
+ std::move(file), |
+ 0, |
+ std::string(), |
+ scoped_ptr<crypto::SecureHash>())); |
#if defined(OS_WIN) |
set_expected_error(DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED); |
#elif defined (OS_POSIX) |
@@ -580,20 +473,17 @@ TEST_F(BaseFileTest, DuplicateBaseFile) { |
TEST_F(BaseFileTest, AppendToBaseFile) { |
// Create a new file. |
base::FilePath existing_file_name = CreateTestFile(); |
- |
set_expected_data(kTestData4); |
// Use the file we've just created. |
- base_file_.reset(new BaseFile(existing_file_name, |
- GURL(), |
- GURL(), |
- kTestDataLength4, |
- false, |
- std::string(), |
- base::File(), |
- net::BoundNetLog())); |
- |
- ASSERT_TRUE(InitializeFile()); |
+ base_file_.reset(new BaseFile(net::BoundNetLog())); |
+ ASSERT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, |
+ base_file_->Initialize(existing_file_name, |
+ base::FilePath(), |
+ base::File(), |
+ kTestDataLength4, |
+ std::string(), |
+ scoped_ptr<crypto::SecureHash>())); |
const base::FilePath file_name = base_file_->full_path(); |
EXPECT_NE(base::FilePath::StringType(), file_name.value()); |
@@ -618,18 +508,16 @@ TEST_F(BaseFileTest, ReadonlyBaseFile) { |
EXPECT_TRUE(base::MakeFileUnwritable(readonly_file_name)); |
// Try to overwrite it. |
- base_file_.reset(new BaseFile(readonly_file_name, |
- GURL(), |
- GURL(), |
- 0, |
- false, |
- std::string(), |
- base::File(), |
- net::BoundNetLog())); |
+ base_file_.reset(new BaseFile(net::BoundNetLog())); |
+ EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED, |
+ base_file_->Initialize(readonly_file_name, |
+ base::FilePath(), |
+ base::File(), |
+ 0, |
+ std::string(), |
+ scoped_ptr<crypto::SecureHash>())); |
expect_in_progress_ = false; |
- set_expected_error(DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED); |
- EXPECT_FALSE(InitializeFile()); |
const base::FilePath file_name = base_file_->full_path(); |
EXPECT_NE(base::FilePath::StringType(), file_name.value()); |
@@ -643,16 +531,175 @@ TEST_F(BaseFileTest, ReadonlyBaseFile) { |
expect_file_survives_ = true; |
} |
-TEST_F(BaseFileTest, IsEmptyHash) { |
- std::string empty(crypto::kSHA256Length, '\x00'); |
- EXPECT_TRUE(BaseFile::IsEmptyHash(empty)); |
- std::string not_empty(crypto::kSHA256Length, '\x01'); |
- EXPECT_FALSE(BaseFile::IsEmptyHash(not_empty)); |
- EXPECT_FALSE(BaseFile::IsEmptyHash(std::string())); |
+// Open an existing file and continue writing to it. The hash of the partial |
+// file is known and matches the existing contents. |
+TEST_F(BaseFileTest, ExistingBaseFileKnownHash) { |
+ base::FilePath file_path = temp_dir_.path().AppendASCII("existing"); |
+ ASSERT_TRUE(base::WriteFile(file_path, kTestData1, kTestDataLength1)); |
+ |
+ std::string hash_so_far(std::begin(kHashOfTestData1), |
+ std::end(kHashOfTestData1)); |
+ EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, |
+ base_file_->Initialize(file_path, |
+ base::FilePath(), |
+ base::File(), |
+ kTestDataLength1, |
+ hash_so_far, |
+ scoped_ptr<crypto::SecureHash>())); |
+ set_expected_data(kTestData1); |
+ ASSERT_TRUE(AppendDataToFile(kTestData2)); |
+ ASSERT_TRUE(AppendDataToFile(kTestData3)); |
+ ExpectHashValue(kHashOfTestData1To3, base_file_->Finish()); |
+} |
+ |
+// Open an existing file and continue writing to it. The hash of the partial |
+// file is unknown. |
+TEST_F(BaseFileTest, ExistingBaseFileUnknownHash) { |
+ base::FilePath file_path = temp_dir_.path().AppendASCII("existing"); |
+ ASSERT_TRUE(base::WriteFile(file_path, kTestData1, kTestDataLength1)); |
+ |
+ EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, |
+ base_file_->Initialize(file_path, |
+ base::FilePath(), |
+ base::File(), |
+ kTestDataLength1, |
+ std::string(), |
+ scoped_ptr<crypto::SecureHash>())); |
+ set_expected_data(kTestData1); |
+ ASSERT_TRUE(AppendDataToFile(kTestData2)); |
+ ASSERT_TRUE(AppendDataToFile(kTestData3)); |
+ ExpectHashValue(kHashOfTestData1To3, base_file_->Finish()); |
+} |
+ |
+// Open an existing file. The contentsof the file doesn't match the known hash. |
+TEST_F(BaseFileTest, ExistingBaseFileIncorrectHash) { |
+ base::FilePath file_path = temp_dir_.path().AppendASCII("existing"); |
+ ASSERT_TRUE(base::WriteFile(file_path, kTestData2, kTestDataLength2)); |
+ |
+ std::string hash_so_far(std::begin(kHashOfTestData1), |
+ std::end(kHashOfTestData1)); |
+ EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_HASH_MISMATCH, |
+ base_file_->Initialize(file_path, |
+ base::FilePath(), |
+ base::File(), |
+ kTestDataLength2, |
+ hash_so_far, |
+ scoped_ptr<crypto::SecureHash>())); |
+ set_expected_error(DOWNLOAD_INTERRUPT_REASON_FILE_HASH_MISMATCH); |
+} |
- std::string also_not_empty = empty; |
- also_not_empty[crypto::kSHA256Length - 1] = '\x01'; |
- EXPECT_FALSE(BaseFile::IsEmptyHash(also_not_empty)); |
+// Open a large existing file with a known hash and continue writing to it. |
+TEST_F(BaseFileTest, ExistingBaseFileLargeSizeKnownHash) { |
+ base::FilePath file_path = temp_dir_.path().AppendASCII("existing"); |
+ std::string big_buffer(1024 * 200, 'a'); |
+ ASSERT_TRUE(base::WriteFile(file_path, big_buffer.data(), big_buffer.size())); |
+ |
+ // Hash of partial file (1024*200 * 'a') |
+ const uint8_t kExpectedPartialHash[] = { |
+ 0x4b, 0x4f, 0x0f, 0x46, 0xac, 0x02, 0xd1, 0x77, 0xde, 0xa0, 0xab, |
+ 0x36, 0xa6, 0x6a, 0x65, 0x78, 0x40, 0xe2, 0xfb, 0x98, 0xb2, 0x0b, |
+ 0xb2, 0x7a, 0x68, 0x8d, 0xb4, 0xd8, 0xea, 0x9c, 0xd2, 0x2c}; |
+ |
+ // Hash of entire file (1024*400 * 'a') |
+ const uint8_t kExpectedFullHash[] = { |
+ 0x0c, 0xe9, 0xf6, 0x78, 0x6b, 0x0f, 0x58, 0x49, 0x36, 0xe8, 0x83, |
+ 0xc5, 0x09, 0x16, 0xbc, 0x5e, 0x2d, 0x07, 0x95, 0xb9, 0x42, 0x20, |
+ 0x41, 0x7c, 0xb3, 0x38, 0xd3, 0xf4, 0xe0, 0x78, 0x89, 0x46}; |
+ |
+ ASSERT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, |
+ base_file_->Initialize(file_path, |
+ base::FilePath(), |
+ base::File(), |
+ big_buffer.size(), |
+ std::string(std::begin(kExpectedPartialHash), |
+ std::end(kExpectedPartialHash)), |
+ scoped_ptr<crypto::SecureHash>())); |
+ set_expected_data(big_buffer); // Contents of the file on Open. |
+ ASSERT_TRUE(AppendDataToFile(big_buffer)); |
+ ExpectHashValue(kExpectedFullHash, base_file_->Finish()); |
+} |
+ |
+// Open a large existing file. The contents doesn't match the known hash. |
+TEST_F(BaseFileTest, ExistingBaseFileLargeSizeIncorrectHash) { |
+ base::FilePath file_path = temp_dir_.path().AppendASCII("existing"); |
+ std::string big_buffer(1024 * 200, 'a'); |
+ ASSERT_TRUE(base::WriteFile(file_path, big_buffer.data(), big_buffer.size())); |
+ |
+ // Incorrect hash of partial file (1024*200 * 'a') |
+ const uint8_t kExpectedPartialHash[] = { |
+ 0xc2, 0xa9, 0x08, 0xd9, 0x8f, 0x5d, 0xf9, 0x87, 0xad, 0xe4, 0x1b, |
+ 0x5f, 0xce, 0x21, 0x30, 0x67, 0xef, 0x6c, 0xc2, 0x1e, 0xf2, 0x24, |
+ 0x02, 0x12, 0xa4, 0x1e, 0x54, 0xb5, 0xe7, 0xc2, 0x8a, 0xe5}; |
+ |
+ EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_HASH_MISMATCH, |
+ base_file_->Initialize(file_path, |
+ base::FilePath(), |
+ base::File(), |
+ big_buffer.size(), |
+ std::string(std::begin(kExpectedPartialHash), |
+ std::end(kExpectedPartialHash)), |
+ scoped_ptr<crypto::SecureHash>())); |
+ set_expected_error(DOWNLOAD_INTERRUPT_REASON_FILE_HASH_MISMATCH); |
+} |
+ |
+// Open an existing file. The size of the file is too short. |
+TEST_F(BaseFileTest, ExistingBaseFileTooShort) { |
+ base::FilePath file_path = temp_dir_.path().AppendASCII("existing"); |
+ ASSERT_TRUE(base::WriteFile(file_path, kTestData1, kTestDataLength1)); |
+ |
+ EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_TOO_SHORT, |
+ base_file_->Initialize(file_path, |
+ base::FilePath(), |
+ base::File(), |
+ kTestDataLength1 + 1, |
+ std::string(), |
+ scoped_ptr<crypto::SecureHash>())); |
+ set_expected_error(DOWNLOAD_INTERRUPT_REASON_FILE_TOO_SHORT); |
+} |
+ |
+// Open an existing file. The size is larger than expected. |
+TEST_F(BaseFileTest, ExistingBaseFileKnownHashTooLong) { |
+ base::FilePath file_path = temp_dir_.path().AppendASCII("existing"); |
+ std::string contents; |
+ contents.append(kTestData1); |
+ contents.append("Something extra"); |
+ ASSERT_TRUE(base::WriteFile(file_path, contents.data(), contents.size())); |
+ |
+ std::string hash_so_far(std::begin(kHashOfTestData1), |
+ std::end(kHashOfTestData1)); |
+ EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, |
+ base_file_->Initialize(file_path, |
+ base::FilePath(), |
+ base::File(), |
+ kTestDataLength1, |
+ hash_so_far, |
+ scoped_ptr<crypto::SecureHash>())); |
+ set_expected_data(kTestData1); // Our starting position. |
+ ASSERT_TRUE(AppendDataToFile(kTestData2)); |
+ ASSERT_TRUE(AppendDataToFile(kTestData3)); |
+ ExpectHashValue(kHashOfTestData1To3, base_file_->Finish()); |
+} |
+ |
+// Open an existing file. The size is large than expected and the hash is |
+// unknown. |
+TEST_F(BaseFileTest, ExistingBaseFileUnknownHashTooLong) { |
+ base::FilePath file_path = temp_dir_.path().AppendASCII("existing"); |
+ std::string contents; |
+ contents.append(kTestData1); |
+ contents.append("Something extra"); |
+ ASSERT_TRUE(base::WriteFile(file_path, contents.data(), contents.size())); |
+ |
+ EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, |
+ base_file_->Initialize(file_path, |
+ base::FilePath(), |
+ base::File(), |
+ kTestDataLength1, |
+ std::string(), |
+ scoped_ptr<crypto::SecureHash>())); |
+ set_expected_data(kTestData1); |
+ ASSERT_TRUE(AppendDataToFile(kTestData2)); |
+ ASSERT_TRUE(AppendDataToFile(kTestData3)); |
+ ExpectHashValue(kHashOfTestData1To3, base_file_->Finish()); |
} |
// Test that a temporary file is created in the default download directory. |