Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(278)

Side by Side Diff: chrome/browser/download/download_browsertest.cc

Issue 9355050: Added read-only file error test. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merged with parent. Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/test/test_file_util_win.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « base/test/test_file_util_win.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698