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

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

Issue 10912173: Replace the DownloadFileManager with direct ownership of DownloadFileImpl (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sync'd to LKGR (r162700) Created 8 years, 2 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_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 ff28c63ae89dda986778a7956575dc5f6f87186c..6b1538a1eaaca0cc4b15b475b5c5a667bd0544d2 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());
@@ -160,7 +168,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());
};
@@ -199,52 +206,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> {
@@ -348,8 +309,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;
}
@@ -372,6 +339,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&,
+ const GURL&, const GURL&, int64, bool,
+ content::ByteStreamReader*,
+ const net::BoundNetLog&,
+ base::WeakPtr<content::DownloadDestinationObserver>));
+
+ virtual content::DownloadFile* CreateFile(
+ scoped_ptr<content::DownloadSaveInfo> save_info,
+ const FilePath& default_download_directory,
+ const GURL& url,
+ const 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.get(), default_download_directory, url,
+ referrer_url, received_bytes, calculate_hash,
+ stream.get(), bound_net_log, observer);
+ }
+};
+
class MockBrowserContext : public content::BrowserContext {
public:
MockBrowserContext() {}
@@ -427,28 +426,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());
@@ -472,9 +472,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();
}
@@ -490,12 +490,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;
}
@@ -516,10 +518,6 @@ class DownloadManagerTest : public testing::Test {
return *mock_download_manager_delegate_;
}
- MockDownloadFileManager& GetMockDownloadFileManager() {
- return *mock_download_file_manager_;
- }
-
MockDownloadManagerObserver& GetMockObserver() {
return *observer_;
}
@@ -529,6 +527,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.
@@ -561,6 +578,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_;
@@ -568,7 +593,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_;
@@ -589,44 +613,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.get()), _, _, _, 0, true,
+ stream.get(), _, _));
download_manager_->StartDownload(info.Pass(), stream.Pass());
EXPECT_TRUE(download_manager_->GetDownload(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_->GetDownload(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());
@@ -637,15 +675,12 @@ TEST_F(DownloadManagerTest, OnDownloadStopped_NonPersisted) {
EXPECT_CALL(item, GetDbHandle())
.WillRepeatedly(Return(DownloadItem::kUninitializedHandle));
- EXPECT_CALL(item, OffThreadCancel());
DownloadStopped(&item);
}
// 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());
int64 db_handle = 0x7;
@@ -662,6 +697,5 @@ TEST_F(DownloadManagerTest, OnDownloadStopped_Persisted) {
EXPECT_CALL(item, GetDbHandle())
.WillRepeatedly(Return(db_handle));
- EXPECT_CALL(item, OffThreadCancel());
DownloadStopped(&item);
}
« no previous file with comments | « content/browser/download/download_manager_impl.cc ('k') | content/browser/download/download_resource_handler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698