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; |
} |