Index: content/browser/download/download_item_impl_unittest.cc |
diff --git a/content/browser/download/download_item_impl_unittest.cc b/content/browser/download/download_item_impl_unittest.cc |
index cbc583852176f42d7d48e7e7ea50d7732b604998..05cb86375448713757a633cb6faf99cea1502a66 100644 |
--- a/content/browser/download/download_item_impl_unittest.cc |
+++ b/content/browser/download/download_item_impl_unittest.cc |
@@ -7,11 +7,13 @@ |
#include "base/threading/thread.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_impl.h" |
#include "content/browser/download/download_item_impl_delegate.h" |
#include "content/browser/download/download_request_handle.h" |
+#include "content/browser/download/mock_download_file.h" |
#include "content/public/browser/download_id.h" |
+#include "content/public/browser/download_destination_controller.h" |
#include "content/public/browser/download_interrupt_reasons.h" |
#include "content/public/test/mock_download_item.h" |
#include "content/public/test/test_browser_thread.h" |
@@ -28,14 +30,16 @@ using ::testing::_; |
using ::testing::AllOf; |
using ::testing::Property; |
using ::testing::Return; |
+using ::testing::StrictMock; |
DownloadId::Domain kValidDownloadItemIdDomain = "valid DownloadId::Domain"; |
namespace { |
class MockDelegate : public DownloadItemImplDelegate { |
public: |
- MOCK_METHOD1(ShouldOpenFileBasedOnExtension, bool(const FilePath& path)); |
+ MOCK_METHOD1(DelegateStart, void(DownloadItemImpl* download)); |
MOCK_METHOD1(ShouldOpenDownload, bool(DownloadItemImpl* download)); |
+ MOCK_METHOD1(ShouldOpenFileBasedOnExtension, bool(const FilePath& path)); |
MOCK_METHOD1(CheckForFileRemoval, void(DownloadItemImpl* download)); |
MOCK_METHOD1(MaybeCompleteDownload, void(DownloadItemImpl* download)); |
MOCK_CONST_METHOD0(GetBrowserContext, content::BrowserContext*()); |
@@ -59,53 +63,15 @@ class MockRequestHandle : public DownloadRequestHandleInterface { |
MOCK_CONST_METHOD0(DebugString, std::string()); |
}; |
-class MockDownloadFileFactory |
- : public DownloadFileManager::DownloadFileFactory { |
- public: |
- content::DownloadFile* CreateFile( |
- DownloadCreateInfo* info, |
- scoped_ptr<content::ByteStreamReader> stream_reader, |
- DownloadManager* mgr, |
- bool calculate_hash, |
- const net::BoundNetLog& bound_net_log) { |
- return MockCreateFile( |
- info, stream_reader.get(), info->request_handle, mgr, calculate_hash, |
- bound_net_log); |
- } |
- |
- MOCK_METHOD6(MockCreateFile, |
- content::DownloadFile*(DownloadCreateInfo*, |
- content::ByteStreamReader*, |
- const DownloadRequestHandle&, |
- DownloadManager*, |
- bool, |
- const net::BoundNetLog&)); |
-}; |
- |
-class MockDownloadFileManager : public DownloadFileManager { |
- public: |
- MockDownloadFileManager(); |
- MOCK_METHOD0(Shutdown, void()); |
- MOCK_METHOD1(CancelDownload, void(DownloadId)); |
- MOCK_METHOD2(CompleteDownload, void(DownloadId, const base::Closure&)); |
- MOCK_METHOD1(OnDownloadManagerShutdown, void(DownloadManager*)); |
- MOCK_METHOD4(RenameDownloadFile, void(DownloadId, const FilePath&, bool, |
- const RenameCompletionCallback&)); |
- MOCK_CONST_METHOD0(NumberOfActiveDownloads, int()); |
- private: |
- ~MockDownloadFileManager() {} |
-}; |
- |
// Schedules a task to invoke the RenameCompletionCallback with |new_path| on |
// the UI thread. Should only be used as the action for |
-// MockDownloadFileManager::Rename*DownloadFile as follows: |
-// EXPECT_CALL(mock_download_file_manager, |
-// RenameDownloadFile(_,_,_,_)) |
+// MockDownloadFile::Rename as follows: |
+// EXPECT_CALL(download_file, Rename(_,_,_)) |
// .WillOnce(ScheduleRenameCallback(new_path)); |
ACTION_P(ScheduleRenameCallback, new_path) { |
BrowserThread::PostTask( |
BrowserThread::UI, FROM_HERE, |
- base::Bind(arg3, content::DOWNLOAD_INTERRUPT_REASON_NONE, new_path)); |
+ base::Bind(arg2, content::DOWNLOAD_INTERRUPT_REASON_NONE, new_path)); |
} |
// Similarly for scheduling a completion callback. |
@@ -113,10 +79,6 @@ ACTION(ScheduleCompleteCallback) { |
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(arg1)); |
} |
-MockDownloadFileManager::MockDownloadFileManager() |
- : DownloadFileManager(new MockDownloadFileFactory) { |
-} |
- |
} // namespace |
class DownloadItemTest : public testing::Test { |
@@ -188,6 +150,22 @@ class DownloadItemTest : public testing::Test { |
return download; |
} |
+ // Add DownloadFile to DownloadItem |
+ MockDownloadFile* AddDownloadFileToDownloadItem(DownloadItemImpl* item) { |
+ MockDownloadFile* mock_download_file(new StrictMock<MockDownloadFile>); |
+ scoped_ptr<content::DownloadFile> download_file(mock_download_file); |
+ EXPECT_CALL(*mock_download_file, Initialize(_)); |
+ item->Start(download_file.Pass()); |
+ loop_.RunAllPending(); |
+ return mock_download_file; |
+ } |
+ |
+ // Cleanup a download item (specifically get rid of the DownloadFile on it). |
+ void CleanupItem(DownloadItemImpl* item, MockDownloadFile* download_file) { |
+ EXPECT_CALL(*download_file, Cancel()); |
+ item->OffThreadCancel(); |
+ } |
+ |
// Destroy a previously created download item. |
void DestroyDownloadItem(DownloadItem* item) { |
allocated_downloads_.erase(item); |
@@ -225,7 +203,7 @@ const FilePath::CharType kDummyPath[] = FILE_PATH_LITERAL("/testpath"); |
// void OpenDownload(); |
// void ShowDownloadInShell(); |
// void CompleteDelayedDownload(); |
-// void OnDownloadCompleting(DownloadFileManager* file_manager); |
+// void OnDownloadCompleting(); |
// set_* mutators |
TEST_F(DownloadItemTest, NotificationAfterUpdate) { |
@@ -256,7 +234,7 @@ TEST_F(DownloadItemTest, NotificationAfterComplete) { |
DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); |
MockObserver observer(item); |
- item->OnAllDataSaved(kDownloadChunkSize, DownloadItem::kEmptyFileHash); |
+ item->OnAllDataSaved(DownloadItem::kEmptyFileHash); |
ASSERT_TRUE(observer.CheckUpdated()); |
item->MarkAsComplete(); |
@@ -338,7 +316,7 @@ TEST_F(DownloadItemTest, NotificationAfterOnContentCheckCompleted) { |
FilePath(kDummyPath), DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
EXPECT_FALSE(safe_observer.CheckUpdated()); |
- safe_item->OnAllDataSaved(1, ""); |
+ safe_item->OnAllDataSaved(""); |
EXPECT_TRUE(safe_observer.CheckUpdated()); |
safe_item->OnContentCheckCompleted( |
content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
@@ -353,7 +331,7 @@ TEST_F(DownloadItemTest, NotificationAfterOnContentCheckCompleted) { |
FilePath(kDummyPath), DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
EXPECT_FALSE(unsafeurl_observer.CheckUpdated()); |
- unsafeurl_item->OnAllDataSaved(1, ""); |
+ unsafeurl_item->OnAllDataSaved(""); |
EXPECT_TRUE(unsafeurl_observer.CheckUpdated()); |
unsafeurl_item->OnContentCheckCompleted( |
content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL); |
@@ -370,7 +348,7 @@ TEST_F(DownloadItemTest, NotificationAfterOnContentCheckCompleted) { |
FilePath(kDummyPath), DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
EXPECT_FALSE(unsafefile_observer.CheckUpdated()); |
- unsafefile_item->OnAllDataSaved(1, ""); |
+ unsafefile_item->OnAllDataSaved(""); |
EXPECT_TRUE(unsafefile_observer.CheckUpdated()); |
unsafefile_item->OnContentCheckCompleted( |
content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); |
@@ -381,26 +359,27 @@ TEST_F(DownloadItemTest, NotificationAfterOnContentCheckCompleted) { |
} |
// DownloadItemImpl::OnIntermediatePathDetermined will schedule a task to run |
-// DownloadFileManager::RenameDownloadFile(). Once the rename |
+// DownloadFile::Rename(). Once the rename |
// completes, DownloadItemImpl receives a notification with the new file |
// name. Check that observers are updated when the new filename is available and |
// not before. |
TEST_F(DownloadItemTest, NotificationAfterOnIntermediatePathDetermined) { |
DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); |
+ MockDownloadFile* download_file = AddDownloadFileToDownloadItem(item); |
MockObserver observer(item); |
FilePath intermediate_path(kDummyPath); |
FilePath new_intermediate_path(intermediate_path.AppendASCII("foo")); |
- scoped_refptr<MockDownloadFileManager> file_manager( |
- new MockDownloadFileManager); |
- EXPECT_CALL(*file_manager.get(), |
- RenameDownloadFile(_,intermediate_path,false,_)) |
+ EXPECT_CALL(*download_file, Rename(intermediate_path, false, _)) |
.WillOnce(ScheduleRenameCallback(new_intermediate_path)); |
- item->OnIntermediatePathDetermined(file_manager.get(), intermediate_path); |
+ item->OnIntermediatePathDetermined(intermediate_path); |
EXPECT_FALSE(observer.CheckUpdated()); |
RunAllPendingInMessageLoops(); |
EXPECT_TRUE(observer.CheckUpdated()); |
EXPECT_EQ(new_intermediate_path, item->GetFullPath()); |
+ |
+ CleanupItem(item, download_file); |
+ RunAllPendingInMessageLoops(); |
} |
TEST_F(DownloadItemTest, NotificationAfterTogglePause) { |
@@ -426,6 +405,17 @@ TEST_F(DownloadItemTest, DisplayName) { |
item->GetFileNameToReportUser().value()); |
} |
+// Test to make sure that Start method calls DF initialize properly. |
+TEST_F(DownloadItemTest, Start) { |
+ MockDownloadFile* mock_download_file(new MockDownloadFile); |
+ scoped_ptr<content::DownloadFile> download_file(mock_download_file); |
+ DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); |
+ EXPECT_CALL(*mock_download_file, Initialize(_)); |
+ item->Start(download_file.Pass()); |
+ |
+ CleanupItem(item, mock_download_file); |
+} |
+ |
static char external_data_test_string[] = "External data test"; |
static int destructor_called = 0; |
@@ -500,15 +490,13 @@ TEST_F(DownloadItemTest, ExternalData) { |
// rename. |
TEST_F(DownloadItemTest, CallbackAfterRename) { |
DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); |
+ MockDownloadFile* download_file = AddDownloadFileToDownloadItem(item); |
FilePath intermediate_path(kDummyPath); |
FilePath new_intermediate_path(intermediate_path.AppendASCII("foo")); |
FilePath final_path(intermediate_path.AppendASCII("bar")); |
- scoped_refptr<MockDownloadFileManager> file_manager( |
- new MockDownloadFileManager); |
- EXPECT_CALL(*file_manager.get(), |
- RenameDownloadFile(item->GetGlobalId(), |
- intermediate_path, false, _)) |
+ EXPECT_CALL(*download_file, Rename(intermediate_path, false, _)) |
.WillOnce(ScheduleRenameCallback(new_intermediate_path)); |
+ |
// DownloadItemImpl should invoke this callback on the delegate once the |
// download is renamed to the intermediate name. Also check that GetFullPath() |
// returns the intermediate path at the time of the call. |
@@ -520,20 +508,16 @@ TEST_F(DownloadItemTest, CallbackAfterRename) { |
item->OnTargetPathDetermined(final_path, |
DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
- item->OnIntermediatePathDetermined(file_manager.get(), intermediate_path); |
+ item->OnIntermediatePathDetermined(intermediate_path); |
RunAllPendingInMessageLoops(); |
// All the callbacks should have happened by now. |
- ::testing::Mock::VerifyAndClearExpectations(file_manager.get()); |
+ ::testing::Mock::VerifyAndClearExpectations(download_file); |
::testing::Mock::VerifyAndClearExpectations(mock_delegate()); |
- item->OnAllDataSaved(10, ""); |
- EXPECT_CALL(*file_manager.get(), |
- RenameDownloadFile(item->GetGlobalId(), |
- final_path, true, _)) |
+ item->OnAllDataSaved(""); |
+ EXPECT_CALL(*download_file, Rename(final_path, true, _)) |
.WillOnce(ScheduleRenameCallback(final_path)); |
- EXPECT_CALL(*file_manager.get(), |
- CompleteDownload(item->GetGlobalId(), _)) |
- .WillOnce(ScheduleCompleteCallback()); |
+ |
// DownloadItemImpl should invoke this callback on the delegate after the |
// final rename has completed. Also check that GetFullPath() and |
// GetTargetFilePath() return the final path at the time of the call. |
@@ -546,9 +530,10 @@ TEST_F(DownloadItemTest, CallbackAfterRename) { |
EXPECT_CALL(*mock_delegate(), DownloadCompleted(item)); |
EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item)) |
.WillOnce(Return(true)); |
- item->OnDownloadCompleting(file_manager.get()); |
+ EXPECT_CALL(*download_file, Detach()); |
+ item->OnDownloadCompleting(); |
RunAllPendingInMessageLoops(); |
- ::testing::Mock::VerifyAndClearExpectations(file_manager.get()); |
+ ::testing::Mock::VerifyAndClearExpectations(download_file); |
::testing::Mock::VerifyAndClearExpectations(mock_delegate()); |
} |
@@ -587,6 +572,86 @@ TEST_F(DownloadItemTest, FileRemoved) { |
EXPECT_TRUE(item->GetFileExternallyRemoved()); |
} |
+TEST_F(DownloadItemTest, DestinationUpdate) { |
+ DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); |
+ base::WeakPtr<content::DownloadDestinationController> as_controller( |
+ item->DestinationControllerAsWeakPtr()); |
+ MockObserver observer(item); |
+ |
+ EXPECT_EQ(0l, item->CurrentSpeed()); |
+ EXPECT_EQ("", item->GetHashState()); |
+ EXPECT_EQ(0l, item->GetReceivedBytes()); |
+ EXPECT_EQ(0l, item->GetTotalBytes()); |
+ EXPECT_FALSE(observer.CheckUpdated()); |
+ item->SetTotalBytes(100l); |
+ EXPECT_EQ(100l, item->GetTotalBytes()); |
+ |
+ as_controller->DestinationUpdate(10, 20, "deadbeef"); |
+ EXPECT_EQ(20l, item->CurrentSpeed()); |
+ EXPECT_EQ("deadbeef", item->GetHashState()); |
+ EXPECT_EQ(10l, item->GetReceivedBytes()); |
+ EXPECT_EQ(100l, item->GetTotalBytes()); |
+ EXPECT_TRUE(observer.CheckUpdated()); |
+ |
+ as_controller->DestinationUpdate(200, 20, "livebeef"); |
+ EXPECT_EQ(20l, item->CurrentSpeed()); |
+ EXPECT_EQ("livebeef", item->GetHashState()); |
+ EXPECT_EQ(200l, item->GetReceivedBytes()); |
+ EXPECT_EQ(0l, item->GetTotalBytes()); |
+ EXPECT_TRUE(observer.CheckUpdated()); |
+} |
+ |
+TEST_F(DownloadItemTest, DestinationError) { |
+ DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); |
+ base::WeakPtr<content::DownloadDestinationController> as_controller( |
+ item->DestinationControllerAsWeakPtr()); |
+ MockObserver observer(item); |
+ |
+ EXPECT_EQ(content::DownloadItem::IN_PROGRESS, item->GetState()); |
+ EXPECT_EQ(content::DOWNLOAD_INTERRUPT_REASON_NONE, item->GetLastReason()); |
+ EXPECT_FALSE(observer.CheckUpdated()); |
+ |
+ EXPECT_CALL(*mock_delegate(), DownloadStopped(item)); |
+ as_controller->DestinationError( |
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED); |
+ ::testing::Mock::VerifyAndClearExpectations(mock_delegate()); |
+ EXPECT_TRUE(observer.CheckUpdated()); |
+ EXPECT_EQ(content::DownloadItem::INTERRUPTED, item->GetState()); |
+ EXPECT_EQ(content::DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED, |
+ item->GetLastReason()); |
+} |
+ |
+TEST_F(DownloadItemTest, DestinationCompleted) { |
+ DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); |
+ base::WeakPtr<content::DownloadDestinationController> as_controller( |
+ item->DestinationControllerAsWeakPtr()); |
+ MockObserver observer(item); |
+ |
+ EXPECT_EQ(content::DownloadItem::IN_PROGRESS, item->GetState()); |
+ EXPECT_EQ("", item->GetHash()); |
+ EXPECT_EQ("", item->GetHashState()); |
+ EXPECT_FALSE(item->AllDataSaved()); |
+ EXPECT_FALSE(observer.CheckUpdated()); |
+ |
+ as_controller->DestinationUpdate(10, 20, "deadbeef"); |
+ EXPECT_TRUE(observer.CheckUpdated()); |
+ EXPECT_FALSE(observer.CheckUpdated()); // Confirm reset. |
+ EXPECT_EQ(content::DownloadItem::IN_PROGRESS, item->GetState()); |
+ EXPECT_EQ("", item->GetHash()); |
+ EXPECT_EQ("deadbeef", item->GetHashState()); |
+ EXPECT_FALSE(item->AllDataSaved()); |
+ |
+ EXPECT_CALL(*mock_delegate(), MaybeCompleteDownload(item)); |
+ as_controller->DestinationCompleted("livebeef"); |
+ ::testing::Mock::VerifyAndClearExpectations(mock_delegate()); |
+ EXPECT_EQ(content::DownloadItem::IN_PROGRESS, item->GetState()); |
+ EXPECT_TRUE(observer.CheckUpdated()); |
+ EXPECT_EQ("livebeef", item->GetHash()); |
+ EXPECT_EQ("", item->GetHashState()); |
+ EXPECT_TRUE(item->AllDataSaved()); |
+} |
+ |
TEST(MockDownloadItem, Compiles) { |
MockDownloadItem mock_item; |
} |
+ |