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.h" | 7 #include "base/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/string_util.h" | 12 #include "base/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_util.h" | 18 #include "chrome/browser/download/download_util.h" |
19 #include "chrome/browser/history/history_service.h" | 19 #include "chrome/browser/history/history_service.h" |
20 #include "chrome/browser/history/history_service_factory.h" | 20 #include "chrome/browser/history/history_service_factory.h" |
21 #include "chrome/browser/history/history_types.h" | 21 #include "chrome/browser/history/history_types.h" |
22 #include "chrome/common/extensions/extension.h" | 22 #include "chrome/common/extensions/extension.h" |
23 #include "chrome/common/pref_names.h" | 23 #include "chrome/common/pref_names.h" |
24 #include "chrome/test/base/chrome_render_view_host_test_harness.h" | 24 #include "chrome/test/base/chrome_render_view_host_test_harness.h" |
25 #include "chrome/test/base/testing_pref_service_syncable.h" | 25 #include "chrome/test/base/testing_pref_service_syncable.h" |
26 #include "chrome/test/base/testing_profile.h" | 26 #include "chrome/test/base/testing_profile.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" |
33 #include "testing/gmock/include/gmock/gmock.h" | 34 #include "testing/gmock/include/gmock/gmock.h" |
34 #include "testing/gtest/include/gtest/gtest.h" | 35 #include "testing/gtest/include/gtest/gtest.h" |
35 | 36 |
36 using ::testing::AnyNumber; | 37 using ::testing::AnyNumber; |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
201 | 202 |
202 // Set the kPromptForDownload user preference to |prompt|. | 203 // Set the kPromptForDownload user preference to |prompt|. |
203 void SetPromptForDownload(bool prompt); | 204 void SetPromptForDownload(bool prompt); |
204 | 205 |
205 // Given the relative path |path|, returns the full path under the temporary | 206 // Given the relative path |path|, returns the full path under the temporary |
206 // downloads directory. | 207 // downloads directory. |
207 base::FilePath GetPathInDownloadDir(const base::FilePath::StringType& path); | 208 base::FilePath GetPathInDownloadDir(const base::FilePath::StringType& path); |
208 | 209 |
209 // Run |test_case| using |item|. | 210 // Run |test_case| using |item|. |
210 void RunTestCase(const DownloadTestCase& test_case, | 211 void RunTestCase(const DownloadTestCase& test_case, |
212 const base::FilePath& initial_virtual_path, | |
211 content::MockDownloadItem* item); | 213 content::MockDownloadItem* item); |
212 | 214 |
213 // Run through |test_case_count| tests in |test_cases|. A new MockDownloadItem | 215 // Run through |test_case_count| tests in |test_cases|. A new MockDownloadItem |
214 // will be created for each test case and destroyed when the test case is | 216 // will be created for each test case and destroyed when the test case is |
215 // complete. | 217 // complete. |
216 void RunTestCasesWithActiveItem(const DownloadTestCase test_cases[], | 218 void RunTestCasesWithActiveItem(const DownloadTestCase test_cases[], |
217 size_t test_case_count); | 219 size_t test_case_count); |
218 | 220 |
219 const base::FilePath& test_download_dir() const { | 221 const base::FilePath& test_download_dir() const { |
220 return test_download_dir_.path(); | 222 return test_download_dir_.path(); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
303 ON_CALL(*item, GetDangerType()) | 305 ON_CALL(*item, GetDangerType()) |
304 .WillByDefault(Return(content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS)); | 306 .WillByDefault(Return(content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS)); |
305 ON_CALL(*item, GetForcedFilePath()) | 307 ON_CALL(*item, GetForcedFilePath()) |
306 .WillByDefault(ReturnRefOfCopy(forced_file_path)); | 308 .WillByDefault(ReturnRefOfCopy(forced_file_path)); |
307 ON_CALL(*item, GetFullPath()) | 309 ON_CALL(*item, GetFullPath()) |
308 .WillByDefault(ReturnRefOfCopy(base::FilePath())); | 310 .WillByDefault(ReturnRefOfCopy(base::FilePath())); |
309 ON_CALL(*item, GetHash()) | 311 ON_CALL(*item, GetHash()) |
310 .WillByDefault(ReturnRefOfCopy(std::string())); | 312 .WillByDefault(ReturnRefOfCopy(std::string())); |
311 ON_CALL(*item, GetId()) | 313 ON_CALL(*item, GetId()) |
312 .WillByDefault(Return(id)); | 314 .WillByDefault(Return(id)); |
315 ON_CALL(*item, GetLastReason()) | |
316 .WillByDefault(Return(content::DOWNLOAD_INTERRUPT_REASON_NONE)); | |
313 ON_CALL(*item, GetMimeType()) | 317 ON_CALL(*item, GetMimeType()) |
314 .WillByDefault(Return(test_case.mime_type)); | 318 .WillByDefault(Return(test_case.mime_type)); |
315 ON_CALL(*item, GetReferrerUrl()) | 319 ON_CALL(*item, GetReferrerUrl()) |
316 .WillByDefault(ReturnRefOfCopy(download_url)); | 320 .WillByDefault(ReturnRefOfCopy(download_url)); |
317 ON_CALL(*item, GetState()) | 321 ON_CALL(*item, GetState()) |
318 .WillByDefault(Return(DownloadItem::IN_PROGRESS)); | 322 .WillByDefault(Return(DownloadItem::IN_PROGRESS)); |
319 ON_CALL(*item, GetTargetDisposition()) | 323 ON_CALL(*item, GetTargetDisposition()) |
320 .WillByDefault(Return(initial_disposition)); | 324 .WillByDefault(Return(initial_disposition)); |
321 ON_CALL(*item, GetTargetFilePath()) | 325 ON_CALL(*item, GetTargetFilePath()) |
322 .WillByDefault(ReturnRefOfCopy(base::FilePath())); | 326 .WillByDefault(ReturnRefOfCopy(base::FilePath())); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
365 base::FilePath DownloadTargetDeterminerTest::GetPathInDownloadDir( | 369 base::FilePath DownloadTargetDeterminerTest::GetPathInDownloadDir( |
366 const base::FilePath::StringType& relative_path) { | 370 const base::FilePath::StringType& relative_path) { |
367 if (relative_path.empty()) | 371 if (relative_path.empty()) |
368 return base::FilePath(); | 372 return base::FilePath(); |
369 base::FilePath full_path(test_download_dir().Append(relative_path)); | 373 base::FilePath full_path(test_download_dir().Append(relative_path)); |
370 return full_path.NormalizePathSeparators(); | 374 return full_path.NormalizePathSeparators(); |
371 } | 375 } |
372 | 376 |
373 void DownloadTargetDeterminerTest::RunTestCase( | 377 void DownloadTargetDeterminerTest::RunTestCase( |
374 const DownloadTestCase& test_case, | 378 const DownloadTestCase& test_case, |
379 const base::FilePath& initial_virtual_path, | |
375 content::MockDownloadItem* item) { | 380 content::MockDownloadItem* item) { |
376 // Kick off the test. | 381 // Kick off the test. |
377 base::WeakPtrFactory<DownloadTargetDeterminerTest> factory(this); | 382 base::WeakPtrFactory<DownloadTargetDeterminerTest> factory(this); |
378 base::RunLoop run_loop; | 383 base::RunLoop run_loop; |
379 DownloadTargetDeterminer::Start( | 384 DownloadTargetDeterminer::Start( |
380 item, download_prefs_.get(), last_selected_directory_, delegate(), | 385 item, initial_virtual_path, download_prefs_.get(), |
386 last_selected_directory_, delegate(), | |
381 base::Bind(&DownloadTargetDeterminerTest::DownloadTargetVerifier, | 387 base::Bind(&DownloadTargetDeterminerTest::DownloadTargetVerifier, |
382 factory.GetWeakPtr(), run_loop.QuitClosure(), test_case)); | 388 factory.GetWeakPtr(), run_loop.QuitClosure(), test_case)); |
383 run_loop.Run(); | 389 run_loop.Run(); |
384 ::testing::Mock::VerifyAndClearExpectations(delegate()); | 390 ::testing::Mock::VerifyAndClearExpectations(delegate()); |
385 } | 391 } |
386 | 392 |
387 void DownloadTargetDeterminerTest::RunTestCasesWithActiveItem( | 393 void DownloadTargetDeterminerTest::RunTestCasesWithActiveItem( |
388 const DownloadTestCase test_cases[], | 394 const DownloadTestCase test_cases[], |
389 size_t test_case_count) { | 395 size_t test_case_count) { |
390 for (size_t i = 0; i < test_case_count; ++i) { | 396 for (size_t i = 0; i < test_case_count; ++i) { |
391 scoped_ptr<content::MockDownloadItem> item( | 397 scoped_ptr<content::MockDownloadItem> item( |
392 CreateActiveDownloadItem(i, test_cases[i])); | 398 CreateActiveDownloadItem(i, test_cases[i])); |
393 SCOPED_TRACE(testing::Message() << "Running test case " << i); | 399 SCOPED_TRACE(testing::Message() << "Running test case " << i); |
394 RunTestCase(test_cases[i], item.get()); | 400 RunTestCase(test_cases[i], base::FilePath(), item.get()); |
395 } | 401 } |
396 } | 402 } |
397 | 403 |
398 void DownloadTargetDeterminerTest::DownloadTargetVerifier( | 404 void DownloadTargetDeterminerTest::DownloadTargetVerifier( |
399 const base::Closure& closure, | 405 const base::Closure& closure, |
400 const DownloadTestCase& test_case, | 406 const DownloadTestCase& test_case, |
401 const base::FilePath& local_path, | 407 const base::FilePath& local_path, |
402 DownloadItem::TargetDisposition disposition, | 408 DownloadItem::TargetDisposition disposition, |
403 content::DownloadDangerType danger_type, | 409 content::DownloadDangerType danger_type, |
404 const base::FilePath& intermediate_path) { | 410 const base::FilePath& intermediate_path) { |
(...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
969 SCOPED_TRACE(testing::Message() << "Running test case " << i); | 975 SCOPED_TRACE(testing::Message() << "Running test case " << i); |
970 const DownloadTestCase& test_case = kInactiveTestCases[i]; | 976 const DownloadTestCase& test_case = kInactiveTestCases[i]; |
971 scoped_ptr<content::MockDownloadItem> item( | 977 scoped_ptr<content::MockDownloadItem> item( |
972 CreateActiveDownloadItem(i, test_case)); | 978 CreateActiveDownloadItem(i, test_case)); |
973 EXPECT_CALL(*item.get(), IsInProgress()) | 979 EXPECT_CALL(*item.get(), IsInProgress()) |
974 .WillRepeatedly(Return(false)); | 980 .WillRepeatedly(Return(false)); |
975 // Even though one is a SAVE_AS download, no prompt will be displayed to | 981 // Even though one is a SAVE_AS download, no prompt will be displayed to |
976 // the user because the download is inactive. | 982 // the user because the download is inactive. |
977 EXPECT_CALL(*delegate(), PromptUserForDownloadPath(_, _, _)) | 983 EXPECT_CALL(*delegate(), PromptUserForDownloadPath(_, _, _)) |
978 .Times(0); | 984 .Times(0); |
979 RunTestCase(kInactiveTestCases[i], item.get()); | 985 RunTestCase(test_case, base::FilePath(), item.get()); |
980 } | 986 } |
981 } | 987 } |
982 | 988 |
983 // If the reserved path could not be verified, then the user should see a | 989 // If the reserved path could not be verified, then the user should see a |
984 // prompt. | 990 // prompt. |
985 TEST_F(DownloadTargetDeterminerTest, TargetDeterminer_ReservationFailed) { | 991 TEST_F(DownloadTargetDeterminerTest, TargetDeterminer_ReservationFailed) { |
986 const DownloadTestCase kReservationFailedCases[] = { | 992 const DownloadTestCase kReservationFailedCases[] = { |
987 { | 993 { |
988 // 0: Automatic download. Since the reservation fails, the disposition of | 994 // 0: Automatic download. Since the reservation fails, the disposition of |
989 // the target is to prompt, but the returned path is used. | 995 // the target is to prompt, but the returned path is used. |
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1418 // First case: An extension sets the conflict_action to OVERWRITE. | 1424 // First case: An extension sets the conflict_action to OVERWRITE. |
1419 EXPECT_CALL(*delegate(), NotifyExtensions(_, _, _)) | 1425 EXPECT_CALL(*delegate(), NotifyExtensions(_, _, _)) |
1420 .WillOnce(WithArg<2>( | 1426 .WillOnce(WithArg<2>( |
1421 ScheduleCallback2(overridden_path, | 1427 ScheduleCallback2(overridden_path, |
1422 DownloadPathReservationTracker::OVERWRITE))); | 1428 DownloadPathReservationTracker::OVERWRITE))); |
1423 EXPECT_CALL(*delegate(), ReserveVirtualPath( | 1429 EXPECT_CALL(*delegate(), ReserveVirtualPath( |
1424 _, full_overridden_path, true, DownloadPathReservationTracker::OVERWRITE, | 1430 _, full_overridden_path, true, DownloadPathReservationTracker::OVERWRITE, |
1425 _)).WillOnce(WithArg<4>( | 1431 _)).WillOnce(WithArg<4>( |
1426 ScheduleCallback2(full_overridden_path, true))); | 1432 ScheduleCallback2(full_overridden_path, true))); |
1427 | 1433 |
1428 RunTestCase(test_case, item.get()); | 1434 RunTestCase(test_case, base::FilePath(), item.get()); |
1429 | 1435 |
1430 // Second case: An extension sets the conflict_action to PROMPT. | 1436 // Second case: An extension sets the conflict_action to PROMPT. |
1431 EXPECT_CALL(*delegate(), NotifyExtensions(_, _, _)) | 1437 EXPECT_CALL(*delegate(), NotifyExtensions(_, _, _)) |
1432 .WillOnce(WithArg<2>( | 1438 .WillOnce(WithArg<2>( |
1433 ScheduleCallback2(overridden_path, | 1439 ScheduleCallback2(overridden_path, |
1434 DownloadPathReservationTracker::PROMPT))); | 1440 DownloadPathReservationTracker::PROMPT))); |
1435 EXPECT_CALL(*delegate(), ReserveVirtualPath( | 1441 EXPECT_CALL(*delegate(), ReserveVirtualPath( |
1436 _, full_overridden_path, true, DownloadPathReservationTracker::PROMPT, _)) | 1442 _, full_overridden_path, true, DownloadPathReservationTracker::PROMPT, _)) |
1437 .WillOnce(WithArg<4>( | 1443 .WillOnce(WithArg<4>( |
1438 ScheduleCallback2(full_overridden_path, true))); | 1444 ScheduleCallback2(full_overridden_path, true))); |
1439 RunTestCase(test_case, item.get()); | 1445 RunTestCase(test_case, base::FilePath(), item.get()); |
1440 } | 1446 } |
1441 | 1447 |
1442 // Test that relative paths returned by extensions are always relative to the | 1448 // Test that relative paths returned by extensions are always relative to the |
1443 // default downloads path. | 1449 // default downloads path. |
1444 TEST_F(DownloadTargetDeterminerTest, | 1450 TEST_F(DownloadTargetDeterminerTest, |
1445 TargetDeterminer_NotifyExtensionsDefaultPath) { | 1451 TargetDeterminer_NotifyExtensionsDefaultPath) { |
1446 const DownloadTestCase kNotifyExtensionsTestCase = { | 1452 const DownloadTestCase kNotifyExtensionsTestCase = { |
1447 SAVE_AS, | 1453 SAVE_AS, |
1448 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | 1454 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
1449 "http://example.com/foo.txt", "text/plain", | 1455 "http://example.com/foo.txt", "text/plain", |
(...skipping 19 matching lines...) Expand all Loading... | |
1469 FILE_PATH_LITERAL("last_selected"))); | 1475 FILE_PATH_LITERAL("last_selected"))); |
1470 | 1476 |
1471 EXPECT_CALL(*delegate(), NotifyExtensions(_, _, _)) | 1477 EXPECT_CALL(*delegate(), NotifyExtensions(_, _, _)) |
1472 .WillOnce(WithArg<2>( | 1478 .WillOnce(WithArg<2>( |
1473 ScheduleCallback2(overridden_path, | 1479 ScheduleCallback2(overridden_path, |
1474 DownloadPathReservationTracker::UNIQUIFY))); | 1480 DownloadPathReservationTracker::UNIQUIFY))); |
1475 EXPECT_CALL(*delegate(), | 1481 EXPECT_CALL(*delegate(), |
1476 PromptUserForDownloadPath(_, full_overridden_path, _)) | 1482 PromptUserForDownloadPath(_, full_overridden_path, _)) |
1477 .WillOnce(WithArg<2>( | 1483 .WillOnce(WithArg<2>( |
1478 ScheduleCallback(full_overridden_path))); | 1484 ScheduleCallback(full_overridden_path))); |
1479 RunTestCase(test_case, item.get()); | 1485 RunTestCase(test_case, base::FilePath(), item.get()); |
1480 } | 1486 } |
1487 | |
1488 TEST_F(DownloadTargetDeterminerTest, | |
1489 TargetDeterminer_InitialVirtualPathUnsafe) { | |
1490 const base::FilePath::CharType* kInitialPath = | |
1491 FILE_PATH_LITERAL("some_path/bar.html"); | |
1492 | |
1493 const DownloadTestCase kInitialPathTestCases[] = { | |
1494 { | |
1495 // 0: Save As Save. The path generated based on the DownloadItem is safe, | |
1496 // but the initial path is unsafe. However, the download is not considered | |
1497 // dangerous since the user has been prompted. | |
1498 SAVE_AS, | |
1499 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | |
1500 "http://example.com/foo.txt", "text/plain", | |
1501 FILE_PATH_LITERAL(""), | |
1502 | |
1503 FILE_PATH_LITERAL(""), | |
1504 kInitialPath, | |
1505 DownloadItem::TARGET_DISPOSITION_PROMPT, | |
1506 | |
1507 EXPECT_CRDOWNLOAD | |
1508 }, | |
1509 }; | |
1510 | |
1511 for (size_t i = 0; i < arraysize(kInitialPathTestCases); ++i) { | |
Randy Smith (Not in Mondays)
2013/05/24 01:53:55
Why bother to have the test case loop if we're onl
asanka
2013/05/29 22:30:11
Removed loop. It was supposed to contain multiple
| |
1512 SCOPED_TRACE(testing::Message() << "Running test case " << i); | |
1513 const DownloadTestCase& test_case = kInitialPathTestCases[i]; | |
1514 scoped_ptr<content::MockDownloadItem> item( | |
1515 CreateActiveDownloadItem(i, test_case)); | |
1516 EXPECT_CALL(*item, GetLastReason()) | |
1517 .WillRepeatedly(Return( | |
1518 content::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED)); | |
1519 EXPECT_CALL(*item, GetTargetDisposition()) | |
1520 .WillRepeatedly(Return(DownloadItem::TARGET_DISPOSITION_PROMPT)); | |
1521 RunTestCase(test_case, GetPathInDownloadDir(kInitialPath), item.get()); | |
1522 } | |
1523 } | |
1524 | |
1525 // Prompting behavior for resumed downloads is based on the last interrupt | |
1526 // reason. If the reason indicates that the target path may not be suitable for | |
1527 // the download (ACCESS_DENIED, NO_SPACE, etc..), then the user should be | |
1528 // prompted, and not otherwise. These test cases shouldn't result in prompting | |
1529 // since the error is set to NETWORK_FAILED. | |
1530 TEST_F(DownloadTargetDeterminerTest, TargetDeterminer_ResumedNoPrompt) { | |
1531 // All test cases run with GetPathInDownloadDir(kInitialPath) as the inital | |
1532 // path. | |
1533 const base::FilePath::CharType* kInitialPath = | |
1534 FILE_PATH_LITERAL("some_path/bar.txt"); | |
1535 | |
1536 const DownloadTestCase kResumedTestCases[] = { | |
1537 { | |
1538 // 0: Automatic Safe: Initial path is ignored since the user has not been | |
1539 // prompted before. | |
1540 AUTOMATIC, | |
1541 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | |
1542 "http://example.com/foo.txt", "text/plain", | |
1543 FILE_PATH_LITERAL(""), | |
1544 | |
1545 FILE_PATH_LITERAL(""), | |
1546 FILE_PATH_LITERAL("foo.txt"), | |
1547 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | |
1548 | |
1549 EXPECT_CRDOWNLOAD | |
1550 }, | |
1551 | |
1552 { | |
1553 // 1: Save_As Safe: Initial path used. | |
1554 SAVE_AS, | |
1555 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | |
1556 "http://example.com/foo.txt", "text/plain", | |
1557 FILE_PATH_LITERAL(""), | |
1558 | |
1559 FILE_PATH_LITERAL(""), | |
1560 kInitialPath, | |
1561 DownloadItem::TARGET_DISPOSITION_PROMPT, | |
1562 | |
1563 EXPECT_CRDOWNLOAD | |
1564 }, | |
1565 | |
1566 { | |
1567 // 2: Automatic Dangerous: Initial path is ignored since the user hasn't | |
1568 // been prompted before. | |
1569 AUTOMATIC, | |
1570 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE, | |
1571 "http://example.com/foo.html", "", | |
1572 FILE_PATH_LITERAL(""), | |
1573 | |
1574 FILE_PATH_LITERAL(""), | |
1575 FILE_PATH_LITERAL("foo.html"), | |
1576 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | |
1577 | |
1578 EXPECT_UNCONFIRMED | |
1579 }, | |
1580 | |
1581 { | |
1582 // 3: Forced Safe: Initial path is ignored due to the forced path. | |
1583 FORCED, | |
1584 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | |
1585 "http://example.com/foo.txt", "", | |
1586 FILE_PATH_LITERAL("forced-foo.txt"), | |
1587 | |
1588 FILE_PATH_LITERAL(""), | |
1589 FILE_PATH_LITERAL("forced-foo.txt"), | |
1590 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | |
1591 | |
1592 EXPECT_LOCAL_PATH | |
1593 }, | |
1594 }; | |
1595 | |
1596 // The test assumes that .html files have a danger level of | |
1597 // AllowOnUserGesture. | |
1598 ASSERT_EQ(download_util::AllowOnUserGesture, | |
1599 download_util::GetFileDangerLevel( | |
1600 base::FilePath(FILE_PATH_LITERAL("foo.html")))); | |
1601 for (size_t i = 0; i < arraysize(kResumedTestCases); ++i) { | |
1602 SCOPED_TRACE(testing::Message() << "Running test case " << i); | |
1603 const DownloadTestCase& test_case = kResumedTestCases[i]; | |
1604 scoped_ptr<content::MockDownloadItem> item( | |
1605 CreateActiveDownloadItem(i, test_case)); | |
1606 base::FilePath expected_path = | |
1607 GetPathInDownloadDir(test_case.expected_local_path); | |
1608 ON_CALL(*item.get(), GetLastReason()) | |
1609 .WillByDefault(Return( | |
1610 content::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED)); | |
1611 // Extensions should be notified if a new path is being generated and there | |
1612 // is no forced path. In the test cases above, this is true for tests with | |
1613 // type == AUTOMATIC. | |
1614 EXPECT_CALL(*delegate(), NotifyExtensions(_, _, _)) | |
1615 .Times(test_case.test_type == AUTOMATIC ? 1 : 0); | |
1616 EXPECT_CALL(*delegate(), ReserveVirtualPath(_, expected_path, false, _, _)); | |
1617 EXPECT_CALL(*delegate(), PromptUserForDownloadPath(_, expected_path, _)) | |
1618 .Times(0); | |
1619 EXPECT_CALL(*delegate(), DetermineLocalPath(_, expected_path, _)); | |
1620 EXPECT_CALL(*delegate(), CheckDownloadUrl(_, expected_path, _)); | |
1621 RunTestCase(test_case, GetPathInDownloadDir(kInitialPath), item.get()); | |
1622 } | |
1623 | |
1624 } | |
1625 | |
1626 // Test that a forced download doesn't prompt, even if the interrupt reason | |
1627 // suggests that the target path may not be suitable for downloads. | |
1628 TEST_F(DownloadTargetDeterminerTest, TargetDeterminer_ResumedForcedDownload) { | |
1629 const base::FilePath::CharType* kInitialPath = | |
1630 FILE_PATH_LITERAL("some_path/bar.txt"); | |
1631 const DownloadTestCase kResumedForcedDownload = { | |
1632 // 3: Forced Safe | |
1633 FORCED, | |
1634 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | |
1635 "http://example.com/foo.txt", "", | |
1636 FILE_PATH_LITERAL("forced-foo.txt"), | |
1637 | |
1638 FILE_PATH_LITERAL(""), | |
1639 FILE_PATH_LITERAL("forced-foo.txt"), | |
1640 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | |
1641 | |
1642 EXPECT_LOCAL_PATH | |
1643 }; | |
1644 | |
1645 const DownloadTestCase& test_case = kResumedForcedDownload; | |
1646 base::FilePath expected_path = | |
1647 GetPathInDownloadDir(test_case.expected_local_path); | |
1648 scoped_ptr<content::MockDownloadItem> item( | |
1649 CreateActiveDownloadItem(0, test_case)); | |
1650 ON_CALL(*item.get(), GetLastReason()) | |
1651 .WillByDefault(Return( | |
1652 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE)); | |
1653 EXPECT_CALL(*delegate(), NotifyExtensions(_, _, _)) | |
1654 .Times(test_case.test_type == AUTOMATIC ? 1 : 0); | |
1655 EXPECT_CALL(*delegate(), ReserveVirtualPath(_, expected_path, false, _, _)); | |
1656 EXPECT_CALL(*delegate(), PromptUserForDownloadPath(_, _, _)) | |
1657 .Times(0); | |
1658 EXPECT_CALL(*delegate(), DetermineLocalPath(_, expected_path, _)); | |
1659 EXPECT_CALL(*delegate(), CheckDownloadUrl(_, expected_path, _)); | |
1660 RunTestCase(test_case, GetPathInDownloadDir(kInitialPath), item.get()); | |
1661 } | |
1662 | |
1663 // Prompting behavior for resumed downloads is based on the last interrupt | |
1664 // reason. If the reason indicates that the target path may not be suitable for | |
1665 // the download (ACCESS_DENIED, NO_SPACE, etc..), then the user should be | |
1666 // prompted, and not otherwise. These test cases result in prompting since the | |
1667 // error is set to NO_SPACE. | |
1668 TEST_F(DownloadTargetDeterminerTest, TargetDeterminer_ResumedWithPrompt) { | |
1669 // All test cases run with GetPathInDownloadDir(kInitialPath) as the inital | |
1670 // path. | |
1671 const base::FilePath::CharType* kInitialPath = | |
1672 FILE_PATH_LITERAL("some_path/bar.txt"); | |
1673 | |
1674 const DownloadTestCase kResumedTestCases[] = { | |
1675 { | |
1676 // 0: Automatic Safe | |
1677 AUTOMATIC, | |
1678 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | |
1679 "http://example.com/foo.txt", "text/plain", | |
1680 FILE_PATH_LITERAL(""), | |
1681 | |
1682 FILE_PATH_LITERAL(""), | |
1683 FILE_PATH_LITERAL("foo.txt"), | |
1684 DownloadItem::TARGET_DISPOSITION_PROMPT, | |
1685 | |
1686 EXPECT_CRDOWNLOAD | |
1687 }, | |
1688 | |
1689 { | |
1690 // 1: Save_As Safe | |
1691 SAVE_AS, | |
1692 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | |
1693 "http://example.com/foo.txt", "text/plain", | |
1694 FILE_PATH_LITERAL(""), | |
1695 | |
1696 FILE_PATH_LITERAL(""), | |
1697 kInitialPath, | |
1698 DownloadItem::TARGET_DISPOSITION_PROMPT, | |
1699 | |
1700 EXPECT_CRDOWNLOAD | |
1701 }, | |
1702 | |
1703 { | |
1704 // 2: Automatic Dangerous | |
1705 AUTOMATIC, | |
1706 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | |
1707 "http://example.com/foo.html", "", | |
1708 FILE_PATH_LITERAL(""), | |
1709 | |
1710 FILE_PATH_LITERAL(""), | |
1711 FILE_PATH_LITERAL("foo.html"), | |
1712 DownloadItem::TARGET_DISPOSITION_PROMPT, | |
1713 | |
1714 EXPECT_CRDOWNLOAD | |
1715 }, | |
1716 }; | |
1717 | |
1718 // The test assumes that .html files have a danger level of | |
1719 // AllowOnUserGesture. | |
1720 ASSERT_EQ(download_util::AllowOnUserGesture, | |
1721 download_util::GetFileDangerLevel( | |
1722 base::FilePath(FILE_PATH_LITERAL("foo.html")))); | |
1723 for (size_t i = 0; i < arraysize(kResumedTestCases); ++i) { | |
1724 SCOPED_TRACE(testing::Message() << "Running test case " << i); | |
1725 const DownloadTestCase& test_case = kResumedTestCases[i]; | |
1726 base::FilePath expected_path = | |
1727 GetPathInDownloadDir(test_case.expected_local_path); | |
1728 scoped_ptr<content::MockDownloadItem> item( | |
1729 CreateActiveDownloadItem(i, test_case)); | |
1730 ON_CALL(*item.get(), GetLastReason()) | |
1731 .WillByDefault(Return( | |
1732 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE)); | |
1733 EXPECT_CALL(*delegate(), NotifyExtensions(_, _, _)) | |
1734 .Times(test_case.test_type == AUTOMATIC ? 1 : 0); | |
1735 EXPECT_CALL(*delegate(), ReserveVirtualPath(_, expected_path, false, _, _)); | |
1736 EXPECT_CALL(*delegate(), PromptUserForDownloadPath(_, expected_path, _)); | |
1737 EXPECT_CALL(*delegate(), DetermineLocalPath(_, expected_path, _)); | |
1738 EXPECT_CALL(*delegate(), CheckDownloadUrl(_, expected_path, _)); | |
1739 RunTestCase(test_case, GetPathInDownloadDir(kInitialPath), item.get()); | |
1740 } | |
1741 } | |
1742 | |
1481 } // namespace | 1743 } // namespace |
OLD | NEW |