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

Unified Diff: content/browser/download/download_file_unittest.cc

Issue 10689093: Move Rename functionality from DownloadFileManager to DownloadFileImple. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sync'd to TOT to avoid showing already committed changes in Rietveld. Created 8 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/download/download_file_unittest.cc
diff --git a/content/browser/download/download_file_unittest.cc b/content/browser/download/download_file_unittest.cc
index 01009a89b9fe97d932f6dbf42b57f6cf9d1427ee..3d9fb24124b129bc6641e2887dee94e6fec540c1 100644
--- a/content/browser/download/download_file_unittest.cc
+++ b/content/browser/download/download_file_unittest.cc
@@ -15,6 +15,7 @@
#include "content/public/browser/download_manager.h"
#include "content/public/test/mock_download_manager.h"
#include "net/base/file_stream.h"
+#include "net/base/mock_file_stream.h"
#include "net/base/net_errors.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -45,6 +46,19 @@ class MockByteStreamReader : public content::ByteStreamReader {
MOCK_METHOD1(RegisterCallback, void(const base::Closure&));
};
+void SetRenameResult(bool* called_p,
+ content::DownloadInterruptReason* reason_p,
+ FilePath* result_path_p,
+ content::DownloadInterruptReason reason,
+ const FilePath& result_path) {
+ if (called_p)
+ *called_p = true;
+ if (reason_p)
+ *reason_p = reason;
+ if (result_path_p)
+ *result_path_p = result_path;
+}
+
} // namespace
DownloadId::Domain kValidIdDomain = "valid DownloadId::Domain";
@@ -117,8 +131,8 @@ class DownloadFileTest : public testing::Test {
.RetiresOnSaturation();
DownloadCreateInfo info;
- info.download_id = DownloadId(kValidIdDomain, kDummyDownloadId + offset);
// info.request_handle default constructed to null.
+ info.download_id = DownloadId(kValidIdDomain, kDummyDownloadId + offset);
info.save_info.file_stream = file_stream_;
download_file_.reset(
new DownloadFileImpl(
@@ -228,6 +242,26 @@ class DownloadFileTest : public testing::Test {
}
}
+ content::DownloadInterruptReason Rename(
+ const FilePath& full_path, bool overwrite_existing_file,
+ FilePath* result_path_p) {
+ content::DownloadInterruptReason result_reason(
+ content::DOWNLOAD_INTERRUPT_REASON_NONE);
+ bool callback_was_called(false);
+ FilePath result_path;
+
+ download_file_->Rename(full_path, overwrite_existing_file,
+ base::Bind(&SetRenameResult,
+ &callback_was_called,
+ &result_reason, result_path_p));
+ loop_.RunAllPending();
+
+ // If the callback wasn't called we've got a memory stomper waiting
+ // to happen; best to crash.
+ CHECK(callback_was_called);
asanka 2012/07/05 18:47:21 The last time came up, I ended up creating a local
Randy Smith (Not in Mondays) 2012/07/09 20:35:51 Nice. Done.
+ return result_reason;
+ }
+
protected:
scoped_refptr<StrictMock<content::MockDownloadManager> > download_manager_;
@@ -281,12 +315,15 @@ TEST_F(DownloadFileTest, RenameFileFinal) {
FilePath path_2(initial_path.InsertBeforeExtensionASCII("_2"));
FilePath path_3(initial_path.InsertBeforeExtensionASCII("_3"));
FilePath path_4(initial_path.InsertBeforeExtensionASCII("_4"));
+ FilePath path_5(initial_path.InsertBeforeExtensionASCII("_5"));
+ FilePath output_path;
// Rename the file before downloading any data.
EXPECT_EQ(content::DOWNLOAD_INTERRUPT_REASON_NONE,
- download_file_->Rename(path_1));
+ Rename(path_1, false, &output_path));
FilePath renamed_path = download_file_->FullPath();
EXPECT_EQ(path_1, renamed_path);
+ EXPECT_EQ(path_1, output_path);
// Check the files.
EXPECT_FALSE(file_util::PathExists(initial_path));
@@ -298,9 +335,10 @@ TEST_F(DownloadFileTest, RenameFileFinal) {
// Rename the file after downloading some data.
EXPECT_EQ(content::DOWNLOAD_INTERRUPT_REASON_NONE,
- download_file_->Rename(path_2));
+ Rename(path_2, false, &output_path));
renamed_path = download_file_->FullPath();
EXPECT_EQ(path_2, renamed_path);
+ EXPECT_EQ(path_2, output_path);
// Check the files.
EXPECT_FALSE(file_util::PathExists(path_1));
@@ -311,9 +349,10 @@ TEST_F(DownloadFileTest, RenameFileFinal) {
// Rename the file after downloading all the data.
EXPECT_EQ(content::DOWNLOAD_INTERRUPT_REASON_NONE,
- download_file_->Rename(path_3));
+ Rename(path_3, false, &output_path));
renamed_path = download_file_->FullPath();
EXPECT_EQ(path_3, renamed_path);
+ EXPECT_EQ(path_3, output_path);
// Check the files.
EXPECT_FALSE(file_util::PathExists(path_2));
@@ -327,9 +366,10 @@ TEST_F(DownloadFileTest, RenameFileFinal) {
// Rename the file after downloading all the data and closing the file.
EXPECT_EQ(content::DOWNLOAD_INTERRUPT_REASON_NONE,
- download_file_->Rename(path_4));
+ Rename(path_4, false, &output_path));
renamed_path = download_file_->FullPath();
EXPECT_EQ(path_4, renamed_path);
+ EXPECT_EQ(path_4, output_path);
// Check the files.
EXPECT_FALSE(file_util::PathExists(path_3));
@@ -339,9 +379,54 @@ TEST_F(DownloadFileTest, RenameFileFinal) {
EXPECT_TRUE(download_file_->GetHash(&hash));
EXPECT_EQ(kDataHash, base::HexEncode(hash.data(), hash.size()));
+ // Check that a rename with overwrite to an existing file succeeds.
+ std::string file_contents;
+ ASSERT_FALSE(file_util::PathExists(path_5));
+ static const char file_data[] = "xyzzy";
+ ASSERT_EQ(static_cast<int>(sizeof(file_data) - 1),
+ file_util::WriteFile(path_5, file_data, sizeof(file_data) - 1));
+ ASSERT_TRUE(file_util::PathExists(path_5));
+ EXPECT_TRUE(file_util::ReadFileToString(path_5, &file_contents));
+ EXPECT_EQ(std::string(file_data), file_contents);
+
+ EXPECT_EQ(content::DOWNLOAD_INTERRUPT_REASON_NONE,
+ Rename(path_5, true, &output_path));
+ EXPECT_EQ(path_5, output_path);
+
+ file_contents = "";
+ EXPECT_TRUE(file_util::ReadFileToString(path_5, &file_contents));
+ EXPECT_NE(std::string(file_data), file_contents);
+
DestroyDownloadFile(0);
}
asanka 2012/07/05 18:47:21 Also throw in a RenameError test now that error re
Randy Smith (Not in Mondays) 2012/07/09 20:35:51 Good thought! I didn't know about MakeFileUnwrita
+// Test to make sure the rename uniquifies if we aren't overwriting
+// and there's a file where we're aiming.
+TEST_F(DownloadFileTest, RenameOverwrite) {
+ ASSERT_TRUE(CreateDownloadFile(0, true));
+ FilePath initial_path(download_file_->FullPath());
+ EXPECT_TRUE(file_util::PathExists(initial_path));
+ FilePath path_1(initial_path.InsertBeforeExtensionASCII("_1"));
+ FilePath path_1_suffixed(path_1.InsertBeforeExtensionASCII(" (1)"));
+
+ ASSERT_FALSE(file_util::PathExists(path_1));
+ static const char file_data[] = "xyzzy";
+ ASSERT_EQ(static_cast<int>(sizeof(file_data)),
+ file_util::WriteFile(path_1, file_data, sizeof(file_data)));
+ ASSERT_TRUE(file_util::PathExists(path_1));
+
+ EXPECT_EQ(content::DOWNLOAD_INTERRUPT_REASON_NONE,
+ Rename(path_1, false, NULL));
+ EXPECT_TRUE(file_util::PathExists(path_1_suffixed));
+
+ FinishStream(content::DOWNLOAD_INTERRUPT_REASON_NONE, true);
+ loop_.RunAllPending();
+ DestroyDownloadFile(0);
+}
+
+// TODO(rdsmith): Test proper behavior of DownloadFile in the case of
+// errors on the rename (including writing to the file after rename error).
+
// Various tests of the StreamActive method.
TEST_F(DownloadFileTest, StreamEmptySuccess) {
ASSERT_TRUE(CreateDownloadFile(0, true));
@@ -380,7 +465,6 @@ TEST_F(DownloadFileTest, StreamEmptyError) {
EXPECT_CALL(*(download_manager_.get()),
asanka 2012/07/05 18:47:21 Expect a sequence restricted UpdateDownload() call
Randy Smith (Not in Mondays) 2012/07/09 20:35:51 So the tricky thing here is that we're going to ha
OnDownloadInterrupted(
DownloadId(kValidIdDomain, kDummyDownloadId + 0).local(),
- 0, _,
content::DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED));
FinishStream(content::DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED, false);
@@ -419,9 +503,11 @@ TEST_F(DownloadFileTest, StreamNonEmptyError) {
EXPECT_CALL(*(download_manager_.get()),
OnDownloadInterrupted(
DownloadId(kValidIdDomain, kDummyDownloadId + 0).local(),
- strlen(kTestData1) + strlen(kTestData2), _,
content::DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED));
sink_callback_.Run();
+ loop_.RunAllPending();
+ EXPECT_EQ(static_cast<int64>(strlen(kTestData1) + strlen(kTestData2)),
+ bytes_);
VerifyStreamAndSize();
DestroyDownloadFile(0);
}

Powered by Google App Engine
This is Rietveld 408576698