summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-30 17:11:03 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-30 17:11:03 +0000
commit385e93180e0c9498df0c3996ad4e9b709d087fe6 (patch)
tree72d927007f0901107abd14e5774643f7fa516b4a /chrome/browser
parente2dc04b87f64b51cffe00560017b6bcee55c5fad (diff)
downloadchromium_src-385e93180e0c9498df0c3996ad4e9b709d087fe6.zip
chromium_src-385e93180e0c9498df0c3996ad4e9b709d087fe6.tar.gz
chromium_src-385e93180e0c9498df0c3996ad4e9b709d087fe6.tar.bz2
Move the DownloadManager and DownloadFile unittests to content so they can live beside the code they're testing.
-moved some of the logic about renaming intermediate files into content as the tests depended on them -made the DownloadManagerDelegate interface have empty default implementations. Darin convinced me that it's better to have delegate interfaces in the API have emptry interfaces, for tests and to make life easier for embedders. -removed the DownloadItemModel checks; these really were duplicating the DownloadItem::GetState call -removed the MockDownloadManagerDelegate class since it wasn't being used anymore -removed DownloadManagerDelegate::OnResponseCompleted since it wasn't called anymore BUG=98716 Review URL: https://chromiumcodereview.appspot.com/9224006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@119683 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/DEPS1
-rw-r--r--chrome/browser/download/chrome_download_manager_delegate.cc32
-rw-r--r--chrome/browser/download/chrome_download_manager_delegate.h4
-rw-r--r--chrome/browser/download/download_item_unittest.cc348
-rw-r--r--chrome/browser/download/download_manager_unittest.cc1323
5 files changed, 4 insertions, 1704 deletions
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS
index 782262b..6155ac4 100644
--- a/chrome/browser/DEPS
+++ b/chrome/browser/DEPS
@@ -44,7 +44,6 @@ include_rules = [
"+content/browser/download/download_create_info.h",
"+content/browser/download/download_file_impl.h",
"+content/browser/download/download_file_manager.h",
- "+content/browser/download/download_item_impl.h",
"+content/browser/download/download_persistent_store_info.h",
"+content/browser/download/download_request_handle.h",
"+content/browser/download/download_state_info.h",
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc
index 73856ba..b353035 100644
--- a/chrome/browser/download/chrome_download_manager_delegate.cc
+++ b/chrome/browser/download/chrome_download_manager_delegate.cc
@@ -144,31 +144,9 @@ void ChromeDownloadManagerDelegate::ChooseDownloadPath(
download_manager_, web_contents, suggested_path, data);
}
-bool ChromeDownloadManagerDelegate::OverrideIntermediatePath(
- DownloadItem* item,
- FilePath* intermediate_path) {
- if (item->GetDangerType() != content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS) {
- if (item->PromptUserForSaveLocation()) {
- // When we prompt the user, we overwrite the FullPath with what the user
- // wanted to use. Construct a file path using the previously determined
- // intermediate filename and the new path.
- // TODO(asanka): This can trample an in-progress download in the new
- // target directory if it was using the same intermediate name.
- FilePath file_name = item->GetSuggestedPath().BaseName();
- *intermediate_path = item->GetFullPath().DirName().Append(file_name);
- return true;
- } else {
- // The download's name is already set to an intermediate name, so no need
- // to override.
- return false;
- }
- }
-
- // The download is a safe download. We need to rename it to its intermediate
- // '.crdownload' path. The final name after user confirmation will be set
- // from DownloadItem::OnDownloadCompleting.
- *intermediate_path = download_util::GetCrDownloadPath(item->GetFullPath());
- return true;
+FilePath ChromeDownloadManagerDelegate::GetIntermediatePath(
+ const FilePath& suggested_path) {
+ return download_util::GetCrDownloadPath(suggested_path);
}
WebContents* ChromeDownloadManagerDelegate::
@@ -254,10 +232,6 @@ bool ChromeDownloadManagerDelegate::GenerateFileHash() {
#endif
}
-void ChromeDownloadManagerDelegate::OnResponseCompleted(DownloadItem* item) {
- // TODO(noelutz): remove this method from the delegate API.
-}
-
void ChromeDownloadManagerDelegate::AddItemToPersistentStore(
DownloadItem* item) {
download_history_->AddEntry(item,
diff --git a/chrome/browser/download/chrome_download_manager_delegate.h b/chrome/browser/download/chrome_download_manager_delegate.h
index d0464763..6d7c6ea 100644
--- a/chrome/browser/download/chrome_download_manager_delegate.h
+++ b/chrome/browser/download/chrome_download_manager_delegate.h
@@ -59,15 +59,13 @@ class ChromeDownloadManagerDelegate
virtual void ChooseDownloadPath(content::WebContents* web_contents,
const FilePath& suggested_path,
void* data) OVERRIDE;
- virtual bool OverrideIntermediatePath(content::DownloadItem* item,
- FilePath* intermediate_path) OVERRIDE;
+ virtual FilePath GetIntermediatePath(const FilePath& suggested_path) OVERRIDE;
virtual content::WebContents*
GetAlternativeWebContentsToNotifyForDownload() OVERRIDE;
virtual bool ShouldOpenFileBasedOnExtension(const FilePath& path) OVERRIDE;
virtual bool ShouldCompleteDownload(content::DownloadItem* item) OVERRIDE;
virtual bool ShouldOpenDownload(content::DownloadItem* item) OVERRIDE;
virtual bool GenerateFileHash() OVERRIDE;
- virtual void OnResponseCompleted(content::DownloadItem* item) OVERRIDE;
virtual void AddItemToPersistentStore(content::DownloadItem* item) OVERRIDE;
virtual void UpdateItemInPersistentStore(
content::DownloadItem* item) OVERRIDE;
diff --git a/chrome/browser/download/download_item_unittest.cc b/chrome/browser/download/download_item_unittest.cc
deleted file mode 100644
index dcafc04..0000000
--- a/chrome/browser/download/download_item_unittest.cc
+++ /dev/null
@@ -1,348 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/message_loop.h"
-#include "base/stl_util.h"
-#include "base/threading/thread.h"
-#include "chrome/test/base/testing_profile.h"
-#include "content/browser/download/download_create_info.h"
-#include "content/browser/download/download_item_impl.h"
-#include "content/browser/download/download_request_handle.h"
-#include "content/browser/download/download_status_updater.h"
-#include "content/browser/download/interrupt_reasons.h"
-#include "content/browser/download/mock_download_item.h"
-#include "content/public/browser/download_id.h"
-#include "content/test/test_browser_thread.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using content::BrowserThread;
-using content::DownloadId;
-using content::DownloadItem;
-using content::DownloadManager;
-
-DownloadId::Domain kValidDownloadItemIdDomain = "valid DownloadId::Domain";
-
-namespace {
-class MockDelegate : public DownloadItemImpl::Delegate {
- public:
- MOCK_METHOD1(ShouldOpenFileBasedOnExtension, bool(const FilePath& path));
- MOCK_METHOD1(ShouldOpenDownload, bool(DownloadItem* download));
- MOCK_METHOD1(CheckForFileRemoval, void(DownloadItem* download));
- MOCK_METHOD1(MaybeCompleteDownload, void(DownloadItem* download));
- MOCK_CONST_METHOD0(GetBrowserContext, content::BrowserContext*());
- MOCK_METHOD1(DownloadCancelled, void(DownloadItem* download));
- MOCK_METHOD1(DownloadCompleted, void(DownloadItem* download));
- MOCK_METHOD1(DownloadOpened, void(DownloadItem* download));
- MOCK_METHOD1(DownloadRemoved, void(DownloadItem* download));
- MOCK_CONST_METHOD1(AssertStateConsistent, void(DownloadItem* download));
-};
-
-class MockRequestHandle : public DownloadRequestHandleInterface {
- public:
- MOCK_CONST_METHOD0(GetTabContents, TabContents*());
- MOCK_CONST_METHOD0(GetDownloadManager, DownloadManager*());
- MOCK_CONST_METHOD0(PauseRequest, void());
- MOCK_CONST_METHOD0(ResumeRequest, void());
- MOCK_CONST_METHOD0(CancelRequest, void());
- MOCK_CONST_METHOD0(DebugString, std::string());
-};
-
-}
-
-class DownloadItemTest : public testing::Test {
- public:
- class MockObserver : public content::DownloadItem::Observer {
- public:
- explicit MockObserver(DownloadItem* item) : item_(item), updated_(false) {
- item_->AddObserver(this);
- }
- ~MockObserver() { item_->RemoveObserver(this); }
-
- virtual void OnDownloadUpdated(content::DownloadItem* download) {
- updated_ = true;
- }
-
- virtual void OnDownloadOpened(content::DownloadItem* download) { }
-
- bool CheckUpdated() {
- bool was_updated = updated_;
- updated_ = false;
- return was_updated;
- }
-
- private:
- DownloadItem* item_;
- bool updated_;
- };
-
- DownloadItemTest()
- : ui_thread_(BrowserThread::UI, &loop_) {
- }
-
- ~DownloadItemTest() {
- }
-
- virtual void SetUp() {
- }
-
- virtual void TearDown() {
- ui_thread_.DeprecatedGetThreadObject()->message_loop()->RunAllPending();
- STLDeleteElements(&allocated_downloads_);
- allocated_downloads_.clear();
- }
-
- // This class keeps ownership of the created download item; it will
- // be torn down at the end of the test unless DestroyDownloadItem is
- // called.
- DownloadItem* CreateDownloadItem(DownloadItem::DownloadState state) {
- // 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_;
-
- info_.reset(new DownloadCreateInfo());
- static int next_id;
- info_->download_id =
- content::DownloadId(kValidDownloadItemIdDomain, ++next_id);
- info_->prompt_user_for_save_location = false;
- info_->url_chain.push_back(GURL());
- info_->state = state;
-
- MockRequestHandle* request_handle =
- new testing::NiceMock<MockRequestHandle>;
- DownloadItem* download =
- new DownloadItemImpl(&delegate_, *(info_.get()),
- request_handle, false);
- allocated_downloads_.insert(download);
- return download;
- }
-
- // Destroy a previously created download item.
- void DestroyDownloadItem(DownloadItem* item) {
- allocated_downloads_.erase(item);
- delete item;
- }
-
- protected:
- DownloadStatusUpdater download_status_updater_;
-
- private:
- MessageLoopForUI loop_;
- // UI thread.
- content::TestBrowserThread ui_thread_;
- testing::NiceMock<MockDelegate> delegate_;
- std::set<DownloadItem*> allocated_downloads_;
-};
-
-namespace {
-
-const int kDownloadChunkSize = 1000;
-const int kDownloadSpeed = 1000;
-const int kDummyDBHandle = 10;
-const FilePath::CharType kDummyPath[] = FILE_PATH_LITERAL("/testpath");
-
-} // namespace
-
-// Tests to ensure calls that change a DownloadItem generate an update to
-// observers.
-// State changing functions not tested:
-// void OpenDownload();
-// void ShowDownloadInShell();
-// void CompleteDelayedDownload();
-// void OnDownloadCompleting(DownloadFileManager* file_manager);
-// void OnDownloadRenamedToFinalName(const FilePath& full_path);
-// set_* mutators
-
-TEST_F(DownloadItemTest, NotificationAfterUpdate) {
- DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
- MockObserver observer(item);
-
- item->UpdateProgress(kDownloadChunkSize, kDownloadSpeed, "");
- ASSERT_TRUE(observer.CheckUpdated());
- EXPECT_EQ(kDownloadSpeed, item->CurrentSpeed());
-}
-
-TEST_F(DownloadItemTest, NotificationAfterCancel) {
- DownloadItem* user_cancel = CreateDownloadItem(DownloadItem::IN_PROGRESS);
- MockObserver observer1(user_cancel);
-
- user_cancel->Cancel(true);
- ASSERT_TRUE(observer1.CheckUpdated());
-
- DownloadItem* system_cancel = CreateDownloadItem(DownloadItem::IN_PROGRESS);
- MockObserver observer2(system_cancel);
-
- system_cancel->Cancel(false);
- ASSERT_TRUE(observer2.CheckUpdated());
-}
-
-TEST_F(DownloadItemTest, NotificationAfterComplete) {
- DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
- MockObserver observer(item);
-
- // Calling OnAllDataSaved does not trigger notification
- item->OnAllDataSaved(kDownloadChunkSize, DownloadItem::kEmptyFileHash);
- ASSERT_FALSE(observer.CheckUpdated());
-
- item->MarkAsComplete();
- ASSERT_TRUE(observer.CheckUpdated());
-}
-
-TEST_F(DownloadItemTest, NotificationAfterDownloadedFileRemoved) {
- DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
- MockObserver observer(item);
-
- item->OnDownloadedFileRemoved();
- ASSERT_TRUE(observer.CheckUpdated());
-}
-
-TEST_F(DownloadItemTest, NotificationAfterInterrupted) {
- DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
- MockObserver observer(item);
-
- item->Interrupted(kDownloadChunkSize, "", DOWNLOAD_INTERRUPT_REASON_NONE);
- ASSERT_TRUE(observer.CheckUpdated());
-}
-
-TEST_F(DownloadItemTest, NotificationAfterDelete) {
- DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
- MockObserver observer(item);
-
- item->Delete(DownloadItem::DELETE_DUE_TO_BROWSER_SHUTDOWN);
- ASSERT_TRUE(observer.CheckUpdated());
-}
-
-TEST_F(DownloadItemTest, NotificationAfterRemove) {
- DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
- MockObserver observer(item);
-
- item->Remove();
- ASSERT_TRUE(observer.CheckUpdated());
-}
-
-TEST_F(DownloadItemTest, NotificationAfterSetFileCheckResults) {
- // Setting to safe should not trigger any notifications
- DownloadItem* safe_item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
- MockObserver safe_observer(safe_item);
-
- DownloadStateInfo state = safe_item->GetStateInfo();;
- state.danger = content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS;
- safe_item->SetFileCheckResults(state);
- ASSERT_FALSE(safe_observer.CheckUpdated());
-
- // Setting to unsafe url or unsafe file should trigger notification
- DownloadItem* unsafeurl_item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
- MockObserver unsafeurl_observer(unsafeurl_item);
-
- state = unsafeurl_item->GetStateInfo();;
- state.danger = content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL;
- unsafeurl_item->SetFileCheckResults(state);
- ASSERT_TRUE(unsafeurl_observer.CheckUpdated());
-
- unsafeurl_item->DangerousDownloadValidated();
- ASSERT_TRUE(unsafeurl_observer.CheckUpdated());
-
- DownloadItem* unsafefile_item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
- MockObserver unsafefile_observer(unsafefile_item);
-
- state = unsafefile_item->GetStateInfo();;
- state.danger = content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE;
- unsafefile_item->SetFileCheckResults(state);
- ASSERT_TRUE(unsafefile_observer.CheckUpdated());
-
- unsafefile_item->DangerousDownloadValidated();
- ASSERT_TRUE(unsafefile_observer.CheckUpdated());
-}
-
-TEST_F(DownloadItemTest, NotificationAfterOnPathDetermined) {
- DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
- MockObserver observer(item);
-
- // Calling OnPathDetermined does not trigger notification
- item->OnPathDetermined(FilePath(kDummyPath));
- ASSERT_FALSE(observer.CheckUpdated());
-}
-
-TEST_F(DownloadItemTest, NotificationAfterRename) {
- DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
- MockObserver observer(item);
-
- // Calling Rename does not trigger notification
- item->Rename(FilePath(kDummyPath));
- ASSERT_FALSE(observer.CheckUpdated());
-}
-
-TEST_F(DownloadItemTest, NotificationAfterTogglePause) {
- DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
- MockObserver observer(item);
-
- item->TogglePause();
- ASSERT_TRUE(observer.CheckUpdated());
-
- item->TogglePause();
- ASSERT_TRUE(observer.CheckUpdated());
-}
-
-static char external_data_test_string[] = "External data test";
-static int destructor_called = 0;
-
-class TestExternalData : public content::DownloadItem::ExternalData {
- public:
- int value;
- virtual ~TestExternalData() {
- destructor_called++;
- }
-};
-
-TEST_F(DownloadItemTest, ExternalData) {
- DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS);
-
- // Shouldn't be anything there before set.
- EXPECT_EQ(NULL, item->GetExternalData(&external_data_test_string));
-
- TestExternalData* test1(new TestExternalData());
- test1->value = 2;
-
- // Should be able to get back what you set.
- item->SetExternalData(&external_data_test_string, test1);
- TestExternalData* test_result =
- static_cast<TestExternalData*>(
- item->GetExternalData(&external_data_test_string));
- EXPECT_EQ(test1, test_result);
-
- // Destructor should be called if value overwritten. New value
- // should then be retrievable.
- TestExternalData* test2(new TestExternalData());
- test2->value = 3;
- EXPECT_EQ(0, destructor_called);
- item->SetExternalData(&external_data_test_string, test2);
- EXPECT_EQ(1, destructor_called);
- EXPECT_EQ(static_cast<DownloadItem::ExternalData*>(test2),
- item->GetExternalData(&external_data_test_string));
-
- // Overwriting with the same value shouldn't do anything.
- EXPECT_EQ(1, destructor_called);
- item->SetExternalData(&external_data_test_string, test2);
- EXPECT_EQ(1, destructor_called);
- EXPECT_EQ(static_cast<DownloadItem::ExternalData*>(test2),
- item->GetExternalData(&external_data_test_string));
-
- // Overwriting with NULL should result in destruction.
- item->SetExternalData(&external_data_test_string, NULL);
- EXPECT_EQ(2, destructor_called);
-
- // Destroying the download item should destroy the external data.
-
- TestExternalData* test3(new TestExternalData());
- item->SetExternalData(&external_data_test_string, test3);
- EXPECT_EQ(static_cast<DownloadItem::ExternalData*>(test3),
- item->GetExternalData(&external_data_test_string));
- DestroyDownloadItem(item);
- EXPECT_EQ(3, destructor_called);
-}
-
-TEST(MockDownloadItem, Compiles) {
- MockDownloadItem mock_item;
-}
diff --git a/chrome/browser/download/download_manager_unittest.cc b/chrome/browser/download/download_manager_unittest.cc
deleted file mode 100644
index 59723fe..0000000
--- a/chrome/browser/download/download_manager_unittest.cc
+++ /dev/null
@@ -1,1323 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <set>
-#include <string>
-
-#include "base/bind.h"
-#include "base/file_util.h"
-#include "base/i18n/number_formatting.h"
-#include "base/i18n/rtl.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/message_loop.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 "chrome/browser/download/chrome_download_manager_delegate.h"
-#include "chrome/browser/download/download_item_model.h"
-#include "chrome/browser/download/download_prefs.h"
-#include "chrome/browser/download/download_util.h"
-#include "chrome/browser/prefs/pref_service.h"
-#include "chrome/common/pref_names.h"
-#include "chrome/test/base/testing_profile.h"
-#include "content/browser/download/download_buffer.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_request_handle.h"
-#include "content/browser/download/download_status_updater.h"
-#include "content/browser/download/interrupt_reasons.h"
-#include "content/browser/download/mock_download_file.h"
-#include "content/browser/download/mock_download_manager.h"
-#include "content/public/browser/download_item.h"
-#include "content/public/browser/download_manager.h"
-#include "content/test/test_browser_thread.h"
-#include "grit/generated_resources.h"
-#include "net/base/io_buffer.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gmock_mutant.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/text/bytes_formatting.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::BrowserThread;
-using content::DownloadFile;
-using content::DownloadId;
-using content::DownloadItem;
-using content::DownloadManager;
-using ::testing::ReturnRef;
-using ::testing::Return;
-using content::WebContents;
-
-namespace {
-
-class MockDownloadFileFactory
- : public DownloadFileManager::DownloadFileFactory {
- public:
- MockDownloadFileFactory() {}
-
- virtual DownloadFile* CreateFile(DownloadCreateInfo* info,
- const DownloadRequestHandle& request_handle,
- DownloadManager* download_manager,
- bool calculate_hash) OVERRIDE;
-};
-
-DownloadFile* MockDownloadFileFactory::CreateFile(
- DownloadCreateInfo* info,
- const DownloadRequestHandle& request_handle,
- DownloadManager* download_manager,
- bool calculate_hash) {
- NOTREACHED();
- return NULL;
-}
-
-DownloadId::Domain kValidIdDomain = "valid DownloadId::Domain";
-
-class TestDownloadManagerDelegate : public ChromeDownloadManagerDelegate {
- public:
- explicit TestDownloadManagerDelegate(Profile* profile)
- : ChromeDownloadManagerDelegate(profile),
- mark_content_dangerous_(false) {
- }
-
- virtual void ChooseDownloadPath(WebContents* web_contents,
- const FilePath& suggested_path,
- void* data) OVERRIDE {
- if (!expected_suggested_path_.empty()) {
- EXPECT_STREQ(expected_suggested_path_.value().c_str(),
- suggested_path.value().c_str());
- }
- if (file_selection_response_.empty()) {
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- base::Bind(&DownloadManager::FileSelectionCanceled,
- download_manager_.get(),
- base::Unretained(data)));
- } else {
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- base::Bind(&DownloadManager::FileSelected,
- download_manager_.get(),
- file_selection_response_,
- base::Unretained(data)));
- }
- expected_suggested_path_.clear();
- file_selection_response_.clear();
- }
-
- void SetFileSelectionExpectation(const FilePath& suggested_path,
- const FilePath& response) {
- expected_suggested_path_ = suggested_path;
- file_selection_response_ = response;
- }
-
- void SetMarkContentsDangerous(bool dangerous) {
- mark_content_dangerous_ = dangerous;
- }
-
- virtual bool ShouldCompleteDownload(DownloadItem* item) {
- if (mark_content_dangerous_) {
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- base::Bind(&TestDownloadManagerDelegate::MarkContentDangerous,
- this, item->GetId()));
- mark_content_dangerous_ = false;
- return false;
- } else {
- return true;
- }
- }
-
- private:
- void MarkContentDangerous(int32 download_id) {
- DownloadItem* item = download_manager_->GetActiveDownloadItem(download_id);
- if (!item)
- return;
- item->MarkContentDangerous();
- item->MaybeCompleteDownload();
- }
-
- FilePath expected_suggested_path_;
- FilePath file_selection_response_;
- bool mark_content_dangerous_;
-};
-
-} // namespace
-
-class DownloadManagerTest : public testing::Test {
- public:
- static const char* kTestData;
- static const size_t kTestDataLen;
-
- DownloadManagerTest()
- : profile_(new TestingProfile()),
- download_manager_delegate_(new TestDownloadManagerDelegate(
- profile_.get())),
- download_manager_(DownloadManager::Create(
- download_manager_delegate_, &download_status_updater_)),
- ui_thread_(BrowserThread::UI, &message_loop_),
- file_thread_(BrowserThread::FILE, &message_loop_),
- download_buffer_(new content::DownloadBuffer) {
- download_manager_->Init(profile_.get());
- download_manager_delegate_->SetDownloadManager(download_manager_);
- }
-
- ~DownloadManagerTest() {
- download_manager_->Shutdown();
- // profile_ must outlive download_manager_, so we explicitly delete
- // download_manager_ first.
- download_manager_ = NULL;
- download_manager_delegate_ = NULL;
- profile_.reset(NULL);
- message_loop_.RunAllPending();
- }
-
- void AddDownloadToFileManager(int id, DownloadFile* download_file) {
- file_manager()->downloads_[DownloadId(kValidIdDomain, id)] =
- download_file;
- }
-
- void AddMockDownloadToFileManager(int id, MockDownloadFile* download_file) {
- AddDownloadToFileManager(id, download_file);
- ON_CALL(*download_file, GetDownloadManager())
- .WillByDefault(Return(download_manager_));
- }
-
- void OnResponseCompleted(int32 download_id, int64 size,
- const std::string& hash) {
- download_manager_->OnResponseCompleted(download_id, size, hash);
- }
-
- void FileSelected(const FilePath& path, void* params) {
- download_manager_->FileSelected(path, params);
- }
-
- void ContinueDownloadWithPath(DownloadItem* download, const FilePath& path) {
- download_manager_->ContinueDownloadWithPath(download, path);
- }
-
- void UpdateData(int32 id, const char* data, size_t length) {
- // We are passing ownership of this buffer to the download file manager.
- net::IOBuffer* io_buffer = new net::IOBuffer(length);
- // We need |AddRef()| because we do a |Release()| in |UpdateDownload()|.
- io_buffer->AddRef();
- memcpy(io_buffer->data(), data, length);
-
- download_buffer_->AddData(io_buffer, length);
-
- BrowserThread::PostTask(
- BrowserThread::FILE, FROM_HERE,
- base::Bind(&DownloadFileManager::UpdateDownload, file_manager_.get(),
- DownloadId(kValidIdDomain, id), download_buffer_));
-
- message_loop_.RunAllPending();
- }
-
- void OnDownloadInterrupted(int32 download_id, int64 size,
- const std::string& hash_state,
- InterruptReason reason) {
- download_manager_->OnDownloadInterrupted(download_id, size,
- hash_state, reason);
- }
-
- // Get the download item with ID |id|.
- DownloadItem* GetActiveDownloadItem(int32 id) {
- return download_manager_->GetActiveDownload(id);
- }
-
- protected:
- DownloadStatusUpdater download_status_updater_;
- scoped_ptr<TestingProfile> profile_;
- scoped_refptr<TestDownloadManagerDelegate> download_manager_delegate_;
- scoped_refptr<DownloadManager> download_manager_;
- scoped_refptr<DownloadFileManager> file_manager_;
- MessageLoopForUI message_loop_;
- content::TestBrowserThread ui_thread_;
- content::TestBrowserThread file_thread_;
- scoped_refptr<content::DownloadBuffer> download_buffer_;
-
- DownloadFileManager* file_manager() {
- if (!file_manager_) {
- file_manager_ = new DownloadFileManager(NULL,
- new MockDownloadFileFactory);
- download_manager_->SetFileManager(file_manager_);
- }
- return file_manager_;
- }
-
- DISALLOW_COPY_AND_ASSIGN(DownloadManagerTest);
-};
-
-const char* DownloadManagerTest::kTestData = "a;sdlfalsdfjalsdkfjad";
-const size_t DownloadManagerTest::kTestDataLen =
- strlen(DownloadManagerTest::kTestData);
-
-// A DownloadFile that we can inject errors into.
-class DownloadFileWithErrors : public DownloadFileImpl {
- public:
- DownloadFileWithErrors(DownloadCreateInfo* info,
- DownloadManager* manager,
- bool calculate_hash);
- virtual ~DownloadFileWithErrors() {}
-
- // BaseFile delegated functions.
- virtual net::Error Initialize();
- virtual net::Error AppendDataToFile(const char* data, size_t data_len);
- virtual net::Error Rename(const FilePath& full_path);
-
- 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_; }
-
- private:
- net::Error ReturnError(net::Error function_error) {
- if (forced_error_ != net::OK) {
- net::Error ret = forced_error_;
- clear_forced_error();
- return ret;
- }
-
- return function_error;
- }
-
- net::Error forced_error_;
-};
-
-DownloadFileWithErrors::DownloadFileWithErrors(DownloadCreateInfo* info,
- DownloadManager* manager,
- bool calculate_hash)
- : DownloadFileImpl(info,
- new DownloadRequestHandle(),
- manager,
- calculate_hash),
- forced_error_(net::OK) {
-}
-
-net::Error DownloadFileWithErrors::Initialize() {
- return ReturnError(DownloadFileImpl::Initialize());
-}
-
-net::Error DownloadFileWithErrors::AppendDataToFile(const char* data,
- size_t data_len) {
- return ReturnError(DownloadFileImpl::AppendDataToFile(data, data_len));
-}
-
-net::Error DownloadFileWithErrors::Rename(const FilePath& full_path) {
- return ReturnError(DownloadFileImpl::Rename(full_path));
-}
-
-namespace {
-
-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, },
-};
-
-const struct {
- FilePath::StringType suggested_path;
- content::DownloadDangerType danger;
- bool finish_before_rename;
- int expected_rename_count;
-} kDownloadRenameCases[] = {
- // Safe download, download finishes BEFORE file name determined.
- // Renamed twice (linear path through UI). Crdownload file does not need
- // to be deleted.
- { FILE_PATH_LITERAL("foo.zip"), content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
- true, 2, },
- // Potentially dangerous download (e.g., file is dangerous), download finishes
- // BEFORE file name determined. Needs to be renamed only once.
- { FILE_PATH_LITERAL("Unconfirmed xxx.crdownload"),
- content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT, true, 1, },
- { FILE_PATH_LITERAL("Unconfirmed xxx.crdownload"),
- content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, true, 1, },
- // Safe download, download finishes AFTER file name determined.
- // Needs to be renamed twice.
- { FILE_PATH_LITERAL("foo.zip"), content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
- false, 2, },
- // Potentially dangerous download, download finishes AFTER file name
- // determined. Needs to be renamed only once.
- { FILE_PATH_LITERAL("Unconfirmed xxx.crdownload"),
- content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT, false, 1, },
- { FILE_PATH_LITERAL("Unconfirmed xxx.crdownload"),
- content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, false, 1, },
-};
-
-// This is an observer that records what download IDs have opened a select
-// file dialog.
-class SelectFileObserver : public content::DownloadManager::Observer {
- public:
- explicit SelectFileObserver(DownloadManager* download_manager)
- : download_manager_(download_manager) {
- DCHECK(download_manager_.get());
- download_manager_->AddObserver(this);
- }
-
- ~SelectFileObserver() {
- download_manager_->RemoveObserver(this);
- }
-
- // Downloadmanager::Observer functions.
- virtual void ModelChanged() {}
- virtual void ManagerGoingDown() {}
- virtual void SelectFileDialogDisplayed(int32 id) {
- file_dialog_ids_.insert(id);
- }
-
- bool ShowedFileDialogForId(int32 id) {
- return file_dialog_ids_.find(id) != file_dialog_ids_.end();
- }
-
- 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);
- }
-
- 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_; }
-
- private:
- // DownloadItem::Observer methods
- virtual void OnDownloadUpdated(DownloadItem* download) {
- DCHECK_EQ(tracked_, download);
- states_hit_ |= (1 << download->GetState());
- was_updated_ = true;
- }
- virtual void OnDownloadOpened(DownloadItem* download) {
- DCHECK_EQ(tracked_, download);
- states_hit_ |= (1 << download->GetState());
- was_opened_ = true;
- }
-
- DownloadItem* tracked_;
- int states_hit_;
- bool was_updated_;
- bool was_opened_;
-};
-
-} // namespace
-
-TEST_F(DownloadManagerTest, MAYBE_StartDownload) {
- content::TestBrowserThread io_thread(BrowserThread::IO, &message_loop_);
- PrefService* prefs = profile_->GetPrefs();
- prefs->SetFilePath(prefs::kDownloadDefaultDirectory, FilePath());
- DownloadPrefs* download_prefs =
- DownloadPrefs::FromDownloadManager(download_manager_);
- download_prefs->EnableAutoOpenBasedOnExtension(
- FilePath(FILE_PATH_LITERAL("example.pdf")));
-
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kStartDownloadCases); ++i) {
- prefs->SetBoolean(prefs::kPromptForDownload,
- 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);
- const DownloadId id = DownloadId(kValidIdDomain, static_cast<int>(i));
- info->download_id = id;
- 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());
-
- DownloadFile* download_file(
- new DownloadFileImpl(info.get(), new DownloadRequestHandle(),
- download_manager_, false));
- AddDownloadToFileManager(info->download_id.local(), download_file);
- download_file->Initialize();
- download_manager_->StartDownload(info->download_id.local());
- message_loop_.RunAllPending();
-
- // 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(i));
-
- file_manager()->CancelDownload(id);
- }
-}
-
-namespace {
-
-enum PromptForSaveLocation {
- DONT_PROMPT,
- PROMPT
-};
-
-enum ValidateDangerousDownload {
- DONT_VALIDATE,
- VALIDATE
-};
-
-// Test cases to be used with DownloadFilenameTest. The paths that are used in
-// test cases can contain "$dl" and "$alt" tokens which are replaced by a
-// default download path, and an alternate download path in
-// ExpandFilenameTestPath() below.
-const struct DownloadFilenameTestCase {
-
- // Fields to be set in DownloadStateInfo when calling SetFileCheckResults().
- const FilePath::CharType* suggested_path;
- const FilePath::CharType* target_name;
- PromptForSaveLocation prompt_user_for_save_location;
- content::DownloadDangerType danger_type;
-
- // If we receive a ChooseDownloadPath() call to prompt the user for a download
- // location, |prompt_path| is the expected prompt path. The
- // TestDownloadManagerDelegate will respond with |final_path|. If |final_path|
- // is empty, then the file choose dialog be cancelled.
- const FilePath::CharType* prompt_path;
-
- // The expected intermediate path for the download.
- const FilePath::CharType* intermediate_path;
-
- // The expected final path for the download.
- const FilePath::CharType* final_path;
-
- // If this is a dangerous download, then we will either validate the download
- // or delete it depending on the value of |validate_dangerous_download|.
- ValidateDangerousDownload validate_dangerous_download;
-} kDownloadFilenameTestCases[] = {
- {
- // 0: A safe file is downloaded with no prompting.
- FILE_PATH_LITERAL("$dl/foo.txt"),
- FILE_PATH_LITERAL(""),
- DONT_PROMPT,
- content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
- FILE_PATH_LITERAL(""),
- FILE_PATH_LITERAL("$dl/foo.txt.crdownload"),
- FILE_PATH_LITERAL("$dl/foo.txt"),
- DONT_VALIDATE
- },
- {
- // 1: A safe file is downloaded with prompting.
- FILE_PATH_LITERAL("$dl/foo.txt"),
- FILE_PATH_LITERAL(""),
- PROMPT,
- content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
- FILE_PATH_LITERAL("$dl/foo.txt"),
- FILE_PATH_LITERAL("$dl/foo.txt.crdownload"),
- FILE_PATH_LITERAL("$dl/foo.txt"),
- DONT_VALIDATE
- },
- {
- // 2: A safe file is downloaded. The filename is changed before the dialog
- // completes.
- FILE_PATH_LITERAL("$dl/foo.txt"),
- FILE_PATH_LITERAL(""),
- PROMPT,
- content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
- FILE_PATH_LITERAL("$dl/foo.txt"),
- FILE_PATH_LITERAL("$dl/bar.txt.crdownload"),
- FILE_PATH_LITERAL("$dl/bar.txt"),
- DONT_VALIDATE
- },
- {
- // 3: A safe file is downloaded. The download path is changed before the
- // dialog completes.
- FILE_PATH_LITERAL("$dl/foo.txt"),
- FILE_PATH_LITERAL(""),
- PROMPT,
- content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
- FILE_PATH_LITERAL("$dl/foo.txt"),
- FILE_PATH_LITERAL("$alt/bar.txt.crdownload"),
- FILE_PATH_LITERAL("$alt/bar.txt"),
- DONT_VALIDATE
- },
- {
- // 4: Potentially dangerous content.
- FILE_PATH_LITERAL("$dl/Unconfirmed xxx.download"),
- FILE_PATH_LITERAL("foo.exe"),
- DONT_PROMPT,
- content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
- FILE_PATH_LITERAL(""),
- FILE_PATH_LITERAL("$dl/Unconfirmed xxx.download"),
- FILE_PATH_LITERAL("$dl/foo.exe"),
- DONT_VALIDATE
- },
- {
- // 5: Potentially dangerous content. Uses "Save as."
- FILE_PATH_LITERAL("$dl/Unconfirmed xxx.download"),
- FILE_PATH_LITERAL("foo.exe"),
- PROMPT,
- content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
- FILE_PATH_LITERAL("$dl/foo.exe"),
- FILE_PATH_LITERAL("$dl/Unconfirmed xxx.download"),
- FILE_PATH_LITERAL("$dl/foo.exe"),
- DONT_VALIDATE
- },
- {
- // 6: Potentially dangerous content. Uses "Save as." The download filename
- // is changed before the dialog completes.
- FILE_PATH_LITERAL("$dl/Unconfirmed xxx.download"),
- FILE_PATH_LITERAL("foo.exe"),
- PROMPT,
- content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
- FILE_PATH_LITERAL("$dl/foo.exe"),
- FILE_PATH_LITERAL("$dl/Unconfirmed xxx.download"),
- FILE_PATH_LITERAL("$dl/bar.exe"),
- DONT_VALIDATE
- },
- {
- // 7: Potentially dangerous content. Uses "Save as." The download directory
- // is changed before the dialog completes.
- FILE_PATH_LITERAL("$dl/Unconfirmed xxx.download"),
- FILE_PATH_LITERAL("foo.exe"),
- PROMPT,
- content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
- FILE_PATH_LITERAL("$dl/foo.exe"),
- FILE_PATH_LITERAL("$alt/Unconfirmed xxx.download"),
- FILE_PATH_LITERAL("$alt/bar.exe"),
- DONT_VALIDATE
- },
- {
- // 8: Dangerous content. Saved directly.
- FILE_PATH_LITERAL("$dl/Unconfirmed xxx.download"),
- FILE_PATH_LITERAL("foo.exe"),
- PROMPT,
- content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL,
- FILE_PATH_LITERAL(""),
- FILE_PATH_LITERAL("$dl/Unconfirmed xxx.download"),
- FILE_PATH_LITERAL("$dl/foo.exe"),
- VALIDATE
- },
- {
- // 9: Dangerous content. Saved directly. Not validated.
- FILE_PATH_LITERAL("$dl/Unconfirmed xxx.download"),
- FILE_PATH_LITERAL("foo.exe"),
- DONT_PROMPT,
- content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL,
- FILE_PATH_LITERAL(""),
- FILE_PATH_LITERAL("$dl/Unconfirmed xxx.download"),
- FILE_PATH_LITERAL(""),
- DONT_VALIDATE
- },
- {
- // 10: Dangerous content. Uses "Save as." The download directory is changed
- // before the dialog completes.
- FILE_PATH_LITERAL("$dl/Unconfirmed xxx.download"),
- FILE_PATH_LITERAL("foo.exe"),
- PROMPT,
- content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL,
- FILE_PATH_LITERAL("$dl/foo.exe"),
- FILE_PATH_LITERAL("$alt/Unconfirmed xxx.download"),
- FILE_PATH_LITERAL("$alt/bar.exe"),
- VALIDATE
- },
- {
- // 11: A safe file is download. The target file exists, but we don't
- // uniquify. Safe downloads are uniquified in ChromeDownloadManagerDelegate
- // instead of DownloadManagerImpl.
- FILE_PATH_LITERAL("$dl/exists.txt"),
- FILE_PATH_LITERAL(""),
- DONT_PROMPT,
- content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
- FILE_PATH_LITERAL(""),
- FILE_PATH_LITERAL("$dl/exists.txt.crdownload"),
- FILE_PATH_LITERAL("$dl/exists.txt"),
- DONT_VALIDATE
- },
- {
- // 12: A potentially dangerous file is download. The target file exists. The
- // target path is uniquified.
- FILE_PATH_LITERAL("$dl/Unconfirmed xxx.download"),
- FILE_PATH_LITERAL("exists.exe"),
- DONT_PROMPT,
- content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
- FILE_PATH_LITERAL(""),
- FILE_PATH_LITERAL("$dl/Unconfirmed xxx.download"),
- FILE_PATH_LITERAL("$dl/exists (1).exe"),
- DONT_VALIDATE
- },
- {
- // 13: A dangerous file is download. The target file exists. The target path
- // is uniquified.
- FILE_PATH_LITERAL("$dl/Unconfirmed xxx.download"),
- FILE_PATH_LITERAL("exists.exe"),
- DONT_PROMPT,
- content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT,
- FILE_PATH_LITERAL(""),
- FILE_PATH_LITERAL("$dl/Unconfirmed xxx.download"),
- FILE_PATH_LITERAL("$dl/exists (1).exe"),
- VALIDATE
- },
- {
- // 14: A potentially dangerous file is download with prompting. The target
- // file exists. The target path is not uniquified because the filename was
- // given to us by the user.
- FILE_PATH_LITERAL("$dl/Unconfirmed xxx.download"),
- FILE_PATH_LITERAL("exists.exe"),
- PROMPT,
- content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
- FILE_PATH_LITERAL("$dl/exists.exe"),
- FILE_PATH_LITERAL("$dl/Unconfirmed xxx.download"),
- FILE_PATH_LITERAL("$dl/exists.exe"),
- DONT_VALIDATE
- },
-};
-
-FilePath ExpandFilenameTestPath(const FilePath::CharType* template_path,
- const FilePath& downloads_dir,
- const FilePath& alternate_dir) {
- FilePath::StringType path(template_path);
- ReplaceSubstringsAfterOffset(&path, 0, FILE_PATH_LITERAL("$dl"),
- downloads_dir.value());
- ReplaceSubstringsAfterOffset(&path, 0, FILE_PATH_LITERAL("$alt"),
- alternate_dir.value());
- FilePath file_path(path);
-#if defined(FILE_PATH_USES_WIN_SEPARATORS)
- file_path = file_path.NormalizeWindowsPathSeparators();
-#endif
- return file_path;
-}
-
-} // namespace
-
-TEST_F(DownloadManagerTest, DownloadFilenameTest) {
- ScopedTempDir scoped_dl_dir;
- ASSERT_TRUE(scoped_dl_dir.CreateUniqueTempDir());
-
- FilePath downloads_dir(scoped_dl_dir.path());
- FilePath alternate_dir(downloads_dir.Append(FILE_PATH_LITERAL("Foo")));
-
- // We create a known file to test file uniquification.
- file_util::WriteFile(downloads_dir.Append(FILE_PATH_LITERAL("exists.txt")),
- "", 0);
- file_util::WriteFile(downloads_dir.Append(FILE_PATH_LITERAL("exists.exe")),
- "", 0);
-
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kDownloadFilenameTestCases); ++i) {
- scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo);
- info->download_id = DownloadId(kValidIdDomain, i);
- info->url_chain.push_back(GURL());
-
- MockDownloadFile* download_file(new MockDownloadFile());
- FilePath suggested_path(ExpandFilenameTestPath(
- kDownloadFilenameTestCases[i].suggested_path,
- downloads_dir, alternate_dir));
- FilePath prompt_path(ExpandFilenameTestPath(
- kDownloadFilenameTestCases[i].prompt_path,
- downloads_dir, alternate_dir));
- FilePath intermediate_path(ExpandFilenameTestPath(
- kDownloadFilenameTestCases[i].intermediate_path,
- downloads_dir, alternate_dir));
- FilePath final_path(ExpandFilenameTestPath(
- kDownloadFilenameTestCases[i].final_path,
- downloads_dir, alternate_dir));
-
- AddMockDownloadToFileManager(info->download_id.local(), download_file);
-
- EXPECT_CALL(*download_file, Rename(intermediate_path))
- .WillOnce(Return(net::OK));
-
- if (!final_path.empty()) {
- // If |final_path| is empty, its a signal that the download doesn't
- // complete. Therefore it will only go through a single rename.
- EXPECT_CALL(*download_file, Rename(final_path))
- .WillOnce(Return(net::OK));
- }
-
- download_manager_->CreateDownloadItem(info.get(), DownloadRequestHandle());
- DownloadItem* download = GetActiveDownloadItem(i);
- ASSERT_TRUE(download != NULL);
-
- DownloadStateInfo state = download->GetStateInfo();
- state.suggested_path = suggested_path;
- state.danger = kDownloadFilenameTestCases[i].danger_type;
- state.prompt_user_for_save_location =
- (kDownloadFilenameTestCases[i].prompt_user_for_save_location == PROMPT);
- state.target_name = FilePath(kDownloadFilenameTestCases[i].target_name);
- if (state.danger == content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT) {
- // DANGEROUS_CONTENT will only be known once we have all the data. We let
- // our TestDownloadManagerDelegate handle it.
- state.danger = content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT;
- download_manager_delegate_->SetMarkContentsDangerous(true);
- }
- download->SetFileCheckResults(state);
- download_manager_delegate_->SetFileSelectionExpectation(
- prompt_path, final_path);
- download_manager_->RestartDownload(i);
- message_loop_.RunAllPending();
-
- OnResponseCompleted(i, 1024, std::string("fake_hash"));
- message_loop_.RunAllPending();
-
- if (download->GetSafetyState() == DownloadItem::DANGEROUS) {
- if (kDownloadFilenameTestCases[i].validate_dangerous_download == VALIDATE)
- download->DangerousDownloadValidated();
- else
- download->Delete(DownloadItem::DELETE_DUE_TO_USER_DISCARD);
- message_loop_.RunAllPending();
- // |download| might be deleted when we get here.
- }
- }
-}
-
-TEST_F(DownloadManagerTest, DownloadRenameTest) {
- using ::testing::_;
- using ::testing::CreateFunctor;
- using ::testing::Invoke;
- using ::testing::Return;
-
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kDownloadRenameCases); ++i) {
- // 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->download_id = DownloadId(kValidIdDomain, static_cast<int>(i));
- info->prompt_user_for_save_location = false;
- info->url_chain.push_back(GURL());
- const FilePath new_path(kDownloadRenameCases[i].suggested_path);
-
- MockDownloadFile* download_file(new MockDownloadFile());
- const DownloadId id = info->download_id;
- ON_CALL(*download_file, GlobalId())
- .WillByDefault(ReturnRef(id));
-
- AddMockDownloadToFileManager(info->download_id.local(), download_file);
-
- // |download_file| is owned by DownloadFileManager.
- if (kDownloadRenameCases[i].expected_rename_count == 1) {
- EXPECT_CALL(*download_file, Rename(new_path))
- .Times(1)
- .WillOnce(Return(net::OK));
- } else {
- ASSERT_EQ(2, kDownloadRenameCases[i].expected_rename_count);
- FilePath crdownload(download_util::GetCrDownloadPath(new_path));
- EXPECT_CALL(*download_file, Rename(crdownload))
- .Times(1)
- .WillOnce(Return(net::OK));
- EXPECT_CALL(*download_file, Rename(new_path))
- .Times(1)
- .WillOnce(Return(net::OK));
- }
- download_manager_->CreateDownloadItem(info.get(), DownloadRequestHandle());
- DownloadItem* download = GetActiveDownloadItem(i);
- ASSERT_TRUE(download != NULL);
- DownloadStateInfo state = download->GetStateInfo();
- state.danger = kDownloadRenameCases[i].danger;
- download->SetFileCheckResults(state);
-
- int32* id_ptr = new int32;
- *id_ptr = i; // Deleted in FileSelected().
- if (kDownloadRenameCases[i].finish_before_rename) {
- OnResponseCompleted(i, 1024, std::string("fake_hash"));
- message_loop_.RunAllPending();
- FileSelected(new_path, id_ptr);
- } else {
- FileSelected(new_path, id_ptr);
- message_loop_.RunAllPending();
- OnResponseCompleted(i, 1024, std::string("fake_hash"));
- }
- // Validating the download item, so it will complete.
- if (state.danger == content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE)
- download->DangerousDownloadValidated();
- message_loop_.RunAllPending();
- }
-}
-
-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->download_id = DownloadId(kValidIdDomain, 0);
- 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(download_util::GetCrDownloadPath(new_path));
-
- MockDownloadFile* download_file(new MockDownloadFile());
- ON_CALL(*download_file, AppendDataToFile(_, _))
- .WillByDefault(Return(net::OK));
-
- // |download_file| is owned by DownloadFileManager.
- AddMockDownloadToFileManager(info->download_id.local(), download_file);
-
- EXPECT_CALL(*download_file, Rename(cr_path))
- .Times(1)
- .WillOnce(Return(net::OK));
-
- download_manager_->CreateDownloadItem(info.get(), DownloadRequestHandle());
-
- DownloadItem* download = GetActiveDownloadItem(0);
- ASSERT_TRUE(download != NULL);
- scoped_ptr<DownloadItemModel> download_item_model(
- new DownloadItemModel(download));
-
- EXPECT_EQ(DownloadItem::IN_PROGRESS, download->GetState());
- scoped_ptr<ItemObserver> observer(new ItemObserver(download));
-
- download_file->AppendDataToFile(kTestData, kTestDataLen);
-
- ContinueDownloadWithPath(download, new_path);
- message_loop_.RunAllPending();
- EXPECT_TRUE(GetActiveDownloadItem(0) != NULL);
-
- int64 error_size = 3;
- OnDownloadInterrupted(0, error_size, "",
- DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED);
- message_loop_.RunAllPending();
-
- EXPECT_TRUE(GetActiveDownloadItem(0) == 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());
- ui::DataUnits amount_units = ui::GetByteDisplayUnits(kTestDataLen);
- string16 simple_size =
- ui::FormatBytesWithUnits(error_size, amount_units, false);
- string16 simple_total = base::i18n::GetDisplayStringInLTRDirectionality(
- ui::FormatBytesWithUnits(kTestDataLen, amount_units, true));
- EXPECT_EQ(download_item_model->GetStatusText(),
- l10n_util::GetStringFUTF16(IDS_DOWNLOAD_STATUS_INTERRUPTED,
- simple_size,
- simple_total));
-
- 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));
-}
-
-// 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;
- ASSERT_EQ(0, stream->Open(
- path,
- base::PLATFORM_FILE_OPEN_ALWAYS | base::PLATFORM_FILE_WRITE));
-
- // 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);
- static const int32 local_id = 0;
- info->download_id = DownloadId(kValidIdDomain, local_id);
- 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);
-
- // Create a download file that we can insert errors into.
- DownloadFileWithErrors* download_file(new DownloadFileWithErrors(
- info.get(), download_manager_, false));
- download_file->Initialize();
- AddDownloadToFileManager(local_id, download_file);
-
- // |download_file| is owned by DownloadFileManager.
- download_manager_->CreateDownloadItem(info.get(), DownloadRequestHandle());
-
- DownloadItem* download = GetActiveDownloadItem(0);
- ASSERT_TRUE(download != NULL);
- // This will keep track of what should be displayed on the shelf.
- scoped_ptr<DownloadItemModel> download_item_model(
- new DownloadItemModel(download));
-
- EXPECT_EQ(DownloadItem::IN_PROGRESS, download->GetState());
- scoped_ptr<ItemObserver> observer(new ItemObserver(download));
-
- // Add some data before finalizing the file name.
- UpdateData(local_id, kTestData, kTestDataLen);
-
- // Finalize the file name.
- ContinueDownloadWithPath(download, path);
- message_loop_.RunAllPending();
- EXPECT_TRUE(GetActiveDownloadItem(0) != NULL);
-
- // Add more data.
- UpdateData(local_id, kTestData, kTestDataLen);
-
- // Add more data, but an error occurs.
- download_file->set_forced_error(net::ERR_FAILED);
- UpdateData(local_id, kTestData, kTestDataLen);
-
- // Check the state. The download should have been interrupted.
- EXPECT_TRUE(GetActiveDownloadItem(0) == 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());
-
- // Check the download shelf's information.
- size_t error_size = kTestDataLen * 3;
- size_t total_size = kTestDataLen * 3;
- ui::DataUnits amount_units = ui::GetByteDisplayUnits(kTestDataLen);
- string16 simple_size =
- ui::FormatBytesWithUnits(error_size, amount_units, false);
- string16 simple_total = base::i18n::GetDisplayStringInLTRDirectionality(
- ui::FormatBytesWithUnits(total_size, amount_units, true));
- EXPECT_EQ(l10n_util::GetStringFUTF16(IDS_DOWNLOAD_STATUS_INTERRUPTED,
- simple_size,
- simple_total),
- download_item_model->GetStatusText());
-
- // Clean up.
- download->Cancel(true);
- message_loop_.RunAllPending();
-}
-
-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);
- DownloadId id = DownloadId(kValidIdDomain, 0);
- info->download_id = id;
- 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(download_util::GetCrDownloadPath(new_path));
-
- MockDownloadFile* download_file(new MockDownloadFile());
- ON_CALL(*download_file, AppendDataToFile(_, _))
- .WillByDefault(Return(net::OK));
- AddMockDownloadToFileManager(info->download_id.local(), download_file);
-
- // |download_file| is owned by DownloadFileManager.
- EXPECT_CALL(*download_file, Rename(cr_path))
- .Times(1)
- .WillOnce(Return(net::OK));
-
- download_manager_->CreateDownloadItem(info.get(), DownloadRequestHandle());
-
- DownloadItem* download = GetActiveDownloadItem(0);
- ASSERT_TRUE(download != NULL);
- scoped_ptr<DownloadItemModel> download_item_model(
- new DownloadItemModel(download));
-
- EXPECT_EQ(DownloadItem::IN_PROGRESS, download->GetState());
- scoped_ptr<ItemObserver> observer(new ItemObserver(download));
-
- ContinueDownloadWithPath(download, new_path);
- message_loop_.RunAllPending();
- EXPECT_TRUE(GetActiveDownloadItem(0) != NULL);
-
- download_file->AppendDataToFile(kTestData, kTestDataLen);
-
- download->Cancel(false);
- message_loop_.RunAllPending();
-
- EXPECT_TRUE(GetActiveDownloadItem(0) != 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());
- EXPECT_EQ(download_item_model->GetStatusText(),
- l10n_util::GetStringUTF16(IDS_DOWNLOAD_STATUS_CANCELED));
-
- file_manager()->CancelDownload(id);
-
- EXPECT_FALSE(file_util::PathExists(new_path));
- EXPECT_FALSE(file_util::PathExists(cr_path));
-}
-
-TEST_F(DownloadManagerTest, MAYBE_DownloadOverwriteTest) {
- using ::testing::_;
- using ::testing::CreateFunctor;
- using ::testing::Invoke;
- using ::testing::Return;
-
- // Create a temporary directory.
- ScopedTempDir temp_dir_;
- ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
-
- // File names we're using.
- const FilePath new_path(temp_dir_.path().AppendASCII("foo.txt"));
- const FilePath cr_path(download_util::GetCrDownloadPath(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 = DownloadFile::GetUniquePathNumber(new_path);
- FilePath unique_new_path = new_path;
- EXPECT_NE(0, uniquifier);
- DownloadFile::AppendNumberToPath(&unique_new_path, 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->download_id = DownloadId(kValidIdDomain, 0);
- info->prompt_user_for_save_location = true;
- info->url_chain.push_back(GURL());
-
- download_manager_->CreateDownloadItem(info.get(), DownloadRequestHandle());
-
- DownloadItem* download = GetActiveDownloadItem(0);
- ASSERT_TRUE(download != NULL);
- scoped_ptr<DownloadItemModel> download_item_model(
- new DownloadItemModel(download));
-
- 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(), new DownloadRequestHandle(),
- download_manager_, false));
- download_file->Rename(cr_path);
- // This creates the .crdownload version of the file.
- download_file->Initialize();
- // |download_file| is owned by DownloadFileManager.
- AddDownloadToFileManager(info->download_id.local(), download_file);
-
- ContinueDownloadWithPath(download, new_path);
- message_loop_.RunAllPending();
- EXPECT_TRUE(GetActiveDownloadItem(0) != NULL);
-
- download_file->AppendDataToFile(kTestData, kTestDataLen);
-
- // Finish the download.
- OnResponseCompleted(0, kTestDataLen, "");
- message_loop_.RunAllPending();
-
- // Download is complete.
- EXPECT_TRUE(GetActiveDownloadItem(0) == 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_EQ(download_item_model->GetStatusText(), string16());
-
- 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);
-}
-
-TEST_F(DownloadManagerTest, MAYBE_DownloadRemoveTest) {
- using ::testing::_;
- using ::testing::CreateFunctor;
- using ::testing::Invoke;
- using ::testing::Return;
-
- // Create a temporary directory.
- ScopedTempDir temp_dir_;
- ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
-
- // File names we're using.
- const FilePath new_path(temp_dir_.path().AppendASCII("foo.txt"));
- const FilePath cr_path(download_util::GetCrDownloadPath(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->download_id = DownloadId(kValidIdDomain, 0);
- info->prompt_user_for_save_location = true;
- info->url_chain.push_back(GURL());
-
- download_manager_->CreateDownloadItem(info.get(), DownloadRequestHandle());
-
- DownloadItem* download = GetActiveDownloadItem(0);
- ASSERT_TRUE(download != NULL);
- scoped_ptr<DownloadItemModel> download_item_model(
- new DownloadItemModel(download));
-
- 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(), new DownloadRequestHandle(),
- download_manager_, false));
- download_file->Rename(cr_path);
- // This creates the .crdownload version of the file.
- download_file->Initialize();
- // |download_file| is owned by DownloadFileManager.
- AddDownloadToFileManager(info->download_id.local(), download_file);
-
- ContinueDownloadWithPath(download, new_path);
- message_loop_.RunAllPending();
- EXPECT_TRUE(GetActiveDownloadItem(0) != NULL);
-
- download_file->AppendDataToFile(kTestData, kTestDataLen);
-
- // Finish the download.
- OnResponseCompleted(0, kTestDataLen, "");
- message_loop_.RunAllPending();
-
- // Download is complete.
- EXPECT_TRUE(GetActiveDownloadItem(0) == 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_EQ(download_item_model->GetStatusText(), string16());
-
- 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(0) == 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_EQ(download_item_model->GetStatusText(),
- l10n_util::GetStringUTF16(IDS_DOWNLOAD_STATUS_REMOVED));
-
- EXPECT_FALSE(file_util::PathExists(new_path));
-}