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/files/file_path.h" | 5 #include "base/files/file_path.h" |
6 #include "base/files/scoped_temp_dir.h" | 6 #include "base/files/scoped_temp_dir.h" |
7 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
8 #include "base/observer_list.h" | 8 #include "base/observer_list.h" |
9 #include "base/prefs/pref_service.h" | 9 #include "base/prefs/pref_service.h" |
10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
11 #include "base/stl_util.h" | 11 #include "base/stl_util.h" |
12 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
13 #include "base/value_conversions.h" | 13 #include "base/value_conversions.h" |
14 #include "chrome/browser/download/chrome_download_manager_delegate.h" | 14 #include "chrome/browser/download/chrome_download_manager_delegate.h" |
15 #include "chrome/browser/download/download_extensions.h" | 15 #include "chrome/browser/download/download_extensions.h" |
16 #include "chrome/browser/download/download_prefs.h" | 16 #include "chrome/browser/download/download_prefs.h" |
17 #include "chrome/browser/download/download_target_determiner.h" | 17 #include "chrome/browser/download/download_target_determiner.h" |
18 #include "chrome/browser/download/download_target_info.h" | |
18 #include "chrome/browser/history/history_service.h" | 19 #include "chrome/browser/history/history_service.h" |
19 #include "chrome/browser/history/history_service_factory.h" | 20 #include "chrome/browser/history/history_service_factory.h" |
20 #include "chrome/browser/history/history_types.h" | 21 #include "chrome/browser/history/history_types.h" |
21 #include "chrome/common/extensions/extension.h" | 22 #include "chrome/common/extensions/extension.h" |
22 #include "chrome/common/pref_names.h" | 23 #include "chrome/common/pref_names.h" |
23 #include "chrome/test/base/chrome_render_view_host_test_harness.h" | 24 #include "chrome/test/base/chrome_render_view_host_test_harness.h" |
24 #include "chrome/test/base/testing_pref_service_syncable.h" | 25 #include "chrome/test/base/testing_pref_service_syncable.h" |
25 #include "chrome/test/base/testing_profile.h" | 26 #include "chrome/test/base/testing_profile.h" |
26 #include "content/public/browser/download_interrupt_reasons.h" | 27 #include "content/public/browser/download_interrupt_reasons.h" |
27 #include "content/public/browser/web_contents.h" | 28 #include "content/public/browser/web_contents.h" |
28 #include "content/public/browser/web_contents_delegate.h" | 29 #include "content/public/browser/web_contents_delegate.h" |
29 #include "content/public/test/mock_download_item.h" | 30 #include "content/public/test/mock_download_item.h" |
30 #include "content/public/test/test_browser_thread.h" | 31 #include "content/public/test/test_browser_thread.h" |
31 #include "content/public/test/test_renderer_host.h" | 32 #include "content/public/test/test_renderer_host.h" |
32 #include "content/public/test/web_contents_tester.h" | 33 #include "content/public/test/web_contents_tester.h" |
34 #include "net/base/mime_util.h" | |
33 #include "testing/gmock/include/gmock/gmock.h" | 35 #include "testing/gmock/include/gmock/gmock.h" |
34 #include "testing/gtest/include/gtest/gtest.h" | 36 #include "testing/gtest/include/gtest/gtest.h" |
35 | 37 |
38 #if defined(ENABLE_PLUGINS) | |
39 #include "chrome/browser/plugins/plugin_prefs.h" | |
40 #include "content/public/browser/plugin_service.h" | |
41 #include "content/public/common/webplugininfo.h" | |
42 #endif | |
43 | |
36 using ::testing::AnyNumber; | 44 using ::testing::AnyNumber; |
37 using ::testing::Invoke; | 45 using ::testing::Invoke; |
38 using ::testing::Ref; | 46 using ::testing::Ref; |
39 using ::testing::Return; | 47 using ::testing::Return; |
40 using ::testing::ReturnRef; | 48 using ::testing::ReturnRef; |
41 using ::testing::ReturnRefOfCopy; | 49 using ::testing::ReturnRefOfCopy; |
42 using ::testing::Truly; | 50 using ::testing::Truly; |
43 using ::testing::WithArg; | 51 using ::testing::WithArg; |
44 using ::testing::_; | 52 using ::testing::_; |
45 using content::DownloadItem; | 53 using content::DownloadItem; |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
136 MOCK_METHOD3(PromptUserForDownloadPath, | 144 MOCK_METHOD3(PromptUserForDownloadPath, |
137 void(content::DownloadItem*, const base::FilePath&, | 145 void(content::DownloadItem*, const base::FilePath&, |
138 const FileSelectedCallback&)); | 146 const FileSelectedCallback&)); |
139 MOCK_METHOD3(DetermineLocalPath, | 147 MOCK_METHOD3(DetermineLocalPath, |
140 void(DownloadItem*, const base::FilePath&, | 148 void(DownloadItem*, const base::FilePath&, |
141 const LocalPathCallback&)); | 149 const LocalPathCallback&)); |
142 MOCK_METHOD5(ReserveVirtualPath, | 150 MOCK_METHOD5(ReserveVirtualPath, |
143 void(DownloadItem*, const base::FilePath&, bool, | 151 void(DownloadItem*, const base::FilePath&, bool, |
144 DownloadPathReservationTracker::FilenameConflictAction, | 152 DownloadPathReservationTracker::FilenameConflictAction, |
145 const ReservedPathCallback&)); | 153 const ReservedPathCallback&)); |
154 MOCK_METHOD2(GetFileMimeType, | |
155 void(const base::FilePath&, | |
156 const GetFileMimeTypeCallback&)); | |
146 | 157 |
147 void SetupDefaults() { | 158 void SetupDefaults() { |
148 ON_CALL(*this, CheckDownloadUrl(_, _, _)) | 159 ON_CALL(*this, CheckDownloadUrl(_, _, _)) |
149 .WillByDefault(WithArg<2>( | 160 .WillByDefault(WithArg<2>( |
150 ScheduleCallback(content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS))); | 161 ScheduleCallback(content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS))); |
151 ON_CALL(*this, NotifyExtensions(_, _, _)) | 162 ON_CALL(*this, NotifyExtensions(_, _, _)) |
152 .WillByDefault(WithArg<2>( | 163 .WillByDefault(WithArg<2>( |
153 ScheduleCallback2(base::FilePath(), | 164 ScheduleCallback2(base::FilePath(), |
154 DownloadPathReservationTracker::UNIQUIFY))); | 165 DownloadPathReservationTracker::UNIQUIFY))); |
155 ON_CALL(*this, ReserveVirtualPath(_, _, _, _, _)) | 166 ON_CALL(*this, ReserveVirtualPath(_, _, _, _, _)) |
156 .WillByDefault(Invoke( | 167 .WillByDefault(Invoke( |
157 &MockDownloadTargetDeterminerDelegate::NullReserveVirtualPath)); | 168 &MockDownloadTargetDeterminerDelegate::NullReserveVirtualPath)); |
158 ON_CALL(*this, PromptUserForDownloadPath(_, _, _)) | 169 ON_CALL(*this, PromptUserForDownloadPath(_, _, _)) |
159 .WillByDefault(Invoke( | 170 .WillByDefault(Invoke( |
160 &MockDownloadTargetDeterminerDelegate::NullPromptUser)); | 171 &MockDownloadTargetDeterminerDelegate::NullPromptUser)); |
161 ON_CALL(*this, DetermineLocalPath(_, _, _)) | 172 ON_CALL(*this, DetermineLocalPath(_, _, _)) |
162 .WillByDefault(Invoke( | 173 .WillByDefault(Invoke( |
163 &MockDownloadTargetDeterminerDelegate::NullDetermineLocalPath)); | 174 &MockDownloadTargetDeterminerDelegate::NullDetermineLocalPath)); |
175 ON_CALL(*this, GetFileMimeType(_, _)) | |
176 .WillByDefault(WithArg<1>( | |
177 ScheduleCallback(""))); | |
164 } | 178 } |
165 private: | 179 private: |
166 static void NullReserveVirtualPath( | 180 static void NullReserveVirtualPath( |
167 DownloadItem* download, | 181 DownloadItem* download, |
168 const base::FilePath& virtual_path, | 182 const base::FilePath& virtual_path, |
169 bool create_directory, | 183 bool create_directory, |
170 DownloadPathReservationTracker::FilenameConflictAction conflict_action, | 184 DownloadPathReservationTracker::FilenameConflictAction conflict_action, |
171 const DownloadTargetDeterminerDelegate::ReservedPathCallback& callback); | 185 const DownloadTargetDeterminerDelegate::ReservedPathCallback& callback); |
172 static void NullPromptUser( | 186 static void NullPromptUser( |
173 DownloadItem* download, const base::FilePath& suggested_path, | 187 DownloadItem* download, const base::FilePath& suggested_path, |
(...skipping 25 matching lines...) Expand all Loading... | |
199 | 213 |
200 // Given the relative path |path|, returns the full path under the temporary | 214 // Given the relative path |path|, returns the full path under the temporary |
201 // downloads directory. | 215 // downloads directory. |
202 base::FilePath GetPathInDownloadDir(const base::FilePath::StringType& path); | 216 base::FilePath GetPathInDownloadDir(const base::FilePath::StringType& path); |
203 | 217 |
204 // Run |test_case| using |item|. | 218 // Run |test_case| using |item|. |
205 void RunTestCase(const DownloadTestCase& test_case, | 219 void RunTestCase(const DownloadTestCase& test_case, |
206 const base::FilePath& initial_virtual_path, | 220 const base::FilePath& initial_virtual_path, |
207 content::MockDownloadItem* item); | 221 content::MockDownloadItem* item); |
208 | 222 |
223 // Runs |test_case| with |item|. When the DownloadTargetDeterminer is done, | |
224 // returns the resulting DownloadTargetInfo. | |
225 scoped_ptr<DownloadTargetInfo> RunDownloadTargetDeterminer( | |
226 const base::FilePath& initial_virtual_path, | |
227 content::MockDownloadItem* item); | |
228 | |
209 // Run through |test_case_count| tests in |test_cases|. A new MockDownloadItem | 229 // Run through |test_case_count| tests in |test_cases|. A new MockDownloadItem |
210 // will be created for each test case and destroyed when the test case is | 230 // will be created for each test case and destroyed when the test case is |
211 // complete. | 231 // complete. |
212 void RunTestCasesWithActiveItem(const DownloadTestCase test_cases[], | 232 void RunTestCasesWithActiveItem(const DownloadTestCase test_cases[], |
213 size_t test_case_count); | 233 size_t test_case_count); |
214 | 234 |
215 // Verifies that |target_path|, |disposition|, |expected_danger_type| and | 235 // Verifies that |target_path|, |disposition|, |expected_danger_type| and |
216 // |intermediate_path| matches the expectations of |test_case|. Posts | 236 // |intermediate_path| matches the expectations of |test_case|. Posts |
217 // |closure| to the current message loop when done. | 237 // |closure| to the current message loop when done. |
218 void DownloadTargetVerifier(const base::Closure& closure, | 238 void VerifyDownloadTarget(const DownloadTestCase& test_case, |
219 const DownloadTestCase& test_case, | 239 const DownloadTargetInfo* target_info); |
220 const base::FilePath& local_path, | |
221 DownloadItem::TargetDisposition disposition, | |
222 content::DownloadDangerType danger_type, | |
223 const base::FilePath& intermediate_path); | |
224 | 240 |
225 const base::FilePath& test_download_dir() const { | 241 const base::FilePath& test_download_dir() const { |
226 return test_download_dir_.path(); | 242 return test_download_dir_.path(); |
227 } | 243 } |
228 | 244 |
229 const base::FilePath& test_virtual_dir() const { | 245 const base::FilePath& test_virtual_dir() const { |
230 return test_virtual_dir_; | 246 return test_virtual_dir_; |
231 } | 247 } |
232 | 248 |
233 MockDownloadTargetDeterminerDelegate* delegate() { | 249 MockDownloadTargetDeterminerDelegate* delegate() { |
(...skipping 14 matching lines...) Expand all Loading... | |
248 | 264 |
249 void DownloadTargetDeterminerTest::SetUp() { | 265 void DownloadTargetDeterminerTest::SetUp() { |
250 ChromeRenderViewHostTestHarness::SetUp(); | 266 ChromeRenderViewHostTestHarness::SetUp(); |
251 CHECK(profile()); | 267 CHECK(profile()); |
252 download_prefs_.reset(new DownloadPrefs(profile())); | 268 download_prefs_.reset(new DownloadPrefs(profile())); |
253 web_contents()->SetDelegate(&web_contents_delegate_); | 269 web_contents()->SetDelegate(&web_contents_delegate_); |
254 ASSERT_TRUE(test_download_dir_.CreateUniqueTempDir()); | 270 ASSERT_TRUE(test_download_dir_.CreateUniqueTempDir()); |
255 test_virtual_dir_ = test_download_dir().Append(FILE_PATH_LITERAL("virtual")); | 271 test_virtual_dir_ = test_download_dir().Append(FILE_PATH_LITERAL("virtual")); |
256 download_prefs_->SetDownloadPath(test_download_dir()); | 272 download_prefs_->SetDownloadPath(test_download_dir()); |
257 delegate_.SetupDefaults(); | 273 delegate_.SetupDefaults(); |
274 #if defined(ENABLE_PLUGINS) | |
275 content::PluginService::GetInstance()->Init(); | |
276 content::PluginService::GetInstance()->DisablePluginsDiscoveryForTesting(); | |
277 #endif | |
258 } | 278 } |
259 | 279 |
260 void DownloadTargetDeterminerTest::TearDown() { | 280 void DownloadTargetDeterminerTest::TearDown() { |
261 download_prefs_.reset(); | 281 download_prefs_.reset(); |
262 ChromeRenderViewHostTestHarness::TearDown(); | 282 ChromeRenderViewHostTestHarness::TearDown(); |
263 } | 283 } |
264 | 284 |
265 content::MockDownloadItem* | 285 content::MockDownloadItem* |
266 DownloadTargetDeterminerTest::CreateActiveDownloadItem( | 286 DownloadTargetDeterminerTest::CreateActiveDownloadItem( |
267 int32 id, | 287 int32 id, |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
343 if (relative_path.empty()) | 363 if (relative_path.empty()) |
344 return base::FilePath(); | 364 return base::FilePath(); |
345 base::FilePath full_path(test_download_dir().Append(relative_path)); | 365 base::FilePath full_path(test_download_dir().Append(relative_path)); |
346 return full_path.NormalizePathSeparators(); | 366 return full_path.NormalizePathSeparators(); |
347 } | 367 } |
348 | 368 |
349 void DownloadTargetDeterminerTest::RunTestCase( | 369 void DownloadTargetDeterminerTest::RunTestCase( |
350 const DownloadTestCase& test_case, | 370 const DownloadTestCase& test_case, |
351 const base::FilePath& initial_virtual_path, | 371 const base::FilePath& initial_virtual_path, |
352 content::MockDownloadItem* item) { | 372 content::MockDownloadItem* item) { |
353 // Kick off the test. | 373 scoped_ptr<DownloadTargetInfo> target_info = |
354 base::WeakPtrFactory<DownloadTargetDeterminerTest> factory(this); | 374 RunDownloadTargetDeterminer(initial_virtual_path, item); |
375 VerifyDownloadTarget(test_case, target_info.get()); | |
376 } | |
377 | |
378 void CompletionCallbackWrapper( | |
379 const base::Closure& closure, | |
380 scoped_ptr<DownloadTargetInfo>* target_info_receiver, | |
381 scoped_ptr<DownloadTargetInfo> target_info) { | |
382 target_info_receiver->swap(target_info); | |
383 base::MessageLoop::current()->PostTask(FROM_HERE, closure); | |
384 } | |
385 | |
386 scoped_ptr<DownloadTargetInfo> | |
387 DownloadTargetDeterminerTest::RunDownloadTargetDeterminer( | |
388 const base::FilePath& initial_virtual_path, | |
389 content::MockDownloadItem* item) { | |
390 scoped_ptr<DownloadTargetInfo> target_info; | |
355 base::RunLoop run_loop; | 391 base::RunLoop run_loop; |
356 DownloadTargetDeterminer::Start( | 392 DownloadTargetDeterminer::Start( |
357 item, initial_virtual_path, download_prefs_.get(), delegate(), | 393 item, initial_virtual_path, download_prefs_.get(), delegate(), |
358 base::Bind(&DownloadTargetDeterminerTest::DownloadTargetVerifier, | 394 base::Bind(&CompletionCallbackWrapper, |
359 factory.GetWeakPtr(), run_loop.QuitClosure(), test_case)); | 395 run_loop.QuitClosure(), |
396 &target_info)); | |
360 run_loop.Run(); | 397 run_loop.Run(); |
361 ::testing::Mock::VerifyAndClearExpectations(delegate()); | 398 ::testing::Mock::VerifyAndClearExpectations(delegate()); |
399 return target_info.Pass(); | |
362 } | 400 } |
363 | 401 |
364 void DownloadTargetDeterminerTest::RunTestCasesWithActiveItem( | 402 void DownloadTargetDeterminerTest::RunTestCasesWithActiveItem( |
365 const DownloadTestCase test_cases[], | 403 const DownloadTestCase test_cases[], |
366 size_t test_case_count) { | 404 size_t test_case_count) { |
367 for (size_t i = 0; i < test_case_count; ++i) { | 405 for (size_t i = 0; i < test_case_count; ++i) { |
368 scoped_ptr<content::MockDownloadItem> item( | 406 scoped_ptr<content::MockDownloadItem> item( |
369 CreateActiveDownloadItem(i, test_cases[i])); | 407 CreateActiveDownloadItem(i, test_cases[i])); |
370 SCOPED_TRACE(testing::Message() << "Running test case " << i); | 408 SCOPED_TRACE(testing::Message() << "Running test case " << i); |
371 RunTestCase(test_cases[i], base::FilePath(), item.get()); | 409 RunTestCase(test_cases[i], base::FilePath(), item.get()); |
372 } | 410 } |
373 } | 411 } |
374 | 412 |
375 void DownloadTargetDeterminerTest::DownloadTargetVerifier( | 413 void DownloadTargetDeterminerTest::VerifyDownloadTarget( |
376 const base::Closure& closure, | |
377 const DownloadTestCase& test_case, | 414 const DownloadTestCase& test_case, |
378 const base::FilePath& local_path, | 415 const DownloadTargetInfo* target_info) { |
379 DownloadItem::TargetDisposition disposition, | |
380 content::DownloadDangerType danger_type, | |
381 const base::FilePath& intermediate_path) { | |
382 base::FilePath expected_local_path( | 416 base::FilePath expected_local_path( |
383 GetPathInDownloadDir(test_case.expected_local_path)); | 417 GetPathInDownloadDir(test_case.expected_local_path)); |
384 EXPECT_EQ(expected_local_path.value(), local_path.value()); | 418 EXPECT_EQ(expected_local_path.value(), target_info->target_path.value()); |
385 EXPECT_EQ(test_case.expected_disposition, disposition); | 419 EXPECT_EQ(test_case.expected_disposition, target_info->target_disposition); |
386 EXPECT_EQ(test_case.expected_danger_type, danger_type); | 420 EXPECT_EQ(test_case.expected_danger_type, target_info->danger_type); |
387 | 421 |
388 switch (test_case.expected_intermediate) { | 422 switch (test_case.expected_intermediate) { |
389 case EXPECT_CRDOWNLOAD: | 423 case EXPECT_CRDOWNLOAD: |
390 EXPECT_EQ(DownloadTargetDeterminer::GetCrDownloadPath(local_path).value(), | 424 EXPECT_EQ(DownloadTargetDeterminer::GetCrDownloadPath( |
391 intermediate_path.value()); | 425 target_info->target_path).value(), |
426 target_info->intermediate_path.value()); | |
392 break; | 427 break; |
393 | 428 |
394 case EXPECT_UNCONFIRMED: | 429 case EXPECT_UNCONFIRMED: |
395 // The paths (in English) look like: /path/Unconfirmed xxx.crdownload. | 430 // The paths (in English) look like: /path/Unconfirmed xxx.crdownload. |
396 // Of this, we only check that the path is: | 431 // Of this, we only check that the path is: |
397 // 1. Not "/path/target.crdownload", | 432 // 1. Not "/path/target.crdownload", |
398 // 2. Points to the same directory as the target. | 433 // 2. Points to the same directory as the target. |
399 // 3. Has extension ".crdownload". | 434 // 3. Has extension ".crdownload". |
400 // 4. Basename starts with "Unconfirmed ". | 435 // 4. Basename starts with "Unconfirmed ". |
401 EXPECT_NE(DownloadTargetDeterminer::GetCrDownloadPath(expected_local_path) | 436 EXPECT_NE(DownloadTargetDeterminer::GetCrDownloadPath(expected_local_path) |
402 .value(), | 437 .value(), |
403 intermediate_path.value()); | 438 target_info->intermediate_path.value()); |
404 EXPECT_EQ(expected_local_path.DirName().value(), | 439 EXPECT_EQ(expected_local_path.DirName().value(), |
405 intermediate_path.DirName().value()); | 440 target_info->intermediate_path.DirName().value()); |
406 EXPECT_TRUE(intermediate_path.MatchesExtension( | 441 EXPECT_TRUE(target_info->intermediate_path.MatchesExtension( |
407 FILE_PATH_LITERAL(".crdownload"))); | 442 FILE_PATH_LITERAL(".crdownload"))); |
408 EXPECT_EQ(0u, intermediate_path.BaseName().value().find( | 443 EXPECT_EQ(0u, |
409 FILE_PATH_LITERAL("Unconfirmed "))); | 444 target_info->intermediate_path.BaseName().value().find( |
445 FILE_PATH_LITERAL("Unconfirmed "))); | |
410 break; | 446 break; |
411 | 447 |
412 case EXPECT_LOCAL_PATH: | 448 case EXPECT_LOCAL_PATH: |
413 EXPECT_EQ(expected_local_path.value(), intermediate_path.value()); | 449 EXPECT_EQ(expected_local_path.value(), |
450 target_info->intermediate_path.value()); | |
414 break; | 451 break; |
415 } | 452 } |
416 base::MessageLoop::current()->PostTask(FROM_HERE, closure); | |
417 } | 453 } |
418 | 454 |
419 // static | 455 // static |
420 void MockDownloadTargetDeterminerDelegate::NullReserveVirtualPath( | 456 void MockDownloadTargetDeterminerDelegate::NullReserveVirtualPath( |
421 DownloadItem* download, | 457 DownloadItem* download, |
422 const base::FilePath& virtual_path, | 458 const base::FilePath& virtual_path, |
423 bool create_directory, | 459 bool create_directory, |
424 DownloadPathReservationTracker::FilenameConflictAction conflict_action, | 460 DownloadPathReservationTracker::FilenameConflictAction conflict_action, |
425 const DownloadTargetDeterminerDelegate::ReservedPathCallback& callback) { | 461 const DownloadTargetDeterminerDelegate::ReservedPathCallback& callback) { |
426 callback.Run(virtual_path, true); | 462 callback.Run(virtual_path, true); |
(...skipping 1270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1697 EXPECT_CALL(*delegate(), NotifyExtensions(_, _, _)) | 1733 EXPECT_CALL(*delegate(), NotifyExtensions(_, _, _)) |
1698 .Times(test_case.test_type == AUTOMATIC ? 1 : 0); | 1734 .Times(test_case.test_type == AUTOMATIC ? 1 : 0); |
1699 EXPECT_CALL(*delegate(), ReserveVirtualPath(_, expected_path, false, _, _)); | 1735 EXPECT_CALL(*delegate(), ReserveVirtualPath(_, expected_path, false, _, _)); |
1700 EXPECT_CALL(*delegate(), PromptUserForDownloadPath(_, expected_path, _)); | 1736 EXPECT_CALL(*delegate(), PromptUserForDownloadPath(_, expected_path, _)); |
1701 EXPECT_CALL(*delegate(), DetermineLocalPath(_, expected_path, _)); | 1737 EXPECT_CALL(*delegate(), DetermineLocalPath(_, expected_path, _)); |
1702 EXPECT_CALL(*delegate(), CheckDownloadUrl(_, expected_path, _)); | 1738 EXPECT_CALL(*delegate(), CheckDownloadUrl(_, expected_path, _)); |
1703 RunTestCase(test_case, GetPathInDownloadDir(kInitialPath), item.get()); | 1739 RunTestCase(test_case, GetPathInDownloadDir(kInitialPath), item.get()); |
1704 } | 1740 } |
1705 } | 1741 } |
1706 | 1742 |
1707 // Used with TargetDeterminer_IntermediateNameForResumed test. Verifies that | |
1708 // |intermediate_path| == |expected_intermediate_path| if the latter is | |
1709 // non-empty. | |
1710 void IntermediatePathVerifier( | |
1711 const base::FilePath& expected_intermediate_path, | |
1712 const content::DownloadTargetCallback& callback, | |
1713 const base::FilePath& target_path, | |
1714 content::DownloadItem::TargetDisposition disposition, | |
1715 content::DownloadDangerType danger_type, | |
1716 const base::FilePath& intermediate_path) { | |
1717 if (!expected_intermediate_path.empty()) | |
1718 EXPECT_EQ(expected_intermediate_path, intermediate_path); | |
1719 callback.Run(target_path, disposition, danger_type, intermediate_path); | |
1720 } | |
1721 | |
1722 // Test intermediate filename generation for resumed downloads. | 1743 // Test intermediate filename generation for resumed downloads. |
1723 TEST_F(DownloadTargetDeterminerTest, | 1744 TEST_F(DownloadTargetDeterminerTest, |
1724 TargetDeterminer_IntermediateNameForResumed) { | 1745 TargetDeterminer_IntermediateNameForResumed) { |
1725 // All test cases run with GetPathInDownloadDir(kInitialPath) as the inital | 1746 // All test cases run with GetPathInDownloadDir(kInitialPath) as the inital |
1726 // path. | 1747 // path. |
1727 const base::FilePath::CharType kInitialPath[] = | 1748 const base::FilePath::CharType kInitialPath[] = |
1728 FILE_PATH_LITERAL("some_path/bar.txt"); | 1749 FILE_PATH_LITERAL("some_path/bar.txt"); |
1729 | 1750 |
1730 struct IntermediateNameTestCase { | 1751 struct IntermediateNameTestCase { |
1731 // General test case settings. | 1752 // General test case settings. |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1848 | 1869 |
1849 ON_CALL(*item.get(), GetLastReason()) | 1870 ON_CALL(*item.get(), GetLastReason()) |
1850 .WillByDefault(Return( | 1871 .WillByDefault(Return( |
1851 content::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED)); | 1872 content::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED)); |
1852 ON_CALL(*item.get(), GetFullPath()) | 1873 ON_CALL(*item.get(), GetFullPath()) |
1853 .WillByDefault(ReturnRefOfCopy( | 1874 .WillByDefault(ReturnRefOfCopy( |
1854 GetPathInDownloadDir(test_case.initial_intermediate_path))); | 1875 GetPathInDownloadDir(test_case.initial_intermediate_path))); |
1855 ON_CALL(*item.get(), GetDangerType()) | 1876 ON_CALL(*item.get(), GetDangerType()) |
1856 .WillByDefault(Return(test_case.general.expected_danger_type)); | 1877 .WillByDefault(Return(test_case.general.expected_danger_type)); |
1857 | 1878 |
1858 base::WeakPtrFactory<DownloadTargetDeterminerTest> factory(this); | 1879 scoped_ptr<DownloadTargetInfo> target_info = |
1859 base::RunLoop run_loop; | 1880 RunDownloadTargetDeterminer(GetPathInDownloadDir(kInitialPath), |
1860 content::DownloadTargetCallback verifier_callback = | 1881 item.get()); |
1861 base::Bind(&DownloadTargetDeterminerTest::DownloadTargetVerifier, | 1882 VerifyDownloadTarget(test_case.general, target_info.get()); |
1862 factory.GetWeakPtr(), | 1883 base::FilePath expected_intermediate_path = |
1863 run_loop.QuitClosure(), | 1884 GetPathInDownloadDir(test_case.expected_intermediate_path); |
1864 test_case.general); | 1885 if (!expected_intermediate_path.empty()) |
1865 content::DownloadTargetCallback test_callback = | 1886 EXPECT_EQ(expected_intermediate_path, target_info->intermediate_path); |
1866 base::Bind(&IntermediatePathVerifier, | 1887 } |
1867 GetPathInDownloadDir(test_case.expected_intermediate_path), | 1888 } |
1868 verifier_callback); | 1889 |
1869 DownloadTargetDeterminer::Start(item.get(), | 1890 // Test MIME type determination based on the target filename. |
1870 GetPathInDownloadDir(kInitialPath), | 1891 TEST_F(DownloadTargetDeterminerTest, |
1871 download_prefs(), | 1892 TargetDeterminer_MIMETypeDetermination) { |
1872 delegate(), | 1893 // All test cases run with GetPathInDownloadDir(kInitialPath) as the inital |
1873 test_callback); | 1894 // path. |
1874 run_loop.Run(); | 1895 const base::FilePath::CharType kInitialPath[] = |
1875 ::testing::Mock::VerifyAndClearExpectations(delegate()); | 1896 FILE_PATH_LITERAL("some_path/bar.txt"); |
1876 } | 1897 |
1877 } | 1898 struct MIMETypeTestCase { |
1899 // General test case settings. | |
1900 DownloadTestCase general; | |
1901 | |
1902 // Expected MIME type for test case. | |
1903 const char* expected_mime_type; | |
1904 } kMIMETypeTestCases[] = { | |
1905 { | |
1906 { | |
1907 // 0: | |
1908 AUTOMATIC, | |
1909 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | |
1910 "http://example.com/foo.png", "image/png", | |
1911 FILE_PATH_LITERAL(""), | |
1912 | |
1913 FILE_PATH_LITERAL(""), | |
1914 FILE_PATH_LITERAL("foo.png"), | |
1915 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | |
1916 | |
1917 EXPECT_CRDOWNLOAD | |
1918 }, | |
1919 "image/png" | |
1920 }, | |
1921 { | |
1922 { | |
1923 // 1: Empty MIME type in response. | |
1924 AUTOMATIC, | |
1925 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | |
1926 "http://example.com/foo.png", "", | |
1927 FILE_PATH_LITERAL(""), | |
1928 | |
1929 FILE_PATH_LITERAL(""), | |
1930 FILE_PATH_LITERAL("foo.png"), | |
1931 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | |
1932 | |
1933 EXPECT_CRDOWNLOAD | |
1934 }, | |
1935 "image/png" | |
1936 }, | |
1937 { | |
1938 { | |
1939 // 2: Forced path. | |
1940 FORCED, | |
1941 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | |
1942 "http://example.com/foo.abc", "", | |
1943 FILE_PATH_LITERAL("foo.png"), | |
1944 | |
1945 FILE_PATH_LITERAL(""), | |
1946 FILE_PATH_LITERAL("foo.png"), | |
1947 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | |
1948 | |
1949 EXPECT_CRDOWNLOAD | |
1950 }, | |
1951 "image/png" | |
1952 }, | |
1953 { | |
1954 { | |
1955 // 3: Unknown file type. | |
1956 AUTOMATIC, | |
1957 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | |
1958 "http://example.com/foo.notarealext", "", | |
1959 FILE_PATH_LITERAL(""), | |
1960 | |
1961 FILE_PATH_LITERAL(""), | |
1962 FILE_PATH_LITERAL("foo.notarealext"), | |
1963 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | |
1964 | |
1965 EXPECT_CRDOWNLOAD | |
1966 }, | |
1967 "" | |
1968 }, | |
1969 { | |
1970 { | |
1971 // 4: Unknown file type. | |
1972 AUTOMATIC, | |
1973 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | |
1974 "http://example.com/foo.notarealext", "image/png", | |
1975 FILE_PATH_LITERAL(""), | |
1976 | |
1977 FILE_PATH_LITERAL(""), | |
1978 FILE_PATH_LITERAL("foo.notarealext"), | |
1979 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | |
1980 | |
1981 EXPECT_CRDOWNLOAD | |
1982 }, | |
1983 "" | |
1984 }, | |
1985 }; | |
1986 | |
1987 ON_CALL(*delegate(), GetFileMimeType( | |
1988 GetPathInDownloadDir(FILE_PATH_LITERAL("foo.png")), _)) | |
1989 .WillByDefault(WithArg<1>( | |
1990 ScheduleCallback("image/png"))); | |
1991 | |
1992 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kMIMETypeTestCases); ++i) { | |
1993 SCOPED_TRACE(testing::Message() << "Running test case " << i); | |
1994 const MIMETypeTestCase& test_case = kMIMETypeTestCases[i]; | |
1995 scoped_ptr<content::MockDownloadItem> item( | |
1996 CreateActiveDownloadItem(i, test_case.general)); | |
1997 scoped_ptr<DownloadTargetInfo> target_info = | |
1998 RunDownloadTargetDeterminer(GetPathInDownloadDir(kInitialPath), | |
1999 item.get()); | |
2000 EXPECT_EQ(test_case.expected_mime_type, target_info->mime_type); | |
Randy Smith (Not in Mondays)
2013/11/05 16:52:40
nit: Why doesn't VerifyDownloadTarget do this/isn'
asanka
2013/11/05 21:31:40
DownloadTestCase is currently overspecified. Most
| |
2001 } | |
2002 } | |
2003 | |
2004 #if defined(ENABLE_PLUGINS) | |
2005 | |
2006 void DummyGetPluginsCallback( | |
2007 const base::Closure& closure, | |
2008 const std::vector<content::WebPluginInfo>& plugins) { | |
2009 closure.Run(); | |
2010 } | |
2011 | |
2012 void ForceRefreshOfPlugins() { | |
2013 base::RunLoop run_loop; | |
2014 content::PluginService::GetInstance()->GetPlugins( | |
2015 base::Bind(&DummyGetPluginsCallback, run_loop.QuitClosure())); | |
2016 run_loop.Run(); | |
2017 } | |
2018 | |
2019 void PluginEnabledCallback(const base::Closure& closure, | |
2020 bool result) { | |
2021 EXPECT_TRUE(result); | |
2022 closure.Run(); | |
2023 } | |
2024 | |
2025 void EnablePlugin(bool enable, PluginPrefs* prefs, const base::FilePath& path) { | |
2026 base::RunLoop run_loop; | |
2027 prefs->EnablePlugin(enable, path, | |
2028 base::Bind(&PluginEnabledCallback, | |
2029 run_loop.QuitClosure())); | |
2030 run_loop.Run(); | |
2031 } | |
2032 | |
2033 class ScopedRegisterInternalPlugin { | |
2034 public: | |
2035 ScopedRegisterInternalPlugin(content::PluginService* plugin_service, | |
2036 content::WebPluginInfo::PluginType type, | |
2037 const base::FilePath& path, | |
2038 const char* mime_type, | |
2039 const char* extension) | |
2040 : plugin_service_(plugin_service), | |
2041 plugin_path_(path) { | |
2042 content::WebPluginMimeType plugin_mime_type(mime_type, | |
2043 extension, | |
2044 "Test file"); | |
2045 content::WebPluginInfo plugin_info(base::string16(), | |
2046 path, | |
2047 base::string16(), | |
2048 base::string16()); | |
2049 plugin_info.mime_types.push_back(plugin_mime_type); | |
2050 plugin_info.type = type; | |
2051 | |
2052 plugin_service->RegisterInternalPlugin(plugin_info, true); | |
2053 plugin_service->RefreshPlugins(); | |
2054 ForceRefreshOfPlugins(); | |
2055 } | |
2056 | |
2057 ~ScopedRegisterInternalPlugin() { | |
2058 plugin_service_->UnregisterInternalPlugin(plugin_path_); | |
2059 plugin_service_->RefreshPlugins(); | |
2060 ForceRefreshOfPlugins(); | |
2061 } | |
2062 | |
2063 const base::FilePath& path() { return plugin_path_; } | |
2064 | |
2065 private: | |
2066 content::PluginService* plugin_service_; | |
2067 base::FilePath plugin_path_; | |
2068 }; | |
2069 | |
2070 // Check if secure handling of filetypes is determined correctly for PPAPI | |
2071 // plugins. | |
2072 TEST_F(DownloadTargetDeterminerTest, | |
2073 TargetDeterminer_CheckForSecureHandling_PPAPI) { | |
2074 // All test cases run with GetPathInDownloadDir(kInitialPath) as the inital | |
2075 // path. | |
2076 const base::FilePath::CharType kInitialPath[] = | |
2077 FILE_PATH_LITERAL("some_path/bar.txt"); | |
2078 const char kTestMIMEType[] = "application/x-example-should-not-exist"; | |
2079 | |
2080 DownloadTestCase kSecureHandlingTestCase = { | |
2081 AUTOMATIC, | |
2082 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | |
2083 "http://example.com/foo.fakeext", "", | |
2084 FILE_PATH_LITERAL(""), | |
2085 | |
2086 FILE_PATH_LITERAL(""), | |
2087 FILE_PATH_LITERAL("foo.fakeext"), | |
2088 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | |
2089 | |
2090 EXPECT_CRDOWNLOAD | |
2091 }; | |
2092 | |
2093 content::PluginService* plugin_service = | |
2094 content::PluginService::GetInstance(); | |
2095 // This creates a PluginPrefs for our TestingProfile. | |
2096 scoped_refptr<PluginPrefs> plugin_prefs = | |
2097 PluginPrefs::GetForTestingProfile(profile()); | |
2098 | |
2099 // Verify our test assumptions. | |
2100 { | |
2101 ForceRefreshOfPlugins(); | |
2102 std::vector<content::WebPluginInfo> info; | |
2103 ASSERT_FALSE(plugin_service->GetPluginInfoArray( | |
2104 GURL(), kTestMIMEType, false, &info, NULL)); | |
2105 ASSERT_EQ(0u, info.size()) | |
2106 << "Name: " << info[0].name << ", Path: " << info[0].path.value(); | |
2107 } | |
2108 | |
2109 ON_CALL(*delegate(), GetFileMimeType( | |
2110 GetPathInDownloadDir(FILE_PATH_LITERAL("foo.fakeext")), _)) | |
2111 .WillByDefault(WithArg<1>( | |
2112 ScheduleCallback(kTestMIMEType))); | |
2113 scoped_ptr<content::MockDownloadItem> item( | |
2114 CreateActiveDownloadItem(1, kSecureHandlingTestCase)); | |
2115 scoped_ptr<DownloadTargetInfo> target_info = | |
2116 RunDownloadTargetDeterminer(GetPathInDownloadDir(kInitialPath), | |
2117 item.get()); | |
2118 EXPECT_FALSE(target_info->is_filetype_handled_securely); | |
2119 | |
2120 // Register a PPAPI plugin. This should count as handling the filetype | |
2121 // securely. | |
2122 ScopedRegisterInternalPlugin ppapi_plugin( | |
2123 plugin_service, | |
2124 content::WebPluginInfo::PLUGIN_TYPE_PEPPER_OUT_OF_PROCESS, | |
2125 test_download_dir().AppendASCII("ppapi"), | |
2126 kTestMIMEType, | |
2127 "fakeext"); | |
2128 | |
2129 target_info = RunDownloadTargetDeterminer( | |
2130 GetPathInDownloadDir(kInitialPath), item.get()); | |
2131 EXPECT_TRUE(target_info->is_filetype_handled_securely); | |
2132 | |
2133 // Try disabling the plugin. Handling should no longer be considered secure. | |
2134 EnablePlugin(false, plugin_prefs, ppapi_plugin.path()); | |
2135 target_info = RunDownloadTargetDeterminer( | |
2136 GetPathInDownloadDir(kInitialPath), item.get()); | |
2137 EXPECT_FALSE(target_info->is_filetype_handled_securely); | |
2138 | |
2139 // Now register an unsandboxed PPAPI plug-in. This should not be considered | |
2140 // secure. | |
2141 ScopedRegisterInternalPlugin ppapi_unsandboxed_plugin( | |
2142 plugin_service, | |
2143 content::WebPluginInfo::PLUGIN_TYPE_PEPPER_UNSANDBOXED, | |
2144 test_download_dir().AppendASCII("ppapi-nosandbox"), | |
2145 kTestMIMEType, | |
2146 "fakeext"); | |
2147 | |
2148 target_info = RunDownloadTargetDeterminer( | |
2149 GetPathInDownloadDir(kInitialPath), item.get()); | |
2150 EXPECT_FALSE(target_info->is_filetype_handled_securely); | |
2151 } | |
2152 | |
2153 // Check if secure handling of filetypes is determined correctly for NPAPI | |
2154 // plugins. | |
2155 TEST_F(DownloadTargetDeterminerTest, | |
2156 TargetDeterminer_CheckForSecureHandling_NPAPI) { | |
2157 // All test cases run with GetPathInDownloadDir(kInitialPath) as the inital | |
2158 // path. | |
2159 const base::FilePath::CharType kInitialPath[] = | |
2160 FILE_PATH_LITERAL("some_path/bar.txt"); | |
2161 const char kTestMIMEType[] = "application/x-example-should-not-exist"; | |
2162 | |
2163 DownloadTestCase kSecureHandlingTestCase = { | |
2164 AUTOMATIC, | |
2165 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | |
2166 "http://example.com/foo.fakeext", "", | |
2167 FILE_PATH_LITERAL(""), | |
2168 | |
2169 FILE_PATH_LITERAL(""), | |
2170 FILE_PATH_LITERAL("foo.fakeext"), | |
2171 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | |
2172 | |
2173 EXPECT_CRDOWNLOAD | |
2174 }; | |
2175 | |
2176 content::PluginService* plugin_service = | |
2177 content::PluginService::GetInstance(); | |
2178 // This creates a PluginPrefs for our TestingProfile. | |
2179 scoped_refptr<PluginPrefs> plugin_prefs = | |
2180 PluginPrefs::GetForTestingProfile(profile()); | |
2181 | |
2182 // Verify our test assumptions. | |
2183 { | |
2184 ForceRefreshOfPlugins(); | |
2185 std::vector<content::WebPluginInfo> info; | |
2186 ASSERT_FALSE(plugin_service->GetPluginInfoArray( | |
2187 GURL(), kTestMIMEType, false, &info, NULL)); | |
2188 ASSERT_EQ(0u, info.size()) | |
2189 << "Name: " << info[0].name << ", Path: " << info[0].path.value(); | |
2190 } | |
2191 | |
2192 ON_CALL(*delegate(), GetFileMimeType( | |
2193 GetPathInDownloadDir(FILE_PATH_LITERAL("foo.fakeext")), _)) | |
2194 .WillByDefault(WithArg<1>( | |
2195 ScheduleCallback(kTestMIMEType))); | |
2196 scoped_ptr<content::MockDownloadItem> item( | |
2197 CreateActiveDownloadItem(1, kSecureHandlingTestCase)); | |
2198 scoped_ptr<DownloadTargetInfo> target_info = | |
2199 RunDownloadTargetDeterminer(GetPathInDownloadDir(kInitialPath), | |
2200 item.get()); | |
2201 EXPECT_FALSE(target_info->is_filetype_handled_securely); | |
2202 | |
2203 // Register a NPAPI plugin. This should not count as handling the filetype | |
2204 // securely. | |
2205 ScopedRegisterInternalPlugin npapi_plugin( | |
2206 plugin_service, | |
2207 content::WebPluginInfo::PLUGIN_TYPE_NPAPI, | |
2208 test_download_dir().AppendASCII("npapi"), | |
2209 kTestMIMEType, | |
2210 "fakeext"); | |
2211 | |
2212 target_info = RunDownloadTargetDeterminer( | |
2213 GetPathInDownloadDir(kInitialPath), item.get()); | |
2214 EXPECT_FALSE(target_info->is_filetype_handled_securely); | |
2215 } | |
2216 #endif // ENABLE_PLUGINS | |
1878 | 2217 |
1879 } // namespace | 2218 } // namespace |
OLD | NEW |