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/bind.h" | 5 #include "base/bind.h" |
6 #include "base/bind_helpers.h" | 6 #include "base/bind_helpers.h" |
7 #include "base/file_path.h" | 7 #include "base/file_path.h" |
8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
243 DOWNLOAD_DIRECT | 243 DOWNLOAD_DIRECT |
244 }; | 244 }; |
245 | 245 |
246 // Information passed in to |DownloadFileCheckErrors()|. | 246 // Information passed in to |DownloadFileCheckErrors()|. |
247 struct DownloadInfo { | 247 struct DownloadInfo { |
248 const char* url_name; // URL for the download. | 248 const char* url_name; // URL for the download. |
249 DownloadMethod download_method; // Navigation or Direct. | 249 DownloadMethod download_method; // Navigation or Direct. |
250 // Download interrupt reason (NONE is OK). | 250 // Download interrupt reason (NONE is OK). |
251 content::DownloadInterruptReason reason; | 251 content::DownloadInterruptReason reason; |
252 bool show_download_item; // True if the download item appears on the shelf. | 252 bool show_download_item; // True if the download item appears on the shelf. |
253 bool should_redirect_to_documents; // True if we save it in "My Documents". | |
253 }; | 254 }; |
254 | 255 |
255 DownloadTest() { | 256 DownloadTest() { |
256 EnableDOMAutomation(); | 257 EnableDOMAutomation(); |
257 } | 258 } |
258 | 259 |
259 void SetUpOnMainThread() OVERRIDE { | 260 void SetUpOnMainThread() OVERRIDE { |
260 BrowserThread::PostTask( | 261 BrowserThread::PostTask( |
261 BrowserThread::IO, FROM_HERE, | 262 BrowserThread::IO, FROM_HERE, |
262 base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true)); | 263 base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true)); |
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
634 | 635 |
635 // Check the contents. | 636 // Check the contents. |
636 EXPECT_EQ(value, file_contents); | 637 EXPECT_EQ(value, file_contents); |
637 if (memcmp(file_contents.c_str(), value.c_str(), expected_size) != 0) | 638 if (memcmp(file_contents.c_str(), value.c_str(), expected_size) != 0) |
638 return false; | 639 return false; |
639 | 640 |
640 return true; | 641 return true; |
641 } | 642 } |
642 | 643 |
643 // Attempts to download a file, based on information in |download_info|. | 644 // Attempts to download a file, based on information in |download_info|. |
645 // If a Select File dialog opens, will automatically choose the default. | |
644 void DownloadFileCheckErrors(const DownloadInfo& download_info) { | 646 void DownloadFileCheckErrors(const DownloadInfo& download_info) { |
645 ASSERT_TRUE(test_server()->Start()); | 647 ASSERT_TRUE(test_server()->Start()); |
646 std::vector<DownloadItem*> download_items; | 648 std::vector<DownloadItem*> download_items; |
647 GetDownloads(browser(), &download_items); | 649 GetDownloads(browser(), &download_items); |
648 ASSERT_TRUE(download_items.empty()); | 650 ASSERT_TRUE(download_items.empty()); |
649 | 651 |
650 NullSelectFile(browser()); | 652 NullSelectFile(browser()); |
651 | 653 |
652 std::string server_path = "files/downloads/"; | 654 std::string server_path = "files/downloads/"; |
653 server_path += download_info.url_name; | 655 server_path += download_info.url_name; |
654 GURL url = test_server()->GetURL(server_path); | 656 GURL url = test_server()->GetURL(server_path); |
655 ASSERT_TRUE(url.is_valid()); | 657 ASSERT_TRUE(url.is_valid()); |
656 | 658 |
659 NullSelectFile(browser()); // Needed for read-only tests. | |
660 | |
657 DownloadManager* download_manager = DownloadManagerForBrowser(browser()); | 661 DownloadManager* download_manager = DownloadManagerForBrowser(browser()); |
658 scoped_ptr<DownloadTestObserver> observer( | 662 scoped_ptr<DownloadTestObserver> observer( |
659 new DownloadTestObserverTerminal( | 663 new DownloadTestObserverTerminal( |
660 download_manager, | 664 download_manager, |
661 1, | 665 1, |
662 false, // Don't bail on select file. | 666 false, // Don't bail on select file. |
663 DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); | 667 DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); |
664 | 668 |
665 if (download_info.download_method == DOWNLOAD_DIRECT) { | 669 if (download_info.download_method == DOWNLOAD_DIRECT) { |
666 // Go directly to download. | 670 // Go directly to download. |
(...skipping 24 matching lines...) Expand all Loading... | |
691 EXPECT_EQ(invalid_id, creation_observer->download_id().local()); | 695 EXPECT_EQ(invalid_id, creation_observer->download_id().local()); |
692 } | 696 } |
693 } else { | 697 } else { |
694 // Navigate to URL normally, wait until done. | 698 // Navigate to URL normally, wait until done. |
695 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(), | 699 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(), |
696 url, | 700 url, |
697 1); | 701 1); |
698 } | 702 } |
699 | 703 |
700 if (download_info.show_download_item) { | 704 if (download_info.show_download_item) { |
701 observer->WaitForFinished(); | 705 observer->WaitForFinished(); |
Randy Smith (Not in Mondays)
2012/03/12 17:51:16
Part of me's a little bothered that we're creating
| |
702 DownloadItem::DownloadState final_state = | 706 DownloadItem::DownloadState final_state = |
703 (download_info.reason == content::DOWNLOAD_INTERRUPT_REASON_NONE) ? | 707 (download_info.reason == content::DOWNLOAD_INTERRUPT_REASON_NONE) ? |
704 DownloadItem::COMPLETE : | 708 DownloadItem::COMPLETE : |
705 DownloadItem::INTERRUPTED; | 709 DownloadItem::INTERRUPTED; |
706 EXPECT_EQ(1u, observer->NumDownloadsSeenInState(final_state)); | 710 EXPECT_EQ(1u, observer->NumDownloadsSeenInState(final_state)); |
707 } | 711 } |
708 | 712 |
709 // Validate that the correct file was downloaded. | 713 // Validate that the correct file was downloaded. |
710 download_items.clear(); | 714 download_items.clear(); |
711 GetDownloads(browser(), &download_items); | 715 GetDownloads(browser(), &download_items); |
712 size_t item_count = download_info.show_download_item ? 1 : 0; | 716 size_t item_count = download_info.show_download_item ? 1 : 0; |
713 ASSERT_EQ(item_count, download_items.size()); | 717 ASSERT_EQ(item_count, download_items.size()); |
714 | 718 |
715 if (download_info.show_download_item) { | 719 if (download_info.show_download_item) { |
716 DownloadItem* item = download_items[0]; | 720 DownloadItem* item = download_items[0]; |
717 ASSERT_EQ(url, item->GetOriginalUrl()); | 721 ASSERT_EQ(url, item->GetOriginalUrl()); |
718 | 722 |
719 ASSERT_EQ(download_info.reason, item->GetLastReason()); | 723 ASSERT_EQ(download_info.reason, item->GetLastReason()); |
724 | |
725 if (item->GetState() == content::DownloadItem::COMPLETE) { | |
726 // Clean up the file, in case it ended up in the My Documents folder. | |
727 FilePath destination_folder = GetDownloadDirectory(browser()); | |
728 FilePath my_downloaded_file = item->GetTargetFilePath(); | |
729 EXPECT_TRUE(file_util::PathExists(my_downloaded_file)); | |
730 EXPECT_TRUE(file_util::Delete(my_downloaded_file, false)); | |
731 | |
732 EXPECT_EQ(download_info.should_redirect_to_documents ? | |
733 std::string::npos : | |
734 0u, | |
735 my_downloaded_file.value().find(destination_folder.value())); | |
736 if (download_info.should_redirect_to_documents) { | |
737 // If it's not where we asked it to be, it should be in the | |
738 // My Documents folder. | |
739 FilePath my_docs_folder; | |
740 EXPECT_TRUE(PathService::Get(chrome::DIR_USER_DOCUMENTS, | |
741 &my_docs_folder)); | |
742 EXPECT_EQ(0u, | |
743 my_downloaded_file.value().find(my_docs_folder.value())); | |
744 } | |
745 } | |
720 } | 746 } |
721 } | 747 } |
722 | 748 |
749 // Attempts to download a file to a read-only folder, based on information | |
750 // in |download_info|. | |
751 void DownloadFileToReadonlyFolder(const DownloadInfo& download_info) { | |
752 ASSERT_TRUE(InitialSetup(false)); // Creates temporary download folder. | |
753 | |
754 // Make the test folder unwritable. | |
755 FilePath destination_folder = GetDownloadDirectory(browser()); | |
756 DVLOG(1) << " " << __FUNCTION__ << "()" | |
757 << " folder = '" << destination_folder.value() << "'"; | |
758 file_util::PermissionRestorer permission_restorer(destination_folder); | |
759 EXPECT_TRUE(file_util::MakeFileUnwritable(destination_folder)); | |
760 | |
761 DownloadFileCheckErrors(download_info); | |
762 } | |
763 | |
723 private: | 764 private: |
724 // Location of the test data. | 765 // Location of the test data. |
725 FilePath test_dir_; | 766 FilePath test_dir_; |
726 | 767 |
727 // Location of the downloads directory for these tests | 768 // Location of the downloads directory for these tests |
728 ScopedTempDir downloads_directory_; | 769 ScopedTempDir downloads_directory_; |
729 }; | 770 }; |
730 | 771 |
731 // NOTES: | 772 // NOTES: |
732 // | 773 // |
(...skipping 1272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2005 ASSERT_EQ(2u, download_items.size()); | 2046 ASSERT_EQ(2u, download_items.size()); |
2006 ASSERT_EQ(jpeg_url, download_items[0]->GetOriginalUrl()); | 2047 ASSERT_EQ(jpeg_url, download_items[0]->GetOriginalUrl()); |
2007 ASSERT_EQ(jpeg_url, download_items[1]->GetOriginalUrl()); | 2048 ASSERT_EQ(jpeg_url, download_items[1]->GetOriginalUrl()); |
2008 } | 2049 } |
2009 | 2050 |
2010 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadNavigate) { | 2051 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadNavigate) { |
2011 DownloadInfo download_info = { | 2052 DownloadInfo download_info = { |
2012 "a_zip_file.zip", | 2053 "a_zip_file.zip", |
2013 DOWNLOAD_NAVIGATE, | 2054 DOWNLOAD_NAVIGATE, |
2014 content::DOWNLOAD_INTERRUPT_REASON_NONE, | 2055 content::DOWNLOAD_INTERRUPT_REASON_NONE, |
2015 true | 2056 true, |
2057 false | |
2016 }; | 2058 }; |
2017 | 2059 |
2018 // Do initial setup. | 2060 // Do initial setup. |
2019 ASSERT_TRUE(InitialSetup(false)); | 2061 ASSERT_TRUE(InitialSetup(false)); |
2020 DownloadFileCheckErrors(download_info); | 2062 DownloadFileCheckErrors(download_info); |
2021 } | 2063 } |
2022 | 2064 |
2023 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadDirect) { | 2065 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadDirect) { |
2024 DownloadInfo download_info = { | 2066 DownloadInfo download_info = { |
2025 "a_zip_file.zip", | 2067 "a_zip_file.zip", |
2026 DOWNLOAD_DIRECT, | 2068 DOWNLOAD_DIRECT, |
2027 content::DOWNLOAD_INTERRUPT_REASON_NONE, | 2069 content::DOWNLOAD_INTERRUPT_REASON_NONE, |
2028 true | 2070 true, |
2071 false | |
2029 }; | 2072 }; |
2030 | 2073 |
2031 // Do initial setup. | 2074 // Do initial setup. |
2032 ASSERT_TRUE(InitialSetup(false)); | 2075 ASSERT_TRUE(InitialSetup(false)); |
2033 DownloadFileCheckErrors(download_info); | 2076 DownloadFileCheckErrors(download_info); |
2034 } | 2077 } |
2035 | 2078 |
2036 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadError404Direct) { | 2079 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadError404Direct) { |
2037 DownloadInfo download_info = { | 2080 DownloadInfo download_info = { |
2038 "there_IS_no_spoon.zip", | 2081 "there_IS_no_spoon.zip", |
2039 DOWNLOAD_DIRECT, | 2082 DOWNLOAD_DIRECT, |
2040 content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, | 2083 content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, |
2041 true | 2084 true, |
2085 false | |
2042 }; | 2086 }; |
2043 | 2087 |
2044 // Do initial setup. | 2088 // Do initial setup. |
2045 ASSERT_TRUE(InitialSetup(false)); | 2089 ASSERT_TRUE(InitialSetup(false)); |
2046 DownloadFileCheckErrors(download_info); | 2090 DownloadFileCheckErrors(download_info); |
2047 } | 2091 } |
2048 | 2092 |
2049 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadError404Navigate) { | 2093 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadError404Navigate) { |
2050 DownloadInfo download_info = { | 2094 DownloadInfo download_info = { |
2051 "there_IS_no_spoon.zip", | 2095 "there_IS_no_spoon.zip", |
2052 DOWNLOAD_NAVIGATE, | 2096 DOWNLOAD_NAVIGATE, |
2053 content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, | 2097 content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, |
2098 false, | |
2054 false | 2099 false |
2055 }; | 2100 }; |
2056 | 2101 |
2057 // Do initial setup. | 2102 // Do initial setup. |
2058 ASSERT_TRUE(InitialSetup(false)); | 2103 ASSERT_TRUE(InitialSetup(false)); |
2059 DownloadFileCheckErrors(download_info); | 2104 DownloadFileCheckErrors(download_info); |
2060 } | 2105 } |
2061 | 2106 |
2062 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadError400Direct) { | 2107 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadError400Direct) { |
2063 DownloadInfo download_info = { | 2108 DownloadInfo download_info = { |
2064 "zip_file_not_found.zip", | 2109 "zip_file_not_found.zip", |
2065 DOWNLOAD_DIRECT, | 2110 DOWNLOAD_DIRECT, |
2066 content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, | 2111 content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, |
2067 true | 2112 true, |
2113 false | |
2068 }; | 2114 }; |
2069 | 2115 |
2070 // Do initial setup. | 2116 // Do initial setup. |
2071 ASSERT_TRUE(InitialSetup(false)); | 2117 ASSERT_TRUE(InitialSetup(false)); |
2072 DownloadFileCheckErrors(download_info); | 2118 DownloadFileCheckErrors(download_info); |
2073 } | 2119 } |
2074 | 2120 |
2075 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadError400Navigate) { | 2121 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadError400Navigate) { |
2076 DownloadInfo download_info = { | 2122 DownloadInfo download_info = { |
2077 "zip_file_not_found.zip", | 2123 "zip_file_not_found.zip", |
2078 DOWNLOAD_NAVIGATE, | 2124 DOWNLOAD_NAVIGATE, |
2079 content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, | 2125 content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, |
2126 false, | |
2080 false | 2127 false |
2081 }; | 2128 }; |
2082 | 2129 |
2083 // Do initial setup. | 2130 // Do initial setup. |
2084 ASSERT_TRUE(InitialSetup(false)); | 2131 ASSERT_TRUE(InitialSetup(false)); |
2085 DownloadFileCheckErrors(download_info); | 2132 DownloadFileCheckErrors(download_info); |
2086 } | 2133 } |
2134 | |
2135 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorReadonlyFolderDirect) { | |
2136 DownloadInfo download_info = { | |
2137 "a_zip_file.zip", | |
2138 DOWNLOAD_DIRECT, | |
2139 // This passes because we switch to the My Documents folder. | |
2140 content::DOWNLOAD_INTERRUPT_REASON_NONE, | |
2141 true, | |
2142 true | |
2143 }; | |
2144 | |
2145 DownloadFileToReadonlyFolder(download_info); | |
2146 } | |
2147 | |
2148 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorReadonlyFolderNavigate) { | |
2149 DownloadInfo download_info = { | |
2150 "a_zip_file.zip", | |
2151 DOWNLOAD_NAVIGATE, | |
2152 // This passes because we switch to the My Documents folder. | |
2153 content::DOWNLOAD_INTERRUPT_REASON_NONE, | |
2154 true, | |
2155 true | |
2156 }; | |
2157 | |
2158 DownloadFileToReadonlyFolder(download_info); | |
2159 } | |
OLD | NEW |