| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/file_path.h" | 5 #include "base/file_path.h" |
| 6 #include "base/file_util.h" | 6 #include "base/file_util.h" |
| 7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
| 8 #include "base/observer_list.h" | 8 #include "base/observer_list.h" |
| 9 #include "base/scoped_temp_dir.h" | 9 #include "base/scoped_temp_dir.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 using safe_browsing::DownloadProtectionService; | 30 using safe_browsing::DownloadProtectionService; |
| 31 using ::testing::AtMost; | 31 using ::testing::AtMost; |
| 32 using ::testing::Invoke; | 32 using ::testing::Invoke; |
| 33 using ::testing::Return; | 33 using ::testing::Return; |
| 34 using ::testing::ReturnPointee; | 34 using ::testing::ReturnPointee; |
| 35 using ::testing::ReturnRef; | 35 using ::testing::ReturnRef; |
| 36 using ::testing::ReturnRefOfCopy; | 36 using ::testing::ReturnRefOfCopy; |
| 37 using ::testing::WithArg; | 37 using ::testing::WithArg; |
| 38 using ::testing::_; | 38 using ::testing::_; |
| 39 | 39 |
| 40 namespace { |
| 41 |
| 40 // Google Mock action that posts a task to the current message loop that invokes | 42 // Google Mock action that posts a task to the current message loop that invokes |
| 41 // the first argument of the mocked method as a callback. Said argument must be | 43 // the first argument of the mocked method as a callback. Said argument must be |
| 42 // a base::Callback<void(ParamType)>. |result| must be of |ParamType| and is | 44 // a base::Callback<void(ParamType)>. |result| must be of |ParamType| and is |
| 43 // bound as that parameter. | 45 // bound as that parameter. |
| 44 // Example: | 46 // Example: |
| 45 // class FooClass { | 47 // class FooClass { |
| 46 // public: | 48 // public: |
| 47 // virtual void Foo(base::Callback<void(bool)> callback); | 49 // virtual void Foo(base::Callback<void(bool)> callback); |
| 48 // }; | 50 // }; |
| 49 // ... | 51 // ... |
| 50 // EXPECT_CALL(mock_fooclass_instance, Foo(callback)) | 52 // EXPECT_CALL(mock_fooclass_instance, Foo(callback)) |
| 51 // .WillOnce(ScheduleCallback(false)); | 53 // .WillOnce(ScheduleCallback(false)); |
| 52 ACTION_P(ScheduleCallback, result) { | 54 ACTION_P(ScheduleCallback, result) { |
| 53 MessageLoop::current()->PostTask(FROM_HERE, base::Bind(arg0, result)); | 55 MessageLoop::current()->PostTask(FROM_HERE, base::Bind(arg0, result)); |
| 54 } | 56 } |
| 55 | 57 |
| 56 // Matches a safe_browsing::DownloadProtectionService::DownloadInfo that has | 58 // Matches a safe_browsing::DownloadProtectionService::DownloadInfo that has |
| 57 // |url| as the first URL in the |download_url_chain|. | 59 // |url| as the first URL in the |download_url_chain|. |
| 58 // Example: | 60 // Example: |
| 59 // EXPECT_CALL(Foo(InfoMatchinURL(url))) | 61 // EXPECT_CALL(Foo(InfoMatchinURL(url))) |
| 60 MATCHER_P(InfoMatchingURL, url, "DownloadInfo matching URL " + url.spec()) { | 62 MATCHER_P(InfoMatchingURL, url, "DownloadInfo matching URL " + url.spec()) { |
| 61 return url == arg.download_url_chain.front(); | 63 return url == arg.download_url_chain.front(); |
| 62 } | 64 } |
| 63 | 65 |
| 64 namespace { | |
| 65 | |
| 66 // Used with DownloadTestCase. Indicates the type of test case. The expectations | 66 // Used with DownloadTestCase. Indicates the type of test case. The expectations |
| 67 // for the test is set based on the type. | 67 // for the test is set based on the type. |
| 68 enum TestCaseType { | 68 enum TestCaseType { |
| 69 SAVE_AS, | 69 SAVE_AS, |
| 70 AUTOMATIC, | 70 AUTOMATIC, |
| 71 FORCED // Requires that forced_file_path be non-empty. | 71 FORCED // Requires that forced_file_path be non-empty. |
| 72 }; | 72 }; |
| 73 | 73 |
| 74 // Used with DownloadTestCase. Indicates whether the a file should be | 74 // Used with DownloadTestCase. Indicates whether the a file should be |
| 75 // overwritten. | 75 // overwritten. |
| 76 enum TestCaseExpectOverwrite { | 76 enum TestCaseExpectOverwrite { |
| 77 EXPECT_OVERWRITE, | 77 EXPECT_OVERWRITE, |
| 78 EXPECT_NO_OVERWRITE | 78 EXPECT_NO_OVERWRITE |
| 79 }; | 79 }; |
| 80 | 80 |
| 81 // Used with DownloadTestCase. Type of intermediate filename to expect. | 81 // Used with DownloadTestCase. Type of intermediate filename to expect. |
| 82 enum TestCaseExpectIntermediate { | 82 enum TestCaseExpectIntermediate { |
| 83 EXPECT_CRDOWNLOAD, // Expect path/to/target.crdownload | 83 EXPECT_CRDOWNLOAD, // Expect path/to/target.crdownload |
| 84 EXPECT_UNCONFIRMED // Expect path/to/Unconfirmed xxx.crdownload | 84 EXPECT_UNCONFIRMED // Expect path/to/Unconfirmed xxx.crdownload |
| 85 }; | 85 }; |
| 86 | 86 |
| 87 // Typical download test case. Used with | 87 // Typical download test case. Used with |
| 88 // ChromeDownloadManagerDelegateTest::RunTestCase(). | 88 // ChromeDownloadManagerDelegateTest::RunTestCase(). |
| 89 struct DownloadTestCase { | 89 struct DownloadTestCase { |
| 90 // Type of test. | 90 // Type of test. |
| 91 TestCaseType test_type; | 91 TestCaseType test_type; |
| 92 | 92 |
| 93 // The |danger_type| value is used to determine the behavior of | 93 // The |danger_type| is the expected danger type for the download as |
| 94 // DownloadProtectionService::IsSupportedDownload(), GetUrlCheckResult() and | 94 // determined by CDMD. This value is also used to determine the behavior of |
| 95 // well as set expectations for GetDangerType() as necessary for flagging the | 95 // DownloadProtectionService::IsSupportedDownload(), CDMD::CheckDownloadUrl() |
| 96 // download with as a dangerous download of type |danger_type|. | 96 // as necessary for flagging the download with as a dangerous download of type |
| 97 // |danger_type|. |
| 97 content::DownloadDangerType danger_type; | 98 content::DownloadDangerType danger_type; |
| 98 | 99 |
| 99 // Value of GetURL() | 100 // Value of DownloadItem::GetURL() |
| 100 const char* url; | 101 const char* url; |
| 101 | 102 |
| 102 // Value of GetMimeType() | 103 // Value of DownloadItem::GetMimeType() |
| 103 const char* mime_type; | 104 const char* mime_type; |
| 104 | 105 |
| 105 // Should be non-empty if |test_type| == FORCED. Value of GetForcedFilePath(). | 106 // Should be non-empty if |test_type| == FORCED. Value of GetForcedFilePath(). |
| 106 const FilePath::CharType* forced_file_path; | 107 const FilePath::CharType* forced_file_path; |
| 107 | 108 |
| 108 // Expected final download path. Specified relative to the test download path. | 109 // Expected final download path. Specified relative to the test download path. |
| 110 // If the user is presented with a file chooser, this path will also be the |
| 111 // response sent back from the file chooser. |
| 109 const FilePath::CharType* expected_target_path; | 112 const FilePath::CharType* expected_target_path; |
| 110 | 113 |
| 111 // Expected target disposition. | 114 // The path to expect as the suggested path if the user will be prompted for a |
| 115 // download path. |
| 116 const FilePath::CharType* expected_prompt_path; |
| 117 |
| 118 // Expected target disposition. If this is TARGET_DISPOSITION_PROMPT, then the |
| 119 // test run will expect ChromeDownloadManagerDelegate to prompt the user for a |
| 120 // download location. |
| 112 DownloadItem::TargetDisposition expected_disposition; | 121 DownloadItem::TargetDisposition expected_disposition; |
| 113 | 122 |
| 114 // Type of intermediate path to expect. | 123 // Type of intermediate path to expect. |
| 115 TestCaseExpectIntermediate expected_intermediate; | 124 TestCaseExpectIntermediate expected_intermediate; |
| 116 }; | 125 }; |
| 117 | 126 |
| 118 #if defined(ENABLE_SAFE_BROWSING) | 127 #if defined(ENABLE_SAFE_BROWSING) |
| 119 // DownloadProtectionService with mock methods. Since the SafeBrowsingService is | 128 // DownloadProtectionService with mock methods. Since the SafeBrowsingService is |
| 120 // set to NULL, it is not safe to call any non-mocked methods other than | 129 // set to NULL, it is not safe to call any non-mocked methods other than |
| 121 // SetEnabled() and enabled(). | 130 // SetEnabled() and enabled(). |
| (...skipping 17 matching lines...) Expand all Loading... |
| 139 // DownloadProtectionService and IsDangerousFile. | 148 // DownloadProtectionService and IsDangerousFile. |
| 140 class TestChromeDownloadManagerDelegate : public ChromeDownloadManagerDelegate { | 149 class TestChromeDownloadManagerDelegate : public ChromeDownloadManagerDelegate { |
| 141 public: | 150 public: |
| 142 explicit TestChromeDownloadManagerDelegate(Profile* profile) | 151 explicit TestChromeDownloadManagerDelegate(Profile* profile) |
| 143 : ChromeDownloadManagerDelegate(profile) { | 152 : ChromeDownloadManagerDelegate(profile) { |
| 144 #if defined(ENABLE_SAFE_BROWSING) | 153 #if defined(ENABLE_SAFE_BROWSING) |
| 145 download_protection_service_.reset(new TestDownloadProtectionService()); | 154 download_protection_service_.reset(new TestDownloadProtectionService()); |
| 146 download_protection_service_->SetEnabled(true); | 155 download_protection_service_->SetEnabled(true); |
| 147 #endif | 156 #endif |
| 148 } | 157 } |
| 158 |
| 149 virtual safe_browsing::DownloadProtectionService* | 159 virtual safe_browsing::DownloadProtectionService* |
| 150 GetDownloadProtectionService() OVERRIDE { | 160 GetDownloadProtectionService() OVERRIDE { |
| 151 #if defined(ENABLE_SAFE_BROWSING) | 161 #if defined(ENABLE_SAFE_BROWSING) |
| 152 return download_protection_service_.get(); | 162 return download_protection_service_.get(); |
| 153 #else | 163 #else |
| 154 return NULL; | 164 return NULL; |
| 155 #endif | 165 #endif |
| 156 } | 166 } |
| 167 |
| 157 virtual bool IsDangerousFile(const DownloadItem& download, | 168 virtual bool IsDangerousFile(const DownloadItem& download, |
| 158 const FilePath& suggested_path, | 169 const FilePath& suggested_path, |
| 159 bool visited_referrer_before) OVERRIDE { | 170 bool visited_referrer_before) OVERRIDE { |
| 160 // The implementaion of ChromeDownloadManagerDelegate::IsDangerousFile() is | 171 // The implementaion of ChromeDownloadManagerDelegate::IsDangerousFile() is |
| 161 // sensitive to a number of external factors (e.g. whether off-store | 172 // sensitive to a number of external factors (e.g. whether off-store |
| 162 // extension installs are allowed, whether a given extension download is | 173 // extension installs are allowed, whether a given extension download is |
| 163 // approved, whether the user wants files of a given type to be opened | 174 // approved, whether the user wants files of a given type to be opened |
| 164 // automatically etc...). We should test these specifically, but for other | 175 // automatically etc...). We should test these specifically, but for other |
| 165 // tests, we keep the IsDangerousFile() test simple so as not to make the | 176 // tests, we keep the IsDangerousFile() test simple so as not to make the |
| 166 // tests flaky. | 177 // tests flaky. |
| 167 return suggested_path.MatchesExtension(FILE_PATH_LITERAL(".jar")) || | 178 return suggested_path.MatchesExtension(FILE_PATH_LITERAL(".jar")) || |
| 168 suggested_path.MatchesExtension(FILE_PATH_LITERAL(".exe")); | 179 suggested_path.MatchesExtension(FILE_PATH_LITERAL(".exe")); |
| 169 } | 180 } |
| 181 |
| 170 virtual void GetReservedPath( | 182 virtual void GetReservedPath( |
| 171 content::DownloadItem& download, | 183 content::DownloadItem& download, |
| 172 const FilePath& target_path, | 184 const FilePath& target_path, |
| 173 const FilePath& default_download_path, | 185 const FilePath& default_download_path, |
| 174 bool should_uniquify_path, | 186 bool should_uniquify_path, |
| 175 const DownloadPathReservationTracker::ReservedPathCallback callback) { | 187 const DownloadPathReservationTracker::ReservedPathCallback& callback) |
| 188 OVERRIDE { |
| 176 // Pretend the path reservation succeeded without any change to | 189 // Pretend the path reservation succeeded without any change to |
| 177 // |target_path|. | 190 // |target_path|. |
| 178 MessageLoop::current()->PostTask(FROM_HERE, | 191 MessageLoop::current()->PostTask(FROM_HERE, |
| 179 base::Bind(callback, target_path, true)); | 192 base::Bind(callback, target_path, true)); |
| 180 } | 193 } |
| 181 | 194 |
| 195 // During tests, we want to mock the behavior of this method. |
| 196 MOCK_METHOD3(ChooseDownloadPath, |
| 197 void(content::DownloadItem*, |
| 198 const FilePath&, |
| 199 const FileSelectedCallback&)); |
| 200 |
| 182 #if defined(ENABLE_SAFE_BROWSING) | 201 #if defined(ENABLE_SAFE_BROWSING) |
| 183 // A TestDownloadProtectionService* is convenient for setting up mocks. | 202 // A TestDownloadProtectionService* is convenient for setting up mocks. |
| 184 TestDownloadProtectionService* test_download_protection_service() { | 203 TestDownloadProtectionService* test_download_protection_service() { |
| 185 return download_protection_service_.get(); | 204 return download_protection_service_.get(); |
| 186 } | 205 } |
| 187 #endif | 206 #endif |
| 188 | 207 |
| 189 private: | 208 private: |
| 190 ~TestChromeDownloadManagerDelegate() {} | 209 ~TestChromeDownloadManagerDelegate() {} |
| 191 | 210 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 | 247 |
| 229 // Set the kDownloadDefaultDirectory user preference to |path|. | 248 // Set the kDownloadDefaultDirectory user preference to |path|. |
| 230 void SetDefaultDownloadPath(const FilePath& path); | 249 void SetDefaultDownloadPath(const FilePath& path); |
| 231 | 250 |
| 232 // Set the kDownloadDefaultDirectory managed preference to |path|. | 251 // Set the kDownloadDefaultDirectory managed preference to |path|. |
| 233 void SetManagedDownloadPath(const FilePath& path); | 252 void SetManagedDownloadPath(const FilePath& path); |
| 234 | 253 |
| 235 // Set the kPromptForDownload user preference to |prompt|. | 254 // Set the kPromptForDownload user preference to |prompt|. |
| 236 void SetPromptForDownload(bool prompt); | 255 void SetPromptForDownload(bool prompt); |
| 237 | 256 |
| 238 // Verifies that the intermediate path in |intermediate| is the path that is | |
| 239 // expected for |target| given the intermediate path type in |expectation|. | |
| 240 void VerifyIntermediatePath(TestCaseExpectIntermediate expectation, | |
| 241 const FilePath& target, | |
| 242 const FilePath& intermediate); | |
| 243 | |
| 244 const FilePath& default_download_path() const; | 257 const FilePath& default_download_path() const; |
| 245 TestChromeDownloadManagerDelegate* delegate(); | 258 TestChromeDownloadManagerDelegate* delegate(); |
| 246 content::MockDownloadManager* download_manager(); | 259 content::MockDownloadManager* download_manager(); |
| 247 DownloadPrefs* download_prefs(); | 260 DownloadPrefs* download_prefs(); |
| 248 | 261 |
| 249 private: | 262 private: |
| 263 // Verifies that |target_path|, |disposition|, |danger_type| and |
| 264 // |intermediate_path| matches the expectations of |test_case|. |
| 265 void DownloadTargetVerifier(const DownloadTestCase* test_case, |
| 266 const FilePath& target_path, |
| 267 DownloadItem::TargetDisposition disposition, |
| 268 content::DownloadDangerType danger_type, |
| 269 const FilePath& intermediate_path); |
| 270 |
| 250 MessageLoopForUI message_loop_; | 271 MessageLoopForUI message_loop_; |
| 251 TestingPrefService* pref_service_; | 272 TestingPrefService* pref_service_; |
| 252 ScopedTempDir test_download_dir_; | 273 ScopedTempDir test_download_dir_; |
| 253 TestingProfile profile_; | 274 TestingProfile profile_; |
| 254 content::TestBrowserThread ui_thread_; | 275 content::TestBrowserThread ui_thread_; |
| 255 content::TestBrowserThread file_thread_; | 276 content::TestBrowserThread file_thread_; |
| 256 scoped_refptr<content::MockDownloadManager> download_manager_; | 277 scoped_refptr<content::MockDownloadManager> download_manager_; |
| 257 scoped_refptr<TestChromeDownloadManagerDelegate> delegate_; | 278 scoped_refptr<TestChromeDownloadManagerDelegate> delegate_; |
| 258 }; | 279 }; |
| 259 | 280 |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 .WillOnce(Return(maybe_dangerous)); | 379 .WillOnce(Return(maybe_dangerous)); |
| 359 } | 380 } |
| 360 #else // ENABLE_SAFE_BROWSING | 381 #else // ENABLE_SAFE_BROWSING |
| 361 // If safe browsing is not enabled, then these tests would fail. If such a | 382 // If safe browsing is not enabled, then these tests would fail. If such a |
| 362 // test was added, then fail early. | 383 // test was added, then fail early. |
| 363 EXPECT_NE(content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, test_case.danger_type); | 384 EXPECT_NE(content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, test_case.danger_type); |
| 364 EXPECT_NE(content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT, | 385 EXPECT_NE(content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT, |
| 365 test_case.danger_type); | 386 test_case.danger_type); |
| 366 #endif // !ENABLE_SAFE_BROWSING | 387 #endif // !ENABLE_SAFE_BROWSING |
| 367 | 388 |
| 368 // Expectations for filename determination results. | 389 DownloadItem::TargetDisposition initial_disposition = |
| 369 FilePath expected_target_path( | 390 (test_case.test_type == SAVE_AS) ? |
| 370 GetPathInDownloadDir(test_case.expected_target_path)); | 391 DownloadItem::TARGET_DISPOSITION_PROMPT : |
| 371 { | 392 DownloadItem::TARGET_DISPOSITION_OVERWRITE; |
| 372 ::testing::Sequence s1, s2, s3; | 393 EXPECT_CALL(*item, GetTargetFilePath()) |
| 373 DownloadItem::TargetDisposition initial_disposition = | 394 .WillRepeatedly(ReturnRefOfCopy(FilePath())); |
| 374 (test_case.test_type == SAVE_AS) ? | 395 EXPECT_CALL(*item, GetTargetDisposition()) |
| 375 DownloadItem::TARGET_DISPOSITION_PROMPT : | 396 .WillRepeatedly(Return(initial_disposition)); |
| 376 DownloadItem::TARGET_DISPOSITION_OVERWRITE; | 397 EXPECT_CALL(*item, GetDangerType()) |
| 377 EXPECT_CALL(*item, GetTargetFilePath()) | 398 .WillRepeatedly(Return(content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS)); |
| 378 .InSequence(s1) | 399 |
| 379 .WillRepeatedly(ReturnRefOfCopy(FilePath())); | 400 if (test_case.expected_disposition == |
| 380 EXPECT_CALL(*item, GetTargetDisposition()) | 401 DownloadItem::TARGET_DISPOSITION_PROMPT) { |
| 381 .InSequence(s2) | 402 FilePath expected_prompt_path = GetPathInDownloadDir( |
| 382 .WillRepeatedly(Return(initial_disposition)); | 403 test_case.expected_prompt_path); |
| 383 EXPECT_CALL(*item, GetDangerType()) | 404 FilePath expected_target_path = GetPathInDownloadDir( |
| 384 .InSequence(s3) | 405 test_case.expected_target_path); |
| 385 .WillRepeatedly(Return(content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS)); | 406 EXPECT_CALL(*delegate_, |
| 386 EXPECT_CALL(*item, OnTargetPathDetermined(expected_target_path, | 407 ChooseDownloadPath(item, expected_prompt_path, _)) |
| 387 test_case.expected_disposition, | 408 .WillOnce(WithArg<2>(ScheduleCallback(expected_target_path))); |
| 388 test_case.danger_type)) | |
| 389 .InSequence(s1, s2, s3); | |
| 390 EXPECT_CALL(*item, GetTargetFilePath()) | |
| 391 .InSequence(s1) | |
| 392 .WillRepeatedly(ReturnRef(expected_target_path)); | |
| 393 EXPECT_CALL(*item, GetTargetDisposition()) | |
| 394 .InSequence(s2) | |
| 395 .WillRepeatedly(Return(test_case.expected_disposition)); | |
| 396 EXPECT_CALL(*item, GetDangerType()) | |
| 397 .InSequence(s3) | |
| 398 .WillRepeatedly(Return(test_case.danger_type)); | |
| 399 } | 409 } |
| 400 | 410 |
| 401 // RestartDownload() should be called at this point. | |
| 402 EXPECT_CALL(*download_manager_, RestartDownload(item->GetId())); | |
| 403 EXPECT_CALL(*download_manager_, LastDownloadPath()) | |
| 404 .WillRepeatedly(Return(FilePath())); | |
| 405 | |
| 406 // Kick off the test. | 411 // Kick off the test. |
| 407 EXPECT_FALSE(delegate_->ShouldStartDownload(item->GetId())); | 412 base::WeakPtrFactory<ChromeDownloadManagerDelegateTest> factory(this); |
| 413 EXPECT_TRUE(delegate_->DetermineDownloadTarget( |
| 414 item, |
| 415 base::Bind(&ChromeDownloadManagerDelegateTest::DownloadTargetVerifier, |
| 416 factory.GetWeakPtr(), base::Unretained(&test_case)))); |
| 408 message_loop_.RunAllPending(); | 417 message_loop_.RunAllPending(); |
| 409 | 418 VerifyAndClearExpectations(); |
| 410 // Now query the intermediate path. | |
| 411 EXPECT_CALL(*item, GetDangerType()) | |
| 412 .WillOnce(Return(test_case.danger_type)); | |
| 413 bool ok_to_overwrite = false; | |
| 414 FilePath intermediate_path = delegate_->GetIntermediatePath(*item); | |
| 415 EXPECT_FALSE(ok_to_overwrite); | |
| 416 VerifyIntermediatePath(test_case.expected_intermediate, | |
| 417 GetPathInDownloadDir(test_case.expected_target_path), | |
| 418 intermediate_path); | |
| 419 } | 419 } |
| 420 | 420 |
| 421 void ChromeDownloadManagerDelegateTest::RunTestCases( | 421 void ChromeDownloadManagerDelegateTest::RunTestCases( |
| 422 const DownloadTestCase test_cases[], | 422 const DownloadTestCase test_cases[], |
| 423 size_t test_case_count) { | 423 size_t test_case_count) { |
| 424 for (size_t i = 0; i < test_case_count; ++i) { | 424 for (size_t i = 0; i < test_case_count; ++i) { |
| 425 scoped_ptr<content::MockDownloadItem> item(CreateActiveDownloadItem(i)); | 425 scoped_ptr<content::MockDownloadItem> item(CreateActiveDownloadItem(i)); |
| 426 SCOPED_TRACE(testing::Message() << "Running test case " << i); | 426 SCOPED_TRACE(testing::Message() << "Running test case " << i); |
| 427 RunTestCaseWithDownloadItem(test_cases[i], item.get()); | 427 RunTestCaseWithDownloadItem(test_cases[i], item.get()); |
| 428 } | 428 } |
| 429 } | 429 } |
| 430 | 430 |
| 431 void ChromeDownloadManagerDelegateTest::SetDefaultDownloadPath( | 431 void ChromeDownloadManagerDelegateTest::SetDefaultDownloadPath( |
| 432 const FilePath& path) { | 432 const FilePath& path) { |
| 433 pref_service_->SetFilePath(prefs::kDownloadDefaultDirectory, path); | 433 pref_service_->SetFilePath(prefs::kDownloadDefaultDirectory, path); |
| 434 } | 434 } |
| 435 | 435 |
| 436 void ChromeDownloadManagerDelegateTest::SetManagedDownloadPath( | 436 void ChromeDownloadManagerDelegateTest::SetManagedDownloadPath( |
| 437 const FilePath& path) { | 437 const FilePath& path) { |
| 438 pref_service_->SetManagedPref(prefs::kDownloadDefaultDirectory, | 438 pref_service_->SetManagedPref(prefs::kDownloadDefaultDirectory, |
| 439 base::CreateFilePathValue(path)); | 439 base::CreateFilePathValue(path)); |
| 440 } | 440 } |
| 441 | 441 |
| 442 void ChromeDownloadManagerDelegateTest::SetPromptForDownload(bool prompt) { | 442 void ChromeDownloadManagerDelegateTest::SetPromptForDownload(bool prompt) { |
| 443 pref_service_->SetBoolean(prefs::kPromptForDownload, prompt); | 443 pref_service_->SetBoolean(prefs::kPromptForDownload, prompt); |
| 444 } | 444 } |
| 445 | 445 |
| 446 void ChromeDownloadManagerDelegateTest::VerifyIntermediatePath( | 446 void ChromeDownloadManagerDelegateTest::DownloadTargetVerifier( |
| 447 TestCaseExpectIntermediate expectation, | 447 const DownloadTestCase* test_case, |
| 448 const FilePath& target, | 448 const FilePath& target_path, |
| 449 const FilePath& intermediate) { | 449 DownloadItem::TargetDisposition disposition, |
| 450 if (expectation == EXPECT_CRDOWNLOAD) { | 450 content::DownloadDangerType danger_type, |
| 451 EXPECT_EQ(download_util::GetCrDownloadPath(target).value(), | 451 const FilePath& intermediate_path) { |
| 452 intermediate.value()); | 452 FilePath expected_target_path( |
| 453 GetPathInDownloadDir(test_case->expected_target_path)); |
| 454 EXPECT_EQ(expected_target_path.value(), target_path.value()); |
| 455 EXPECT_EQ(test_case->expected_disposition, disposition); |
| 456 EXPECT_EQ(test_case->danger_type, danger_type); |
| 457 |
| 458 if (test_case->expected_intermediate == EXPECT_CRDOWNLOAD) { |
| 459 EXPECT_EQ(download_util::GetCrDownloadPath(target_path).value(), |
| 460 intermediate_path.value()); |
| 453 } else { | 461 } else { |
| 454 // The paths (in English) look like: /path/Unconfirmed xxx.crdownload. | 462 // The paths (in English) look like: /path/Unconfirmed xxx.crdownload. |
| 455 // Of this, we only check that the path is: | 463 // Of this, we only check that the path is: |
| 456 // 1. Not "/path/target.crdownload", | 464 // 1. Not "/path/target.crdownload", |
| 457 // 2. Points to the same directory as the target. | 465 // 2. Points to the same directory as the target. |
| 458 // 3. Has extension ".crdownload". | 466 // 3. Has extension ".crdownload". |
| 459 EXPECT_NE(download_util::GetCrDownloadPath(target).value(), | 467 EXPECT_NE(download_util::GetCrDownloadPath(target_path).value(), |
| 460 intermediate.value()); | 468 intermediate_path.value()); |
| 461 EXPECT_EQ(target.DirName().value(), | 469 EXPECT_EQ(target_path.DirName().value(), |
| 462 intermediate.DirName().value()); | 470 intermediate_path.DirName().value()); |
| 463 EXPECT_TRUE(intermediate.MatchesExtension( | 471 EXPECT_TRUE(intermediate_path.MatchesExtension( |
| 464 FILE_PATH_LITERAL(".crdownload"))); | 472 FILE_PATH_LITERAL(".crdownload"))); |
| 465 } | 473 } |
| 466 } | 474 } |
| 467 | 475 |
| 468 const FilePath& ChromeDownloadManagerDelegateTest::default_download_path() | 476 const FilePath& ChromeDownloadManagerDelegateTest::default_download_path() |
| 469 const { | 477 const { |
| 470 return test_download_dir_.path(); | 478 return test_download_dir_.path(); |
| 471 } | 479 } |
| 472 | 480 |
| 473 TestChromeDownloadManagerDelegate* | 481 TestChromeDownloadManagerDelegate* |
| 474 ChromeDownloadManagerDelegateTest::delegate() { | 482 ChromeDownloadManagerDelegateTest::delegate() { |
| 475 return delegate_.get(); | 483 return delegate_.get(); |
| 476 } | 484 } |
| 477 | 485 |
| 478 content::MockDownloadManager* | 486 content::MockDownloadManager* |
| 479 ChromeDownloadManagerDelegateTest::download_manager() { | 487 ChromeDownloadManagerDelegateTest::download_manager() { |
| 480 return download_manager_.get(); | 488 return download_manager_.get(); |
| 481 } | 489 } |
| 482 | 490 |
| 483 DownloadPrefs* ChromeDownloadManagerDelegateTest::download_prefs() { | 491 DownloadPrefs* ChromeDownloadManagerDelegateTest::download_prefs() { |
| 484 return delegate_->download_prefs(); | 492 return delegate_->download_prefs(); |
| 485 } | 493 } |
| 486 | 494 |
| 487 } // namespace | 495 } // namespace |
| 488 | 496 |
| 489 TEST_F(ChromeDownloadManagerDelegateTest, ShouldStartDownload_Invalid) { | |
| 490 // Invalid download ID shouldn't do anything. | |
| 491 EXPECT_CALL(*download_manager(), GetActiveDownloadItem(-1)) | |
| 492 .WillOnce(Return(reinterpret_cast<DownloadItem*>(NULL))); | |
| 493 EXPECT_FALSE(delegate()->ShouldStartDownload(-1)); | |
| 494 } | |
| 495 | |
| 496 TEST_F(ChromeDownloadManagerDelegateTest, StartDownload_Basic) { | 497 TEST_F(ChromeDownloadManagerDelegateTest, StartDownload_Basic) { |
| 497 const DownloadTestCase kBasicTestCases[] = { | 498 const DownloadTestCase kBasicTestCases[] = { |
| 498 { | 499 { |
| 499 // 0: Automatic Safe | 500 // 0: Automatic Safe |
| 500 AUTOMATIC, | 501 AUTOMATIC, |
| 501 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | 502 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 502 "http://example.com/foo.txt", "text/plain", | 503 "http://example.com/foo.txt", "text/plain", |
| 503 FILE_PATH_LITERAL(""), | 504 FILE_PATH_LITERAL(""), |
| 504 | 505 |
| 505 FILE_PATH_LITERAL("foo.txt"), | 506 FILE_PATH_LITERAL("foo.txt"), |
| 507 FILE_PATH_LITERAL(""), |
| 506 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 508 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 507 | 509 |
| 508 EXPECT_CRDOWNLOAD | 510 EXPECT_CRDOWNLOAD |
| 509 }, | 511 }, |
| 510 | 512 |
| 511 { | 513 { |
| 512 // 1: Save_As Safe | 514 // 1: Save_As Safe |
| 513 SAVE_AS, | 515 SAVE_AS, |
| 514 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | 516 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 515 "http://example.com/foo.txt", "text/plain", | 517 "http://example.com/foo.txt", "text/plain", |
| 516 FILE_PATH_LITERAL(""), | 518 FILE_PATH_LITERAL(""), |
| 517 | 519 |
| 518 FILE_PATH_LITERAL("foo.txt"), | 520 FILE_PATH_LITERAL("foo.txt"), |
| 521 FILE_PATH_LITERAL("foo.txt"), |
| 519 DownloadItem::TARGET_DISPOSITION_PROMPT, | 522 DownloadItem::TARGET_DISPOSITION_PROMPT, |
| 520 | 523 |
| 521 EXPECT_CRDOWNLOAD | 524 EXPECT_CRDOWNLOAD |
| 522 }, | 525 }, |
| 523 | 526 |
| 524 { | 527 { |
| 525 // 2: Automatic Dangerous | 528 // 2: Automatic Dangerous |
| 526 AUTOMATIC, | 529 AUTOMATIC, |
| 527 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, | 530 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, |
| 528 "http://example.com/foo.exe", "", | 531 "http://example.com/foo.exe", "", |
| 529 FILE_PATH_LITERAL(""), | 532 FILE_PATH_LITERAL(""), |
| 530 | 533 |
| 531 FILE_PATH_LITERAL("foo.exe"), | 534 FILE_PATH_LITERAL("foo.exe"), |
| 535 FILE_PATH_LITERAL(""), |
| 532 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 536 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 533 | 537 |
| 534 EXPECT_UNCONFIRMED | 538 EXPECT_UNCONFIRMED |
| 535 }, | 539 }, |
| 536 | 540 |
| 537 { | 541 { |
| 538 // 3 Forced Safe | 542 // 3 Forced Safe |
| 539 FORCED, | 543 FORCED, |
| 540 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | 544 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 541 "http://example.com/foo.txt", "", | 545 "http://example.com/foo.txt", "", |
| 542 FILE_PATH_LITERAL("forced-foo.txt"), | 546 FILE_PATH_LITERAL("forced-foo.txt"), |
| 543 | 547 |
| 544 FILE_PATH_LITERAL("forced-foo.txt"), | 548 FILE_PATH_LITERAL("forced-foo.txt"), |
| 549 FILE_PATH_LITERAL(""), |
| 545 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 550 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 546 | 551 |
| 547 EXPECT_CRDOWNLOAD | 552 EXPECT_CRDOWNLOAD |
| 548 }, | 553 }, |
| 549 | 554 |
| 550 #if defined(ENABLE_SAFE_BROWSING) | 555 #if defined(ENABLE_SAFE_BROWSING) |
| 551 // These test cases are only applicable if safe browsing is enabled. Without | 556 // These test cases are only applicable if safe browsing is enabled. Without |
| 552 // it, these are equivalent to FORCED/SAFE and SAFE_AS/SAFE respectively. | 557 // it, these are equivalent to FORCED/SAFE and SAFE_AS/SAFE respectively. |
| 553 { | 558 { |
| 554 // 4: Forced Dangerous. As above. .jar is considered to be one of the file | 559 // 4: Forced Dangerous. As above. .jar is considered to be one of the file |
| 555 // types supportred by safe browsing. | 560 // types supportred by safe browsing. |
| 556 FORCED, | 561 FORCED, |
| 557 content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT, | 562 content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT, |
| 558 "http://example.com/foo.exe", "", | 563 "http://example.com/foo.exe", "", |
| 559 FILE_PATH_LITERAL("forced-foo.exe"), | 564 FILE_PATH_LITERAL("forced-foo.exe"), |
| 560 | 565 |
| 561 FILE_PATH_LITERAL("forced-foo.exe"), | 566 FILE_PATH_LITERAL("forced-foo.exe"), |
| 567 FILE_PATH_LITERAL(""), |
| 562 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 568 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 563 | 569 |
| 564 EXPECT_UNCONFIRMED | 570 EXPECT_UNCONFIRMED |
| 565 }, | 571 }, |
| 566 | 572 |
| 567 { | 573 { |
| 568 // 5: Save_As Dangerous. | 574 // 5: Save_As Dangerous. |
| 569 SAVE_AS, | 575 SAVE_AS, |
| 570 content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT, | 576 content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT, |
| 571 "http://example.com/foo.exe", "", | 577 "http://example.com/foo.exe", "", |
| 572 FILE_PATH_LITERAL(""), | 578 FILE_PATH_LITERAL(""), |
| 573 | 579 |
| 574 FILE_PATH_LITERAL("foo.exe"), | 580 FILE_PATH_LITERAL("foo.exe"), |
| 581 FILE_PATH_LITERAL("foo.exe"), |
| 575 DownloadItem::TARGET_DISPOSITION_PROMPT, | 582 DownloadItem::TARGET_DISPOSITION_PROMPT, |
| 576 | 583 |
| 577 EXPECT_UNCONFIRMED | 584 EXPECT_UNCONFIRMED |
| 578 } | 585 } |
| 579 #endif | 586 #endif |
| 580 }; | 587 }; |
| 581 | 588 |
| 582 RunTestCases(kBasicTestCases, arraysize(kBasicTestCases)); | 589 RunTestCases(kBasicTestCases, arraysize(kBasicTestCases)); |
| 583 } | 590 } |
| 584 | 591 |
| 585 #if defined(ENABLE_SAFE_BROWSING) | 592 #if defined(ENABLE_SAFE_BROWSING) |
| 586 // The SafeBrowsing URL check is performed early. Make sure that a download item | 593 // The SafeBrowsing URL check is performed early. Make sure that a download item |
| 587 // that has been marked as DANGEROUS_URL behaves correctly. | 594 // that has been marked as DANGEROUS_URL behaves correctly. |
| 588 TEST_F(ChromeDownloadManagerDelegateTest, StartDownload_DangerousURL) { | 595 TEST_F(ChromeDownloadManagerDelegateTest, StartDownload_DangerousURL) { |
| 589 const DownloadTestCase kDangerousURLTestCases[] = { | 596 const DownloadTestCase kDangerousURLTestCases[] = { |
| 590 { | 597 { |
| 591 // 0: Automatic Dangerous URL | 598 // 0: Automatic Dangerous URL |
| 592 AUTOMATIC, | 599 AUTOMATIC, |
| 593 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, | 600 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, |
| 594 "http://phishing.example.com/foo.txt", "", | 601 "http://phishing.example.com/foo.txt", "", |
| 595 FILE_PATH_LITERAL(""), | 602 FILE_PATH_LITERAL(""), |
| 596 | 603 |
| 597 FILE_PATH_LITERAL("foo.txt"), | 604 FILE_PATH_LITERAL("foo.txt"), |
| 605 FILE_PATH_LITERAL(""), |
| 598 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 606 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 599 | 607 |
| 600 EXPECT_UNCONFIRMED | 608 EXPECT_UNCONFIRMED |
| 601 }, | 609 }, |
| 602 | 610 |
| 603 { | 611 { |
| 604 // 1: Save As Dangerous URL | 612 // 1: Save As Dangerous URL |
| 605 SAVE_AS, | 613 SAVE_AS, |
| 606 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, | 614 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, |
| 607 "http://phishing.example.com/foo.txt", "", | 615 "http://phishing.example.com/foo.txt", "", |
| 608 FILE_PATH_LITERAL(""), | 616 FILE_PATH_LITERAL(""), |
| 609 | 617 |
| 610 FILE_PATH_LITERAL("foo.txt"), | 618 FILE_PATH_LITERAL("foo.txt"), |
| 619 FILE_PATH_LITERAL("foo.txt"), |
| 611 DownloadItem::TARGET_DISPOSITION_PROMPT, | 620 DownloadItem::TARGET_DISPOSITION_PROMPT, |
| 612 | 621 |
| 613 EXPECT_UNCONFIRMED | 622 EXPECT_UNCONFIRMED |
| 614 }, | 623 }, |
| 615 | 624 |
| 616 { | 625 { |
| 617 // 2: Forced Dangerous URL | 626 // 2: Forced Dangerous URL |
| 618 FORCED, | 627 FORCED, |
| 619 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, | 628 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, |
| 620 "http://phishing.example.com/foo.txt", "", | 629 "http://phishing.example.com/foo.txt", "", |
| 621 FILE_PATH_LITERAL("forced-foo.txt"), | 630 FILE_PATH_LITERAL("forced-foo.txt"), |
| 622 | 631 |
| 623 FILE_PATH_LITERAL("forced-foo.txt"), | 632 FILE_PATH_LITERAL("forced-foo.txt"), |
| 633 FILE_PATH_LITERAL(""), |
| 624 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 634 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 625 | 635 |
| 626 EXPECT_UNCONFIRMED | 636 EXPECT_UNCONFIRMED |
| 627 }, | 637 }, |
| 628 | 638 |
| 629 { | 639 { |
| 630 // 3: Automatic Dangerous URL + Dangerous file. Dangerous URL takes | 640 // 3: Automatic Dangerous URL + Dangerous file. Dangerous URL takes |
| 631 // precendence. | 641 // precendence. |
| 632 AUTOMATIC, | 642 AUTOMATIC, |
| 633 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, | 643 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, |
| 634 "http://phishing.example.com/foo.jar", "", | 644 "http://phishing.example.com/foo.jar", "", |
| 635 FILE_PATH_LITERAL(""), | 645 FILE_PATH_LITERAL(""), |
| 636 | 646 |
| 637 FILE_PATH_LITERAL("foo.jar"), | 647 FILE_PATH_LITERAL("foo.jar"), |
| 648 FILE_PATH_LITERAL(""), |
| 638 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 649 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 639 | 650 |
| 640 EXPECT_UNCONFIRMED | 651 EXPECT_UNCONFIRMED |
| 641 }, | 652 }, |
| 642 | 653 |
| 643 { | 654 { |
| 644 // 4: Save As Dangerous URL + Dangerous file | 655 // 4: Save As Dangerous URL + Dangerous file |
| 645 SAVE_AS, | 656 SAVE_AS, |
| 646 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, | 657 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, |
| 647 "http://phishing.example.com/foo.jar", "", | 658 "http://phishing.example.com/foo.jar", "", |
| 648 FILE_PATH_LITERAL(""), | 659 FILE_PATH_LITERAL(""), |
| 649 | 660 |
| 650 FILE_PATH_LITERAL("foo.jar"), | 661 FILE_PATH_LITERAL("foo.jar"), |
| 662 FILE_PATH_LITERAL("foo.jar"), |
| 651 DownloadItem::TARGET_DISPOSITION_PROMPT, | 663 DownloadItem::TARGET_DISPOSITION_PROMPT, |
| 652 | 664 |
| 653 EXPECT_UNCONFIRMED | 665 EXPECT_UNCONFIRMED |
| 654 }, | 666 }, |
| 655 | 667 |
| 656 { | 668 { |
| 657 // 5: Forced Dangerous URL + Dangerous file | 669 // 5: Forced Dangerous URL + Dangerous file |
| 658 FORCED, | 670 FORCED, |
| 659 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, | 671 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, |
| 660 "http://phishing.example.com/foo.jar", "", | 672 "http://phishing.example.com/foo.jar", "", |
| 661 FILE_PATH_LITERAL("forced-foo.jar"), | 673 FILE_PATH_LITERAL("forced-foo.jar"), |
| 662 | 674 |
| 663 FILE_PATH_LITERAL("forced-foo.jar"), | 675 FILE_PATH_LITERAL("forced-foo.jar"), |
| 676 FILE_PATH_LITERAL(""), |
| 664 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 677 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 665 | 678 |
| 666 EXPECT_UNCONFIRMED | 679 EXPECT_UNCONFIRMED |
| 667 }, | 680 }, |
| 668 }; | 681 }; |
| 669 | 682 |
| 670 RunTestCases(kDangerousURLTestCases, arraysize(kDangerousURLTestCases)); | 683 RunTestCases(kDangerousURLTestCases, arraysize(kDangerousURLTestCases)); |
| 671 } | 684 } |
| 672 #endif // ENABLE_SAFE_BROWSING | 685 #endif // ENABLE_SAFE_BROWSING |
| 673 | 686 |
| 674 // These test cases are run with "Prompt for download" user preference set to | 687 // These test cases are run with "Prompt for download" user preference set to |
| 675 // true. Even with the preference set, some of these downloads should not cause | 688 // true. Even with the preference set, some of these downloads should not cause |
| 676 // a prompt to appear. | 689 // a prompt to appear. |
| 677 TEST_F(ChromeDownloadManagerDelegateTest, StartDownload_PromptAlways) { | 690 TEST_F(ChromeDownloadManagerDelegateTest, StartDownload_PromptAlways) { |
| 678 const DownloadTestCase kPromptingTestCases[] = { | 691 const DownloadTestCase kPromptingTestCases[] = { |
| 679 { | 692 { |
| 680 // 0: Safe Automatic - Should prompt because of "Prompt for download" | 693 // 0: Safe Automatic - Should prompt because of "Prompt for download" |
| 681 // preference setting. | 694 // preference setting. |
| 682 AUTOMATIC, | 695 AUTOMATIC, |
| 683 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | 696 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 684 "http://example.com/foo.txt", "text/plain", | 697 "http://example.com/foo.txt", "text/plain", |
| 685 FILE_PATH_LITERAL(""), | 698 FILE_PATH_LITERAL(""), |
| 686 | 699 |
| 687 FILE_PATH_LITERAL("foo.txt"), | 700 FILE_PATH_LITERAL("foo.txt"), |
| 701 FILE_PATH_LITERAL("foo.txt"), |
| 688 DownloadItem::TARGET_DISPOSITION_PROMPT, | 702 DownloadItem::TARGET_DISPOSITION_PROMPT, |
| 689 | 703 |
| 690 EXPECT_CRDOWNLOAD | 704 EXPECT_CRDOWNLOAD |
| 691 }, | 705 }, |
| 692 | 706 |
| 693 { | 707 { |
| 694 // 1: Automatic Browser Extension download. - Shouldn't prompt for browser | 708 // 1: Automatic Browser Extension download. - Shouldn't prompt for browser |
| 695 // extension downloads even if "Prompt for download" preference is set. | 709 // extension downloads even if "Prompt for download" preference is set. |
| 696 AUTOMATIC, | 710 AUTOMATIC, |
| 697 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | 711 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 698 "http://example.com/foo.crx", | 712 "http://example.com/foo.crx", |
| 699 extensions::Extension::kMimeType, | 713 extensions::Extension::kMimeType, |
| 700 FILE_PATH_LITERAL(""), | 714 FILE_PATH_LITERAL(""), |
| 701 | 715 |
| 702 FILE_PATH_LITERAL("foo.crx"), | 716 FILE_PATH_LITERAL("foo.crx"), |
| 717 FILE_PATH_LITERAL(""), |
| 703 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 718 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 704 | 719 |
| 705 EXPECT_CRDOWNLOAD | 720 EXPECT_CRDOWNLOAD |
| 706 }, | 721 }, |
| 707 | 722 |
| 708 { | 723 { |
| 709 // 2: Automatic User Script - Shouldn't prompt for user script downloads | 724 // 2: Automatic User Script - Shouldn't prompt for user script downloads |
| 710 // even if "Prompt for download" preference is set. | 725 // even if "Prompt for download" preference is set. |
| 711 AUTOMATIC, | 726 AUTOMATIC, |
| 712 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | 727 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 713 "http://example.com/foo.user.js", "", | 728 "http://example.com/foo.user.js", "", |
| 714 FILE_PATH_LITERAL(""), | 729 FILE_PATH_LITERAL(""), |
| 715 | 730 |
| 716 FILE_PATH_LITERAL("foo.user.js"), | 731 FILE_PATH_LITERAL("foo.user.js"), |
| 732 FILE_PATH_LITERAL(""), |
| 717 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 733 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 718 | 734 |
| 719 EXPECT_CRDOWNLOAD | 735 EXPECT_CRDOWNLOAD |
| 720 }, | 736 }, |
| 721 | 737 |
| 722 { | 738 { |
| 723 // 3: Automatic - The filename extension is marked as one that we will | 739 // 3: Automatic - The filename extension is marked as one that we will |
| 724 // open automatically. Shouldn't prompt. | 740 // open automatically. Shouldn't prompt. |
| 725 AUTOMATIC, | 741 AUTOMATIC, |
| 726 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | 742 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 727 "http://example.com/foo.dummy", "", | 743 "http://example.com/foo.dummy", "", |
| 728 FILE_PATH_LITERAL(""), | 744 FILE_PATH_LITERAL(""), |
| 729 | 745 |
| 730 FILE_PATH_LITERAL("foo.dummy"), | 746 FILE_PATH_LITERAL("foo.dummy"), |
| 747 FILE_PATH_LITERAL(""), |
| 731 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 748 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 732 | 749 |
| 733 EXPECT_CRDOWNLOAD | 750 EXPECT_CRDOWNLOAD |
| 734 }, | 751 }, |
| 735 | 752 |
| 736 #if defined(ENABLE_SAFE_BROWSING) | 753 #if defined(ENABLE_SAFE_BROWSING) |
| 737 // If safe browsing is disabled, this case is equivalent to AUTOMATIC/SAFE | 754 // If safe browsing is disabled, this case is equivalent to AUTOMATIC/SAFE |
| 738 // since the download isn't marked as dangerous when we are going to prompt | 755 // since the download isn't marked as dangerous when we are going to prompt |
| 739 // the user. | 756 // the user. |
| 740 { | 757 { |
| 741 // 4: Dangerous Automatic - Should prompt due to "Prompt for download" | 758 // 4: Dangerous Automatic - Should prompt due to "Prompt for download" |
| 742 // preference setting. | 759 // preference setting. |
| 743 AUTOMATIC, | 760 AUTOMATIC, |
| 744 content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT, | 761 content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT, |
| 745 "http://example.com/foo.exe", "", | 762 "http://example.com/foo.exe", "", |
| 746 FILE_PATH_LITERAL(""), | 763 FILE_PATH_LITERAL(""), |
| 747 | 764 |
| 748 FILE_PATH_LITERAL("foo.exe"), | 765 FILE_PATH_LITERAL("foo.exe"), |
| 766 FILE_PATH_LITERAL("foo.exe"), |
| 749 DownloadItem::TARGET_DISPOSITION_PROMPT, | 767 DownloadItem::TARGET_DISPOSITION_PROMPT, |
| 750 | 768 |
| 751 EXPECT_UNCONFIRMED | 769 EXPECT_UNCONFIRMED |
| 752 }, | 770 }, |
| 753 #endif | 771 #endif |
| 754 }; | 772 }; |
| 755 | 773 |
| 756 SetPromptForDownload(true); | 774 SetPromptForDownload(true); |
| 757 EnableAutoOpenBasedOnExtension(FilePath(FILE_PATH_LITERAL("dummy.dummy"))); | 775 EnableAutoOpenBasedOnExtension(FilePath(FILE_PATH_LITERAL("dummy.dummy"))); |
| 758 RunTestCases(kPromptingTestCases, arraysize(kPromptingTestCases)); | 776 RunTestCases(kPromptingTestCases, arraysize(kPromptingTestCases)); |
| 759 } | 777 } |
| 760 | 778 |
| 761 // If the download path is managed, then we don't show any prompts. | 779 // If the download path is managed, then we don't show any prompts. |
| 762 // Note that if the download path is managed, then PromptForDownload() is false. | 780 // Note that if the download path is managed, then PromptForDownload() is false. |
| 763 TEST_F(ChromeDownloadManagerDelegateTest, StartDownload_ManagedPath) { | 781 TEST_F(ChromeDownloadManagerDelegateTest, StartDownload_ManagedPath) { |
| 764 const DownloadTestCase kManagedPathTestCases[] = { | 782 const DownloadTestCase kManagedPathTestCases[] = { |
| 765 { | 783 { |
| 766 // 0: Automatic Safe | 784 // 0: Automatic Safe |
| 767 AUTOMATIC, | 785 AUTOMATIC, |
| 768 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | 786 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 769 "http://example.com/foo.txt", "text/plain", | 787 "http://example.com/foo.txt", "text/plain", |
| 770 FILE_PATH_LITERAL(""), | 788 FILE_PATH_LITERAL(""), |
| 771 | 789 |
| 772 FILE_PATH_LITERAL("foo.txt"), | 790 FILE_PATH_LITERAL("foo.txt"), |
| 791 FILE_PATH_LITERAL(""), |
| 773 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 792 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 774 | 793 |
| 775 EXPECT_CRDOWNLOAD | 794 EXPECT_CRDOWNLOAD |
| 776 }, | 795 }, |
| 777 | 796 |
| 778 { | 797 { |
| 779 // 1: Save_As Safe | 798 // 1: Save_As Safe |
| 780 SAVE_AS, | 799 SAVE_AS, |
| 781 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | 800 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 782 "http://example.com/foo.txt", "text/plain", | 801 "http://example.com/foo.txt", "text/plain", |
| 783 FILE_PATH_LITERAL(""), | 802 FILE_PATH_LITERAL(""), |
| 784 | 803 |
| 785 FILE_PATH_LITERAL("foo.txt"), | 804 FILE_PATH_LITERAL("foo.txt"), |
| 805 FILE_PATH_LITERAL(""), |
| 786 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 806 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 787 | 807 |
| 788 EXPECT_CRDOWNLOAD | 808 EXPECT_CRDOWNLOAD |
| 789 }, | 809 }, |
| 790 }; | 810 }; |
| 791 | 811 |
| 792 SetManagedDownloadPath(default_download_path()); | 812 SetManagedDownloadPath(default_download_path()); |
| 793 ASSERT_TRUE(download_prefs()->IsDownloadPathManaged()); | 813 ASSERT_TRUE(download_prefs()->IsDownloadPathManaged()); |
| 794 RunTestCases(kManagedPathTestCases, arraysize(kManagedPathTestCases)); | 814 RunTestCases(kManagedPathTestCases, arraysize(kManagedPathTestCases)); |
| 795 } | 815 } |
| 796 | 816 |
| 817 // Test whether the last saved directory is saved if the user was presented with |
| 818 // a file chooser. |
| 819 TEST_F(ChromeDownloadManagerDelegateTest, StartDownload_LastSavePath) { |
| 820 const DownloadTestCase kLastSavePathTestCases[] = { |
| 821 { |
| 822 // Initially the last saved directory is the user's default download path. |
| 823 |
| 824 // 0: Start a Save As download. Then respond to the file chooser with |
| 825 // foo/bar.txt as the target directory. This should cause the foo/ |
| 826 // directory to be remembered as the last used save directory. |
| 827 SAVE_AS, |
| 828 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 829 "http://example.com/foo.txt", "text/plain", |
| 830 FILE_PATH_LITERAL(""), |
| 831 |
| 832 FILE_PATH_LITERAL("foo/bar.txt"), |
| 833 FILE_PATH_LITERAL("foo.txt"), |
| 834 DownloadItem::TARGET_DISPOSITION_PROMPT, |
| 835 |
| 836 EXPECT_CRDOWNLOAD |
| 837 }, |
| 838 |
| 839 { |
| 840 // 1: Start another Save As download. This time the suggested path should |
| 841 // be in the foo/ directory. |
| 842 SAVE_AS, |
| 843 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 844 "http://example.com/foo.txt", "text/plain", |
| 845 FILE_PATH_LITERAL(""), |
| 846 |
| 847 FILE_PATH_LITERAL("bar/foo.txt"), |
| 848 FILE_PATH_LITERAL("foo/foo.txt"), |
| 849 DownloadItem::TARGET_DISPOSITION_PROMPT, |
| 850 |
| 851 EXPECT_CRDOWNLOAD |
| 852 }, |
| 853 |
| 854 { |
| 855 // 2: Start an automatic download. This should be saved to the user's |
| 856 // default download directory and not the last used Save As directory. |
| 857 AUTOMATIC, |
| 858 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 859 "http://example.com/foo.txt", "text/plain", |
| 860 FILE_PATH_LITERAL(""), |
| 861 |
| 862 FILE_PATH_LITERAL("foo.txt"), |
| 863 FILE_PATH_LITERAL(""), |
| 864 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 865 |
| 866 EXPECT_CRDOWNLOAD |
| 867 }, |
| 868 }; |
| 869 |
| 870 RunTestCases(kLastSavePathTestCases, arraysize(kLastSavePathTestCases)); |
| 871 |
| 872 // Now clear the last download path. |
| 873 delegate()->ClearLastDownloadPath(); |
| 874 |
| 875 // Run the first test case again. Since the last download path was cleared, |
| 876 // this test case should behave identically to the first time it was run. |
| 877 RunTestCases(kLastSavePathTestCases, 1); |
| 878 } |
| 879 |
| 797 // TODO(asanka): Add more tests. | 880 // TODO(asanka): Add more tests. |
| 798 // * Default download path is not writable. | 881 // * Default download path is not writable. |
| 799 // * Download path doesn't exist. | 882 // * Download path doesn't exist. |
| 800 // * IsDangerousFile(). | 883 // * IsDangerousFile(). |
| 801 // * Filename generation. | 884 // * Filename generation. |
| OLD | NEW |