summaryrefslogtreecommitdiffstats
path: root/chrome/browser/download/download_manager_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/download/download_manager_unittest.cc')
-rw-r--r--chrome/browser/download/download_manager_unittest.cc117
1 files changed, 83 insertions, 34 deletions
diff --git a/chrome/browser/download/download_manager_unittest.cc b/chrome/browser/download/download_manager_unittest.cc
index 683a993..a857d34 100644
--- a/chrome/browser/download/download_manager_unittest.cc
+++ b/chrome/browser/download/download_manager_unittest.cc
@@ -3,7 +3,9 @@
// found in the LICENSE file.
#include <string>
+#include <set>
+#include "base/scoped_ptr.h"
#include "base/string_util.h"
#include "build/build_config.h"
#include "chrome/browser/download/download_file.h"
@@ -28,7 +30,8 @@ class DownloadManagerTest : public testing::Test {
DownloadManagerTest()
: profile_(new TestingProfile()),
download_manager_(new MockDownloadManager(&download_status_updater_)),
- ui_thread_(BrowserThread::UI, &message_loop_) {
+ ui_thread_(BrowserThread::UI, &message_loop_),
+ file_thread_(BrowserThread::FILE, &message_loop_) {
download_manager_->Init(profile_.get());
}
@@ -52,6 +55,7 @@ class DownloadManagerTest : public testing::Test {
scoped_refptr<DownloadFileManager> file_manager_;
MessageLoopForUI message_loop_;
BrowserThread ui_thread_;
+ BrowserThread file_thread_;
DownloadFileManager* file_manager() {
if (!file_manager_) {
@@ -126,34 +130,6 @@ const struct {
true, },
};
-} // namespace
-
-TEST_F(DownloadManagerTest, StartDownload) {
- BrowserThread io_thread(BrowserThread::IO, &message_loop_);
- PrefService* prefs = profile_->GetPrefs();
- prefs->SetFilePath(prefs::kDownloadDefaultDirectory, FilePath());
- 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);
-
- DownloadCreateInfo info;
- info.prompt_user_for_save_location = kStartDownloadCases[i].save_as;
- info.url = GURL(kStartDownloadCases[i].url);
- info.mime_type = kStartDownloadCases[i].mime_type;
-
- download_manager_->StartDownload(&info);
- message_loop_.RunAllPending();
-
- EXPECT_EQ(kStartDownloadCases[i].expected_save_as,
- info.prompt_user_for_save_location);
- }
-}
-
-namespace {
-
const struct {
FilePath::StringType suggested_path;
bool is_dangerous_file;
@@ -191,8 +167,8 @@ const struct {
class MockDownloadFile : public DownloadFile {
public:
- explicit MockDownloadFile(DownloadCreateInfo* info)
- : DownloadFile(info, NULL), renamed_count_(0) { }
+ MockDownloadFile(DownloadCreateInfo* info, DownloadManager* manager)
+ : DownloadFile(info, manager), renamed_count_(0) { }
virtual ~MockDownloadFile() { Destructed(); }
MOCK_METHOD1(Rename, bool(const FilePath&));
MOCK_METHOD0(Destructed, void());
@@ -210,16 +186,87 @@ class MockDownloadFile : public DownloadFile {
int renamed_count_;
};
+// 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_);
+ 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_;
+ DownloadManager* download_manager_;
+};
+
} // namespace
+TEST_F(DownloadManagerTest, StartDownload) {
+ BrowserThread io_thread(BrowserThread::IO, &message_loop_);
+ PrefService* prefs = profile_->GetPrefs();
+ prefs->SetFilePath(prefs::kDownloadDefaultDirectory, FilePath());
+ 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_);
+ DownloadCreateInfo* info = new DownloadCreateInfo;
+ info->download_id = static_cast<int>(i);
+ info->prompt_user_for_save_location = kStartDownloadCases[i].save_as;
+ info->url = GURL(kStartDownloadCases[i].url);
+ info->mime_type = kStartDownloadCases[i].mime_type;
+ download_manager_->CreateDownloadItem(info);
+
+ DownloadFile* download(new DownloadFile(info, download_manager_));
+ AddDownloadToFileManager(info->download_id, download);
+ download->Initialize(false);
+ download_manager_->StartDownload(info);
+ message_loop_.RunAllPending();
+
+ // NOTE: At this point, |AttachDownloadItem| will have been run if we don't
+ // need to prompt the user, so |info| could have been destructed.
+ // This means that we can't check any of its values.
+ // However, SelectFileObserver will have recorded any attempt to open the
+ // select file dialog.
+ EXPECT_EQ(kStartDownloadCases[i].expected_save_as,
+ observer.ShowedFileDialogForId(i));
+
+ // If the Save As dialog pops up, it never reached
+ // DownloadManager::AttachDownloadItem(), and never deleted info or
+ // completed. This cleans up info.
+ // Note that DownloadManager::FileSelectionCanceled() is never called.
+ if (observer.ShowedFileDialogForId(i)) {
+ delete info;
+ }
+ }
+}
+
TEST_F(DownloadManagerTest, DownloadRenameTest) {
using ::testing::_;
using ::testing::CreateFunctor;
using ::testing::Invoke;
using ::testing::Return;
- BrowserThread file_thread(BrowserThread::FILE, &message_loop_);
-
for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kDownloadRenameCases); ++i) {
// |info| will be destroyed in download_manager_.
DownloadCreateInfo* info(new DownloadCreateInfo);
@@ -229,7 +276,7 @@ TEST_F(DownloadManagerTest, DownloadRenameTest) {
info->is_dangerous_url = kDownloadRenameCases[i].is_dangerous_url;
FilePath new_path(kDownloadRenameCases[i].suggested_path);
- MockDownloadFile* download(new MockDownloadFile(info));
+ MockDownloadFile* download(new MockDownloadFile(info, download_manager_));
AddDownloadToFileManager(info->download_id, download);
// |download| is owned by DownloadFileManager.
@@ -253,9 +300,11 @@ TEST_F(DownloadManagerTest, DownloadRenameTest) {
if (kDownloadRenameCases[i].finish_before_rename) {
download_manager_->OnAllDataSaved(i, 1024, std::string("fake_hash"));
+ message_loop_.RunAllPending();
download_manager_->FileSelected(new_path, i, info);
} else {
download_manager_->FileSelected(new_path, i, info);
+ message_loop_.RunAllPending();
download_manager_->OnAllDataSaved(i, 1024, std::string("fake_hash"));
}