| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/command_line.h" |
| #include "base/prefs/pref_service.h" |
| #include "base/strings/string_util.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| #include "chrome/common/chrome_switches.h" |
| #include "chrome/test/base/in_process_browser_test.h" |
| #include "chrome/test/base/ui_test_utils.h" |
| #include "components/google/core/browser/google_switches.h" |
| #include "components/search_engines/search_engines_pref_names.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/common/url_constants.h" |
| #include "content/public/test/browser_test_utils.h" |
| #include "net/test/spawned_test_server/spawned_test_server.h" |
| |
| namespace { |
| |
| struct IsSearchProviderTestData { |
| IsSearchProviderTestData() : tab(NULL) {} |
| IsSearchProviderTestData(content::WebContents* t, std::string h, GURL url) |
| : tab(t), host(h), test_url(url) { |
| } |
| |
| content::WebContents* tab; |
| std::string host; |
| GURL test_url; |
| }; |
| |
| } // namespace |
| |
| class SearchProviderTest : public InProcessBrowserTest { |
| protected: |
| SearchProviderTest() {} |
| |
| void SetUpCommandLine(base::CommandLine* command_line) override { |
| ASSERT_TRUE(test_server()->Start()); |
| |
| // Map all hosts to our local server. |
| std::string host_rule( |
| "MAP * " + test_server()->host_port_pair().ToString()); |
| command_line->AppendSwitchASCII(switches::kHostRules, host_rule); |
| // Use no proxy or otherwise this test will fail on a machine that has a |
| // proxy configured. |
| command_line->AppendSwitch(switches::kNoProxyServer); |
| |
| // Always point google search to a known, non-secure URL. Normally, this |
| // varies based on locale and is a HTTPS host. |
| command_line->AppendSwitchASCII( |
| switches::kGoogleBaseURL, "http://www.google.com"); |
| |
| // Get the url for the test page. |
| search_provider_test_url_ = |
| test_server()->GetURL("files/is_search_provider_installed.html"); |
| } |
| |
| void SetUpOnMainThread() override { |
| // Force the country to Canada, which has an installed search provider |
| // that's HTTP. |
| browser()->profile()->GetPrefs()->SetInteger( |
| prefs::kCountryIDAtInstall, ('C' << 8) | 'A'); |
| } |
| |
| IsSearchProviderTestData StartIsSearchProviderInstalledTest( |
| Browser* browser, |
| const char* host, |
| const char* expected_result) { |
| GURL test_url(std::string("http://") + host + |
| search_provider_test_url_.path() + "#" + expected_result); |
| ui_test_utils::NavigateToURLWithDisposition( |
| browser, test_url, NEW_FOREGROUND_TAB, |
| ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| |
| // Bundle up information needed to verify the result. |
| content::WebContents* tab = |
| browser->tab_strip_model()->GetActiveWebContents(); |
| return IsSearchProviderTestData(tab, host, test_url); |
| } |
| |
| void FinishIsSearchProviderInstalledTest( |
| const IsSearchProviderTestData& data) { |
| base::string16 title = data.tab->GetTitle(); |
| if (title.empty()) { |
| content::TitleWatcher title_watcher(data.tab, base::ASCIIToUTF16("OK")); |
| title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("FAIL")); |
| title = title_watcher.WaitAndGetTitle(); |
| } |
| EXPECT_EQ(base::ASCIIToUTF16("OK"), title); |
| } |
| |
| GURL search_provider_test_url_; |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(SearchProviderTest); |
| }; |
| |
| #if defined(OS_WIN) |
| // This is flaking on XP. See http://crbug.com/159530 |
| #define MAYBE_TestIsSearchProviderInstalled \ |
| DISABLED_TestIsSearchProviderInstalled |
| #else |
| #define MAYBE_TestIsSearchProviderInstalled TestIsSearchProviderInstalled |
| #endif |
| IN_PROC_BROWSER_TEST_F(SearchProviderTest, |
| MAYBE_TestIsSearchProviderInstalled) { |
| // Use the default search provider, other installed search provider, and |
| // one not installed as well. Note, Ask is used here because it's a HTTP host. |
| const char* test_hosts[] = { "www.google.com", |
| "www.ask.com", |
| "localhost" }; |
| const char* expected_results[] = { "2", |
| "1", |
| "0" }; |
| static_assert(arraysize(test_hosts) == arraysize(expected_results), |
| "each host should have a test result"); |
| IsSearchProviderTestData test_data[2 * arraysize(test_hosts)]; |
| |
| // Start results for the normal mode. |
| for (size_t i = 0; i < arraysize(test_hosts); ++i) { |
| test_data[i] = StartIsSearchProviderInstalledTest( |
| browser(), test_hosts[i], expected_results[i]); |
| FinishIsSearchProviderInstalledTest(test_data[i]); |
| } |
| |
| // Start tests for incognito mode (and verify the result is 0). |
| Browser* incognito_browser = CreateIncognitoBrowser(); |
| for (size_t i = 0; i < arraysize(test_hosts); ++i) { |
| test_data[i + arraysize(test_hosts)] = StartIsSearchProviderInstalledTest( |
| incognito_browser, test_hosts[i], "0"); |
| FinishIsSearchProviderInstalledTest(test_data[i + arraysize(test_hosts)]); |
| } |
| |
| // The following should be re-enabled. At the moment, there are problems with |
| // doing all of these queries in parallel -- see http://crbug.com/60043. |
| #if 0 |
| // Remove the calls to FinishIsSearchProviderInstalledTest above when |
| // re-enabling this code. |
| |
| // Do the verification. |
| for (size_t i = 0; i < arraysize(test_data); ++i) { |
| FinishIsSearchProviderInstalledTest(test_data[i]); |
| } |
| #endif |
| } |
| |
| IN_PROC_BROWSER_TEST_F(SearchProviderTest, |
| TestIsSearchProviderInstalledWithException) { |
| // Change the url for the test page to one that throws an exception when |
| // toString is called on the argument given to isSearchProviderInstalled. |
| search_provider_test_url_ = test_server()->GetURL( |
| "files/is_search_provider_installed_with_exception.html"); |
| |
| FinishIsSearchProviderInstalledTest(StartIsSearchProviderInstalledTest( |
| browser(), "www.google.com", "")); |
| } |