| Index: content/browser/download/download_manager_impl_unittest.cc
|
| diff --git a/content/browser/download/download_manager_impl_unittest.cc b/content/browser/download/download_manager_impl_unittest.cc
|
| index 2f25f3d909b33850f907ee304f621f2bab2a23ed..7b8c0dc77f74fea2700a1e2224071c2f03522c39 100644
|
| --- a/content/browser/download/download_manager_impl_unittest.cc
|
| +++ b/content/browser/download/download_manager_impl_unittest.cc
|
| @@ -18,7 +18,7 @@
|
| #include "build/build_config.h"
|
| #include "content/browser/download/byte_stream.h"
|
| #include "content/browser/download/download_create_info.h"
|
| -#include "content/browser/download/download_file_manager.h"
|
| +#include "content/browser/download/download_file_factory.h"
|
| #include "content/browser/download/download_item_factory.h"
|
| #include "content/browser/download/download_item_impl.h"
|
| #include "content/browser/download/download_item_impl_delegate.h"
|
| @@ -32,6 +32,7 @@
|
| #include "content/public/test/mock_download_item.h"
|
| #include "content/public/test/test_browser_context.h"
|
| #include "content/public/test/test_browser_thread.h"
|
| +#include "net/base/net_log.h"
|
| #include "net/base/net_util.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gmock_mutant.h"
|
| @@ -89,9 +90,16 @@ class MockDownloadItemImpl : public DownloadItemImpl {
|
| MOCK_METHOD1(Cancel, void(bool));
|
| MOCK_METHOD0(MarkAsComplete, void());
|
| MOCK_METHOD1(DelayedDownloadOpened, void(bool));
|
| - MOCK_METHOD2(OnAllDataSaved, void(int64, const std::string&));
|
| + MOCK_METHOD1(OnAllDataSaved, void(const std::string&));
|
| MOCK_METHOD0(OnDownloadedFileRemoved, void());
|
| MOCK_METHOD0(MaybeCompleteDownload, void());
|
| + virtual void Start(
|
| + scoped_ptr<content::DownloadFile> download_file) OVERRIDE {
|
| + MockStart(download_file.get());
|
| + }
|
| +
|
| + MOCK_METHOD1(MockStart, void(content::DownloadFile*));
|
| +
|
| MOCK_METHOD1(Interrupt, void(DownloadInterruptReason));
|
| MOCK_METHOD1(Delete, void(DeleteReason));
|
| MOCK_METHOD0(Remove, void());
|
| @@ -161,7 +169,6 @@ class MockDownloadItemImpl : public DownloadItemImpl {
|
| MOCK_CONST_METHOD0(GetFileNameToReportUser, FilePath());
|
| MOCK_METHOD1(SetDisplayName, void(const FilePath&));
|
| MOCK_CONST_METHOD0(GetUserVerifiedFilePath, FilePath());
|
| - MOCK_METHOD0(OffThreadCancel, void());
|
| MOCK_CONST_METHOD1(DebugString, std::string(bool));
|
| MOCK_METHOD0(MockDownloadOpenForTesting, void());
|
| };
|
| @@ -200,52 +207,6 @@ MockDownloadManagerDelegate::MockDownloadManagerDelegate() {}
|
|
|
| MockDownloadManagerDelegate::~MockDownloadManagerDelegate() {}
|
|
|
| -class MockDownloadFileManager : public DownloadFileManager {
|
| - public:
|
| - MockDownloadFileManager();
|
| -
|
| - void CreateDownloadFile(
|
| - scoped_ptr<DownloadCreateInfo> info,
|
| - scoped_ptr<content::ByteStreamReader> stream,
|
| - scoped_refptr<content::DownloadManager> download_manager,
|
| - bool hash_needed,
|
| - const net::BoundNetLog& bound_net_log,
|
| - const CreateDownloadFileCallback& callback) OVERRIDE {
|
| - // Note that scoped_refptr<> on download manager is also stripped
|
| - // to make mock comparisons easier. Comparing the scoped_refptr<>
|
| - // works, but holds a reference to the DownloadManager until
|
| - // MockDownloadFileManager destruction, which messes up destruction
|
| - // testing.
|
| - MockCreateDownloadFile(info.get(), stream.get(), download_manager.get(),
|
| - hash_needed, bound_net_log, callback);
|
| - }
|
| -
|
| - MOCK_METHOD6(MockCreateDownloadFile, void(
|
| - DownloadCreateInfo* info,
|
| - content::ByteStreamReader* stream,
|
| - content::DownloadManager* download_manager,
|
| - bool hash_needed,
|
| - const net::BoundNetLog& bound_net_log,
|
| - const CreateDownloadFileCallback& callback));
|
| - MOCK_METHOD0(Shutdown, void());
|
| - MOCK_METHOD1(CancelDownload, void(content::DownloadId));
|
| - MOCK_METHOD2(CompleteDownload, void(content::DownloadId,
|
| - const base::Closure&));
|
| - MOCK_METHOD1(OnDownloadManagerShutdown, void(content::DownloadManager*));
|
| - MOCK_METHOD4(RenameDownloadFile, void(content::DownloadId,
|
| - const FilePath&,
|
| - bool,
|
| - const RenameCompletionCallback&));
|
| - MOCK_CONST_METHOD0(NumberOfActiveDownloads, int());
|
| - protected:
|
| - virtual ~MockDownloadFileManager();
|
| -};
|
| -
|
| -MockDownloadFileManager::MockDownloadFileManager()
|
| - : DownloadFileManager(NULL) {}
|
| -
|
| -MockDownloadFileManager::~MockDownloadFileManager() {}
|
| -
|
| class MockDownloadItemFactory
|
| : public content::DownloadItemFactory,
|
| public base::SupportsWeakPtr<MockDownloadItemFactory> {
|
| @@ -349,8 +310,14 @@ DownloadItemImpl* MockDownloadItemFactory::CreateActiveItem(
|
| new StrictMock<MockDownloadItemImpl>(&item_delegate_);
|
| EXPECT_CALL(*result, GetId())
|
| .WillRepeatedly(Return(local_id));
|
| + EXPECT_CALL(*result, GetGlobalId())
|
| + .WillRepeatedly(Return(content::DownloadId(delegate, local_id)));
|
| items_[local_id] = result;
|
|
|
| + // Active items are created and then immediately are called to start
|
| + // the download.
|
| + EXPECT_CALL(*result, MockStart(_));
|
| +
|
| return result;
|
| }
|
|
|
| @@ -373,6 +340,38 @@ DownloadItemImpl* MockDownloadItemFactory::CreateSavePageItem(
|
| return result;
|
| }
|
|
|
| +class MockDownloadFileFactory
|
| + : public content::DownloadFileFactory,
|
| + public base::SupportsWeakPtr<MockDownloadFileFactory> {
|
| + public:
|
| + MockDownloadFileFactory() {}
|
| + virtual ~MockDownloadFileFactory() {}
|
| +
|
| + // Overridden method from DownloadFileFactory
|
| + MOCK_METHOD9(MockCreateFile, content::DownloadFile*(
|
| + const content::DownloadSaveInfo&,
|
| + const FilePath&,
|
| + GURL, GURL, int64, bool,
|
| + content::ByteStreamReader*,
|
| + const net::BoundNetLog&,
|
| + base::WeakPtr<content::DownloadDestinationObserver>));
|
| +
|
| + virtual content::DownloadFile* CreateFile(
|
| + const content::DownloadSaveInfo& save_info,
|
| + const FilePath& default_download_directory,
|
| + GURL url,
|
| + GURL referrer_url,
|
| + int64 received_bytes,
|
| + bool calculate_hash,
|
| + scoped_ptr<content::ByteStreamReader> stream,
|
| + const net::BoundNetLog& bound_net_log,
|
| + base::WeakPtr<content::DownloadDestinationObserver> observer) {
|
| + return MockCreateFile(save_info, default_download_directory, url,
|
| + referrer_url, received_bytes, calculate_hash,
|
| + stream.get(), bound_net_log, observer);
|
| + }
|
| +};
|
| +
|
| class MockBrowserContext : public content::BrowserContext {
|
| public:
|
| MockBrowserContext() {}
|
| @@ -429,28 +428,29 @@ class DownloadManagerTest : public testing::Test {
|
| // We tear down everything in TearDown().
|
| ~DownloadManagerTest() {}
|
|
|
| - // Create a MockDownloadItemFactory, MockDownloadManagerDelegate,
|
| - // and MockDownloadFileManager, then create a DownloadManager that points
|
| + // Create a MockDownloadItemFactory and MockDownloadManagerDelegate,
|
| + // then create a DownloadManager that points
|
| // at all of those.
|
| virtual void SetUp() {
|
| DCHECK(!download_manager_.get());
|
|
|
| mock_download_item_factory_ = (new MockDownloadItemFactory())->AsWeakPtr();
|
| + mock_download_file_factory_ = (new MockDownloadFileFactory())->AsWeakPtr();
|
| mock_download_manager_delegate_.reset(
|
| new StrictMock<MockDownloadManagerDelegate>);
|
| EXPECT_CALL(*mock_download_manager_delegate_.get(), Shutdown())
|
| .WillOnce(Return());
|
| - mock_download_file_manager_ = new StrictMock<MockDownloadFileManager>;
|
| - EXPECT_CALL(*mock_download_file_manager_.get(),
|
| - OnDownloadManagerShutdown(_));
|
| mock_browser_context_.reset(new StrictMock<MockBrowserContext>);
|
| EXPECT_CALL(*mock_browser_context_.get(), IsOffTheRecord())
|
| .WillRepeatedly(Return(false));
|
|
|
| - download_manager_ = new DownloadManagerImpl(
|
| - mock_download_file_manager_.get(),
|
| + download_manager_ = new DownloadManagerImpl(NULL);
|
| + download_manager_->SetDownloadItemFactoryForTesting(
|
| scoped_ptr<content::DownloadItemFactory>(
|
| - mock_download_item_factory_.get()).Pass(), NULL);
|
| + mock_download_item_factory_.get()).Pass());
|
| + download_manager_->SetDownloadFileFactoryForTesting(
|
| + scoped_ptr<content::DownloadFileFactory>(
|
| + mock_download_file_factory_.get()).Pass());
|
| observer_.reset(new MockDownloadManagerObserver());
|
| EXPECT_CALL(GetMockObserver(), ModelChanged(download_manager_.get()))
|
| .WillOnce(Return());
|
| @@ -474,9 +474,9 @@ class DownloadManagerTest : public testing::Test {
|
| download_manager_ = NULL;
|
| message_loop_.RunAllPending();
|
| ASSERT_EQ(NULL, mock_download_item_factory_.get());
|
| + ASSERT_EQ(NULL, mock_download_file_factory_.get());
|
| message_loop_.RunAllPending();
|
| mock_download_manager_delegate_.reset();
|
| - mock_download_file_manager_ = NULL;
|
| mock_browser_context_.reset();
|
| }
|
|
|
| @@ -492,12 +492,14 @@ class DownloadManagerTest : public testing::Test {
|
| ++next_download_id_;
|
| info.download_id = content::DownloadId(kDownloadIdDomain, id);
|
| info.request_handle = DownloadRequestHandle();
|
| - download_manager_->CreateDownloadItem(&info);
|
| + download_manager_->CreateDownloadItem(&info, net::BoundNetLog());
|
|
|
| DCHECK(mock_download_item_factory_->GetItem(id));
|
| MockDownloadItemImpl& item(*mock_download_item_factory_->GetItem(id));
|
| - ON_CALL(item, GetId())
|
| - .WillByDefault(Return(id));
|
| + // Satisfy expectation. If the item is created in StartDownload(),
|
| + // we call Start on it immediately, so we need to set that expectation
|
| + // in the factory.
|
| + item.Start(scoped_ptr<content::DownloadFile>());
|
|
|
| return item;
|
| }
|
| @@ -518,10 +520,6 @@ class DownloadManagerTest : public testing::Test {
|
| return *mock_download_manager_delegate_;
|
| }
|
|
|
| - MockDownloadFileManager& GetMockDownloadFileManager() {
|
| - return *mock_download_file_manager_;
|
| - }
|
| -
|
| MockDownloadManagerObserver& GetMockObserver() {
|
| return *observer_;
|
| }
|
| @@ -531,6 +529,25 @@ class DownloadManagerTest : public testing::Test {
|
| download_manager_->DownloadStopped(item);
|
| }
|
|
|
| + void DownloadTargetDeterminedCallback(
|
| + const FilePath& target_path,
|
| + content::DownloadItem::TargetDisposition disposition,
|
| + content::DownloadDangerType danger_type,
|
| + const FilePath& intermediate_path) {
|
| + callback_called_ = true;
|
| + target_path_ = target_path;
|
| + target_disposition_ = disposition;
|
| + danger_type_ = danger_type;
|
| + intermediate_path_ = intermediate_path;
|
| + }
|
| +
|
| + void DetermineDownloadTarget(DownloadItemImpl* item) {
|
| + download_manager_->DetermineDownloadTarget(
|
| + item, base::Bind(
|
| + &DownloadManagerTest::DownloadTargetDeterminedCallback,
|
| + base::Unretained(this)));
|
| + }
|
| +
|
| void AddItemToHistory(MockDownloadItemImpl& item, int64 db_handle) {
|
| // For DCHECK in AddDownloadItemToHistory. Don't want to use
|
| // WillRepeatedly as it may have to return true after this.
|
| @@ -563,6 +580,14 @@ class DownloadManagerTest : public testing::Test {
|
| protected:
|
| // Key test variable; we'll keep it available to sub-classes.
|
| scoped_refptr<DownloadManagerImpl> download_manager_;
|
| + base::WeakPtr<MockDownloadFileFactory> mock_download_file_factory_;
|
| +
|
| + // Target detetermined callback.
|
| + bool callback_called_;
|
| + FilePath target_path_;
|
| + content::DownloadItem::TargetDisposition target_disposition_;
|
| + content::DownloadDangerType danger_type_;
|
| + FilePath intermediate_path_;
|
|
|
| private:
|
| MessageLoopForUI message_loop_;
|
| @@ -570,7 +595,6 @@ class DownloadManagerTest : public testing::Test {
|
| content::TestBrowserThread file_thread_;
|
| base::WeakPtr<MockDownloadItemFactory> mock_download_item_factory_;
|
| scoped_ptr<MockDownloadManagerDelegate> mock_download_manager_delegate_;
|
| - scoped_refptr<MockDownloadFileManager> mock_download_file_manager_;
|
| scoped_ptr<MockBrowserContext> mock_browser_context_;
|
| scoped_ptr<MockDownloadManagerObserver> observer_;
|
| int next_download_id_;
|
| @@ -591,44 +615,58 @@ TEST_F(DownloadManagerTest, StartDownload) {
|
| .WillOnce(Return());
|
| EXPECT_CALL(GetMockDownloadManagerDelegate(), GetNextId())
|
| .WillOnce(Return(content::DownloadId(this, local_id)));
|
| +
|
| + // Doing nothing will set the default download directory to null.
|
| + EXPECT_CALL(GetMockDownloadManagerDelegate(), GetSaveDir(_, _, _, _));
|
| EXPECT_CALL(GetMockDownloadManagerDelegate(), GenerateFileHash())
|
| .WillOnce(Return(true));
|
| - EXPECT_CALL(GetMockDownloadManagerDelegate(), GetSaveDir(_,_,_,_))
|
| - .WillOnce(SetArgPointee<2>(download_path));
|
| -
|
| - // The CreateDownloadFile call should specify a DownloadCreateInfo that
|
| - // includes the result of the GetSaveDir() call.
|
| - EXPECT_CALL(GetMockDownloadFileManager(), MockCreateDownloadFile(
|
| - DownloadCreateInfoWithDefaultPath(info.get(), download_path),
|
| - static_cast<content::ByteStreamReader*>(NULL),
|
| - download_manager_.get(), true, _, _));
|
| + EXPECT_CALL(*mock_download_file_factory_.get(),
|
| + MockCreateFile(Ref(info->save_info), _, _, _, 0, true,
|
| + stream.get(), _, _));
|
|
|
| download_manager_->StartDownload(info.Pass(), stream.Pass());
|
| EXPECT_TRUE(download_manager_->GetActiveDownloadItem(local_id));
|
| }
|
|
|
| -// Do the results of an OnDownloadInterrupted get passed through properly
|
| -// to the DownloadItem?
|
| -TEST_F(DownloadManagerTest, OnDownloadInterrupted) {
|
| - EXPECT_CALL(GetMockObserver(), OnDownloadCreated(download_manager_.get(), _))
|
| - .WillOnce(Return());
|
| +// Confirm that calling DetermineDownloadTarget behaves properly if the delegate
|
| +// blocks starting.
|
| +TEST_F(DownloadManagerTest, DetermineDownloadTarget_True) {
|
| // Put a mock we have a handle to on the download manager.
|
| MockDownloadItemImpl& item(AddItemToManager());
|
| - int download_id = item.GetId();
|
|
|
| - content::DownloadInterruptReason reason(
|
| - content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED);
|
| + EXPECT_CALL(GetMockDownloadManagerDelegate(),
|
| + DetermineDownloadTarget(&item, _))
|
| + .WillOnce(Return(true));
|
| + DetermineDownloadTarget(&item);
|
| +}
|
| +
|
| +// Confirm that calling DetermineDownloadTarget behaves properly if the delegate
|
| +// allows starting. This also tests OnDownloadTargetDetermined.
|
| +TEST_F(DownloadManagerTest, DetermineDownloadTarget_False) {
|
| + // Put a mock we have a handle to on the download manager.
|
| + MockDownloadItemImpl& item(AddItemToManager());
|
|
|
| - EXPECT_CALL(item, Interrupt(reason));
|
| - download_manager_->OnDownloadInterrupted(download_id, reason);
|
| - EXPECT_EQ(&item, download_manager_->GetActiveDownloadItem(download_id));
|
| + FilePath path(FILE_PATH_LITERAL("random_filepath.txt"));
|
| + EXPECT_CALL(GetMockDownloadManagerDelegate(),
|
| + DetermineDownloadTarget(&item, _))
|
| + .WillOnce(Return(false));
|
| + EXPECT_CALL(item, GetForcedFilePath())
|
| + .WillOnce(ReturnRef(path));
|
| +
|
| + // Confirm that the callback was called with the right values in this case.
|
| + callback_called_ = false;
|
| + DetermineDownloadTarget(&item);
|
| + EXPECT_TRUE(callback_called_);
|
| + EXPECT_EQ(path, target_path_);
|
| + EXPECT_EQ(content::DownloadItem::TARGET_DISPOSITION_OVERWRITE,
|
| + target_disposition_);
|
| + EXPECT_EQ(content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, danger_type_);
|
| + EXPECT_EQ(path, intermediate_path_);
|
| }
|
|
|
| // Does DownloadStopped remove Download from appropriate queues?
|
| // This test tests non-persisted downloads.
|
| TEST_F(DownloadManagerTest, OnDownloadStopped_NonPersisted) {
|
| - EXPECT_CALL(GetMockObserver(), OnDownloadCreated(download_manager_.get(), _))
|
| - .WillOnce(Return());
|
| // Put a mock we have a handle to on the download manager.
|
| MockDownloadItemImpl& item(AddItemToManager());
|
|
|
| @@ -639,7 +677,6 @@ TEST_F(DownloadManagerTest, OnDownloadStopped_NonPersisted) {
|
| EXPECT_CALL(item, GetDbHandle())
|
| .WillRepeatedly(Return(DownloadItem::kUninitializedHandle));
|
|
|
| - EXPECT_CALL(item, OffThreadCancel());
|
| DownloadStopped(&item);
|
| // TODO(rdsmith): Confirm that the download item is no longer on the
|
| // active list by calling download_manager_->GetActiveDownloadItem(id).
|
| @@ -650,8 +687,6 @@ TEST_F(DownloadManagerTest, OnDownloadStopped_NonPersisted) {
|
| // Does DownloadStopped remove Download from appropriate queues?
|
| // This test tests persisted downloads.
|
| TEST_F(DownloadManagerTest, OnDownloadStopped_Persisted) {
|
| - EXPECT_CALL(GetMockObserver(), OnDownloadCreated(download_manager_.get(), _))
|
| - .WillOnce(Return());
|
| // Put a mock we have a handle to on the download manager.
|
| MockDownloadItemImpl& item(AddItemToManager());
|
| int download_id = item.GetId();
|
| @@ -669,7 +704,6 @@ TEST_F(DownloadManagerTest, OnDownloadStopped_Persisted) {
|
| EXPECT_CALL(item, GetDbHandle())
|
| .WillRepeatedly(Return(db_handle));
|
|
|
| - EXPECT_CALL(item, OffThreadCancel());
|
| DownloadStopped(&item);
|
| EXPECT_EQ(NULL, download_manager_->GetActiveDownloadItem(download_id));
|
| }
|
|
|