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

Unified Diff: content/browser/download/download_item_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_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 46ec7a528637108165d035ee6d3d8cf27448760b..b1fe8832337c1ef3557f4ff35f127de4779e11ca 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_observer.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,19 +30,18 @@ using ::testing::_;
using ::testing::AllOf;
using ::testing::Property;
using ::testing::Return;
+using ::testing::SaveArg;
+using ::testing::StrictMock;
DownloadId::Domain kValidDownloadItemIdDomain = "valid DownloadId::Domain";
namespace {
class MockDelegate : public DownloadItemImplDelegate {
public:
- MockDelegate(DownloadFileManager* file_manager)
- : file_manager_(file_manager) {
- }
- MOCK_METHOD2(ReadyForDownloadCompletion,
- void(DownloadItemImpl*, const base::Closure&));
- MOCK_METHOD1(ShouldOpenFileBasedOnExtension, bool(const FilePath& path));
+ MOCK_METHOD2(DetermineDownloadTarget, void(
+ DownloadItemImpl* download, const DownloadTargetCallback& callback));
MOCK_METHOD1(ShouldOpenDownload, bool(DownloadItemImpl* download));
+ MOCK_METHOD1(ShouldOpenFileBasedOnExtension, bool(const FilePath& path));
MOCK_METHOD1(CheckForFileRemoval, void(DownloadItemImpl* download));
MOCK_CONST_METHOD0(GetBrowserContext, content::BrowserContext*());
MOCK_METHOD1(UpdatePersistence, void(DownloadItemImpl* download));
@@ -69,52 +70,24 @@ class MockRequestHandle : public DownloadRequestHandleInterface {
MOCK_CONST_METHOD0(DebugString, std::string());
};
-class MockDownloadFileFactory : public content::DownloadFileFactory {
- public:
- content::DownloadFile* CreateFile(
- scoped_ptr<DownloadCreateInfo> info,
- scoped_ptr<content::ByteStreamReader> stream_reader,
- DownloadManager* mgr,
- bool calculate_hash,
- const net::BoundNetLog& bound_net_log) {
- return MockCreateFile(
- info.get(), 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));
+}
+
+// Schedules a task to invoke the input closure on
+// the UI thread. Should only be used as the action for
+// MockDownloadFile::Detach/Cancel as follows:
+// EXPECT_CALL(download_file, Detach(_))
+// .WillOnce(ScheduleClosure()));
+ACTION(ScheduleClosure) {
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, arg0);
}
// Similarly for scheduling a completion callback.
@@ -122,15 +95,6 @@ ACTION(ScheduleCompleteCallback) {
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(arg1));
}
-// Just run the callback in arg1
-ACTION(RunArg1Callback) {
- arg1.Run();
-}
-
-MockDownloadFileManager::MockDownloadFileManager()
- : DownloadFileManager(new MockDownloadFileFactory) {
-}
-
} // namespace
class DownloadItemTest : public testing::Test {
@@ -190,8 +154,7 @@ class DownloadItemTest : public testing::Test {
DownloadItemTest()
: ui_thread_(BrowserThread::UI, &loop_),
file_thread_(BrowserThread::FILE, &loop_),
- file_manager_(new MockDownloadFileManager),
- delegate_(file_manager_.get()) {
+ delegate_() {
}
~DownloadItemTest() {
@@ -232,6 +195,43 @@ class DownloadItemTest : public testing::Test {
return download;
}
+ // Add DownloadFile to DownloadItem
+ MockDownloadFile* AddDownloadFileToDownloadItem(
+ DownloadItemImpl* item,
+ DownloadItemImplDelegate::DownloadTargetCallback *callback) {
+ MockDownloadFile* mock_download_file(new StrictMock<MockDownloadFile>);
+ scoped_ptr<content::DownloadFile> download_file(mock_download_file);
+ EXPECT_CALL(*mock_download_file, Initialize(_));
+ if (callback) {
+ // Save the callback.
+ EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _))
+ .WillOnce(SaveArg<1>(callback));
+ } else {
+ // Drop it on the floor.
+ EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _));
+ }
+
+ item->Start(download_file.Pass());
+ loop_.RunAllPending();
+
+ // So that we don't have a function writing to a stack variable
+ // lying around if the above failed.
+ ::testing::Mock::VerifyAndClearExpectations(mock_delegate());
+
+ return mock_download_file;
+ }
+
+ // Cleanup a download item (specifically get rid of the DownloadFile on it).
+ // The item must be in the IN_PROGRESS state.
+ void CleanupItem(DownloadItemImpl* item, MockDownloadFile* download_file) {
+ EXPECT_EQ(content::DownloadItem::IN_PROGRESS, item->GetState());
+
+ EXPECT_CALL(*download_file, Cancel());
+ EXPECT_CALL(delegate_, DownloadStopped(item));
+ item->Cancel(true);
+ loop_.RunAllPending();
+ }
+
// Destroy a previously created download item.
void DestroyDownloadItem(DownloadItem* item) {
allocated_downloads_.erase(item);
@@ -246,15 +246,10 @@ class DownloadItemTest : public testing::Test {
return &delegate_;
}
- MockDownloadFileManager* mock_file_manager() {
- return file_manager_.get();
- }
-
private:
MessageLoopForUI loop_;
content::TestBrowserThread ui_thread_; // UI thread
content::TestBrowserThread file_thread_; // FILE thread
- scoped_refptr<MockDownloadFileManager> file_manager_;
testing::NiceMock<MockDelegate> delegate_;
std::set<DownloadItem*> allocated_downloads_;
};
@@ -287,6 +282,9 @@ TEST_F(DownloadItemTest, NotificationAfterUpdate) {
TEST_F(DownloadItemTest, NotificationAfterCancel) {
DownloadItemImpl* user_cancel = CreateDownloadItem(DownloadItem::IN_PROGRESS);
+ MockDownloadFile* download_file =
+ AddDownloadFileToDownloadItem(user_cancel, NULL);
+ EXPECT_CALL(*download_file, Cancel());
MockObserver observer1(user_cancel);
user_cancel->Cancel(true);
@@ -294,6 +292,8 @@ TEST_F(DownloadItemTest, NotificationAfterCancel) {
DownloadItemImpl* system_cancel =
CreateDownloadItem(DownloadItem::IN_PROGRESS);
+ download_file = AddDownloadFileToDownloadItem(system_cancel, NULL);
+ EXPECT_CALL(*download_file, Cancel());
MockObserver observer2(system_cancel);
system_cancel->Cancel(false);
@@ -304,7 +304,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();
@@ -321,6 +321,8 @@ TEST_F(DownloadItemTest, NotificationAfterDownloadedFileRemoved) {
TEST_F(DownloadItemTest, NotificationAfterInterrupted) {
DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
+ MockDownloadFile* download_file = AddDownloadFileToDownloadItem(item, NULL);
+ EXPECT_CALL(*download_file, Cancel());
MockObserver observer(item);
item->Interrupt(content::DOWNLOAD_INTERRUPT_REASON_NONE);
@@ -329,6 +331,8 @@ TEST_F(DownloadItemTest, NotificationAfterInterrupted) {
TEST_F(DownloadItemTest, NotificationAfterDelete) {
DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
+ MockDownloadFile* download_file = AddDownloadFileToDownloadItem(item, NULL);
+ EXPECT_CALL(*download_file, Cancel());
MockObserver observer(item);
item->Delete(DownloadItem::DELETE_DUE_TO_BROWSER_SHUTDOWN);
@@ -345,6 +349,8 @@ TEST_F(DownloadItemTest, NotificationAfterDestroyed) {
TEST_F(DownloadItemTest, NotificationAfterRemove) {
DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
+ MockDownloadFile* download_file = AddDownloadFileToDownloadItem(item, NULL);
+ EXPECT_CALL(*download_file, Cancel());
MockObserver observer(item);
item->Remove();
@@ -357,7 +363,7 @@ TEST_F(DownloadItemTest, NotificationAfterOnContentCheckCompleted) {
DownloadItemImpl* safe_item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
MockObserver safe_observer(safe_item);
- safe_item->OnAllDataSaved(1, "");
+ safe_item->OnAllDataSaved("");
EXPECT_TRUE(safe_observer.CheckUpdated());
safe_item->OnContentCheckCompleted(
content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS);
@@ -368,7 +374,7 @@ TEST_F(DownloadItemTest, NotificationAfterOnContentCheckCompleted) {
CreateDownloadItem(DownloadItem::IN_PROGRESS);
MockObserver unsafeurl_observer(unsafeurl_item);
- unsafeurl_item->OnAllDataSaved(1, "");
+ unsafeurl_item->OnAllDataSaved("");
EXPECT_TRUE(unsafeurl_observer.CheckUpdated());
unsafeurl_item->OnContentCheckCompleted(
content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL);
@@ -381,7 +387,7 @@ TEST_F(DownloadItemTest, NotificationAfterOnContentCheckCompleted) {
CreateDownloadItem(DownloadItem::IN_PROGRESS);
MockObserver unsafefile_observer(unsafefile_item);
- unsafefile_item->OnAllDataSaved(1, "");
+ unsafefile_item->OnAllDataSaved("");
EXPECT_TRUE(unsafefile_observer.CheckUpdated());
unsafefile_item->OnContentCheckCompleted(
content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE);
@@ -392,30 +398,32 @@ TEST_F(DownloadItemTest, NotificationAfterOnContentCheckCompleted) {
}
// DownloadItemImpl::OnDownloadTargetDetermined 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, NotificationAfterOnDownloadTargetDetermined) {
DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
+ DownloadItemImplDelegate::DownloadTargetCallback callback;
+ MockDownloadFile* download_file =
+ AddDownloadFileToDownloadItem(item, &callback);
MockObserver observer(item);
FilePath target_path(kDummyPath);
FilePath intermediate_path(target_path.InsertBeforeExtensionASCII("x"));
FilePath new_intermediate_path(target_path.InsertBeforeExtensionASCII("y"));
- EXPECT_CALL(*mock_file_manager(),
- RenameDownloadFile(_,intermediate_path,false,_))
+ EXPECT_CALL(*download_file, Rename(intermediate_path, false, _))
.WillOnce(ScheduleRenameCallback(new_intermediate_path));
// Currently, a notification would be generated if the danger type is anything
// other than NOT_DANGEROUS.
- item->OnDownloadTargetDetermined(target_path,
- DownloadItem::TARGET_DISPOSITION_OVERWRITE,
- content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
- intermediate_path);
+ callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE,
+ content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path);
EXPECT_FALSE(observer.CheckUpdated());
RunAllPendingInMessageLoops();
EXPECT_TRUE(observer.CheckUpdated());
EXPECT_EQ(new_intermediate_path, item->GetFullPath());
+
+ CleanupItem(item, download_file);
}
TEST_F(DownloadItemTest, NotificationAfterTogglePause) {
@@ -431,23 +439,35 @@ TEST_F(DownloadItemTest, NotificationAfterTogglePause) {
TEST_F(DownloadItemTest, DisplayName) {
DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
+ DownloadItemImplDelegate::DownloadTargetCallback callback;
+ MockDownloadFile* download_file =
+ AddDownloadFileToDownloadItem(item, &callback);
FilePath target_path(FilePath(kDummyPath).AppendASCII("foo.bar"));
FilePath intermediate_path(target_path.InsertBeforeExtensionASCII("x"));
EXPECT_EQ(FILE_PATH_LITERAL(""),
item->GetFileNameToReportUser().value());
- EXPECT_CALL(*mock_file_manager(),
- RenameDownloadFile(_,_,false,_))
+ EXPECT_CALL(*download_file, Rename(_, false, _))
.WillOnce(ScheduleRenameCallback(intermediate_path));
- item->OnDownloadTargetDetermined(target_path,
- DownloadItem::TARGET_DISPOSITION_OVERWRITE,
- content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
- intermediate_path);
+ callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE,
+ content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path);
RunAllPendingInMessageLoops();
EXPECT_EQ(FILE_PATH_LITERAL("foo.bar"),
item->GetFileNameToReportUser().value());
item->SetDisplayName(FilePath(FILE_PATH_LITERAL("new.name")));
EXPECT_EQ(FILE_PATH_LITERAL("new.name"),
item->GetFileNameToReportUser().value());
+ CleanupItem(item, download_file);
+}
+
+// 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);
}
// Test that the delegate is invoked after the download file is renamed.
@@ -457,13 +477,15 @@ TEST_F(DownloadItemTest, DisplayName) {
// rename.
TEST_F(DownloadItemTest, CallbackAfterRename) {
DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
+ DownloadItemImplDelegate::DownloadTargetCallback callback;
+ MockDownloadFile* download_file =
+ AddDownloadFileToDownloadItem(item, &callback);
FilePath final_path(FilePath(kDummyPath).AppendASCII("foo.bar"));
FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x"));
FilePath new_intermediate_path(final_path.InsertBeforeExtensionASCII("y"));
- EXPECT_CALL(*mock_file_manager(),
- 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.
@@ -472,26 +494,16 @@ TEST_F(DownloadItemTest, CallbackAfterRename) {
AllOf(item,
Property(&DownloadItem::GetFullPath,
new_intermediate_path))));
- item->OnDownloadTargetDetermined(final_path,
- DownloadItem::TARGET_DISPOSITION_OVERWRITE,
- content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
- intermediate_path);
+ callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE,
+ content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path);
RunAllPendingInMessageLoops();
// All the callbacks should have happened by now.
- ::testing::Mock::VerifyAndClearExpectations(mock_file_manager());
+ ::testing::Mock::VerifyAndClearExpectations(download_file);
::testing::Mock::VerifyAndClearExpectations(mock_delegate());
- item->OnAllDataSaved(10, "");
- EXPECT_CALL(*mock_delegate(), ReadyForDownloadCompletion(item, _))
- .WillOnce(RunArg1Callback());
- EXPECT_CALL(*mock_delegate(), UpdatePersistence(item));
- EXPECT_CALL(*mock_file_manager(),
- RenameDownloadFile(item->GetGlobalId(),
- final_path, true, _))
+ item->OnAllDataSaved("");
+ EXPECT_CALL(*download_file, Rename(final_path, true, _))
.WillOnce(ScheduleRenameCallback(final_path));
- EXPECT_CALL(*mock_file_manager(),
- 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.
@@ -504,21 +516,26 @@ TEST_F(DownloadItemTest, CallbackAfterRename) {
EXPECT_CALL(*mock_delegate(), DownloadCompleted(item));
EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item))
.WillOnce(Return(true));
+ EXPECT_CALL(*download_file, Detach(_))
+ .WillOnce(ScheduleClosure());
item->SetIsPersisted();
item->MaybeCompleteDownload();
RunAllPendingInMessageLoops();
- ::testing::Mock::VerifyAndClearExpectations(mock_file_manager());
+ ::testing::Mock::VerifyAndClearExpectations(download_file);
::testing::Mock::VerifyAndClearExpectations(mock_delegate());
}
TEST_F(DownloadItemTest, Interrupted) {
DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
+ MockDownloadFile* download_file = AddDownloadFileToDownloadItem(item, NULL);
const content::DownloadInterruptReason reason(
content::DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED);
// Confirm interrupt sets state properly.
+ EXPECT_CALL(*download_file, Cancel());
item->Interrupt(reason);
+ RunAllPendingInMessageLoops();
EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState());
EXPECT_EQ(reason, item->GetLastReason());
@@ -531,9 +548,11 @@ TEST_F(DownloadItemTest, Interrupted) {
TEST_F(DownloadItemTest, Canceled) {
DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
+ MockDownloadFile* download_file = AddDownloadFileToDownloadItem(item, NULL);
// Confirm cancel sets state properly.
EXPECT_CALL(*mock_delegate(), DownloadStopped(item));
+ EXPECT_CALL(*download_file, Cancel());
item->Cancel(true);
EXPECT_EQ(DownloadItem::CANCELLED, item->GetState());
}
@@ -546,6 +565,86 @@ TEST_F(DownloadItemTest, FileRemoved) {
EXPECT_TRUE(item->GetFileExternallyRemoved());
}
+TEST_F(DownloadItemTest, DestinationUpdate) {
+ DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
+ base::WeakPtr<content::DownloadDestinationObserver> as_observer(
+ item->DestinationObserverAsWeakPtr());
+ 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_observer->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_observer->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);
+ MockDownloadFile* download_file = AddDownloadFileToDownloadItem(item, NULL);
+ base::WeakPtr<content::DownloadDestinationObserver> as_observer(
+ item->DestinationObserverAsWeakPtr());
+ 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));
+ EXPECT_CALL(*download_file, Cancel());
+ as_observer->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::DownloadDestinationObserver> as_observer(
+ item->DestinationObserverAsWeakPtr());
+ 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_observer->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());
+
+ as_observer->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;
}
« no previous file with comments | « content/browser/download/download_item_impl_delegate.cc ('k') | content/browser/download/download_manager_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698