1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/chromeos/drive/download_handler.h"
6
7 #include "base/files/scoped_temp_dir.h"
8 #include "chrome/browser/chromeos/drive/dummy_file_system.h"
9 #include "chrome/browser/chromeos/drive/file_system_util.h"
10 #include "chrome/browser/chromeos/drive/test_util.h"
11 #include "chrome/test/base/testing_profile.h"
12 #include "content/public/test/mock_download_item.h"
13 #include "content/public/test/mock_download_manager.h"
14 #include "content/public/test/test_browser_thread_bundle.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 namespace drive {
18
19 namespace {
20
21 // Test file system for verifying the behavior of DownloadHandler, by simulating
22 // various responses from FileSystem.
23 class DownloadHandlerTestFileSystem : public DummyFileSystem {
24 public:
DownloadHandlerTestFileSystem()25 DownloadHandlerTestFileSystem() : error_(FILE_ERROR_FAILED) {}
26
set_error(FileError error)27 void set_error(FileError error) { error_ = error; }
28
29 // FileSystemInterface overrides.
GetResourceEntry(const base::FilePath & file_path,const GetResourceEntryCallback & callback)30 virtual void GetResourceEntry(
31 const base::FilePath& file_path,
32 const GetResourceEntryCallback& callback) OVERRIDE {
33 callback.Run(error_, scoped_ptr<ResourceEntry>(
34 error_ == FILE_ERROR_OK ? new ResourceEntry : NULL));
35 }
36
CreateDirectory(const base::FilePath & directory_path,bool is_exclusive,bool is_recursive,const FileOperationCallback & callback)37 virtual void CreateDirectory(
38 const base::FilePath& directory_path,
39 bool is_exclusive,
40 bool is_recursive,
41 const FileOperationCallback& callback) OVERRIDE {
42 callback.Run(error_);
43 }
44
45 private:
46 FileError error_;
47 };
48
49 } // namespace
50
51 class DownloadHandlerTest : public testing::Test {
52 public:
DownloadHandlerTest()53 DownloadHandlerTest()
54 : download_manager_(new content::MockDownloadManager) {}
55
SetUp()56 virtual void SetUp() OVERRIDE {
57 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
58
59 // Set expectations for download item.
60 EXPECT_CALL(download_item_, GetState())
61 .WillRepeatedly(testing::Return(content::DownloadItem::IN_PROGRESS));
62
63 download_handler_.reset(new DownloadHandler(&test_file_system_));
64 download_handler_->Initialize(download_manager_.get(), temp_dir_.path());
65 }
66
67 protected:
68 base::ScopedTempDir temp_dir_;
69 content::TestBrowserThreadBundle thread_bundle_;
70 TestingProfile profile_;
71 scoped_ptr<content::MockDownloadManager> download_manager_;
72 DownloadHandlerTestFileSystem test_file_system_;
73 scoped_ptr<DownloadHandler> download_handler_;
74 content::MockDownloadItem download_item_;
75 };
76
TEST_F(DownloadHandlerTest,SubstituteDriveDownloadPathNonDrivePath)77 TEST_F(DownloadHandlerTest, SubstituteDriveDownloadPathNonDrivePath) {
78 const base::FilePath non_drive_path(FILE_PATH_LITERAL("/foo/bar"));
79 ASSERT_FALSE(util::IsUnderDriveMountPoint(non_drive_path));
80
81 // Call SubstituteDriveDownloadPath()
82 base::FilePath substituted_path;
83 download_handler_->SubstituteDriveDownloadPath(
84 non_drive_path,
85 &download_item_,
86 google_apis::test_util::CreateCopyResultCallback(&substituted_path));
87 test_util::RunBlockingPoolTask();
88
89 // Check the result.
90 EXPECT_EQ(non_drive_path, substituted_path);
91 EXPECT_FALSE(download_handler_->IsDriveDownload(&download_item_));
92 }
93
TEST_F(DownloadHandlerTest,SubstituteDriveDownloadPath)94 TEST_F(DownloadHandlerTest, SubstituteDriveDownloadPath) {
95 const base::FilePath drive_path =
96 util::GetDriveMountPointPath(&profile_).AppendASCII("test.dat");
97
98 // Test the case that the download target directory already exists.
99 test_file_system_.set_error(FILE_ERROR_OK);
100
101 // Call SubstituteDriveDownloadPath()
102 base::FilePath substituted_path;
103 download_handler_->SubstituteDriveDownloadPath(
104 drive_path,
105 &download_item_,
106 google_apis::test_util::CreateCopyResultCallback(&substituted_path));
107 test_util::RunBlockingPoolTask();
108
109 // Check the result.
110 EXPECT_TRUE(temp_dir_.path().IsParent(substituted_path));
111 ASSERT_TRUE(download_handler_->IsDriveDownload(&download_item_));
112 EXPECT_EQ(drive_path, download_handler_->GetTargetPath(&download_item_));
113 }
114
TEST_F(DownloadHandlerTest,SubstituteDriveDownloadPathGetEntryFailure)115 TEST_F(DownloadHandlerTest, SubstituteDriveDownloadPathGetEntryFailure) {
116 const base::FilePath drive_path =
117 util::GetDriveMountPointPath(&profile_).AppendASCII("test.dat");
118
119 // Test the case that access to the download target directory failed for some
120 // reason.
121 test_file_system_.set_error(FILE_ERROR_FAILED);
122
123 // Call SubstituteDriveDownloadPath()
124 base::FilePath substituted_path;
125 download_handler_->SubstituteDriveDownloadPath(
126 drive_path,
127 &download_item_,
128 google_apis::test_util::CreateCopyResultCallback(&substituted_path));
129 test_util::RunBlockingPoolTask();
130
131 // Check the result.
132 EXPECT_TRUE(substituted_path.empty());
133 }
134
135 // content::SavePackage calls SubstituteDriveDownloadPath before creating
136 // DownloadItem.
TEST_F(DownloadHandlerTest,SubstituteDriveDownloadPathForSavePackage)137 TEST_F(DownloadHandlerTest, SubstituteDriveDownloadPathForSavePackage) {
138 const base::FilePath drive_path =
139 util::GetDriveMountPointPath(&profile_).AppendASCII("test.dat");
140 test_file_system_.set_error(FILE_ERROR_OK);
141
142 // Call SubstituteDriveDownloadPath()
143 base::FilePath substituted_path;
144 download_handler_->SubstituteDriveDownloadPath(
145 drive_path,
146 NULL, // DownloadItem is not available at this moment.
147 google_apis::test_util::CreateCopyResultCallback(&substituted_path));
148 test_util::RunBlockingPoolTask();
149
150 // Check the result of SubstituteDriveDownloadPath().
151 EXPECT_TRUE(temp_dir_.path().IsParent(substituted_path));
152
153 // |download_item_| is not a drive download yet.
154 EXPECT_FALSE(download_handler_->IsDriveDownload(&download_item_));
155
156 // Call SetDownloadParams().
157 download_handler_->SetDownloadParams(drive_path, &download_item_);
158
159 // |download_item_| is a drive download now.
160 ASSERT_TRUE(download_handler_->IsDriveDownload(&download_item_));
161 EXPECT_EQ(drive_path, download_handler_->GetTargetPath(&download_item_));
162 }
163
TEST_F(DownloadHandlerTest,CheckForFileExistence)164 TEST_F(DownloadHandlerTest, CheckForFileExistence) {
165 const base::FilePath drive_path =
166 util::GetDriveMountPointPath(&profile_).AppendASCII("test.dat");
167
168 // Make |download_item_| a drive download.
169 download_handler_->SetDownloadParams(drive_path, &download_item_);
170 ASSERT_TRUE(download_handler_->IsDriveDownload(&download_item_));
171 EXPECT_EQ(drive_path, download_handler_->GetTargetPath(&download_item_));
172
173 // Test for the case when the path exists.
174 test_file_system_.set_error(FILE_ERROR_OK);
175
176 // Call CheckForFileExistence.
177 bool file_exists = false;
178 download_handler_->CheckForFileExistence(
179 &download_item_,
180 google_apis::test_util::CreateCopyResultCallback(&file_exists));
181 test_util::RunBlockingPoolTask();
182
183 // Check the result.
184 EXPECT_TRUE(file_exists);
185
186 // Test for the case when the path does not exist.
187 test_file_system_.set_error(FILE_ERROR_NOT_FOUND);
188
189 // Call CheckForFileExistence again.
190 download_handler_->CheckForFileExistence(
191 &download_item_,
192 google_apis::test_util::CreateCopyResultCallback(&file_exists));
193 test_util::RunBlockingPoolTask();
194
195 // Check the result.
196 EXPECT_FALSE(file_exists);
197 }
198
199 } // namespace drive
200