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

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

Issue 14947007: [Downloads] Allow acquiring dangerous download file. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rename methods for consistency Created 7 years, 7 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_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..c51f414571858d9b660166e4723b3ebd3954d88f 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,14 +409,17 @@ TEST_F(DownloadItemTest, NotificationAfterInterrupted) {
ASSERT_TRUE(observer.CheckUpdated());
}
-TEST_F(DownloadItemTest, NotificationAfterDelete) {
+TEST_F(DownloadItemTest, NotificationAfterDiscardDangerousDownload) {
DownloadItemImpl* item = CreateDownloadItem();
- MockDownloadFile* download_file = AddDownloadFileToDownloadItem(item, NULL);
+ MockDownloadFile* download_file =
+ DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE);
+ ASSERT_TRUE(item->IsDangerous());
+
+ MockObserver observer(item);
EXPECT_CALL(*download_file, Cancel());
EXPECT_CALL(*mock_delegate(), DownloadRemoved(_));
- MockObserver observer(item);
-
- item->Delete(DownloadItem::DELETE_DUE_TO_BROWSER_SHUTDOWN);
+ item->DiscardDangerousDownload(DownloadItem::DELETE_DUE_TO_BROWSER_SHUTDOWN,
+ DownloadItem::AcquireFileCallback());
ASSERT_TRUE(observer.CheckUpdated());
}
@@ -427,9 +438,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 +466,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 +506,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 +578,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 +590,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 +714,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 +750,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 +850,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 +901,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 +916,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 +929,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 +946,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 +959,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 +975,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 +994,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 +1010,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 +1022,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 +1048,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 +1060,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 +1089,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 +1107,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 +1140,38 @@ 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, AcquireFileAndDiscardDownload) {
+ 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;
+
+ // DiscardDangerousDownload with a non-null AcquireFileCallback should cause
+ // the DownloadFile to be detached and its filename to be passed to the
+ // callback.
+ 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->DiscardDangerousDownload(
+ DownloadItem::DELETE_DUE_TO_USER_DISCARD,
+ base::Bind(&DownloadItemTest::OnDownloadFileAcquired,
+ weak_ptr_factory.GetWeakPtr(),
+ base::Unretained(&returned_path)));
+ RunAllPendingInMessageLoops();
+ EXPECT_EQ(full_path, returned_path);
+}
+
TEST(MockDownloadItem, Compiles) {
MockDownloadItem mock_item;
}

Powered by Google App Engine
This is Rietveld 408576698