| Index: chrome/browser/download/download_manager_unittest.cc
|
| diff --git a/chrome/browser/download/download_manager_unittest.cc b/chrome/browser/download/download_manager_unittest.cc
|
| index a85fb3efebcc5a9b6295b7ca1953985fb39b3d10..6a75106ea52a15a80039b2c76379c706abdb211a 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);
|
|
|