Index: content/browser/download/download_manager_impl_unittest.cc |
diff --git a/content/browser/download/download_manager_impl_unittest.cc b/content/browser/download/download_manager_impl_unittest.cc |
index b60024db42145854b42e0674e9a4826260d01cd1..4fe77611aca5cbacf6ec0969dc99967cc528fb3d 100644 |
--- a/content/browser/download/download_manager_impl_unittest.cc |
+++ b/content/browser/download/download_manager_impl_unittest.cc |
@@ -8,62 +8,43 @@ |
#include "base/bind.h" |
#include "base/file_util.h" |
#include "base/memory/scoped_ptr.h" |
+#include "base/memory/weak_ptr.h" |
#include "base/message_loop.h" |
-#include "base/memory/scoped_ptr.h" |
#include "base/scoped_temp_dir.h" |
#include "base/stl_util.h" |
#include "base/string16.h" |
#include "base/string_util.h" |
#include "base/utf_string_conversions.h" |
#include "build/build_config.h" |
+#include "content/browser/download/byte_stream.h" |
#include "content/browser/download/download_create_info.h" |
-#include "content/browser/download/download_file_impl.h" |
#include "content/browser/download/download_file_manager.h" |
+#include "content/browser/download/download_item_factory.h" |
#include "content/browser/download/download_manager_impl.h" |
#include "content/browser/download/download_request_handle.h" |
#include "content/browser/download/mock_download_file.h" |
-#include "content/browser/power_save_blocker.h" |
+#include "content/public/browser/browser_context.h" |
#include "content/public/browser/download_interrupt_reasons.h" |
#include "content/public/browser/download_item.h" |
#include "content/public/browser/download_manager_delegate.h" |
-#include "content/public/test/mock_download_manager.h" |
+#include "content/public/test/mock_download_item.h" |
#include "content/public/test/test_browser_context.h" |
#include "content/public/test/test_browser_thread.h" |
-#include "net/base/io_buffer.h" |
#include "net/base/net_util.h" |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gmock_mutant.h" |
#include "testing/gtest/include/gtest/gtest.h" |
-#if defined(USE_AURA) && defined(OS_WIN) |
-// http://crbug.com/105200 |
-#define MAYBE_StartDownload DISABLED_StartDownload |
-#define MAYBE_DownloadOverwriteTest DISABLED_DownloadOverwriteTest |
-#define MAYBE_DownloadRemoveTest DISABLED_DownloadRemoveTest |
-#define MAYBE_DownloadFileErrorTest DownloadFileErrorTest |
-#elif defined(OS_LINUX) |
-// http://crbug.com/110886 for Linux |
-#define MAYBE_StartDownload DISABLED_StartDownload |
-#define MAYBE_DownloadOverwriteTest DISABLED_DownloadOverwriteTest |
-#define MAYBE_DownloadRemoveTest DISABLED_DownloadRemoveTest |
-#define MAYBE_DownloadFileErrorTest DISABLED_DownloadFileErrorTest |
-#else |
-#define MAYBE_StartDownload StartDownload |
-#define MAYBE_DownloadOverwriteTest DownloadOverwriteTest |
-#define MAYBE_DownloadRemoveTest DownloadRemoveTest |
-#define MAYBE_DownloadFileErrorTest DownloadFileErrorTest |
-#endif |
- |
-using content::BrowserContext; |
-using content::BrowserThread; |
-using content::DownloadFile; |
-using content::DownloadId; |
+using ::testing::DoAll; |
+using ::testing::Ref; |
+using ::testing::Return; |
+using ::testing::ReturnRef; |
+using ::testing::SetArgPointee; |
+using ::testing::StrictMock; |
+using ::testing::_; |
using content::DownloadItem; |
using content::DownloadManager; |
using content::WebContents; |
-using ::testing::NiceMock; |
-using ::testing::ReturnRef; |
-using ::testing::Return; |
namespace content { |
class ByteStreamReader; |
@@ -71,1191 +52,526 @@ class ByteStreamReader; |
namespace { |
-FilePath GetTempDownloadPath(const FilePath& suggested_path) { |
- return FilePath(suggested_path.value() + FILE_PATH_LITERAL(".temp")); |
-} |
- |
-class MockDownloadFileFactory |
- : public DownloadFileManager::DownloadFileFactory { |
+class MockDownloadManagerDelegate : public content::DownloadManagerDelegate { |
public: |
- MockDownloadFileFactory() {} |
- |
- virtual DownloadFile* CreateFile( |
- DownloadCreateInfo* info, |
- scoped_ptr<content::ByteStreamReader> stream, |
- const DownloadRequestHandle& request_handle, |
- DownloadManager* download_manager, |
- bool calculate_hash, |
- const net::BoundNetLog& bound_net_log) OVERRIDE; |
+ MockDownloadManagerDelegate(); |
+ virtual ~MockDownloadManagerDelegate(); |
+ |
+ MOCK_METHOD0(Shutdown, void()); |
+ MOCK_METHOD0(GetNextId, content::DownloadId()); |
+ MOCK_METHOD1(ShouldStartDownload, bool(int32)); |
+ MOCK_METHOD1(ChooseDownloadPath, void(DownloadItem*)); |
+ MOCK_METHOD2(GetIntermediatePath, FilePath(const DownloadItem&, bool*)); |
+ MOCK_METHOD0(GetAlternativeWebContentsToNotifyForDownload, WebContents*()); |
+ MOCK_METHOD1(ShouldOpenFileBasedOnExtension, bool(const FilePath&)); |
+ MOCK_METHOD2(ShouldCompleteDownload, bool( |
+ DownloadItem*, const base::Closure&)); |
+ MOCK_METHOD1(ShouldOpenDownload, bool(DownloadItem*)); |
+ MOCK_METHOD0(GenerateFileHash, bool()); |
+ MOCK_METHOD1(AddItemToPersistentStore, void(DownloadItem*)); |
+ MOCK_METHOD1(UpdateItemInPersistentStore, void(DownloadItem*)); |
+ MOCK_METHOD2(UpdatePathForItemInPersistentStore, |
+ void(DownloadItem*, const FilePath&)); |
+ MOCK_METHOD1(RemoveItemFromPersistentStore, void(DownloadItem*)); |
+ MOCK_METHOD2(RemoveItemsFromPersistentStoreBetween, void( |
+ base::Time remove_begin, base::Time remove_end)); |
+ MOCK_METHOD4(GetSaveDir, void(WebContents*, FilePath*, FilePath*, bool*)); |
+ MOCK_METHOD5(ChooseSavePath, void( |
+ WebContents*, const FilePath&, const FilePath::StringType&, |
+ bool, const content::SavePackagePathPickedCallback&)); |
}; |
-DownloadFile* MockDownloadFileFactory::CreateFile( |
- DownloadCreateInfo* info, |
- scoped_ptr<content::ByteStreamReader> stream, |
- const DownloadRequestHandle& request_handle, |
- DownloadManager* download_manager, |
- bool calculate_hash, |
- const net::BoundNetLog& bound_net_log) { |
- NOTREACHED(); |
- return NULL; |
-} |
+MockDownloadManagerDelegate::MockDownloadManagerDelegate() { } |
-class TestDownloadManagerDelegate : public content::DownloadManagerDelegate { |
- public: |
- explicit TestDownloadManagerDelegate(content::DownloadManager* dm) |
- : mark_content_dangerous_(false), |
- prompt_user_for_save_location_(false), |
- should_complete_download_(true), |
- download_manager_(dm) { |
- } |
+MockDownloadManagerDelegate::~MockDownloadManagerDelegate() { } |
- void set_download_directory(const FilePath& path) { |
- download_directory_ = path; |
- } |
+class MockDownloadFileManager : public DownloadFileManager { |
+ public: |
+ MockDownloadFileManager(); |
- void set_prompt_user_for_save_location(bool value) { |
- prompt_user_for_save_location_ = value; |
- } |
+ MOCK_METHOD0(Shutdown, void()); |
+ MOCK_METHOD3(MockStartDownload, |
+ content::DownloadId(DownloadCreateInfo*, |
+ content::ByteStreamReader* stream, |
+ const DownloadRequestHandle&)); |
- virtual bool ShouldStartDownload(int32 download_id) OVERRIDE { |
- DownloadItem* item = download_manager_->GetActiveDownloadItem(download_id); |
- FilePath path = net::GenerateFileName(item->GetURL(), |
- item->GetContentDisposition(), |
- item->GetReferrerCharset(), |
- item->GetSuggestedFilename(), |
- item->GetMimeType(), |
- std::string()); |
- DownloadItem::TargetDisposition disposition = item->GetTargetDisposition(); |
- if (!ShouldOpenFileBasedOnExtension(path) && prompt_user_for_save_location_) |
- disposition = DownloadItem::TARGET_DISPOSITION_PROMPT; |
- item->OnTargetPathDetermined(download_directory_.Append(path), |
- disposition, |
- content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
- return true; |
- } |
+ virtual content::DownloadId StartDownload( |
+ scoped_ptr<DownloadCreateInfo> info, |
+ scoped_ptr<content::ByteStreamReader> stream, |
+ const DownloadRequestHandle& request_handle) OVERRIDE { |
+ return MockStartDownload(info.get(), stream.get(), request_handle); |
+ } |
+ |
+ MOCK_METHOD1(CancelDownload, void(content::DownloadId)); |
+ MOCK_METHOD1(CompleteDownload, void(content::DownloadId)); |
+ MOCK_METHOD1(OnDownloadManagerShutdown, void(content::DownloadManager*)); |
+ MOCK_METHOD4(RenameInProgressDownloadFile, |
+ void(content::DownloadId, |
+ const FilePath&, |
+ bool, |
+ const RenameCompletionCallback&)); |
+ MOCK_METHOD4(RenameCompletingDownloadFile, |
+ void(content::DownloadId, |
+ const FilePath&, |
+ bool, |
+ const RenameCompletionCallback&)); |
+ MOCK_CONST_METHOD0(NumberOfActiveDownloads, int()); |
+ protected: |
+ virtual ~MockDownloadFileManager(); |
+}; |
- virtual FilePath GetIntermediatePath(const DownloadItem& item, |
- bool* ok_to_overwrite) OVERRIDE { |
- if (intermediate_path_.empty()) { |
- *ok_to_overwrite = true; |
- return GetTempDownloadPath(item.GetTargetFilePath()); |
- } else { |
- *ok_to_overwrite = overwrite_intermediate_path_; |
- return intermediate_path_; |
- } |
- } |
+MockDownloadFileManager::MockDownloadFileManager() |
+ : DownloadFileManager(NULL) { } |
- virtual void ChooseDownloadPath(DownloadItem* item) OVERRIDE { |
- if (!expected_suggested_path_.empty()) { |
- EXPECT_STREQ(expected_suggested_path_.value().c_str(), |
- item->GetTargetFilePath().value().c_str()); |
- } |
- if (file_selection_response_.empty()) { |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&DownloadManager::FileSelectionCanceled, |
- download_manager_, |
- item->GetId())); |
- } else { |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&DownloadManager::FileSelected, |
- download_manager_, |
- file_selection_response_, |
- item->GetId())); |
- } |
- expected_suggested_path_.clear(); |
- file_selection_response_.clear(); |
- } |
+MockDownloadFileManager::~MockDownloadFileManager() { } |
- virtual bool ShouldOpenFileBasedOnExtension(const FilePath& path) OVERRIDE { |
- return path.Extension() == FilePath::StringType(FILE_PATH_LITERAL(".pdf")); |
- } |
+class MockDownloadItemFactory |
+ : public content::DownloadItemFactory, |
+ public base::SupportsWeakPtr<MockDownloadItemFactory> { |
+ public: |
+ MockDownloadItemFactory(); |
+ virtual ~MockDownloadItemFactory(); |
- virtual void AddItemToPersistentStore(DownloadItem* item) OVERRIDE { |
- static int64 db_handle = DownloadItem::kUninitializedHandle; |
- download_manager_->OnItemAddedToPersistentStore(item->GetId(), --db_handle); |
- } |
+ // Access to map of created items. |
+ // TODO(rdsmith): Could add type (save page, persisted, etc.) |
+ // functionality if it's ever needed by consumers. |
- void SetFileSelectionExpectation(const FilePath& suggested_path, |
- const FilePath& response) { |
- expected_suggested_path_ = suggested_path; |
- file_selection_response_ = response; |
- } |
+ // Returns NULL if no item of that id is present. |
+ content::MockDownloadItem* GetItem(int id); |
- void SetMarkContentsDangerous(bool dangerous) { |
- mark_content_dangerous_ = dangerous; |
- } |
+ // Remove and return an item made by the factory. |
+ // Generally used during teardown. |
+ content::MockDownloadItem* PopItem(); |
- void SetIntermediatePath(const FilePath& intermediate_path, |
- bool overwrite_intermediate_path) { |
- intermediate_path_ = intermediate_path; |
- overwrite_intermediate_path_ = overwrite_intermediate_path; |
- } |
+ // Should be called when the item of this id is removed so that |
+ // we don't keep dangling pointers. |
+ void RemoveItem(int id); |
- void SetShouldCompleteDownload(bool value) { |
- should_complete_download_ = value; |
- } |
- |
- void InvokeDownloadCompletionCallback() { |
- EXPECT_FALSE(download_completion_callback_.is_null()); |
- download_completion_callback_.Run(); |
- download_completion_callback_.Reset(); |
- } |
- |
- virtual bool ShouldCompleteDownload( |
- DownloadItem* item, |
- const base::Closure& complete_callback) OVERRIDE { |
- download_completion_callback_ = complete_callback; |
- if (mark_content_dangerous_) { |
- CHECK(!complete_callback.is_null()); |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&TestDownloadManagerDelegate::MarkContentDangerous, |
- base::Unretained(this), item->GetId())); |
- mark_content_dangerous_ = false; |
- return false; |
- } else { |
- return should_complete_download_; |
- } |
- } |
+ // Overridden methods from DownloadItemFactory. |
+ virtual content::DownloadItem* CreatePersistedItem( |
+ DownloadItemImpl::Delegate* delegate, |
+ content::DownloadId download_id, |
+ const content::DownloadPersistentStoreInfo& info, |
+ const net::BoundNetLog& bound_net_log) OVERRIDE; |
+ virtual content::DownloadItem* CreateActiveItem( |
+ DownloadItemImpl::Delegate* delegate, |
+ const DownloadCreateInfo& info, |
+ DownloadRequestHandleInterface* request_handle, |
+ bool is_otr, |
+ const net::BoundNetLog& bound_net_log) OVERRIDE; |
+ virtual content::DownloadItem* CreateSavePageItem( |
+ DownloadItemImpl::Delegate* delegate, |
+ const FilePath& path, |
+ const GURL& url, |
+ bool is_otr, |
+ content::DownloadId download_id, |
+ const std::string& mime_type, |
+ const net::BoundNetLog& bound_net_log) OVERRIDE; |
private: |
- void MarkContentDangerous( |
- int32 download_id) { |
- DownloadItem* item = download_manager_->GetActiveDownloadItem(download_id); |
- if (!item) |
- return; |
- item->OnContentCheckCompleted( |
- content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT); |
- InvokeDownloadCompletionCallback(); |
- } |
+ std::map<int32, content::MockDownloadItem*> items_; |
- FilePath download_directory_; |
- FilePath expected_suggested_path_; |
- FilePath file_selection_response_; |
- FilePath intermediate_path_; |
- bool overwrite_intermediate_path_; |
- bool mark_content_dangerous_; |
- bool prompt_user_for_save_location_; |
- bool should_complete_download_; |
- DownloadManager* download_manager_; |
- base::Closure download_completion_callback_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TestDownloadManagerDelegate); |
+ DISALLOW_COPY_AND_ASSIGN(MockDownloadItemFactory); |
}; |
-} // namespace |
+MockDownloadItemFactory::MockDownloadItemFactory() {} |
-class DownloadManagerTest : public testing::Test { |
- public: |
- static const char* kTestData; |
- static const size_t kTestDataLen; |
+MockDownloadItemFactory::~MockDownloadItemFactory() {} |
- DownloadManagerTest() |
- : browser_context(new content::TestBrowserContext()), |
- download_manager_(new DownloadManagerImpl(NULL)), |
- ui_thread_(BrowserThread::UI, &message_loop_), |
- file_thread_(BrowserThread::FILE, &message_loop_) { |
- download_manager_delegate_.reset( |
- new TestDownloadManagerDelegate(download_manager_.get())); |
- download_manager_->SetDelegate(download_manager_delegate_.get()); |
- download_manager_->Init(browser_context.get()); |
- } |
+content::MockDownloadItem* MockDownloadItemFactory::GetItem(int id) { |
+ if (items_.find(id) == items_.end()) |
+ return NULL; |
+ return items_[id]; |
+} |
- ~DownloadManagerTest() { |
- download_manager_->Shutdown(); |
- // browser_context must outlive download_manager_, so we explicitly delete |
- // download_manager_ first. |
- download_manager_ = NULL; |
- download_manager_delegate_.reset(); |
- browser_context.reset(NULL); |
- message_loop_.RunAllPending(); |
- } |
+content::MockDownloadItem* MockDownloadItemFactory::PopItem() { |
+ if (items_.empty()) |
+ return NULL; |
- // Create a temporary directory as the downloads directory. |
- bool CreateTempDownloadsDirectory() { |
- if (!scoped_download_dir_.CreateUniqueTempDir()) |
- return false; |
- download_manager_delegate_->set_download_directory( |
- scoped_download_dir_.path()); |
- return true; |
- } |
+ std::map<int32, content::MockDownloadItem*>::iterator first_item |
+ = items_.begin(); |
+ content::MockDownloadItem* result = first_item->second; |
+ items_.erase(first_item); |
+ return result; |
+} |
- void AddDownloadToFileManager(DownloadId id, DownloadFile* download_file) { |
- file_manager()->downloads_[id] = |
- download_file; |
- } |
+void MockDownloadItemFactory::RemoveItem(int id) { |
+ DCHECK(items_.find(id) != items_.end()); |
+ items_.erase(id); |
+} |
- void AddMockDownloadToFileManager(DownloadId id, |
- MockDownloadFile* download_file) { |
- AddDownloadToFileManager(id, download_file); |
- EXPECT_CALL(*download_file, GetDownloadManager()) |
- .WillRepeatedly(Return(download_manager_)); |
- } |
+content::DownloadItem* MockDownloadItemFactory::CreatePersistedItem( |
+ DownloadItemImpl::Delegate* delegate, |
+ content::DownloadId download_id, |
+ const content::DownloadPersistentStoreInfo& info, |
+ const net::BoundNetLog& bound_net_log) { |
+ int local_id = download_id.local(); |
+ DCHECK(items_.find(local_id) == items_.end()); |
- void OnResponseCompleted(DownloadId download_id, int64 size, |
- const std::string& hash) { |
- download_manager_->OnResponseCompleted(download_id.local(), size, hash); |
- } |
+ content::MockDownloadItem* result = |
+ new StrictMock<content::MockDownloadItem>; |
+ EXPECT_CALL(*result, GetId()) |
+ .WillRepeatedly(Return(local_id)); |
+ items_[local_id] = result; |
- void ContinueDownloadWithPath(DownloadItem* download, const FilePath& path) { |
- download->OnTargetPathDetermined( |
- path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
- content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
- download_manager_->OnTargetPathAvailable(download); |
- } |
+ return result; |
+} |
- void OnDownloadInterrupted(DownloadId download_id, int64 size, |
- const std::string& hash_state, |
- content::DownloadInterruptReason reason) { |
- download_manager_->OnDownloadInterrupted(download_id.local(), size, |
- hash_state, reason); |
- } |
+content::DownloadItem* MockDownloadItemFactory::CreateActiveItem( |
+ DownloadItemImpl::Delegate* delegate, |
+ const DownloadCreateInfo& info, |
+ DownloadRequestHandleInterface* request_handle, |
+ bool is_otr, |
+ const net::BoundNetLog& bound_net_log) { |
+ int local_id = info.download_id.local(); |
+ DCHECK(items_.find(local_id) == items_.end()); |
- // Get the download item with ID |id|. |
- DownloadItem* GetActiveDownloadItem(DownloadId id) { |
- return download_manager_->GetActiveDownload(id.local()); |
- } |
+ content::MockDownloadItem* result = |
+ new StrictMock<content::MockDownloadItem>; |
+ EXPECT_CALL(*result, GetId()) |
+ .WillRepeatedly(Return(local_id)); |
+ items_[local_id] = result; |
- FilePath GetPathInDownloadsDir(const FilePath::StringType& fragment) { |
- DCHECK(scoped_download_dir_.IsValid()); |
- FilePath full_path(scoped_download_dir_.path().Append(fragment)); |
- return full_path.NormalizePathSeparators(); |
- } |
+ return result; |
+} |
- protected: |
- scoped_ptr<content::TestBrowserContext> browser_context; |
- scoped_ptr<TestDownloadManagerDelegate> download_manager_delegate_; |
- scoped_refptr<DownloadManagerImpl> download_manager_; |
- scoped_refptr<DownloadFileManager> file_manager_; |
- MessageLoopForUI message_loop_; |
- content::TestBrowserThread ui_thread_; |
- content::TestBrowserThread file_thread_; |
- ScopedTempDir scoped_download_dir_; |
+content::DownloadItem* MockDownloadItemFactory::CreateSavePageItem( |
+ DownloadItemImpl::Delegate* delegate, |
+ const FilePath& path, |
+ const GURL& url, |
+ bool is_otr, |
+ content::DownloadId download_id, |
+ const std::string& mime_type, |
+ const net::BoundNetLog& bound_net_log) { |
+ int local_id = download_id.local(); |
+ DCHECK(items_.find(local_id) == items_.end()); |
- DownloadFileManager* file_manager() { |
- if (!file_manager_) { |
- file_manager_ = new DownloadFileManager(new MockDownloadFileFactory); |
- download_manager_->SetFileManagerForTesting(file_manager_); |
- } |
- return file_manager_; |
- } |
+ content::MockDownloadItem* result = |
+ new StrictMock<content::MockDownloadItem>; |
+ EXPECT_CALL(*result, GetId()) |
+ .WillRepeatedly(Return(local_id)); |
+ items_[local_id] = result; |
- DISALLOW_COPY_AND_ASSIGN(DownloadManagerTest); |
+ return result; |
+} |
+ |
+class MockBrowserContext : public content::BrowserContext { |
+ public: |
+ MockBrowserContext() { } |
+ ~MockBrowserContext() { } |
+ |
+ MOCK_METHOD0(GetPath, FilePath()); |
+ MOCK_CONST_METHOD0(IsOffTheRecord, bool()); |
+ MOCK_METHOD0(GetRequestContext, net::URLRequestContextGetter*()); |
+ MOCK_METHOD1(GetRequestContextForRenderProcess, |
+ net::URLRequestContextGetter*(int renderer_child_id)); |
+ MOCK_METHOD0(GetRequestContextForMedia, net::URLRequestContextGetter*()); |
+ MOCK_METHOD0(GetResourceContext, content::ResourceContext*()); |
+ MOCK_METHOD0(GetDownloadManagerDelegate, content::DownloadManagerDelegate*()); |
+ MOCK_METHOD0(GetGeolocationPermissionContext, |
+ content::GeolocationPermissionContext* ()); |
+ MOCK_METHOD0(GetSpeechRecognitionPreferences, |
+ content::SpeechRecognitionPreferences* ()); |
+ MOCK_METHOD0(DidLastSessionExitCleanly, bool()); |
+ MOCK_METHOD0(GetSpecialStoragePolicy, quota::SpecialStoragePolicy*()); |
}; |
-const char* DownloadManagerTest::kTestData = "a;sdlfalsdfjalsdkfjad"; |
-const size_t DownloadManagerTest::kTestDataLen = |
- strlen(DownloadManagerTest::kTestData); |
+} // namespace |
-// A DownloadFile that we can inject errors into. |
-class DownloadFileWithErrors : public DownloadFileImpl { |
+class DownloadManagerTest : public testing::Test { |
public: |
- DownloadFileWithErrors(DownloadCreateInfo* info, |
- scoped_ptr<content::ByteStreamReader> stream, |
- DownloadManager* manager, |
- bool calculate_hash); |
- virtual ~DownloadFileWithErrors() {} |
- |
- // BaseFile delegated functions. |
- virtual net::Error Initialize() OVERRIDE; |
- virtual net::Error AppendDataToFile(const char* data, |
- size_t data_len) OVERRIDE; |
- virtual net::Error Rename(const FilePath& full_path) OVERRIDE; |
- |
- void set_forced_error(net::Error error) { forced_error_ = error; } |
- void clear_forced_error() { forced_error_ = net::OK; } |
- net::Error forced_error() const { return forced_error_; } |
+ static const char* kTestData; |
+ static const size_t kTestDataLen; |
- private: |
- net::Error ReturnError(net::Error function_error) { |
- if (forced_error_ != net::OK) { |
- net::Error ret = forced_error_; |
- clear_forced_error(); |
- return ret; |
+ DownloadManagerTest() |
+ : ui_thread_(content::BrowserThread::UI, &message_loop_), |
+ file_thread_(content::BrowserThread::FILE, &message_loop_), |
+ next_download_id_(0) { |
+ } |
+ |
+ // We tear down everything in TearDown(). |
+ ~DownloadManagerTest() {} |
+ |
+ // Create a MockDownloadItemFactory, MockDownloadManagerDelegate, |
+ // and MockDownloadFileManager, then create a DownloadManager that points |
+ // at all of those. |
+ virtual void SetUp() { |
+ DCHECK(!download_manager_.get()); |
+ |
+ mock_download_item_factory_ = (new MockDownloadItemFactory())->AsWeakPtr(); |
+ mock_download_manager_delegate_.reset( |
+ new StrictMock<MockDownloadManagerDelegate>); |
+ EXPECT_CALL(*mock_download_manager_delegate_.get(), Shutdown()) |
+ .WillOnce(Return()); |
+ mock_download_file_manager_ = new StrictMock<MockDownloadFileManager>; |
+ EXPECT_CALL(*mock_download_file_manager_.get(), |
+ OnDownloadManagerShutdown(_)); |
+ mock_browser_context_.reset(new StrictMock<MockBrowserContext>); |
+ EXPECT_CALL(*mock_browser_context_.get(), IsOffTheRecord()) |
+ .WillRepeatedly(Return(false)); |
+ |
+ download_manager_ = new DownloadManagerImpl( |
+ mock_download_file_manager_.get(), |
+ scoped_ptr<content::DownloadItemFactory>( |
+ mock_download_item_factory_.get()).Pass(), NULL); |
+ download_manager_->SetDelegate(mock_download_manager_delegate_.get()); |
+ download_manager_->Init(mock_browser_context_.get()); |
+ } |
+ |
+ virtual void TearDown() { |
+ while (content::MockDownloadItem* |
+ item = mock_download_item_factory_->PopItem()) { |
+ EXPECT_CALL(*item, GetSafetyState()) |
+ .WillOnce(Return(content::DownloadItem::SAFE)); |
+ EXPECT_CALL(*item, IsPartialDownload()) |
+ .WillOnce(Return(false)); |
} |
- return function_error; |
+ download_manager_->Shutdown(); |
+ download_manager_ = NULL; |
+ message_loop_.RunAllPending(); |
+ ASSERT_EQ(NULL, mock_download_item_factory_.get()); |
+ message_loop_.RunAllPending(); |
+ mock_download_manager_delegate_.reset(); |
+ mock_download_file_manager_ = NULL; |
+ mock_browser_context_.reset(); |
} |
- net::Error forced_error_; |
-}; |
- |
-DownloadFileWithErrors::DownloadFileWithErrors( |
- DownloadCreateInfo* info, |
- scoped_ptr<content::ByteStreamReader> stream, |
- DownloadManager* manager, |
- bool calculate_hash) |
- : DownloadFileImpl(info, |
- stream.Pass(), |
- new DownloadRequestHandle(), |
- manager, |
- calculate_hash, |
- scoped_ptr<content::PowerSaveBlocker>(NULL).Pass(), |
- net::BoundNetLog()), |
- forced_error_(net::OK) { |
-} |
+ // Returns download id. |
+ content::MockDownloadItem& AddItemToManager() { |
+ DownloadCreateInfo info; |
+ DownloadRequestHandle handle; |
-net::Error DownloadFileWithErrors::Initialize() { |
- return ReturnError(DownloadFileImpl::Initialize()); |
-} |
+ static const char* kDownloadIdDomain = "Test download id domain"; |
-net::Error DownloadFileWithErrors::AppendDataToFile(const char* data, |
- size_t data_len) { |
- return ReturnError(DownloadFileImpl::AppendDataToFile(data, data_len)); |
-} |
+ // Args are ignored except for download id, so everything else can be |
+ // null. |
+ int id = next_download_id_; |
+ ++next_download_id_; |
+ info.download_id = content::DownloadId(kDownloadIdDomain, id); |
+ download_manager_->CreateDownloadItem(&info, handle); |
-net::Error DownloadFileWithErrors::Rename(const FilePath& full_path) { |
- return ReturnError(DownloadFileImpl::Rename(full_path)); |
-} |
+ DCHECK(mock_download_item_factory_->GetItem(id)); |
+ content::MockDownloadItem& item(*mock_download_item_factory_->GetItem(id)); |
+ ON_CALL(item, GetId()) |
+ .WillByDefault(Return(id)); |
-namespace { |
+ return item; |
+ } |
-const struct { |
- const char* url; |
- const char* mime_type; |
- bool save_as; |
- bool prompt_for_download; |
- bool expected_save_as; |
-} kStartDownloadCases[] = { |
- { "http://www.foo.com/dont-open.html", |
- "text/html", |
- false, |
- false, |
- false, }, |
- { "http://www.foo.com/save-as.html", |
- "text/html", |
- true, |
- false, |
- true, }, |
- { "http://www.foo.com/always-prompt.html", |
- "text/html", |
- false, |
- true, |
- true, }, |
- { "http://www.foo.com/user-script-text-html-mimetype.user.js", |
- "text/html", |
- false, |
- false, |
- false, }, |
- { "http://www.foo.com/extensionless-extension", |
- "application/x-chrome-extension", |
- true, |
- false, |
- true, }, |
- { "http://www.foo.com/save-as.pdf", |
- "application/pdf", |
- true, |
- false, |
- true, }, |
- { "http://www.foo.com/sometimes_prompt.pdf", |
- "application/pdf", |
- false, |
- true, |
- false, }, |
- { "http://www.foo.com/always_prompt.jar", |
- "application/jar", |
- false, |
- true, |
- true, }, |
-}; |
+ content::MockDownloadItem& GetMockDownloadItem(int id) { |
+ content::MockDownloadItem* itemp = mock_download_item_factory_->GetItem(id); |
-// This is an observer that records what download IDs have opened a select |
-// file dialog. |
-class SelectFileObserver : public DownloadManager::Observer { |
- public: |
- explicit SelectFileObserver(DownloadManager* download_manager) |
- : download_manager_(download_manager) { |
- DCHECK(download_manager_.get()); |
- download_manager_->AddObserver(this); |
+ DCHECK(itemp); |
+ return *itemp; |
} |
- ~SelectFileObserver() { |
- download_manager_->RemoveObserver(this); |
+ void RemoveMockDownloadItem(int id) { |
+ // Owned by DownloadManager; should be deleted there. |
+ mock_download_item_factory_->RemoveItem(id); |
} |
- // Downloadmanager::Observer functions. |
- virtual void ModelChanged(DownloadManager* manager) OVERRIDE {} |
- virtual void ManagerGoingDown(DownloadManager* manager) OVERRIDE {} |
- virtual void SelectFileDialogDisplayed( |
- DownloadManager* manager, int32 id) OVERRIDE { |
- file_dialog_ids_.insert(id); |
+ MockDownloadManagerDelegate& GetMockDownloadManagerDelegate() { |
+ return *mock_download_manager_delegate_; |
} |
- bool ShowedFileDialogForId(int32 id) { |
- return file_dialog_ids_.find(id) != file_dialog_ids_.end(); |
+ MockDownloadFileManager& GetMockDownloadFileManager() { |
+ return *mock_download_file_manager_; |
} |
- private: |
- std::set<int32> file_dialog_ids_; |
- scoped_refptr<DownloadManager> download_manager_; |
-}; |
- |
-// This observer tracks the progress of |DownloadItem|s. |
-class ItemObserver : public DownloadItem::Observer { |
- public: |
- explicit ItemObserver(DownloadItem* tracked) |
- : tracked_(tracked), states_hit_(0), |
- was_updated_(false), was_opened_(false) { |
- DCHECK(tracked_); |
- tracked_->AddObserver(this); |
- // Record the initial state. |
- OnDownloadUpdated(tracked_); |
- } |
- ~ItemObserver() { |
- tracked_->RemoveObserver(this); |
+ // Probe at private internals. |
+ DownloadItem* GetActiveDownloadItem(int32 id) { |
+ return download_manager_->GetActiveDownload(id); |
} |
- bool hit_state(int state) const { |
- return (1 << state) & states_hit_; |
- } |
- bool was_updated() const { return was_updated_; } |
- bool was_opened() const { return was_opened_; } |
+ void AddItemToHistory(content::MockDownloadItem& item, int64 db_handle) { |
+ // For DCHECK in AddDownloadItemToHistory. Don't want to use |
+ // WillRepeatedly as it may have to return true after this. |
+ if (DCHECK_IS_ON()) |
+ EXPECT_CALL(item, IsPersisted()) |
+ .WillOnce(Return(false)); |
- private: |
- // DownloadItem::Observer methods |
- virtual void OnDownloadUpdated(DownloadItem* download) OVERRIDE { |
- DCHECK_EQ(tracked_, download); |
- states_hit_ |= (1 << download->GetState()); |
- was_updated_ = true; |
- } |
- virtual void OnDownloadOpened(DownloadItem* download) OVERRIDE{ |
- DCHECK_EQ(tracked_, download); |
- states_hit_ |= (1 << download->GetState()); |
- was_opened_ = true; |
- } |
+ EXPECT_CALL(item, SetDbHandle(db_handle)); |
+ EXPECT_CALL(item, SetIsPersisted()); |
+ EXPECT_CALL(item, GetDbHandle()) |
+ .WillRepeatedly(Return(db_handle)); |
- DownloadItem* tracked_; |
- int states_hit_; |
- bool was_updated_; |
- bool was_opened_; |
-}; |
+ // Null out ShowDownloadInBrowser |
+ EXPECT_CALL(item, GetWebContents()) |
+ .WillOnce(Return(static_cast<WebContents*>(NULL))); |
+ EXPECT_CALL(GetMockDownloadManagerDelegate(), |
+ GetAlternativeWebContentsToNotifyForDownload()) |
+ .WillOnce(Return(static_cast<WebContents*>(NULL))); |
-} // namespace |
- |
-TEST_F(DownloadManagerTest, MAYBE_StartDownload) { |
- content::TestBrowserThread io_thread(BrowserThread::IO, &message_loop_); |
- ASSERT_TRUE(CreateTempDownloadsDirectory()); |
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kStartDownloadCases); ++i) { |
- DVLOG(1) << "Test case " << i; |
- download_manager_delegate_->set_prompt_user_for_save_location( |
- kStartDownloadCases[i].prompt_for_download); |
- |
- SelectFileObserver observer(download_manager_); |
- // Normally, the download system takes ownership of info, and is |
- // responsible for deleting it. In these unit tests, however, we |
- // don't call the function that deletes it, so we do so ourselves. |
- scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
- info->prompt_user_for_save_location = kStartDownloadCases[i].save_as; |
- info->url_chain.push_back(GURL(kStartDownloadCases[i].url)); |
- info->mime_type = kStartDownloadCases[i].mime_type; |
- download_manager_->CreateDownloadItem(info.get(), DownloadRequestHandle()); |
- |
- scoped_ptr<content::ByteStreamWriter> stream_writer; |
- scoped_ptr<content::ByteStreamReader> stream_reader; |
- content::CreateByteStream(message_loop_.message_loop_proxy(), |
- message_loop_.message_loop_proxy(), |
- kTestDataLen, &stream_writer, &stream_reader); |
- |
- DownloadFile* download_file( |
- new DownloadFileImpl(info.get(), |
- stream_reader.Pass(), |
- new DownloadRequestHandle(), |
- download_manager_, false, |
- scoped_ptr<content::PowerSaveBlocker>(NULL).Pass(), |
- net::BoundNetLog())); |
- AddDownloadToFileManager(info->download_id, download_file); |
- download_file->Initialize(); |
- download_manager_->StartDownload(info->download_id.local()); |
- message_loop_.RunAllPending(); |
+ EXPECT_CALL(item, IsInProgress()) |
+ .WillOnce(Return(true)); |
- // SelectFileObserver will have recorded any attempt to open the |
- // select file dialog. |
- // Note that DownloadManager::FileSelectionCanceled() is never called. |
- EXPECT_EQ(kStartDownloadCases[i].expected_save_as, |
- observer.ShowedFileDialogForId(info->download_id.local())); |
+ // Null out MaybeCompleteDownload |
+ EXPECT_CALL(item, AllDataSaved()) |
+ .WillOnce(Return(false)); |
- file_manager()->CancelDownload(info->download_id); |
+ download_manager_->OnItemAddedToPersistentStore(item.GetId(), db_handle); |
} |
-} |
- |
-namespace { |
-enum OverwriteDownloadPath { |
- DONT_OVERWRITE, |
- OVERWRITE |
-}; |
+ protected: |
+ // Key test variable; we'll keep it available to sub-classes. |
+ scoped_refptr<DownloadManagerImpl> download_manager_; |
-enum ResponseCompletionTime { |
- COMPLETES_BEFORE_RENAME, |
- COMPLETES_AFTER_RENAME |
-}; |
+ private: |
+ MessageLoopForUI message_loop_; |
+ content::TestBrowserThread ui_thread_; |
+ content::TestBrowserThread file_thread_; |
+ base::WeakPtr<MockDownloadItemFactory> mock_download_item_factory_; |
+ scoped_ptr<MockDownloadManagerDelegate> mock_download_manager_delegate_; |
+ scoped_refptr<MockDownloadFileManager> mock_download_file_manager_; |
+ scoped_ptr<MockBrowserContext> mock_browser_context_; |
+ int next_download_id_; |
-// Test cases to be used with DownloadFilenameTest. The paths are relative to |
-// the temporary downloads directory used for testing. |
-const struct DownloadFilenameTestCase { |
- // DownloadItem properties prior to calling RestartDownload(). |
- const FilePath::CharType* target_path; |
- DownloadItem::TargetDisposition target_disposition; |
- |
- // If we receive a ChooseDownloadPath() call to prompt the user for a download |
- // location, |expected_prompt_path| is the expected prompt path. The |
- // TestDownloadManagerDelegate will respond with |chosen_path|. If |
- // |chosen_path| is empty, then the file choose dialog be cancelled. |
- const FilePath::CharType* expected_prompt_path; |
- const FilePath::CharType* chosen_path; |
- |
- // Response to GetIntermediatePath(). If |intermediate_path| is empty, then a |
- // temporary path is constructed with |
- // GetTempDownloadPath(item->GetTargetFilePath()). |
- const FilePath::CharType* intermediate_path; |
- OverwriteDownloadPath overwrite_intermediate_path; |
- |
- // Determines when OnResponseCompleted() is called. If this is |
- // COMPLETES_BEFORE_RENAME, then the response completes before the filename is |
- // determines. |
- ResponseCompletionTime completion; |
- |
- // The expected intermediate path for the download. |
- const FilePath::CharType* expected_intermediate_path; |
- |
- // The expected final path for the download. |
- const FilePath::CharType* expected_final_path; |
-} kDownloadFilenameTestCases[] = { |
- |
-#define TARGET FILE_PATH_LITERAL |
-#define INTERMEDIATE FILE_PATH_LITERAL |
-#define EXPECTED_PROMPT FILE_PATH_LITERAL |
-#define PROMPT_RESPONSE FILE_PATH_LITERAL |
-#define EXPECTED_INTERMEDIATE FILE_PATH_LITERAL |
-#define EXPECTED_FINAL FILE_PATH_LITERAL |
- |
- { |
- // 0: No prompting. |
- TARGET("foo.txt"), |
- DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
- |
- EXPECTED_PROMPT(""), |
- PROMPT_RESPONSE(""), |
- |
- INTERMEDIATE("foo.txt.intermediate"), |
- OVERWRITE, |
- |
- COMPLETES_AFTER_RENAME, |
- EXPECTED_INTERMEDIATE("foo.txt.intermediate"), |
- EXPECTED_FINAL("foo.txt"), |
- }, |
- { |
- // 1: With prompting. No rename. |
- TARGET("foo.txt"), |
- DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
- |
- EXPECTED_PROMPT("foo.txt"), |
- PROMPT_RESPONSE("foo.txt"), |
- |
- INTERMEDIATE("foo.txt.intermediate"), |
- OVERWRITE, |
- |
- COMPLETES_AFTER_RENAME, |
- EXPECTED_INTERMEDIATE("foo.txt.intermediate"), |
- EXPECTED_FINAL("foo.txt"), |
- }, |
- { |
- // 2: With prompting. Download is renamed. |
- TARGET("foo.txt"), |
- DownloadItem::TARGET_DISPOSITION_PROMPT, |
- |
- EXPECTED_PROMPT("foo.txt"), |
- PROMPT_RESPONSE("bar.txt"), |
- |
- INTERMEDIATE("bar.txt.intermediate"), |
- OVERWRITE, |
- |
- COMPLETES_AFTER_RENAME, |
- EXPECTED_INTERMEDIATE("bar.txt.intermediate"), |
- EXPECTED_FINAL("bar.txt"), |
- }, |
- { |
- // 3: With prompting. Download path is changed. |
- TARGET("foo.txt"), |
- DownloadItem::TARGET_DISPOSITION_PROMPT, |
- |
- EXPECTED_PROMPT("foo.txt"), |
- PROMPT_RESPONSE("Foo/bar.txt"), |
- |
- INTERMEDIATE("Foo/bar.txt.intermediate"), |
- OVERWRITE, |
- |
- COMPLETES_AFTER_RENAME, |
- EXPECTED_INTERMEDIATE("Foo/bar.txt.intermediate"), |
- EXPECTED_FINAL("Foo/bar.txt"), |
- }, |
- { |
- // 4: No prompting. Intermediate path exists. Doesn't overwrite |
- // intermediate path. |
- TARGET("exists.png"), |
- DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
- |
- EXPECTED_PROMPT(""), |
- PROMPT_RESPONSE(""), |
- |
- INTERMEDIATE("exists.png.temp"), |
- DONT_OVERWRITE, |
- |
- COMPLETES_AFTER_RENAME, |
- EXPECTED_INTERMEDIATE("exists.png (1).temp"), |
- EXPECTED_FINAL("exists.png"), |
- }, |
- { |
- // 5: No prompting. Intermediate path exists. Overwrites. |
- TARGET("exists.png"), |
- DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
- |
- EXPECTED_PROMPT(""), |
- PROMPT_RESPONSE(""), |
- |
- INTERMEDIATE("exists.png.temp"), |
- OVERWRITE, |
- |
- COMPLETES_AFTER_RENAME, |
- EXPECTED_INTERMEDIATE("exists.png.temp"), |
- EXPECTED_FINAL("exists.png"), |
- }, |
- { |
- // 6: No prompting. Final path exists. Doesn't overwrite. |
- TARGET("exists.txt"), |
- DownloadItem::TARGET_DISPOSITION_UNIQUIFY, |
- |
- EXPECTED_PROMPT(""), |
- PROMPT_RESPONSE(""), |
- |
- INTERMEDIATE("exists.txt.temp"), |
- OVERWRITE, |
- |
- COMPLETES_AFTER_RENAME, |
- EXPECTED_INTERMEDIATE("exists.txt.temp"), |
- EXPECTED_FINAL("exists (1).txt"), |
- }, |
- { |
- // 7: No prompting. Final path exists. Overwrites. |
- TARGET("exists.txt"), |
- DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
- |
- EXPECTED_PROMPT(""), |
- PROMPT_RESPONSE(""), |
- |
- INTERMEDIATE("exists.txt.temp"), |
- OVERWRITE, |
- |
- COMPLETES_AFTER_RENAME, |
- EXPECTED_INTERMEDIATE("exists.txt.temp"), |
- EXPECTED_FINAL("exists.txt"), |
- }, |
- { |
- // 8: No prompting. Response completes before filename determination. |
- TARGET("foo.txt"), |
- DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
- |
- EXPECTED_PROMPT(""), |
- PROMPT_RESPONSE(""), |
- |
- INTERMEDIATE("foo.txt.intermediate"), |
- OVERWRITE, |
- |
- COMPLETES_BEFORE_RENAME, |
- EXPECTED_INTERMEDIATE("foo.txt.intermediate"), |
- EXPECTED_FINAL("foo.txt"), |
- }, |
- { |
- // 9: With prompting. Download path is changed. Response completes before |
- // filename determination. |
- TARGET("foo.txt"), |
- DownloadItem::TARGET_DISPOSITION_PROMPT, |
- |
- EXPECTED_PROMPT("foo.txt"), |
- PROMPT_RESPONSE("Foo/bar.txt"), |
- |
- INTERMEDIATE("Foo/bar.txt.intermediate"), |
- OVERWRITE, |
- |
- COMPLETES_BEFORE_RENAME, |
- EXPECTED_INTERMEDIATE("Foo/bar.txt.intermediate"), |
- EXPECTED_FINAL("Foo/bar.txt"), |
- }, |
- |
-#undef TARGET |
-#undef INTERMEDIATE |
-#undef EXPECTED_PROMPT |
-#undef PROMPT_RESPONSE |
-#undef EXPECTED_INTERMEDIATE |
-#undef EXPECTED_FINAL |
+ DISALLOW_COPY_AND_ASSIGN(DownloadManagerTest); |
}; |
-} // namespace |
+// Does the DownloadManager prompt when requested? |
+TEST_F(DownloadManagerTest, RestartDownload) { |
+ // Put a mock we have a handle to on the download manager. |
+ content::MockDownloadItem& item(AddItemToManager()); |
+ int download_id = item.GetId(); |
-TEST_F(DownloadManagerTest, DownloadFilenameTest) { |
- ASSERT_TRUE(CreateTempDownloadsDirectory()); |
- |
- // We create a known file to test file uniquification. |
- ASSERT_TRUE(file_util::WriteFile( |
- GetPathInDownloadsDir(FILE_PATH_LITERAL("exists.txt")), "", 0) == 0); |
- ASSERT_TRUE(file_util::WriteFile( |
- GetPathInDownloadsDir(FILE_PATH_LITERAL("exists.png.temp")), "", 0) == 0); |
- |
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kDownloadFilenameTestCases); ++i) { |
- const DownloadFilenameTestCase& test_case = kDownloadFilenameTestCases[i]; |
- scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
- |
- SCOPED_TRACE(testing::Message() << "Running test case " << i); |
- info->url_chain.push_back(GURL()); |
- |
- MockDownloadFile* download_file( |
- new ::testing::StrictMock<MockDownloadFile>()); |
- FilePath target_path = GetPathInDownloadsDir(test_case.target_path); |
- FilePath expected_prompt_path = |
- GetPathInDownloadsDir(test_case.expected_prompt_path); |
- FilePath chosen_path = GetPathInDownloadsDir(test_case.chosen_path); |
- FilePath intermediate_path = |
- GetPathInDownloadsDir(test_case.intermediate_path); |
- FilePath expected_intermediate_path = |
- GetPathInDownloadsDir(test_case.expected_intermediate_path); |
- FilePath expected_final_path = |
- GetPathInDownloadsDir(test_case.expected_final_path); |
- |
- EXPECT_CALL(*download_file, Rename(expected_intermediate_path)) |
- .WillOnce(Return(net::OK)); |
- EXPECT_CALL(*download_file, Rename(expected_final_path)) |
- .WillOnce(Return(net::OK)); |
-#if defined(OS_MACOSX) |
- EXPECT_CALL(*download_file, AnnotateWithSourceInformation()); |
-#endif |
- EXPECT_CALL(*download_file, Detach()); |
- |
- download_manager_->CreateDownloadItem(info.get(), DownloadRequestHandle()); |
- AddMockDownloadToFileManager(info->download_id, download_file); |
- DownloadItem* download = GetActiveDownloadItem(info->download_id); |
- ASSERT_TRUE(download != NULL); |
- |
- if (test_case.completion == COMPLETES_BEFORE_RENAME) |
- OnResponseCompleted(info->download_id, 1024, std::string("fake_hash")); |
- |
- download->OnTargetPathDetermined( |
- target_path, test_case.target_disposition, |
- content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
- download_manager_delegate_->SetFileSelectionExpectation( |
- expected_prompt_path, chosen_path); |
- download_manager_delegate_->SetIntermediatePath( |
- intermediate_path, test_case.overwrite_intermediate_path); |
- download_manager_delegate_->SetShouldCompleteDownload(false); |
- download_manager_->RestartDownload(info->download_id.local()); |
- message_loop_.RunAllPending(); |
+ // Confirm we're internally consistent. |
+ EXPECT_EQ(&item, GetActiveDownloadItem(download_id)); |
- if (test_case.completion == COMPLETES_AFTER_RENAME) { |
- OnResponseCompleted(info->download_id, 1024, std::string("fake_hash")); |
- message_loop_.RunAllPending(); |
- } |
+ ScopedTempDir download_dir; |
+ ASSERT_TRUE(download_dir.CreateUniqueTempDir()); |
+ FilePath expected_path(download_dir.path().Append( |
+ FILE_PATH_LITERAL("location"))); |
- EXPECT_EQ(expected_intermediate_path.value(), |
- download->GetFullPath().value()); |
- download_manager_delegate_->SetShouldCompleteDownload(true); |
- download_manager_delegate_->InvokeDownloadCompletionCallback(); |
- message_loop_.RunAllPending(); |
- EXPECT_EQ(expected_final_path.value(), |
- download->GetTargetFilePath().value()); |
- } |
-} |
+ EXPECT_CALL(item, GetTargetDisposition()) |
+ .WillOnce(Return(DownloadItem::TARGET_DISPOSITION_PROMPT)); |
+ EXPECT_CALL(GetMockDownloadManagerDelegate(), ChooseDownloadPath(&item)); |
+ download_manager_->RestartDownload(download_id); |
-void WriteCopyToStream(const char *source, |
- size_t len, content::ByteStreamWriter* stream) { |
- scoped_refptr<net::IOBuffer> copy(new net::IOBuffer(len)); |
- memcpy(copy.get()->data(), source, len); |
- stream->Write(copy, len); |
+ // The alternative pathway goes straight to OnTargetPathAvailable, |
+ // so it more naturally belongs below. |
} |
-TEST_F(DownloadManagerTest, DownloadInterruptTest) { |
- using ::testing::_; |
- using ::testing::CreateFunctor; |
- using ::testing::Invoke; |
- using ::testing::Return; |
- |
- // Normally, the download system takes ownership of info, and is |
- // responsible for deleting it. In these unit tests, however, we |
- // don't call the function that deletes it, so we do so ourselves. |
- scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
- info->prompt_user_for_save_location = false; |
- info->url_chain.push_back(GURL()); |
- info->total_bytes = static_cast<int64>(kTestDataLen); |
- const FilePath new_path(FILE_PATH_LITERAL("foo.zip")); |
- const FilePath cr_path(GetTempDownloadPath(new_path)); |
- |
- MockDownloadFile* download_file(new NiceMock<MockDownloadFile>()); |
- |
- EXPECT_CALL(*download_file, Rename(cr_path)) |
- .WillOnce(Return(net::OK)); |
- EXPECT_CALL(*download_file, Cancel()); |
- |
- download_manager_->CreateDownloadItem(info.get(), DownloadRequestHandle()); |
- // |download_file| is owned by DownloadFileManager. |
- AddMockDownloadToFileManager(info->download_id, download_file); |
- |
- DownloadItem* download = GetActiveDownloadItem(info->download_id); |
- ASSERT_TRUE(download != NULL); |
- EXPECT_EQ(DownloadItem::IN_PROGRESS, download->GetState()); |
- scoped_ptr<ItemObserver> observer(new ItemObserver(download)); |
- |
- ContinueDownloadWithPath(download, new_path); |
- message_loop_.RunAllPending(); |
- EXPECT_TRUE(GetActiveDownloadItem(info->download_id) != NULL); |
- |
- int64 error_size = 3; |
- OnDownloadInterrupted(info->download_id, error_size, "", |
- content::DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED); |
- message_loop_.RunAllPending(); |
- |
- EXPECT_TRUE(GetActiveDownloadItem(info->download_id) == NULL); |
- EXPECT_TRUE(observer->hit_state(DownloadItem::IN_PROGRESS)); |
- EXPECT_TRUE(observer->hit_state(DownloadItem::INTERRUPTED)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::COMPLETE)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::CANCELLED)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::REMOVING)); |
- EXPECT_TRUE(observer->was_updated()); |
- EXPECT_FALSE(observer->was_opened()); |
- EXPECT_FALSE(download->GetFileExternallyRemoved()); |
- EXPECT_EQ(DownloadItem::INTERRUPTED, download->GetState()); |
- |
- download->Cancel(true); |
- |
- EXPECT_TRUE(observer->hit_state(DownloadItem::IN_PROGRESS)); |
- EXPECT_TRUE(observer->hit_state(DownloadItem::INTERRUPTED)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::COMPLETE)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::CANCELLED)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::REMOVING)); |
- EXPECT_TRUE(observer->was_updated()); |
- EXPECT_FALSE(observer->was_opened()); |
- EXPECT_FALSE(download->GetFileExternallyRemoved()); |
- EXPECT_EQ(DownloadItem::INTERRUPTED, download->GetState()); |
- EXPECT_EQ(download->GetReceivedBytes(), error_size); |
- EXPECT_EQ(download->GetTotalBytes(), static_cast<int64>(kTestDataLen)); |
+// Do the results of GetIntermediatePath get passed through to the |
+// download? Note that this path is tested from RestartDownload |
+// to test the non-prompting path in RestartDownload as well. |
+TEST_F(DownloadManagerTest, OnTargetPathAvailable) { |
+ // Put a mock we have a handle to on the download manager. |
+ content::MockDownloadItem& item(AddItemToManager()); |
+ |
+ ScopedTempDir download_dir; |
+ ASSERT_TRUE(download_dir.CreateUniqueTempDir()); |
+ FilePath target_path(download_dir.path().Append( |
+ FILE_PATH_LITERAL("location"))); |
+ FilePath intermediate_path(download_dir.path().Append( |
+ FILE_PATH_LITERAL("location.crdownload"))); |
+ |
+ EXPECT_CALL(item, GetTargetDisposition()) |
+ .WillOnce(Return(DownloadItem::TARGET_DISPOSITION_UNIQUIFY)); |
+ EXPECT_CALL(GetMockDownloadManagerDelegate(), |
+ GetIntermediatePath(Ref(item), _)) |
+ .WillOnce(DoAll(SetArgPointee<1>(true), Return(intermediate_path))); |
+ // Finesse DCHECK with WillRepeatedly. |
+ EXPECT_CALL(item, GetTargetFilePath()) |
+ .WillRepeatedly(ReturnRef(target_path)); |
+ EXPECT_CALL(item, OnIntermediatePathDetermined( |
+ &GetMockDownloadFileManager(), intermediate_path, true)); |
+ download_manager_->RestartDownload(item.GetId()); |
} |
-// Test the behavior of DownloadFileManager and DownloadManager in the event |
-// of a file error while writing the download to disk. |
-TEST_F(DownloadManagerTest, MAYBE_DownloadFileErrorTest) { |
- // Create a temporary file and a mock stream. |
- FilePath path; |
- ASSERT_TRUE(file_util::CreateTemporaryFile(&path)); |
- |
- // This file stream will be used, until the first rename occurs. |
- net::FileStream* stream = new net::FileStream(NULL); |
- ASSERT_EQ(0, stream->OpenSync( |
- path, |
- base::PLATFORM_FILE_OPEN_ALWAYS | base::PLATFORM_FILE_WRITE)); |
- |
- // Make sure the DFM exists; we'll need it later. |
- // TODO(rdsmith): This is ugly and should be rewritten, but a large |
- // rewrite of this test is in progress in a different CL, so doing it |
- // the hacky way for now. |
- (void) file_manager(); |
- |
- // Normally, the download system takes ownership of info, and is |
- // responsible for deleting it. In these unit tests, however, we |
- // don't call the function that deletes it, so we do so ourselves. |
- scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
- info->prompt_user_for_save_location = false; |
- info->url_chain.push_back(GURL()); |
- info->total_bytes = static_cast<int64>(kTestDataLen * 3); |
- info->save_info.file_path = path; |
- info->save_info.file_stream.reset(stream); |
- scoped_ptr<content::ByteStreamWriter> stream_input; |
- scoped_ptr<content::ByteStreamReader> stream_output; |
- content::CreateByteStream(message_loop_.message_loop_proxy(), |
- message_loop_.message_loop_proxy(), |
- kTestDataLen, &stream_input, &stream_output); |
- |
- download_manager_->CreateDownloadItem(info.get(), DownloadRequestHandle()); |
- |
- // Create a download file that we can insert errors into. |
- scoped_ptr<DownloadFileWithErrors> download_file(new DownloadFileWithErrors( |
- info.get(), stream_output.Pass(), download_manager_, false)); |
- download_file->Initialize(); |
- |
- DownloadItem* download = GetActiveDownloadItem(info->download_id); |
- ASSERT_TRUE(download != NULL); |
- |
- EXPECT_EQ(DownloadItem::IN_PROGRESS, download->GetState()); |
- scoped_ptr<ItemObserver> observer(new ItemObserver(download)); |
- |
- // Add some data before finalizing the file name. |
- WriteCopyToStream(kTestData, kTestDataLen, stream_input.get()); |
- |
- // Finalize the file name. |
- ContinueDownloadWithPath(download, path); |
- message_loop_.RunAllPending(); |
- EXPECT_TRUE(GetActiveDownloadItem(info->download_id) != NULL); |
- |
- // Add more data. |
- WriteCopyToStream(kTestData, kTestDataLen, stream_input.get()); |
- |
- // Add more data, but an error occurs. |
- download_file->set_forced_error(net::ERR_FAILED); |
- WriteCopyToStream(kTestData, kTestDataLen, stream_input.get()); |
- message_loop_.RunAllPending(); |
- |
- // Check the state. The download should have been interrupted. |
- EXPECT_TRUE(GetActiveDownloadItem(info->download_id) == NULL); |
- EXPECT_TRUE(observer->hit_state(DownloadItem::IN_PROGRESS)); |
- EXPECT_TRUE(observer->hit_state(DownloadItem::INTERRUPTED)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::COMPLETE)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::CANCELLED)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::REMOVING)); |
- EXPECT_TRUE(observer->was_updated()); |
- EXPECT_FALSE(observer->was_opened()); |
- EXPECT_FALSE(download->GetFileExternallyRemoved()); |
- EXPECT_EQ(DownloadItem::INTERRUPTED, download->GetState()); |
- |
- // Clean up. |
- download->Cancel(true); |
- message_loop_.RunAllPending(); |
+// Do the results of an OnDownloadInterrupted get passed through properly |
+// to the DownloadItem? This test tests non-persisted downloads. |
+TEST_F(DownloadManagerTest, OnDownloadInterrupted_NonPersisted) { |
+ // Put a mock we have a handle to on the download manager. |
+ content::MockDownloadItem& item(AddItemToManager()); |
+ int download_id = item.GetId(); |
+ |
+ int64 size = 0xdeadbeef; |
+ const std::string hash_state("Undead beef"); |
+ content::DownloadInterruptReason reason( |
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); |
+ |
+ EXPECT_CALL(item, Interrupted(size, hash_state, reason)); |
+ EXPECT_CALL(item, OffThreadCancel(&GetMockDownloadFileManager())); |
+ EXPECT_CALL(item, IsPersisted()) |
+ .WillOnce(Return(false)); |
+ download_manager_->OnDownloadInterrupted( |
+ download_id, size, hash_state, reason); |
+ EXPECT_EQ(&item, GetActiveDownloadItem(download_id)); |
} |
-TEST_F(DownloadManagerTest, DownloadCancelTest) { |
- using ::testing::_; |
- using ::testing::CreateFunctor; |
- using ::testing::Invoke; |
- using ::testing::Return; |
- |
- // Normally, the download system takes ownership of info, and is |
- // responsible for deleting it. In these unit tests, however, we |
- // don't call the function that deletes it, so we do so ourselves. |
- scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
- info->prompt_user_for_save_location = false; |
- info->url_chain.push_back(GURL()); |
- const FilePath new_path(FILE_PATH_LITERAL("foo.zip")); |
- const FilePath cr_path(GetTempDownloadPath(new_path)); |
- |
- MockDownloadFile* download_file(new NiceMock<MockDownloadFile>()); |
- |
- // |download_file| is owned by DownloadFileManager. |
- EXPECT_CALL(*download_file, Rename(cr_path)) |
- .WillOnce(Return(net::OK)); |
- EXPECT_CALL(*download_file, Cancel()); |
- |
- download_manager_->CreateDownloadItem(info.get(), DownloadRequestHandle()); |
- AddMockDownloadToFileManager(info->download_id, download_file); |
- |
- DownloadItem* download = GetActiveDownloadItem(info->download_id); |
- ASSERT_TRUE(download != NULL); |
- |
- EXPECT_EQ(DownloadItem::IN_PROGRESS, download->GetState()); |
- scoped_ptr<ItemObserver> observer(new ItemObserver(download)); |
- |
- ContinueDownloadWithPath(download, new_path); |
- message_loop_.RunAllPending(); |
- EXPECT_TRUE(GetActiveDownloadItem(info->download_id) != NULL); |
- |
- download->Cancel(false); |
- message_loop_.RunAllPending(); |
- |
- EXPECT_TRUE(GetActiveDownloadItem(info->download_id) != NULL); |
- EXPECT_TRUE(observer->hit_state(DownloadItem::IN_PROGRESS)); |
- EXPECT_TRUE(observer->hit_state(DownloadItem::CANCELLED)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::INTERRUPTED)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::COMPLETE)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::REMOVING)); |
- EXPECT_TRUE(observer->was_updated()); |
- EXPECT_FALSE(observer->was_opened()); |
- EXPECT_FALSE(download->GetFileExternallyRemoved()); |
- EXPECT_EQ(DownloadItem::CANCELLED, download->GetState()); |
- |
- file_manager()->CancelDownload(info->download_id); |
- |
- EXPECT_FALSE(file_util::PathExists(new_path)); |
- EXPECT_FALSE(file_util::PathExists(cr_path)); |
+// Do the results of an OnDownloadInterrupted get passed through properly |
+// to the DownloadItem? This test tests persisted downloads. |
+TEST_F(DownloadManagerTest, OnDownloadInterrupted_Persisted) { |
+ // Put a mock we have a handle to on the download manager. |
+ content::MockDownloadItem& item(AddItemToManager()); |
+ int download_id = item.GetId(); |
+ int64 db_handle = 0x7; |
+ AddItemToHistory(item, db_handle); |
+ |
+ int64 size = 0xdeadbeef; |
+ const std::string hash_state("Undead beef"); |
+ content::DownloadInterruptReason reason( |
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); |
+ |
+ EXPECT_CALL(item, Interrupted(size, hash_state, reason)); |
+ EXPECT_CALL(item, OffThreadCancel(&GetMockDownloadFileManager())); |
+ EXPECT_CALL(item, IsPersisted()) |
+ .WillOnce(Return(true)); |
+ EXPECT_CALL(GetMockDownloadManagerDelegate(), |
+ UpdateItemInPersistentStore(&item)); |
+ download_manager_->OnDownloadInterrupted( |
+ download_id, size, hash_state, reason); |
+ EXPECT_EQ(NULL, GetActiveDownloadItem(download_id)); |
+ |
+ // Remove so we don't get errors on shutdown. |
+ EXPECT_CALL(GetMockDownloadManagerDelegate(), |
+ RemoveItemFromPersistentStore(&item)); |
+ download_manager_->DownloadRemoved(&item); |
+ RemoveMockDownloadItem(download_id); |
} |
-TEST_F(DownloadManagerTest, MAYBE_DownloadOverwriteTest) { |
- using ::testing::_; |
- using ::testing::CreateFunctor; |
- using ::testing::Invoke; |
- using ::testing::Return; |
- |
- ASSERT_TRUE(CreateTempDownloadsDirectory()); |
- // File names we're using. |
- const FilePath new_path(GetPathInDownloadsDir(FILE_PATH_LITERAL("foo.txt"))); |
- const FilePath cr_path(GetTempDownloadPath(new_path)); |
- EXPECT_FALSE(file_util::PathExists(new_path)); |
- |
- // Create the file that we will overwrite. Will be automatically cleaned |
- // up when temp_dir_ is destroyed. |
- FILE* fp = file_util::OpenFile(new_path, "w"); |
- file_util::CloseFile(fp); |
- EXPECT_TRUE(file_util::PathExists(new_path)); |
- |
- // Construct the unique file name that normally would be created, but |
- // which we will override. |
- int uniquifier = |
- file_util::GetUniquePathNumber(new_path, FILE_PATH_LITERAL("")); |
- FilePath unique_new_path = new_path; |
- EXPECT_NE(0, uniquifier); |
- unique_new_path = unique_new_path.InsertBeforeExtensionASCII( |
- StringPrintf(" (%d)", uniquifier)); |
- |
- // Normally, the download system takes ownership of info, and is |
- // responsible for deleting it. In these unit tests, however, we |
- // don't call the function that deletes it, so we do so ourselves. |
- scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
- info->prompt_user_for_save_location = true; |
- info->url_chain.push_back(GURL()); |
- scoped_ptr<content::ByteStreamWriter> stream_input; |
- scoped_ptr<content::ByteStreamReader> stream_output; |
- content::CreateByteStream(message_loop_.message_loop_proxy(), |
- message_loop_.message_loop_proxy(), |
- kTestDataLen, &stream_input, &stream_output); |
- |
- download_manager_->CreateDownloadItem(info.get(), DownloadRequestHandle()); |
- |
- DownloadItem* download = GetActiveDownloadItem(info->download_id); |
- ASSERT_TRUE(download != NULL); |
- |
- EXPECT_EQ(DownloadItem::IN_PROGRESS, download->GetState()); |
- scoped_ptr<ItemObserver> observer(new ItemObserver(download)); |
- |
- // Create and initialize the download file. We're bypassing the first part |
- // of the download process and skipping to the part after the final file |
- // name has been chosen, so we need to initialize the download file |
- // properly. |
- DownloadFile* download_file( |
- new DownloadFileImpl(info.get(), stream_output.Pass(), |
- new DownloadRequestHandle(), |
- download_manager_, false, |
- scoped_ptr<content::PowerSaveBlocker>(NULL).Pass(), |
- net::BoundNetLog())); |
- download_file->Rename(cr_path); |
- // This creates the .temp version of the file. |
- download_file->Initialize(); |
- // |download_file| is owned by DownloadFileManager. |
- AddDownloadToFileManager(info->download_id, download_file); |
- |
- ContinueDownloadWithPath(download, new_path); |
- message_loop_.RunAllPending(); |
- EXPECT_TRUE(GetActiveDownloadItem(info->download_id) != NULL); |
- |
- WriteCopyToStream(kTestData, kTestDataLen, stream_input.get()); |
- |
- // Finish the download. |
- OnResponseCompleted(info->download_id, kTestDataLen, ""); |
- message_loop_.RunAllPending(); |
- |
- // Download is complete. |
- EXPECT_TRUE(GetActiveDownloadItem(info->download_id) == NULL); |
- EXPECT_TRUE(observer->hit_state(DownloadItem::IN_PROGRESS)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::CANCELLED)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::INTERRUPTED)); |
- EXPECT_TRUE(observer->hit_state(DownloadItem::COMPLETE)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::REMOVING)); |
- EXPECT_TRUE(observer->was_updated()); |
- EXPECT_FALSE(observer->was_opened()); |
- EXPECT_FALSE(download->GetFileExternallyRemoved()); |
- EXPECT_EQ(DownloadItem::COMPLETE, download->GetState()); |
- |
- EXPECT_TRUE(file_util::PathExists(new_path)); |
- EXPECT_FALSE(file_util::PathExists(cr_path)); |
- EXPECT_FALSE(file_util::PathExists(unique_new_path)); |
- std::string file_contents; |
- EXPECT_TRUE(file_util::ReadFileToString(new_path, &file_contents)); |
- EXPECT_EQ(std::string(kTestData), file_contents); |
+// Does DownloadCancelled remove Download from appropriate queues? |
+// This test tests non-persisted downloads. |
+TEST_F(DownloadManagerTest, OnDownloadCancelled_NonPersisted) { |
+ // Put a mock we have a handle to on the download manager. |
+ content::MockDownloadItem& item(AddItemToManager()); |
+ |
+ EXPECT_CALL(item, IsPersisted()) |
+ .WillRepeatedly(Return(false)); |
+ EXPECT_CALL(item, GetState()) |
+ .WillRepeatedly(Return(DownloadItem::CANCELLED)); |
+ EXPECT_CALL(item, GetDbHandle()) |
+ .WillRepeatedly(Return(DownloadItem::kUninitializedHandle)); |
+ |
+ EXPECT_CALL(item, OffThreadCancel(&GetMockDownloadFileManager())); |
+ download_manager_->DownloadCancelled(&item); |
+ // TODO(rdsmith): Confirm that the download item is no longer on the |
+ // active list by calling GetActiveDownloadItem(id). Currently, the |
+ // item is left on the active list for rendez-vous with the history |
+ // system :-{. |
} |
-TEST_F(DownloadManagerTest, MAYBE_DownloadRemoveTest) { |
- using ::testing::_; |
- using ::testing::CreateFunctor; |
- using ::testing::Invoke; |
- using ::testing::Return; |
- |
- ASSERT_TRUE(CreateTempDownloadsDirectory()); |
- |
- // File names we're using. |
- const FilePath new_path(GetPathInDownloadsDir(FILE_PATH_LITERAL("foo.txt"))); |
- const FilePath cr_path(GetTempDownloadPath(new_path)); |
- EXPECT_FALSE(file_util::PathExists(new_path)); |
- |
- // Normally, the download system takes ownership of info, and is |
- // responsible for deleting it. In these unit tests, however, we |
- // don't call the function that deletes it, so we do so ourselves. |
- scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
- info->prompt_user_for_save_location = true; |
- info->url_chain.push_back(GURL()); |
- scoped_ptr<content::ByteStreamWriter> stream_input; |
- scoped_ptr<content::ByteStreamReader> stream_output; |
- content::CreateByteStream(message_loop_.message_loop_proxy(), |
- message_loop_.message_loop_proxy(), |
- kTestDataLen, &stream_input, &stream_output); |
- |
- download_manager_->CreateDownloadItem(info.get(), DownloadRequestHandle()); |
- |
- DownloadItem* download = GetActiveDownloadItem(info->download_id); |
- ASSERT_TRUE(download != NULL); |
- |
- EXPECT_EQ(DownloadItem::IN_PROGRESS, download->GetState()); |
- scoped_ptr<ItemObserver> observer(new ItemObserver(download)); |
- |
- // Create and initialize the download file. We're bypassing the first part |
- // of the download process and skipping to the part after the final file |
- // name has been chosen, so we need to initialize the download file |
- // properly. |
- DownloadFile* download_file( |
- new DownloadFileImpl(info.get(), stream_output.Pass(), |
- new DownloadRequestHandle(), |
- download_manager_, false, |
- scoped_ptr<content::PowerSaveBlocker>(NULL).Pass(), |
- net::BoundNetLog())); |
- download_file->Rename(cr_path); |
- // This creates the .temp version of the file. |
- download_file->Initialize(); |
- // |download_file| is owned by DownloadFileManager. |
- AddDownloadToFileManager(info->download_id, download_file); |
- |
- ContinueDownloadWithPath(download, new_path); |
- message_loop_.RunAllPending(); |
- EXPECT_TRUE(GetActiveDownloadItem(info->download_id) != NULL); |
- |
- WriteCopyToStream(kTestData, kTestDataLen, stream_input.get()); |
- |
- // Finish the download. |
- OnResponseCompleted(info->download_id, kTestDataLen, ""); |
- message_loop_.RunAllPending(); |
- |
- // Download is complete. |
- EXPECT_TRUE(GetActiveDownloadItem(info->download_id) == NULL); |
- EXPECT_TRUE(observer->hit_state(DownloadItem::IN_PROGRESS)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::CANCELLED)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::INTERRUPTED)); |
- EXPECT_TRUE(observer->hit_state(DownloadItem::COMPLETE)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::REMOVING)); |
- EXPECT_TRUE(observer->was_updated()); |
- EXPECT_FALSE(observer->was_opened()); |
- EXPECT_FALSE(download->GetFileExternallyRemoved()); |
- EXPECT_EQ(DownloadItem::COMPLETE, download->GetState()); |
- |
- EXPECT_TRUE(file_util::PathExists(new_path)); |
- EXPECT_FALSE(file_util::PathExists(cr_path)); |
- |
- // Remove the downloaded file. |
- ASSERT_TRUE(file_util::Delete(new_path, false)); |
- download->OnDownloadedFileRemoved(); |
- message_loop_.RunAllPending(); |
- |
- EXPECT_TRUE(GetActiveDownloadItem(info->download_id) == NULL); |
- EXPECT_TRUE(observer->hit_state(DownloadItem::IN_PROGRESS)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::CANCELLED)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::INTERRUPTED)); |
- EXPECT_TRUE(observer->hit_state(DownloadItem::COMPLETE)); |
- EXPECT_FALSE(observer->hit_state(DownloadItem::REMOVING)); |
- EXPECT_TRUE(observer->was_updated()); |
- EXPECT_FALSE(observer->was_opened()); |
- EXPECT_TRUE(download->GetFileExternallyRemoved()); |
- EXPECT_EQ(DownloadItem::COMPLETE, download->GetState()); |
- |
- EXPECT_FALSE(file_util::PathExists(new_path)); |
+// Does DownloadCancelled remove Download from appropriate queues? |
+// This test tests persisted downloads. |
+TEST_F(DownloadManagerTest, OnDownloadCancelled_Persisted) { |
+ // Put a mock we have a handle to on the download manager. |
+ content::MockDownloadItem& item(AddItemToManager()); |
+ int download_id = item.GetId(); |
+ int64 db_handle = 0x7; |
+ AddItemToHistory(item, db_handle); |
+ |
+ EXPECT_CALL(item, IsPersisted()) |
+ .WillRepeatedly(Return(true)); |
+ EXPECT_CALL(GetMockDownloadManagerDelegate(), |
+ UpdateItemInPersistentStore(&item)); |
+ EXPECT_CALL(item, GetState()) |
+ .WillRepeatedly(Return(DownloadItem::CANCELLED)); |
+ EXPECT_CALL(item, GetDbHandle()) |
+ .WillRepeatedly(Return(db_handle)); |
+ |
+ EXPECT_CALL(item, OffThreadCancel(&GetMockDownloadFileManager())); |
+ download_manager_->DownloadCancelled(&item); |
+ EXPECT_EQ(NULL, GetActiveDownloadItem(download_id)); |
} |