Chromium Code Reviews| 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 8b45ce9ca0f672b5624f41210b204403e20e2367..da2b52d0f8c07b85b425b96370c3c03e2b2ec0ba 100644 |
| --- a/content/browser/download/base_file_unittest.cc |
| +++ b/content/browser/download/base_file_unittest.cc |
| @@ -476,6 +476,58 @@ TEST_F(BaseFileTest, RenameWithError) { |
| base_file_->Finish(); |
| } |
| +// Test that if a rename fails for an in-progress BaseFile, it remains writeable |
| +// and renameable. |
| +TEST_F(BaseFileTest, RenameWithErrorInProgress) { |
| + ASSERT_TRUE(InitializeFile()); |
| + |
| + base::FilePath test_dir(temp_dir_.path().AppendASCII("TestDir")); |
| + ASSERT_TRUE(base::CreateDirectory(test_dir)); |
| + |
| + base::FilePath new_path(test_dir.AppendASCII("TestFile")); |
| + EXPECT_FALSE(base::PathExists(new_path)); |
| + |
| + // Write some data to start with. |
| + ASSERT_TRUE(AppendDataToFile(kTestData1)); |
| + ASSERT_TRUE(base_file_->in_progress()); |
| + |
| + base::FilePath old_path = base_file_->full_path(); |
| + |
| + { |
| + file_util::PermissionRestorer restore_permissions_for(test_dir); |
| + ASSERT_TRUE(file_util::MakeFileUnwritable(test_dir)); |
| + EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED, |
| + base_file_->Rename(new_path)); |
| + |
| + // The file should still be open and we should be able to continue writing |
| + // to it. |
| + ASSERT_TRUE(base_file_->in_progress()); |
| + ASSERT_TRUE(AppendDataToFile(kTestData2)); |
| + ASSERT_EQ(old_path.value(), base_file_->full_path().value()); |
| + |
| + // Try to rename again, just for kicks. It should still fail with |
| + // ACCESS_DENIED. |
| + EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED, |
| + base_file_->Rename(new_path)); |
| + } |
| + |
| + // Now that TestDir is writeable again, we should be able to successfully |
| + // rename the file. |
| + EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, base_file_->Rename(new_path)); |
| + 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); |
| +} |
| + |
|
Randy Smith (Not in Mondays)
2014/06/12 22:10:30
Should you also test the case where the rename suc
asanka
2014/06/17 21:40:56
I was thinking something along the lines of using
|
| // Test that a failed write reports an error. |
| TEST_F(BaseFileTest, WriteWithError) { |
| base::FilePath path; |