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 fab8e996c746e83e8a59ec7ea4906b38a2f10253..baa292801ead18bc84ee7169e3a53ff7443f9c30 100644 |
--- a/content/browser/download/download_item_impl_unittest.cc |
+++ b/content/browser/download/download_item_impl_unittest.cc |
@@ -2,6 +2,7 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include "base/callback.h" |
#include "base/command_line.h" |
#include "base/message_loop.h" |
#include "base/stl_util.h" |
@@ -13,8 +14,8 @@ |
#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_observer.h" |
+#include "content/public/browser/download_id.h" |
#include "content/public/browser/download_interrupt_reasons.h" |
#include "content/public/browser/download_url_parameters.h" |
#include "content/public/common/content_switches.h" |
@@ -278,7 +279,8 @@ class DownloadItemTest : public testing::Test { |
// Perform the intermediate rename for |item|. The target path for the |
// download will be set to kDummyPath. Returns the MockDownloadFile* that was |
// added to the DownloadItem. |
- MockDownloadFile* DoIntermediateRename(DownloadItemImpl* item) { |
+ MockDownloadFile* DoIntermediateRename(DownloadItemImpl* item, |
+ DownloadDangerType danger_type) { |
EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
EXPECT_TRUE(item->GetTargetFilePath().empty()); |
DownloadItemImplDelegate::DownloadTargetCallback callback; |
@@ -291,7 +293,7 @@ class DownloadItemTest : public testing::Test { |
.WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, |
intermediate_path)); |
callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
- DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); |
+ danger_type, intermediate_path); |
RunAllPendingInMessageLoops(); |
return download_file; |
} |
@@ -324,6 +326,11 @@ class DownloadItemTest : public testing::Test { |
return &delegate_; |
} |
+ void OnDownloadFileAcquired(base::FilePath* return_path, |
+ const base::FilePath& path) { |
+ *return_path = path; |
+ } |
+ |
private: |
base::MessageLoopForUI loop_; |
TestBrowserThread ui_thread_; // UI thread |
@@ -389,7 +396,8 @@ TEST_F(DownloadItemTest, NotificationAfterDownloadedFileRemoved) { |
TEST_F(DownloadItemTest, NotificationAfterInterrupted) { |
DownloadItemImpl* item = CreateDownloadItem(); |
- MockDownloadFile* download_file = DoIntermediateRename(item); |
+ MockDownloadFile* download_file = |
+ DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
EXPECT_CALL(*download_file, Cancel()); |
MockObserver observer(item); |
@@ -401,17 +409,6 @@ TEST_F(DownloadItemTest, NotificationAfterInterrupted) { |
ASSERT_TRUE(observer.CheckUpdated()); |
} |
-TEST_F(DownloadItemTest, NotificationAfterDelete) { |
- DownloadItemImpl* item = CreateDownloadItem(); |
- MockDownloadFile* download_file = AddDownloadFileToDownloadItem(item, NULL); |
- EXPECT_CALL(*download_file, Cancel()); |
- EXPECT_CALL(*mock_delegate(), DownloadRemoved(_)); |
- MockObserver observer(item); |
- |
- item->Delete(DownloadItem::DELETE_DUE_TO_BROWSER_SHUTDOWN); |
- ASSERT_TRUE(observer.CheckUpdated()); |
-} |
- |
TEST_F(DownloadItemTest, NotificationAfterDestroyed) { |
DownloadItemImpl* item = CreateDownloadItem(); |
MockObserver observer(item); |
@@ -427,9 +424,12 @@ TEST_F(DownloadItemTest, ContinueAfterInterrupted) { |
DownloadItemImpl* item = CreateDownloadItem(); |
MockObserver observer(item); |
DownloadItemImplDelegate::DownloadTargetCallback callback; |
- MockDownloadFile* download_file = DoIntermediateRename(item); |
+ MockDownloadFile* download_file = |
+ DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
// Interrupt the download, using a continuable interrupt. |
+ EXPECT_CALL(*download_file, FullPath()) |
+ .WillOnce(Return(base::FilePath())); |
EXPECT_CALL(*download_file, Detach()); |
item->DestinationObserverAsWeakPtr()->DestinationError( |
DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR); |
@@ -452,7 +452,8 @@ TEST_F(DownloadItemTest, RestartAfterInterrupted) { |
DownloadItemImpl* item = CreateDownloadItem(); |
MockObserver observer(item); |
DownloadItemImplDelegate::DownloadTargetCallback callback; |
- MockDownloadFile* download_file = DoIntermediateRename(item); |
+ MockDownloadFile* download_file = |
+ DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
// Interrupt the download, using a restartable interrupt. |
EXPECT_CALL(*download_file, Cancel()); |
@@ -491,6 +492,9 @@ TEST_F(DownloadItemTest, LimitRestartsAfterInterrupted) { |
mock_request_handle = new NiceMock<MockRequestHandle>; |
request_handle.reset(mock_request_handle); |
+ ON_CALL(*mock_download_file, FullPath()) |
+ .WillByDefault(Return(base::FilePath())); |
+ |
// It's too complicated to set up a WebContents instance that would cause |
// the MockDownloadItemDelegate's ResumeInterruptedDownload() function |
// to be callled, so we simply verify that GetWebContents() is called. |
@@ -560,7 +564,7 @@ TEST_F(DownloadItemTest, NotificationAfterOnContentCheckCompleted) { |
unsafeurl_item->OnContentCheckCompleted(DOWNLOAD_DANGER_TYPE_DANGEROUS_URL); |
EXPECT_TRUE(unsafeurl_observer.CheckUpdated()); |
- unsafeurl_item->DangerousDownloadValidated(); |
+ unsafeurl_item->ValidateDangerousDownload(); |
EXPECT_TRUE(unsafeurl_observer.CheckUpdated()); |
DownloadItemImpl* unsafefile_item = |
@@ -572,7 +576,7 @@ TEST_F(DownloadItemTest, NotificationAfterOnContentCheckCompleted) { |
unsafefile_item->OnContentCheckCompleted(DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); |
EXPECT_TRUE(unsafefile_observer.CheckUpdated()); |
- unsafefile_item->DangerousDownloadValidated(); |
+ unsafefile_item->ValidateDangerousDownload(); |
EXPECT_TRUE(unsafefile_observer.CheckUpdated()); |
} |
@@ -696,6 +700,8 @@ TEST_F(DownloadItemTest, CallbackAfterRename) { |
EXPECT_CALL(*download_file, RenameAndAnnotate(final_path, _)) |
.WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, |
final_path)); |
+ EXPECT_CALL(*download_file, FullPath()) |
+ .WillOnce(Return(base::FilePath())); |
EXPECT_CALL(*download_file, Detach()); |
item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); |
RunAllPendingInMessageLoops(); |
@@ -730,7 +736,8 @@ TEST_F(DownloadItemTest, CallbackAfterInterruptedRename) { |
TEST_F(DownloadItemTest, Interrupted) { |
DownloadItemImpl* item = CreateDownloadItem(); |
- MockDownloadFile* download_file = DoIntermediateRename(item); |
+ MockDownloadFile* download_file = |
+ DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
const DownloadInterruptReason reason( |
DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED); |
@@ -829,7 +836,8 @@ TEST_F(DownloadItemTest, DestinationUpdate) { |
TEST_F(DownloadItemTest, DestinationError) { |
DownloadItemImpl* item = CreateDownloadItem(); |
- MockDownloadFile* download_file = DoIntermediateRename(item); |
+ MockDownloadFile* download_file = |
+ DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
base::WeakPtr<DownloadDestinationObserver> as_observer( |
item->DestinationObserverAsWeakPtr()); |
MockObserver observer(item); |
@@ -879,7 +887,8 @@ TEST_F(DownloadItemTest, DestinationCompleted) { |
TEST_F(DownloadItemTest, EnabledActionsForNormalDownload) { |
DownloadItemImpl* item = CreateDownloadItem(); |
- MockDownloadFile* download_file = DoIntermediateRename(item); |
+ MockDownloadFile* download_file = |
+ DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
// InProgress |
ASSERT_TRUE(item->IsInProgress()); |
@@ -893,6 +902,8 @@ TEST_F(DownloadItemTest, EnabledActionsForNormalDownload) { |
base::FilePath(kDummyPath))); |
EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) |
.WillOnce(Return(true)); |
+ EXPECT_CALL(*download_file, FullPath()) |
+ .WillOnce(Return(base::FilePath())); |
EXPECT_CALL(*download_file, Detach()); |
item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); |
RunAllPendingInMessageLoops(); |
@@ -904,7 +915,8 @@ TEST_F(DownloadItemTest, EnabledActionsForNormalDownload) { |
TEST_F(DownloadItemTest, EnabledActionsForTemporaryDownload) { |
DownloadItemImpl* item = CreateDownloadItem(); |
- MockDownloadFile* download_file = DoIntermediateRename(item); |
+ MockDownloadFile* download_file = |
+ DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
item->SetIsTemporary(true); |
// InProgress Temporary |
@@ -920,6 +932,8 @@ TEST_F(DownloadItemTest, EnabledActionsForTemporaryDownload) { |
EXPECT_CALL(*download_file, RenameAndAnnotate(_, _)) |
.WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, |
base::FilePath(kDummyPath))); |
+ EXPECT_CALL(*download_file, FullPath()) |
+ .WillOnce(Return(base::FilePath())); |
EXPECT_CALL(*download_file, Detach()); |
item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); |
RunAllPendingInMessageLoops(); |
@@ -931,7 +945,8 @@ TEST_F(DownloadItemTest, EnabledActionsForTemporaryDownload) { |
TEST_F(DownloadItemTest, EnabledActionsForInterruptedDownload) { |
DownloadItemImpl* item = CreateDownloadItem(); |
- MockDownloadFile* download_file = DoIntermediateRename(item); |
+ MockDownloadFile* download_file = |
+ DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
EXPECT_CALL(*download_file, Cancel()); |
item->DestinationObserverAsWeakPtr()->DestinationError( |
@@ -946,7 +961,8 @@ TEST_F(DownloadItemTest, EnabledActionsForInterruptedDownload) { |
TEST_F(DownloadItemTest, EnabledActionsForCancelledDownload) { |
DownloadItemImpl* item = CreateDownloadItem(); |
- MockDownloadFile* download_file = DoIntermediateRename(item); |
+ MockDownloadFile* download_file = |
+ DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
EXPECT_CALL(*download_file, Cancel()); |
item->Cancel(true); |
@@ -964,7 +980,8 @@ TEST_F(DownloadItemTest, CompleteDelegate_ReturnTrue) { |
// Test to confirm that if we have a callback that returns true, |
// we complete immediately. |
DownloadItemImpl* item = CreateDownloadItem(); |
- MockDownloadFile* download_file = DoIntermediateRename(item); |
+ MockDownloadFile* download_file = |
+ DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
// Drive the delegate interaction. |
EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) |
@@ -979,6 +996,8 @@ TEST_F(DownloadItemTest, CompleteDelegate_ReturnTrue) { |
base::FilePath(kDummyPath))); |
EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item, _)) |
.WillOnce(Return(true)); |
+ EXPECT_CALL(*download_file, FullPath()) |
+ .WillOnce(Return(base::FilePath())); |
EXPECT_CALL(*download_file, Detach()); |
RunAllPendingInMessageLoops(); |
EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); |
@@ -989,7 +1008,8 @@ TEST_F(DownloadItemTest, CompleteDelegate_BlockOnce) { |
// Test to confirm that if we have a callback that returns true, |
// we complete immediately. |
DownloadItemImpl* item = CreateDownloadItem(); |
- MockDownloadFile* download_file = DoIntermediateRename(item); |
+ MockDownloadFile* download_file = |
+ DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
// Drive the delegate interaction. |
base::Closure delegate_callback; |
@@ -1014,6 +1034,8 @@ TEST_F(DownloadItemTest, CompleteDelegate_BlockOnce) { |
base::FilePath(kDummyPath))); |
EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item, _)) |
.WillOnce(Return(true)); |
+ EXPECT_CALL(*download_file, FullPath()) |
+ .WillOnce(Return(base::FilePath())); |
EXPECT_CALL(*download_file, Detach()); |
RunAllPendingInMessageLoops(); |
EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); |
@@ -1024,7 +1046,8 @@ TEST_F(DownloadItemTest, CompleteDelegate_SetDanger) { |
// Test to confirm that if we have a callback that returns true, |
// we complete immediately. |
DownloadItemImpl* item = CreateDownloadItem(); |
- MockDownloadFile* download_file = DoIntermediateRename(item); |
+ MockDownloadFile* download_file = |
+ DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
// Drive the delegate interaction. |
base::Closure delegate_callback; |
@@ -1052,12 +1075,14 @@ TEST_F(DownloadItemTest, CompleteDelegate_SetDanger) { |
base::FilePath(kDummyPath))); |
EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item, _)) |
.WillOnce(Return(true)); |
+ EXPECT_CALL(*download_file, FullPath()) |
+ .WillOnce(Return(base::FilePath())); |
EXPECT_CALL(*download_file, Detach()); |
RunAllPendingInMessageLoops(); |
EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
EXPECT_TRUE(item->IsDangerous()); |
- item->DangerousDownloadValidated(); |
+ item->ValidateDangerousDownload(); |
EXPECT_EQ(DOWNLOAD_DANGER_TYPE_USER_VALIDATED, item->GetDangerType()); |
RunAllPendingInMessageLoops(); |
EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); |
@@ -1068,7 +1093,8 @@ TEST_F(DownloadItemTest, CompleteDelegate_BlockTwice) { |
// Test to confirm that if we have a callback that returns true, |
// we complete immediately. |
DownloadItemImpl* item = CreateDownloadItem(); |
- MockDownloadFile* download_file = DoIntermediateRename(item); |
+ MockDownloadFile* download_file = |
+ DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
// Drive the delegate interaction. |
base::Closure delegate_callback; |
@@ -1100,11 +1126,82 @@ TEST_F(DownloadItemTest, CompleteDelegate_BlockTwice) { |
base::FilePath(kDummyPath))); |
EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item, _)) |
.WillOnce(Return(true)); |
+ EXPECT_CALL(*download_file, FullPath()) |
+ .WillOnce(Return(base::FilePath())); |
EXPECT_CALL(*download_file, Detach()); |
RunAllPendingInMessageLoops(); |
EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); |
} |
+TEST_F(DownloadItemTest, StealDangerousDownload) { |
+ DownloadItemImpl* item = CreateDownloadItem(); |
+ MockDownloadFile* download_file = |
+ DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); |
+ ASSERT_TRUE(item->IsDangerous()); |
+ base::FilePath full_path(FILE_PATH_LITERAL("foo.txt")); |
+ base::FilePath returned_path; |
+ |
+ EXPECT_CALL(*download_file, FullPath()) |
+ .WillOnce(Return(full_path)); |
+ EXPECT_CALL(*download_file, Detach()); |
+ EXPECT_CALL(*mock_delegate(), DownloadRemoved(_)); |
+ base::WeakPtrFactory<DownloadItemTest> weak_ptr_factory(this); |
+ item->StealDangerousDownload( |
+ base::Bind(&DownloadItemTest::OnDownloadFileAcquired, |
+ weak_ptr_factory.GetWeakPtr(), |
+ base::Unretained(&returned_path))); |
+ RunAllPendingInMessageLoops(); |
+ EXPECT_EQ(full_path, returned_path); |
+} |
+ |
+TEST_F(DownloadItemTest, StealInterruptedDangerousDownload) { |
+ CommandLine::ForCurrentProcess()->AppendSwitch( |
+ switches::kEnableDownloadResumption); |
+ base::FilePath returned_path; |
+ DownloadItemImpl* item = CreateDownloadItem(); |
+ MockDownloadFile* download_file = |
+ DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); |
+ base::FilePath full_path = item->GetFullPath(); |
+ EXPECT_FALSE(full_path.empty()); |
+ EXPECT_CALL(*download_file, FullPath()) |
+ .WillOnce(Return(full_path)); |
+ EXPECT_CALL(*download_file, Detach()); |
+ item->DestinationObserverAsWeakPtr()->DestinationError( |
+ DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED); |
+ ASSERT_TRUE(item->IsDangerous()); |
+ |
+ EXPECT_CALL(*mock_delegate(), DownloadRemoved(_)); |
+ base::WeakPtrFactory<DownloadItemTest> weak_ptr_factory(this); |
+ item->StealDangerousDownload( |
+ base::Bind(&DownloadItemTest::OnDownloadFileAcquired, |
+ weak_ptr_factory.GetWeakPtr(), |
+ base::Unretained(&returned_path))); |
+ RunAllPendingInMessageLoops(); |
+ EXPECT_EQ(full_path, returned_path); |
+} |
+ |
+TEST_F(DownloadItemTest, StealInterruptedNonResumableDangerousDownload) { |
+ CommandLine::ForCurrentProcess()->AppendSwitch( |
+ switches::kEnableDownloadResumption); |
+ base::FilePath returned_path; |
+ DownloadItemImpl* item = CreateDownloadItem(); |
+ MockDownloadFile* download_file = |
+ DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); |
+ EXPECT_CALL(*download_file, Cancel()); |
+ item->DestinationObserverAsWeakPtr()->DestinationError( |
+ DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); |
+ ASSERT_TRUE(item->IsDangerous()); |
+ |
+ EXPECT_CALL(*mock_delegate(), DownloadRemoved(_)); |
+ base::WeakPtrFactory<DownloadItemTest> weak_ptr_factory(this); |
+ item->StealDangerousDownload( |
+ base::Bind(&DownloadItemTest::OnDownloadFileAcquired, |
+ weak_ptr_factory.GetWeakPtr(), |
+ base::Unretained(&returned_path))); |
+ RunAllPendingInMessageLoops(); |
+ EXPECT_TRUE(returned_path.empty()); |
+} |
+ |
TEST(MockDownloadItem, Compiles) { |
MockDownloadItem mock_item; |
} |