summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorahendrickson@chromium.org <ahendrickson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-16 22:31:39 +0000
committerahendrickson@chromium.org <ahendrickson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-16 22:31:39 +0000
commitf6c2b53147fb1fecbad82da4993670542c4404e2 (patch)
tree860d7927148aabaae012ccc2b010937704d36b9e
parentd8c8749b93af8d5b8b2a761313673539234680ef (diff)
downloadchromium_src-f6c2b53147fb1fecbad82da4993670542c4404e2.zip
chromium_src-f6c2b53147fb1fecbad82da4993670542c4404e2.tar.gz
chromium_src-f6c2b53147fb1fecbad82da4993670542c4404e2.tar.bz2
Created an interface for DownloadFile, for use in unit tests.
Bug=None Test=None Review URL: http://codereview.chromium.org/8372034 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@110377 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/download/download_manager_unittest.cc162
-rw-r--r--content/browser/download/base_file.h2
-rw-r--r--content/browser/download/download_create_info.h1
-rw-r--r--content/browser/download/download_file.cc70
-rw-r--r--content/browser/download/download_file.h85
-rw-r--r--content/browser/download/download_file_impl.cc109
-rw-r--r--content/browser/download/download_file_impl.h66
-rw-r--r--content/browser/download/download_file_manager.cc25
-rw-r--r--content/browser/download/download_file_unittest.cc28
-rw-r--r--content/browser/download/download_resource_handler.h1
-rw-r--r--content/browser/download/drag_download_file.cc1
-rwxr-xr-xcontent/browser/download/mock_download_file.cc134
-rwxr-xr-xcontent/browser/download/mock_download_file.h116
-rw-r--r--content/browser/download/save_file.cc50
-rw-r--r--content/browser/download/save_file.h17
-rw-r--r--content/browser/download/save_file_manager.cc20
-rw-r--r--content/browser/renderer_host/buffered_resource_handler.cc1
-rw-r--r--content/content_browser.gypi2
-rw-r--r--content/content_tests.gypi2
19 files changed, 675 insertions, 217 deletions
diff --git a/chrome/browser/download/download_manager_unittest.cc b/chrome/browser/download/download_manager_unittest.cc
index a85fb3e..6a75106 100644
--- a/chrome/browser/download/download_manager_unittest.cc
+++ b/chrome/browser/download/download_manager_unittest.cc
@@ -24,7 +24,7 @@
#include "chrome/test/base/testing_profile.h"
#include "content/browser/download/download_buffer.h"
#include "content/browser/download/download_create_info.h"
-#include "content/browser/download/download_file.h"
+#include "content/browser/download/download_file_impl.h"
#include "content/browser/download/download_file_manager.h"
#include "content/browser/download/download_id_factory.h"
#include "content/browser/download/download_item.h"
@@ -32,11 +32,11 @@
#include "content/browser/download/download_request_handle.h"
#include "content/browser/download/download_status_updater.h"
#include "content/browser/download/interrupt_reasons.h"
+#include "content/browser/download/mock_download_file.h"
#include "content/browser/download/mock_download_manager.h"
#include "content/test/test_browser_thread.h"
#include "grit/generated_resources.h"
#include "net/base/io_buffer.h"
-#include "net/base/mock_file_stream.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gmock_mutant.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -163,43 +163,52 @@ const char* DownloadManagerTest::kTestData = "a;sdlfalsdfjalsdkfjad";
const size_t DownloadManagerTest::kTestDataLen =
strlen(DownloadManagerTest::kTestData);
-// A DownloadFile that we can inject errors into. Uses MockFileStream.
-// Note: This can't be in an anonymous namespace because it must be declared
-// as a friend of |DownloadFile| in order to access its private members.
-class DownloadFileWithMockStream : public DownloadFile {
+// A DownloadFile that we can inject errors into.
+class DownloadFileWithErrors : public DownloadFileImpl {
public:
- DownloadFileWithMockStream(DownloadCreateInfo* info,
- DownloadManager* manager,
- net::testing::MockFileStream* stream);
+ DownloadFileWithErrors(DownloadCreateInfo* info, DownloadManager* manager);
+ virtual ~DownloadFileWithErrors() {}
- virtual ~DownloadFileWithMockStream() {}
+ // BaseFile delegated functions.
+ virtual net::Error Initialize(bool calculate_hash);
+ virtual net::Error AppendDataToFile(const char* data, size_t data_len);
+ virtual net::Error Rename(const FilePath& full_path);
- void SetForcedError(int error);
+ void set_forced_error(net::Error error) { forced_error_ = error; }
+ void clear_forced_error() { forced_error_ = net::OK; }
+ net::Error forced_error() const { return forced_error_; }
- protected:
- // This version creates a |MockFileStream| instead of a |FileStream|.
- virtual void CreateFileStream() OVERRIDE;
+ private:
+ net::Error ReturnError(net::Error function_error) {
+ if (forced_error_ != net::OK) {
+ net::Error ret = forced_error_;
+ clear_forced_error();
+ return ret;
+ }
+
+ return function_error;
+ }
+
+ net::Error forced_error_;
};
-DownloadFileWithMockStream::DownloadFileWithMockStream(
- DownloadCreateInfo* info,
- DownloadManager* manager,
- net::testing::MockFileStream* stream)
- : DownloadFile(info, new DownloadRequestHandle(), manager) {
- DCHECK(file_stream_ == NULL);
- file_stream_.reset(stream);
+DownloadFileWithErrors::DownloadFileWithErrors(DownloadCreateInfo* info,
+ DownloadManager* manager)
+ : DownloadFileImpl(info, new DownloadRequestHandle(), manager),
+ forced_error_(net::OK) {
+}
+
+net::Error DownloadFileWithErrors::Initialize(bool calculate_hash) {
+ return ReturnError(DownloadFileImpl::Initialize(calculate_hash));
}
-void DownloadFileWithMockStream::SetForcedError(int error)
-{
- // |file_stream_| can only be set in the constructor and in
- // CreateFileStream(), both of which insure that it is a |MockFileStream|.
- net::testing::MockFileStream* mock_stream =
- static_cast<net::testing::MockFileStream *>(file_stream_.get());
- mock_stream->set_forced_error(error);
+net::Error DownloadFileWithErrors::AppendDataToFile(const char* data,
+ size_t data_len) {
+ return ReturnError(DownloadFileImpl::AppendDataToFile(data, data_len));
}
-void DownloadFileWithMockStream::CreateFileStream() {
- file_stream_.reset(new net::testing::MockFileStream);
+
+net::Error DownloadFileWithErrors::Rename(const FilePath& full_path) {
+ return ReturnError(DownloadFileImpl::Rename(full_path));
}
namespace {
@@ -280,28 +289,6 @@ const struct {
{ FILE_PATH_LITERAL("Unconfirmed xxx.crdownload"), true, true, false, 1, },
};
-class MockDownloadFile : public DownloadFile {
- public:
- MockDownloadFile(DownloadCreateInfo* info, DownloadManager* manager)
- : DownloadFile(info, new DownloadRequestHandle(), manager),
- renamed_count_(0) { }
- virtual ~MockDownloadFile() { Destructed(); }
- MOCK_METHOD1(Rename, net::Error(const FilePath&));
- MOCK_METHOD0(Destructed, void());
-
- net::Error TestMultipleRename(
- int expected_count, const FilePath& expected,
- const FilePath& path) {
- ++renamed_count_;
- EXPECT_EQ(expected_count, renamed_count_);
- EXPECT_EQ(expected.value(), path.value());
- return net::OK;
- }
-
- private:
- int renamed_count_;
-};
-
// This is an observer that records what download IDs have opened a select
// file dialog.
class SelectFileObserver : public DownloadManager::Observer {
@@ -399,8 +386,8 @@ TEST_F(DownloadManagerTest, StartDownload) {
download_manager_->CreateDownloadItem(info.get(), DownloadRequestHandle());
DownloadFile* download_file(
- new DownloadFile(info.get(), new DownloadRequestHandle(),
- download_manager_));
+ new DownloadFileImpl(info.get(), new DownloadRequestHandle(),
+ download_manager_));
AddDownloadToFileManager(info->download_id.local(), download_file);
download_file->Initialize(false);
download_manager_->StartDownload(info->download_id.local());
@@ -430,26 +417,22 @@ TEST_F(DownloadManagerTest, DownloadRenameTest) {
info->url_chain.push_back(GURL());
const FilePath new_path(kDownloadRenameCases[i].suggested_path);
+ MockDownloadFile::StatisticsRecorder recorder;
MockDownloadFile* download_file(
- new MockDownloadFile(info.get(), download_manager_));
+ new MockDownloadFile(info.get(),
+ DownloadRequestHandle(),
+ download_manager_,
+ &recorder));
AddDownloadToFileManager(info->download_id.local(), download_file);
// |download_file| is owned by DownloadFileManager.
- ::testing::Mock::AllowLeak(download_file);
- EXPECT_CALL(*download_file, Destructed()).Times(1);
-
if (kDownloadRenameCases[i].expected_rename_count == 1) {
- EXPECT_CALL(*download_file, Rename(new_path)).WillOnce(Return(net::OK));
+ download_file->SetExpectedPath(0, new_path);
} else {
ASSERT_EQ(2, kDownloadRenameCases[i].expected_rename_count);
FilePath crdownload(download_util::GetCrDownloadPath(new_path));
- EXPECT_CALL(*download_file, Rename(_))
- .WillOnce(testing::WithArgs<0>(Invoke(CreateFunctor(
- download_file, &MockDownloadFile::TestMultipleRename,
- 1, crdownload))))
- .WillOnce(testing::WithArgs<0>(Invoke(CreateFunctor(
- download_file, &MockDownloadFile::TestMultipleRename,
- 2, new_path))));
+ download_file->SetExpectedPath(0, crdownload);
+ download_file->SetExpectedPath(1, new_path);
}
download_manager_->CreateDownloadItem(info.get(), DownloadRequestHandle());
DownloadItem* download = GetActiveDownloadItem(i);
@@ -472,6 +455,9 @@ TEST_F(DownloadManagerTest, DownloadRenameTest) {
}
message_loop_.RunAllPending();
+ EXPECT_EQ(
+ kDownloadRenameCases[i].expected_rename_count,
+ recorder.Count(MockDownloadFile::StatisticsRecorder::STAT_RENAME));
EXPECT_TRUE(VerifySafetyState(kDownloadRenameCases[i].is_dangerous_file,
kDownloadRenameCases[i].is_dangerous_url,
i));
@@ -495,15 +481,16 @@ TEST_F(DownloadManagerTest, DownloadInterruptTest) {
const FilePath new_path(FILE_PATH_LITERAL("foo.zip"));
const FilePath cr_path(download_util::GetCrDownloadPath(new_path));
+ MockDownloadFile::StatisticsRecorder recorder;
MockDownloadFile* download_file(
- new MockDownloadFile(info.get(), download_manager_));
+ new MockDownloadFile(info.get(),
+ DownloadRequestHandle(),
+ download_manager_,
+ &recorder));
AddDownloadToFileManager(info->download_id.local(), download_file);
// |download_file| is owned by DownloadFileManager.
- ::testing::Mock::AllowLeak(download_file);
- EXPECT_CALL(*download_file, Destructed()).Times(1);
-
- EXPECT_CALL(*download_file, Rename(cr_path)).WillOnce(Return(net::OK));
+ download_file->SetExpectedPath(0, cr_path);
download_manager_->CreateDownloadItem(info.get(), DownloadRequestHandle());
@@ -519,6 +506,8 @@ TEST_F(DownloadManagerTest, DownloadInterruptTest) {
ContinueDownloadWithPath(download, new_path);
message_loop_.RunAllPending();
+ EXPECT_EQ(1,
+ recorder.Count(MockDownloadFile::StatisticsRecorder::STAT_RENAME));
EXPECT_TRUE(GetActiveDownloadItem(0) != NULL);
int64 error_size = 3;
@@ -569,8 +558,8 @@ TEST_F(DownloadManagerTest, DownloadFileErrorTest) {
ASSERT_TRUE(file_util::CreateTemporaryFile(&path));
// This file stream will be used, until the first rename occurs.
- net::testing::MockFileStream* mock_stream = new net::testing::MockFileStream;
- ASSERT_EQ(0, mock_stream->Open(
+ net::FileStream* stream = new net::FileStream;
+ ASSERT_EQ(0, stream->Open(
path,
base::PLATFORM_FILE_OPEN_ALWAYS | base::PLATFORM_FILE_WRITE));
@@ -584,10 +573,11 @@ TEST_F(DownloadManagerTest, DownloadFileErrorTest) {
info->url_chain.push_back(GURL());
info->total_bytes = static_cast<int64>(kTestDataLen * 3);
info->save_info.file_path = path;
+ info->save_info.file_stream.reset(stream);
// Create a download file that we can insert errors into.
- DownloadFileWithMockStream* download_file(new DownloadFileWithMockStream(
- info.get(), download_manager_, mock_stream));
+ DownloadFileWithErrors* download_file(new DownloadFileWithErrors(
+ info.get(), download_manager_));
AddDownloadToFileManager(local_id, download_file);
// |download_file| is owned by DownloadFileManager.
@@ -614,7 +604,7 @@ TEST_F(DownloadManagerTest, DownloadFileErrorTest) {
UpdateData(local_id, kTestData, kTestDataLen);
// Add more data, but an error occurs.
- download_file->SetForcedError(net::ERR_FAILED);
+ download_file->set_forced_error(net::ERR_FAILED);
UpdateData(local_id, kTestData, kTestDataLen);
// Check the state. The download should have been interrupted.
@@ -630,7 +620,7 @@ TEST_F(DownloadManagerTest, DownloadFileErrorTest) {
EXPECT_EQ(DownloadItem::INTERRUPTED, download->state());
// Check the download shelf's information.
- size_t error_size = kTestDataLen * 2;
+ size_t error_size = kTestDataLen * 3;
size_t total_size = kTestDataLen * 3;
ui::DataUnits amount_units = ui::GetByteDisplayUnits(kTestDataLen);
string16 simple_size =
@@ -664,14 +654,14 @@ TEST_F(DownloadManagerTest, DownloadCancelTest) {
const FilePath cr_path(download_util::GetCrDownloadPath(new_path));
MockDownloadFile* download_file(
- new MockDownloadFile(info.get(), download_manager_));
+ new MockDownloadFile(info.get(),
+ DownloadRequestHandle(),
+ download_manager_,
+ NULL));
AddDownloadToFileManager(info->download_id.local(), download_file);
// |download_file| is owned by DownloadFileManager.
- ::testing::Mock::AllowLeak(download_file);
- EXPECT_CALL(*download_file, Destructed()).Times(1);
-
- EXPECT_CALL(*download_file, Rename(cr_path)).WillOnce(Return(net::OK));
+ download_file->SetExpectedPath(0, cr_path);
download_manager_->CreateDownloadItem(info.get(), DownloadRequestHandle());
@@ -760,8 +750,8 @@ TEST_F(DownloadManagerTest, DownloadOverwriteTest) {
// name has been chosen, so we need to initialize the download file
// properly.
DownloadFile* download_file(
- new DownloadFile(info.get(), new DownloadRequestHandle(),
- download_manager_));
+ new DownloadFileImpl(info.get(), new DownloadRequestHandle(),
+ download_manager_));
download_file->Rename(cr_path);
// This creates the .crdownload version of the file.
download_file->Initialize(false);
@@ -837,8 +827,8 @@ TEST_F(DownloadManagerTest, DownloadRemoveTest) {
// name has been chosen, so we need to initialize the download file
// properly.
DownloadFile* download_file(
- new DownloadFile(info.get(), new DownloadRequestHandle(),
- download_manager_));
+ new DownloadFileImpl(info.get(), new DownloadRequestHandle(),
+ download_manager_));
download_file->Rename(cr_path);
// This creates the .crdownload version of the file.
download_file->Initialize(false);
diff --git a/content/browser/download/base_file.h b/content/browser/download/base_file.h
index 8fbcdd0..2a09943 100644
--- a/content/browser/download/base_file.h
+++ b/content/browser/download/base_file.h
@@ -15,6 +15,7 @@
#include "content/browser/power_save_blocker.h"
#include "content/common/content_export.h"
#include "googleurl/src/gurl.h"
+#include "net/base/file_stream.h"
#include "net/base/net_errors.h"
namespace crypto {
@@ -86,7 +87,6 @@ class CONTENT_EXPORT BaseFile {
private:
friend class BaseFileTest;
- friend class DownloadFileWithMockStream;
FRIEND_TEST_ALL_PREFIXES(BaseFileTest, IsEmptySha256Hash);
static const size_t kSha256HashLen = 32;
diff --git a/content/browser/download/download_create_info.h b/content/browser/download/download_create_info.h
index ed05294..652de4f 100644
--- a/content/browser/download/download_create_info.h
+++ b/content/browser/download/download_create_info.h
@@ -14,6 +14,7 @@
#include "base/time.h"
#include "content/browser/download/download_file.h"
#include "content/browser/download/download_id.h"
+#include "content/browser/download/download_types.h"
#include "content/common/content_export.h"
#include "content/public/common/page_transition_types.h"
#include "googleurl/src/gurl.h"
diff --git a/content/browser/download/download_file.cc b/content/browser/download/download_file.cc
index 3e29fd8..7d65a82 100644
--- a/content/browser/download/download_file.cc
+++ b/content/browser/download/download_file.cc
@@ -4,15 +4,8 @@
#include "content/browser/download/download_file.h"
-#include <string>
-
#include "base/file_util.h"
#include "base/stringprintf.h"
-#include "content/browser/download/download_create_info.h"
-#include "content/browser/download/download_manager.h"
-#include "content/public/browser/browser_thread.h"
-
-using content::BrowserThread;
namespace {
@@ -25,49 +18,23 @@ static const int kMaxUniqueFiles = 100;
}
-DownloadFile::DownloadFile(const DownloadCreateInfo* info,
- DownloadRequestHandleInterface* request_handle,
- DownloadManager* download_manager)
- : BaseFile(info->save_info.file_path,
- info->url(),
- info->referrer_url,
- info->received_bytes,
- info->save_info.file_stream),
- id_(info->download_id),
- request_handle_(request_handle),
- download_manager_(download_manager) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
-}
-
-DownloadFile::~DownloadFile() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
-}
-
-void DownloadFile::CancelDownloadRequest() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
- request_handle_->CancelRequest();
-}
-
-DownloadManager* DownloadFile::GetDownloadManager() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
- return download_manager_.get();
-}
-
-std::string DownloadFile::DebugString() const {
- return base::StringPrintf("{"
- " id_ = " "%d"
- " request_handle = %s"
- " Base File = %s"
- " }",
- id_.local(),
- request_handle_->DebugString().c_str(),
- BaseFile::DebugString().c_str());
-}
-
+// static
void DownloadFile::AppendNumberToPath(FilePath* path, int number) {
*path = path->InsertBeforeExtensionASCII(StringPrintf(" (%d)", number));
}
+// static
+FilePath DownloadFile::AppendSuffixToPath(
+ const FilePath& path,
+ const FilePath::StringType& suffix) {
+ FilePath::StringType file_name;
+ base::SStringPrintf(
+ &file_name, PRFilePathLiteral PRFilePathLiteral, path.value().c_str(),
+ suffix.c_str());
+ return FilePath(file_name);
+}
+
+// static
int DownloadFile::GetUniquePathNumber(const FilePath& path) {
if (!file_util::PathExists(path))
return 0;
@@ -84,16 +51,7 @@ int DownloadFile::GetUniquePathNumber(const FilePath& path) {
return -1;
}
-FilePath DownloadFile::AppendSuffixToPath(
- const FilePath& path,
- const FilePath::StringType& suffix) {
- FilePath::StringType file_name;
- base::SStringPrintf(
- &file_name, PRFilePathLiteral PRFilePathLiteral, path.value().c_str(),
- suffix.c_str());
- return FilePath(file_name);
-}
-
+// static
int DownloadFile::GetUniquePathNumberWithSuffix(
const FilePath& path,
const FilePath::StringType& suffix) {
diff --git a/content/browser/download/download_file.h b/content/browser/download/download_file.h
index 15047f3..dbba1dd 100644
--- a/content/browser/download/download_file.h
+++ b/content/browser/download/download_file.h
@@ -9,49 +9,76 @@
#include <string>
#include "base/basictypes.h"
-#include "base/memory/ref_counted.h"
#include "content/browser/download/base_file.h"
#include "content/browser/download/download_id.h"
-#include "content/browser/download/download_request_handle.h"
-#include "content/browser/download/download_types.h"
#include "content/common/content_export.h"
+#include "net/base/net_errors.h"
-struct DownloadCreateInfo;
class DownloadManager;
-// These objects live exclusively on the download thread and handle the writing
+// These objects live exclusively on the file thread and handle the writing
// operations for one download. These objects live only for the duration that
// the download is 'in progress': once the download has been completed or
// cancelled, the DownloadFile is destroyed.
-class CONTENT_EXPORT DownloadFile : public BaseFile {
+class CONTENT_EXPORT DownloadFile {
public:
- // Takes ownership of the object pointed to by |request_handle|.
- DownloadFile(const DownloadCreateInfo* info,
- DownloadRequestHandleInterface* request_handle,
- DownloadManager* download_manager);
- virtual ~DownloadFile();
+ virtual ~DownloadFile() {}
+
+ // If calculate_hash is true, sha256 hash will be calculated.
+ // Returns net::OK on success, or a network error code on failure.
+ virtual net::Error Initialize(bool calculate_hash) = 0;
+
+ // Write a new chunk of data to the file.
+ // Returns net::OK on success (all bytes written to the file),
+ // or a network error code on failure.
+ virtual net::Error AppendDataToFile(const char* data, size_t data_len) = 0;
+
+ // Rename the download file.
+ // Returns net::OK on success, or a network error code on failure.
+ virtual net::Error Rename(const FilePath& full_path) = 0;
+
+ // Detach the file so it is not deleted on destruction.
+ virtual void Detach() = 0;
+
+ // Abort the download and automatically close the file.
+ virtual void Cancel() = 0;
+
+ // Indicate that the download has finished. No new data will be received.
+ virtual void Finish() = 0;
+
+ // Informs the OS that this file came from the internet.
+ virtual void AnnotateWithSourceInformation() = 0;
+
+ virtual FilePath FullPath() const = 0;
+ virtual bool InProgress() const = 0;
+ virtual int64 BytesSoFar() const = 0;
+
+ // Set |hash| with sha256 digest for the file.
+ // Returns true if digest is successfully calculated.
+ virtual bool GetSha256Hash(std::string* hash) = 0;
// Cancels the download request associated with this file.
- void CancelDownloadRequest();
+ virtual void CancelDownloadRequest() = 0;
- int id() const { return id_.local(); }
- DownloadManager* GetDownloadManager();
- const DownloadId& global_id() const { return id_; }
+ virtual int Id() const = 0;
+ virtual DownloadManager* GetDownloadManager() = 0;
+ virtual const DownloadId& GlobalId() const = 0;
- virtual std::string DebugString() const;
+ virtual std::string DebugString() const = 0;
- // Appends the passed the number between parenthesis the path before the
- // extension.
+ // Appends the passed-in |number| between parenthesis to the |path| before
+ // the file extension.
static void AppendNumberToPath(FilePath* path, int number);
- // Attempts to find a number that can be appended to that path to make it
+ // Appends the passed-in |suffix| to the |path|.
+ static FilePath AppendSuffixToPath(const FilePath& path,
+ const FilePath::StringType& suffix);
+
+ // Attempts to find a number that can be appended to the |path| to make it
// unique. If |path| does not exist, 0 is returned. If it fails to find such
// a number, -1 is returned.
static int GetUniquePathNumber(const FilePath& path);
- static FilePath AppendSuffixToPath(const FilePath& path,
- const FilePath::StringType& suffix);
-
// Same as GetUniquePathNumber, except that it also checks the existence
// of it with the given suffix.
// If |path| does not exist, 0 is returned. If it fails to find such
@@ -59,20 +86,6 @@ class CONTENT_EXPORT DownloadFile : public BaseFile {
static int GetUniquePathNumberWithSuffix(
const FilePath& path,
const FilePath::StringType& suffix);
-
- private:
- // The unique identifier for this download, assigned at creation by
- // the DownloadFileManager for its internal record keeping.
- DownloadId id_;
-
- // The handle to the request information. Used for operations outside the
- // download system, specifically canceling a download.
- scoped_ptr<DownloadRequestHandleInterface> request_handle_;
-
- // DownloadManager this download belongs to.
- scoped_refptr<DownloadManager> download_manager_;
-
- DISALLOW_COPY_AND_ASSIGN(DownloadFile);
};
#endif // CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_FILE_H_
diff --git a/content/browser/download/download_file_impl.cc b/content/browser/download/download_file_impl.cc
new file mode 100644
index 0000000..f998432
--- /dev/null
+++ b/content/browser/download/download_file_impl.cc
@@ -0,0 +1,109 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/download/download_file_impl.h"
+
+#include <string>
+
+#include "base/stringprintf.h"
+#include "content/browser/download/download_create_info.h"
+#include "content/browser/download/download_manager.h"
+#include "content/public/browser/browser_thread.h"
+
+using content::BrowserThread;
+
+DownloadFileImpl::DownloadFileImpl(
+ const DownloadCreateInfo* info,
+ DownloadRequestHandleInterface* request_handle,
+ DownloadManager* download_manager)
+ : file_(info->save_info.file_path,
+ info->url(),
+ info->referrer_url,
+ info->received_bytes,
+ info->save_info.file_stream),
+ id_(info->download_id),
+ request_handle_(request_handle),
+ download_manager_(download_manager) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+}
+
+DownloadFileImpl::~DownloadFileImpl() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+}
+
+// BaseFile delegated functions.
+net::Error DownloadFileImpl::Initialize(bool calculate_hash) {
+ return file_.Initialize(calculate_hash);
+}
+
+net::Error DownloadFileImpl::AppendDataToFile(const char* data,
+ size_t data_len) {
+ return file_.AppendDataToFile(data, data_len);
+}
+
+net::Error DownloadFileImpl::Rename(const FilePath& full_path) {
+ return file_.Rename(full_path);
+}
+
+void DownloadFileImpl::Detach() {
+ file_.Detach();
+}
+
+void DownloadFileImpl::Cancel() {
+ file_.Cancel();
+}
+
+void DownloadFileImpl::Finish() {
+ file_.Finish();
+}
+
+void DownloadFileImpl::AnnotateWithSourceInformation() {
+ file_.AnnotateWithSourceInformation();
+}
+
+FilePath DownloadFileImpl::FullPath() const {
+ return file_.full_path();
+}
+
+bool DownloadFileImpl::InProgress() const {
+ return file_.in_progress();
+}
+
+int64 DownloadFileImpl::BytesSoFar() const {
+ return file_.bytes_so_far();
+}
+
+bool DownloadFileImpl::GetSha256Hash(std::string* hash) {
+ return file_.GetSha256Hash(hash);
+}
+
+// DownloadFileInterface implementation.
+void DownloadFileImpl::CancelDownloadRequest() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+ request_handle_->CancelRequest();
+}
+
+int DownloadFileImpl::Id() const {
+ return id_.local();
+}
+
+DownloadManager* DownloadFileImpl::GetDownloadManager() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+ return download_manager_.get();
+}
+
+const DownloadId& DownloadFileImpl::GlobalId() const {
+ return id_;
+}
+
+std::string DownloadFileImpl::DebugString() const {
+ return base::StringPrintf("{"
+ " id_ = " "%d"
+ " request_handle = %s"
+ " Base File = %s"
+ " }",
+ id_.local(),
+ request_handle_->DebugString().c_str(),
+ file_.DebugString().c_str());
+}
diff --git a/content/browser/download/download_file_impl.h b/content/browser/download/download_file_impl.h
new file mode 100644
index 0000000..31073c5
--- /dev/null
+++ b/content/browser/download/download_file_impl.h
@@ -0,0 +1,66 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_FILE_IMPL_H_
+#define CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_FILE_IMPL_H_
+#pragma once
+
+#include "content/browser/download/download_file.h"
+
+#include <string>
+
+#include "base/basictypes.h"
+#include "base/memory/ref_counted.h"
+#include "content/browser/download/download_request_handle.h"
+#include "content/common/content_export.h"
+
+struct DownloadCreateInfo;
+class DownloadManager;
+
+class CONTENT_EXPORT DownloadFileImpl : virtual public DownloadFile {
+ public:
+ // Takes ownership of the object pointed to by |request_handle|.
+ DownloadFileImpl(const DownloadCreateInfo* info,
+ DownloadRequestHandleInterface* request_handle,
+ DownloadManager* download_manager);
+ virtual ~DownloadFileImpl();
+
+ // DownloadFile functions.
+ virtual net::Error Initialize(bool calculate_hash) OVERRIDE;
+ virtual net::Error AppendDataToFile(const char* data,
+ size_t data_len) OVERRIDE;
+ virtual net::Error Rename(const FilePath& full_path) OVERRIDE;
+ virtual void Detach() OVERRIDE;
+ virtual void Cancel() OVERRIDE;
+ virtual void Finish() OVERRIDE;
+ virtual void AnnotateWithSourceInformation() OVERRIDE;
+ virtual FilePath FullPath() const OVERRIDE;
+ virtual bool InProgress() const OVERRIDE;
+ virtual int64 BytesSoFar() const OVERRIDE;
+ virtual bool GetSha256Hash(std::string* hash) OVERRIDE;
+ virtual void CancelDownloadRequest() OVERRIDE;
+ virtual int Id() const OVERRIDE;
+ virtual DownloadManager* GetDownloadManager() OVERRIDE;
+ virtual const DownloadId& GlobalId() const OVERRIDE;
+ virtual std::string DebugString() const OVERRIDE;
+
+ private:
+ // The base file instance.
+ BaseFile file_;
+
+ // The unique identifier for this download, assigned at creation by
+ // the DownloadFileManager for its internal record keeping.
+ DownloadId id_;
+
+ // The handle to the request information. Used for operations outside the
+ // download system, specifically canceling a download.
+ scoped_ptr<DownloadRequestHandleInterface> request_handle_;
+
+ // DownloadManager this download belongs to.
+ scoped_refptr<DownloadManager> download_manager_;
+
+ DISALLOW_COPY_AND_ASSIGN(DownloadFileImpl);
+};
+
+#endif // CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_FILE_IMPL_H_
diff --git a/content/browser/download/download_file_manager.cc b/content/browser/download/download_file_manager.cc
index 97a4280..55d4097 100644
--- a/content/browser/download/download_file_manager.cc
+++ b/content/browser/download/download_file_manager.cc
@@ -15,7 +15,7 @@
#include "content/browser/download/base_file.h"
#include "content/browser/download/download_buffer.h"
#include "content/browser/download/download_create_info.h"
-#include "content/browser/download/download_file.h"
+#include "content/browser/download/download_file_impl.h"
#include "content/browser/download/download_manager.h"
#include "content/browser/download/download_request_handle.h"
#include "content/browser/download/download_stats.h"
@@ -67,10 +67,10 @@ void DownloadFileManager::CreateDownloadFile(
// Life of |info| ends here. No more references to it after this method.
scoped_ptr<DownloadCreateInfo> infop(info);
- scoped_ptr<DownloadFile>
- download_file(new DownloadFile(info,
- new DownloadRequestHandle(request_handle),
- download_manager));
+ scoped_ptr<DownloadFile> download_file(
+ new DownloadFileImpl(info,
+ new DownloadRequestHandle(request_handle),
+ download_manager));
if (net::OK != download_file->Initialize(get_hash)) {
request_handle.CancelRequest();
return;
@@ -90,7 +90,8 @@ void DownloadFileManager::CreateDownloadFile(
info->download_id.local()));
}
-DownloadFile* DownloadFileManager::GetDownloadFile(DownloadId global_id) {
+DownloadFile* DownloadFileManager::GetDownloadFile(
+ DownloadId global_id) {
DownloadFileMap::iterator it = downloads_.find(global_id);
return it == downloads_.end() ? NULL : it->second;
}
@@ -119,7 +120,7 @@ void DownloadFileManager::UpdateInProgressDownloads() {
if (manager) {
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
base::Bind(&DownloadManager::UpdateDownload, manager,
- global_id.local(), download_file->bytes_so_far()));
+ global_id.local(), download_file->BytesSoFar()));
}
}
}
@@ -173,7 +174,7 @@ void DownloadFileManager::UpdateDownload(
DownloadManager* download_manager = download_file->GetDownloadManager();
had_error = true;
- int64 bytes_downloaded = download_file->bytes_so_far();
+ int64 bytes_downloaded = download_file->BytesSoFar();
// Calling this here in case we get more data, to avoid
// processing data after an error. That could lead to
// files that are corrupted if the later processing succeeded.
@@ -223,13 +224,13 @@ void DownloadFileManager::OnResponseCompleted(
BrowserThread::UI, FROM_HERE,
base::Bind(&DownloadManager::OnResponseCompleted,
download_manager, global_id.local(),
- download_file->bytes_so_far(), hash));
+ download_file->BytesSoFar(), hash));
} else {
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
base::Bind(&DownloadManager::OnDownloadInterrupted,
download_manager, global_id.local(),
- download_file->bytes_so_far(), reason));
+ download_file->BytesSoFar(), reason));
}
// We need to keep the download around until the UI thread has finalized
// the name.
@@ -287,7 +288,7 @@ void DownloadFileManager::OnDownloadManagerShutdown(DownloadManager* manager) {
for (std::set<DownloadFile*>::iterator i = to_remove.begin();
i != to_remove.end(); ++i) {
- downloads_.erase((*i)->global_id());
+ downloads_.erase((*i)->GlobalId());
delete *i;
}
}
@@ -407,7 +408,7 @@ void DownloadFileManager::CancelDownloadOnRename(
BrowserThread::UI, FROM_HERE,
base::Bind(&DownloadManager::OnDownloadInterrupted,
download_manager, global_id.local(),
- download_file->bytes_so_far(),
+ download_file->BytesSoFar(),
ConvertNetErrorToInterruptReason(
rename_error, DOWNLOAD_INTERRUPT_FROM_DISK)));
}
diff --git a/content/browser/download/download_file_unittest.cc b/content/browser/download/download_file_unittest.cc
index 0091125..2fcb51c 100644
--- a/content/browser/download/download_file_unittest.cc
+++ b/content/browser/download/download_file_unittest.cc
@@ -7,7 +7,7 @@
#include "base/string_number_conversions.h"
#include "content/browser/browser_thread_impl.h"
#include "content/browser/download/download_create_info.h"
-#include "content/browser/download/download_file.h"
+#include "content/browser/download/download_file_impl.h"
#include "content/browser/download/download_id.h"
#include "content/browser/download/download_id_factory.h"
#include "content/browser/download/download_manager.h"
@@ -72,20 +72,20 @@ class DownloadFileTest : public testing::Test {
// info.request_handle default constructed to null.
info.save_info.file_stream = file_stream_;
file->reset(
- new DownloadFile(&info, new DownloadRequestHandle(),
- download_manager_));
+ new DownloadFileImpl(&info, new DownloadRequestHandle(),
+ download_manager_));
}
virtual void DestroyDownloadFile(scoped_ptr<DownloadFile>* file, int offset) {
- EXPECT_EQ(kDummyDownloadId + offset, (*file)->id());
+ EXPECT_EQ(kDummyDownloadId + offset, (*file)->Id());
EXPECT_EQ(download_manager_, (*file)->GetDownloadManager());
- EXPECT_FALSE((*file)->in_progress());
+ EXPECT_FALSE((*file)->InProgress());
EXPECT_EQ(static_cast<int64>(expected_data_.size()),
- (*file)->bytes_so_far());
+ (*file)->BytesSoFar());
// Make sure the data has been properly written to disk.
std::string disk_data;
- EXPECT_TRUE(file_util::ReadFileToString((*file)->full_path(),
+ EXPECT_TRUE(file_util::ReadFileToString((*file)->FullPath(),
&disk_data));
EXPECT_EQ(expected_data_, disk_data);
@@ -96,11 +96,11 @@ class DownloadFileTest : public testing::Test {
void AppendDataToFile(scoped_ptr<DownloadFile>* file,
const std::string& data) {
- EXPECT_TRUE((*file)->in_progress());
+ EXPECT_TRUE((*file)->InProgress());
(*file)->AppendDataToFile(data.data(), data.size());
expected_data_ += data;
EXPECT_EQ(static_cast<int64>(expected_data_.size()),
- (*file)->bytes_so_far());
+ (*file)->BytesSoFar());
}
protected:
@@ -141,7 +141,7 @@ const int DownloadFileTest::kDummyRequestId = 67;
TEST_F(DownloadFileTest, RenameFileFinal) {
CreateDownloadFile(&download_file_, 0);
ASSERT_EQ(net::OK, download_file_->Initialize(true));
- FilePath initial_path(download_file_->full_path());
+ FilePath initial_path(download_file_->FullPath());
EXPECT_TRUE(file_util::PathExists(initial_path));
FilePath path_1(initial_path.InsertBeforeExtensionASCII("_1"));
FilePath path_2(initial_path.InsertBeforeExtensionASCII("_2"));
@@ -150,7 +150,7 @@ TEST_F(DownloadFileTest, RenameFileFinal) {
// Rename the file before downloading any data.
EXPECT_EQ(net::OK, download_file_->Rename(path_1));
- FilePath renamed_path = download_file_->full_path();
+ FilePath renamed_path = download_file_->FullPath();
EXPECT_EQ(path_1, renamed_path);
// Check the files.
@@ -163,7 +163,7 @@ TEST_F(DownloadFileTest, RenameFileFinal) {
// Rename the file after downloading some data.
EXPECT_EQ(net::OK, download_file_->Rename(path_2));
- renamed_path = download_file_->full_path();
+ renamed_path = download_file_->FullPath();
EXPECT_EQ(path_2, renamed_path);
// Check the files.
@@ -174,7 +174,7 @@ TEST_F(DownloadFileTest, RenameFileFinal) {
// Rename the file after downloading all the data.
EXPECT_EQ(net::OK, download_file_->Rename(path_3));
- renamed_path = download_file_->full_path();
+ renamed_path = download_file_->FullPath();
EXPECT_EQ(path_3, renamed_path);
// Check the files.
@@ -189,7 +189,7 @@ TEST_F(DownloadFileTest, RenameFileFinal) {
// Rename the file after downloading all the data and closing the file.
EXPECT_EQ(net::OK, download_file_->Rename(path_4));
- renamed_path = download_file_->full_path();
+ renamed_path = download_file_->FullPath();
EXPECT_EQ(path_4, renamed_path);
// Check the files.
diff --git a/content/browser/download/download_resource_handler.h b/content/browser/download/download_resource_handler.h
index 016756c..07cfd13 100644
--- a/content/browser/download/download_resource_handler.h
+++ b/content/browser/download/download_resource_handler.h
@@ -13,6 +13,7 @@
#include "base/timer.h"
#include "content/browser/download/download_file.h"
#include "content/browser/download/download_id.h"
+#include "content/browser/download/download_types.h"
#include "content/browser/renderer_host/global_request_id.h"
#include "content/browser/renderer_host/resource_handler.h"
diff --git a/content/browser/download/drag_download_file.cc b/content/browser/download/drag_download_file.cc
index b8bccb6..56898d5 100644
--- a/content/browser/download/drag_download_file.cc
+++ b/content/browser/download/drag_download_file.cc
@@ -10,6 +10,7 @@
#include "content/browser/browser_context.h"
#include "content/browser/download/download_item.h"
#include "content/browser/download/download_stats.h"
+#include "content/browser/download/download_types.h"
#include "content/browser/tab_contents/tab_contents.h"
#include "content/public/browser/browser_thread.h"
#include "net/base/file_stream.h"
diff --git a/content/browser/download/mock_download_file.cc b/content/browser/download/mock_download_file.cc
new file mode 100755
index 0000000..8165bc0
--- /dev/null
+++ b/content/browser/download/mock_download_file.cc
@@ -0,0 +1,134 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/download/mock_download_file.h"
+
+#include "content/browser/download/download_create_info.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+MockDownloadFile::StatisticsRecorder::StatisticsRecorder() {
+}
+
+MockDownloadFile::StatisticsRecorder::~StatisticsRecorder() {
+}
+
+void MockDownloadFile::StatisticsRecorder::Record(StatisticsIndex index) {
+ Add(index, 1);
+}
+
+void MockDownloadFile::StatisticsRecorder::Add(StatisticsIndex index,
+ int count) {
+ map_[index] = map_[index] + count;
+}
+
+int MockDownloadFile::StatisticsRecorder::Count(StatisticsIndex index) {
+ if (map_.find(index) == map_.end())
+ return 0;
+ return map_[index];
+}
+
+MockDownloadFile::MockDownloadFile(
+ const DownloadCreateInfo* info,
+ const DownloadRequestHandle& request_handle,
+ DownloadManager* download_manager,
+ StatisticsRecorder* recorder)
+ : id_(info->download_id),
+ request_handle_(request_handle),
+ download_manager_(download_manager),
+ recorder_(recorder),
+ rename_count_(0),
+ in_progress_(true) {
+}
+
+MockDownloadFile::~MockDownloadFile() {
+}
+
+net::Error MockDownloadFile::Initialize(bool calculate_hash) {
+ in_progress_ = true;
+ if (recorder_)
+ recorder_->Record(StatisticsRecorder::STAT_INITIALIZE);
+ return net::OK;
+}
+
+net::Error MockDownloadFile::AppendDataToFile(
+ const char* data, size_t data_len) {
+ data_.append(data, data_len);
+ if (recorder_) {
+ recorder_->Record(StatisticsRecorder::STAT_APPEND);
+ recorder_->Add(StatisticsRecorder::STAT_BYTES, data_len);
+ }
+ return net::OK;
+}
+
+net::Error MockDownloadFile::Rename(const FilePath& full_path) {
+ EXPECT_LT(rename_count_, expected_rename_path_list_.size());
+ EXPECT_STREQ(expected_rename_path_list_[rename_count_].value().c_str(),
+ full_path.value().c_str());
+ ++rename_count_;
+ if (recorder_)
+ recorder_->Record(StatisticsRecorder::STAT_RENAME);
+ return net::OK;
+}
+
+void MockDownloadFile::Detach() {
+ if (recorder_)
+ recorder_->Record(StatisticsRecorder::STAT_DETACH);
+}
+
+void MockDownloadFile::Cancel() {
+ in_progress_ = false;
+ if (recorder_)
+ recorder_->Record(StatisticsRecorder::STAT_CANCEL);
+}
+
+void MockDownloadFile::Finish() {
+ in_progress_ = false;
+ if (recorder_)
+ recorder_->Record(StatisticsRecorder::STAT_FINISH);
+}
+
+void MockDownloadFile::AnnotateWithSourceInformation() {
+}
+
+FilePath MockDownloadFile::FullPath() const {
+ return FilePath();
+}
+
+bool MockDownloadFile::InProgress() const {
+ return in_progress_;
+}
+
+int64 MockDownloadFile::BytesSoFar() const {
+ return data_.length();
+}
+
+bool MockDownloadFile::GetSha256Hash(std::string* hash) {
+ return false;
+}
+
+// DownloadFileInterface implementation.
+void MockDownloadFile::CancelDownloadRequest() {
+}
+
+int MockDownloadFile::Id() const {
+ return id_.local();
+}
+
+DownloadManager* MockDownloadFile::GetDownloadManager() {
+ return download_manager_;
+}
+
+const DownloadId& MockDownloadFile::GlobalId() const {
+ return id_;
+}
+
+std::string MockDownloadFile::DebugString() const {
+ return "";
+}
+
+void MockDownloadFile::SetExpectedPath(size_t index, const FilePath& path) {
+ if (expected_rename_path_list_.size() < index + 1)
+ expected_rename_path_list_.resize(index + 1);
+ expected_rename_path_list_[index] = path;
+}
diff --git a/content/browser/download/mock_download_file.h b/content/browser/download/mock_download_file.h
new file mode 100755
index 0000000..ed20203
--- /dev/null
+++ b/content/browser/download/mock_download_file.h
@@ -0,0 +1,116 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_DOWNLOAD_MOCK_DOWNLOAD_FILE_H_
+#define CONTENT_BROWSER_DOWNLOAD_MOCK_DOWNLOAD_FILE_H_
+#pragma once
+
+#include <string>
+#include <map>
+
+#include "base/file_path.h"
+#include "base/memory/ref_counted.h"
+#include "content/browser/download/download_file.h"
+#include "content/browser/download/download_id.h"
+#include "content/browser/download/download_manager.h"
+#include "content/browser/download/download_request_handle.h"
+#include "net/base/net_errors.h"
+
+struct DownloadCreateInfo;
+
+class MockDownloadFile : virtual public DownloadFile {
+ public:
+ // Class to extract statistics from the usage of |MockDownloadFile|.
+ class StatisticsRecorder {
+ public:
+ enum StatisticsIndex {
+ STAT_INITIALIZE,
+ STAT_APPEND,
+ STAT_RENAME,
+ STAT_DETACH,
+ STAT_CANCEL,
+ STAT_FINISH,
+ STAT_BYTES
+ };
+
+ StatisticsRecorder();
+ ~StatisticsRecorder();
+
+ // Records the statistic.
+ // |index| indicates what statistic to use.
+ void Record(StatisticsIndex index);
+
+ // Adds to the statistic.
+ // |index| indicates what statistic to use.
+ void Add(StatisticsIndex index, int count);
+
+ // Returns the statistic value.
+ // |index| indicates what statistic to use.
+ int Count(StatisticsIndex index);
+
+ private:
+ typedef std::map<StatisticsIndex, int> StatisticsMap;
+
+ StatisticsMap map_;
+ };
+
+ MockDownloadFile(const DownloadCreateInfo* info,
+ const DownloadRequestHandle& request_handle,
+ DownloadManager* download_manager,
+ StatisticsRecorder* recorder);
+ virtual ~MockDownloadFile();
+
+ // DownloadFile functions.
+ virtual net::Error Initialize(bool calculate_hash) OVERRIDE;
+ virtual net::Error AppendDataToFile(const char* data,
+ size_t data_len) OVERRIDE;
+ virtual net::Error Rename(const FilePath& full_path) OVERRIDE;
+ virtual void Detach() OVERRIDE;
+ virtual void Cancel() OVERRIDE;
+ virtual void Finish() OVERRIDE;
+ virtual void AnnotateWithSourceInformation() OVERRIDE;
+ virtual FilePath FullPath() const OVERRIDE;
+ virtual bool InProgress() const OVERRIDE;
+ virtual int64 BytesSoFar() const OVERRIDE;
+ virtual bool GetSha256Hash(std::string* hash) OVERRIDE;
+ virtual void CancelDownloadRequest() OVERRIDE;
+ virtual int Id() const OVERRIDE;
+ virtual DownloadManager* GetDownloadManager() OVERRIDE;
+ virtual const DownloadId& GlobalId() const OVERRIDE;
+ virtual std::string DebugString() const OVERRIDE;
+
+ // Functions relating to setting and checking expectations.
+ size_t rename_count() const { return rename_count_; }
+ void SetExpectedPath(size_t index, const FilePath& path);
+
+ private:
+ // The unique identifier for this download, assigned at creation by
+ // the DownloadFileManager for its internal record keeping.
+ DownloadId id_;
+
+ // The handle to the request information. Used for operations outside the
+ // download system, specifically canceling a download.
+ DownloadRequestHandle request_handle_;
+
+ // DownloadManager this download belongs to.
+ scoped_refptr<DownloadManager> download_manager_;
+
+ // Records usage statistics. Not owned by this class (survives destruction).
+ StatisticsRecorder* recorder_;
+
+ // The number of times |Rename()| has been called.
+ // Used instead of checking |recorder_| because the latter can be NULL.
+ size_t rename_count_;
+
+ // A vector of paths that we expect to call |Rename()| with.
+ std::vector<FilePath> expected_rename_path_list_;
+
+ // A buffer to hold the data we write.
+ std::string data_;
+
+ // Dummy in-progress flag.
+ bool in_progress_;
+};
+
+#endif // CONTENT_BROWSER_DOWNLOAD_MOCK_DOWNLOAD_FILE_H_
diff --git a/content/browser/download/save_file.cc b/content/browser/download/save_file.cc
index 980f46e..599ad76 100644
--- a/content/browser/download/save_file.cc
+++ b/content/browser/download/save_file.cc
@@ -11,7 +11,7 @@
using content::BrowserThread;
SaveFile::SaveFile(const SaveFileCreateInfo* info)
- : BaseFile(FilePath(), info->url, GURL(), 0, linked_ptr<net::FileStream>()),
+ : file_(FilePath(), info->url, GURL(), 0, linked_ptr<net::FileStream>()),
info_(info) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
@@ -22,3 +22,51 @@ SaveFile::SaveFile(const SaveFileCreateInfo* info)
SaveFile::~SaveFile() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
}
+
+net::Error SaveFile::Initialize(bool calculate_hash) {
+ return file_.Initialize(calculate_hash);
+}
+
+net::Error SaveFile::AppendDataToFile(const char* data, size_t data_len) {
+ return file_.AppendDataToFile(data, data_len);
+}
+
+net::Error SaveFile::Rename(const FilePath& full_path) {
+ return file_.Rename(full_path);
+}
+
+void SaveFile::Detach() {
+ file_.Detach();
+}
+
+void SaveFile::Cancel() {
+ file_.Cancel();
+}
+
+void SaveFile::Finish() {
+ file_.Finish();
+}
+
+void SaveFile::AnnotateWithSourceInformation() {
+ file_.AnnotateWithSourceInformation();
+}
+
+FilePath SaveFile::FullPath() const {
+ return file_.full_path();
+}
+
+bool SaveFile::InProgress() const {
+ return file_.in_progress();
+}
+
+int64 SaveFile::BytesSoFar() const {
+ return file_.bytes_so_far();
+}
+
+bool SaveFile::GetSha256Hash(std::string* hash) {
+ return file_.GetSha256Hash(hash);
+}
+
+std::string SaveFile::DebugString() const {
+ return file_.DebugString();
+}
diff --git a/content/browser/download/save_file.h b/content/browser/download/save_file.h
index e7faaeb..baa863d 100644
--- a/content/browser/download/save_file.h
+++ b/content/browser/download/save_file.h
@@ -19,11 +19,25 @@
// the saving job is 'in progress': once the saving job has been completed or
// canceled, the SaveFile is destroyed. One SaveFile object represents one item
// in a save session.
-class SaveFile : public BaseFile {
+class SaveFile {
public:
explicit SaveFile(const SaveFileCreateInfo* info);
virtual ~SaveFile();
+ // BaseFile delegated functions.
+ net::Error Initialize(bool calculate_hash);
+ net::Error AppendDataToFile(const char* data, size_t data_len);
+ net::Error Rename(const FilePath& full_path);
+ void Detach();
+ void Cancel();
+ void Finish();
+ void AnnotateWithSourceInformation();
+ FilePath FullPath() const;
+ bool InProgress() const;
+ int64 BytesSoFar() const;
+ bool GetSha256Hash(std::string* hash);
+ std::string DebugString() const;
+
// Accessors.
int save_id() const { return info_->save_id; }
int render_process_id() const { return info_->render_process_id; }
@@ -34,6 +48,7 @@ class SaveFile : public BaseFile {
}
private:
+ BaseFile file_;
scoped_ptr<const SaveFileCreateInfo> info_;
DISALLOW_COPY_AND_ASSIGN(SaveFile);
diff --git a/content/browser/download/save_file_manager.cc b/content/browser/download/save_file_manager.cc
index 5325336..99a9f49 100644
--- a/content/browser/download/save_file_manager.cc
+++ b/content/browser/download/save_file_manager.cc
@@ -220,7 +220,7 @@ void SaveFileManager::StartSave(SaveFileCreateInfo* info) {
DCHECK(!LookupSaveFile(info->save_id));
save_file_map_[info->save_id] = save_file;
- info->path = save_file->full_path();
+ info->path = save_file->FullPath();
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
@@ -244,7 +244,7 @@ void SaveFileManager::UpdateSaveProgress(int save_id,
base::Bind(&SaveFileManager::OnUpdateSaveProgress,
this,
save_file->save_id(),
- save_file->bytes_so_far(),
+ save_file->BytesSoFar(),
write_success == net::OK));
}
}
@@ -272,7 +272,7 @@ void SaveFileManager::SaveFinished(int save_id,
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
base::Bind(&SaveFileManager::OnSaveFinished, this, save_id,
- save_file->bytes_so_far(), is_success));
+ save_file->BytesSoFar(), is_success));
save_file->Finish();
save_file->Detach();
@@ -413,7 +413,7 @@ void SaveFileManager::CancelSave(int save_id) {
// data from other sources or have finished.
DCHECK(save_file->save_source() !=
SaveFileCreateInfo::SAVE_FILE_FROM_NET ||
- !save_file->in_progress());
+ !save_file->InProgress());
}
// Whatever the save file is renamed or not, just delete it.
save_file_map_.erase(it);
@@ -432,7 +432,7 @@ void SaveFileManager::SaveLocalFile(const GURL& original_file_url,
if (!save_file)
return;
// If it has finished, just return.
- if (!save_file->in_progress())
+ if (!save_file->InProgress())
return;
// Close the save file before the copy operation.
@@ -449,9 +449,9 @@ void SaveFileManager::SaveLocalFile(const GURL& original_file_url,
// Copy the local file to the temporary file. It will be renamed to its
// final name later.
- bool success = file_util::CopyFile(file_path, save_file->full_path());
+ bool success = file_util::CopyFile(file_path, save_file->FullPath());
if (!success)
- file_util::Delete(save_file->full_path(), false);
+ file_util::Delete(save_file->FullPath(), false);
SaveFinished(save_id, original_file_url, render_process_id, success);
}
@@ -479,7 +479,7 @@ void SaveFileManager::RenameAllFiles(
SaveFileMap::iterator it = save_file_map_.find(i->first);
if (it != save_file_map_.end()) {
SaveFile* save_file = it->second;
- DCHECK(!save_file->in_progress());
+ DCHECK(!save_file->InProgress());
save_file->Rename(i->second);
delete save_file;
save_file_map_.erase(it);
@@ -513,8 +513,8 @@ void SaveFileManager::RemoveSavedFileFromFileMap(
SaveFileMap::iterator it = save_file_map_.find(*i);
if (it != save_file_map_.end()) {
SaveFile* save_file = it->second;
- DCHECK(!save_file->in_progress());
- file_util::Delete(save_file->full_path(), false);
+ DCHECK(!save_file->InProgress());
+ file_util::Delete(save_file->FullPath(), false);
delete save_file;
save_file_map_.erase(it);
}
diff --git a/content/browser/renderer_host/buffered_resource_handler.cc b/content/browser/renderer_host/buffered_resource_handler.cc
index f639a03..826b156 100644
--- a/content/browser/renderer_host/buffered_resource_handler.cc
+++ b/content/browser/renderer_host/buffered_resource_handler.cc
@@ -12,6 +12,7 @@
#include "base/string_util.h"
#include "content/browser/download/download_id_factory.h"
#include "content/browser/download/download_resource_handler.h"
+#include "content/browser/download/download_types.h"
#include "content/browser/plugin_service.h"
#include "content/browser/renderer_host/resource_dispatcher_host.h"
#include "content/browser/renderer_host/resource_dispatcher_host_request_info.h"
diff --git a/content/content_browser.gypi b/content/content_browser.gypi
index 2bb248e..c6b6d0f 100644
--- a/content/content_browser.gypi
+++ b/content/content_browser.gypi
@@ -114,6 +114,8 @@
'browser/download/download_create_info.h',
'browser/download/download_file.cc',
'browser/download/download_file.h',
+ 'browser/download/download_file_impl.cc',
+ 'browser/download/download_file_impl.h',
'browser/download/download_file_manager.cc',
'browser/download/download_file_manager.h',
'browser/download/download_id.cc',
diff --git a/content/content_tests.gypi b/content/content_tests.gypi
index a7a2df1..d2a93bd4 100644
--- a/content/content_tests.gypi
+++ b/content/content_tests.gypi
@@ -30,6 +30,8 @@
],
'sources': [
# TODO(phajdan.jr): All of those files should live in content/test.
+ 'browser/download/mock_download_file.cc',
+ 'browser/download/mock_download_file.h',
'browser/download/mock_download_manager.h',
'browser/download/mock_download_manager_delegate.cc',
'browser/download/mock_download_manager_delegate.h',