15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct IsSearchProviderTestData {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IsSearchProviderTestData() : tab(NULL) {}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IsSearchProviderTestData(content::WebContents* t, std::string h, GURL url)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : tab(t), host(h), test_url(url) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WebContents* tab;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string host;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL test_url;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SearchProviderTest : public InProcessBrowserTest {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SearchProviderTest() {}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(test_server()->Start());
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Map all hosts to our local server.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string host_rule(
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "MAP * " + test_server()->host_port_pair().ToString());
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitchASCII(switches::kHostRules, host_rule);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Use no proxy or otherwise this test will fail on a machine that has a
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // proxy configured.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kNoProxyServer);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Get the url for the test page.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    search_provider_test_url_ =
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server()->GetURL("files/is_search_provider_installed.html");
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IsSearchProviderTestData StartIsSearchProviderInstalledTest(
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser* browser,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const char* host,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const char* expected_result) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL test_url(std::string("http://") + host +
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        search_provider_test_url_.path() + "#" + expected_result);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURLWithDisposition(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        browser, test_url, NEW_FOREGROUND_TAB,
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Bundle up information needed to verify the result.
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::WebContents* tab =
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser->tab_strip_model()->GetActiveWebContents();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return IsSearchProviderTestData(tab, host, test_url);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FinishIsSearchProviderInstalledTest(
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const IsSearchProviderTestData& data) {
71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 title = data.tab->GetTitle();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (title.empty()) {
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::TitleWatcher title_watcher(data.tab, base::ASCIIToUTF16("OK"));
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("FAIL"));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      title = title_watcher.WaitAndGetTitle();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::ASCIIToUTF16("OK"), title);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL search_provider_test_url_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SearchProviderTest);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if 1
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Disabled - http://crbug.com/359727 (js has syntax errors which v8 hates)
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define MAYBE_TestIsSearchProviderInstalled \
89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    DISABLED_TestIsSearchProviderInstalled
90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#elif defined(OS_WIN)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is flaking on XP. See http://crbug.com/159530
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestIsSearchProviderInstalled \
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISABLED_TestIsSearchProviderInstalled
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TestIsSearchProviderInstalled TestIsSearchProviderInstalled
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SearchProviderTest,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       MAYBE_TestIsSearchProviderInstalled) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use the default search provider, other installed search provider, and
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // one not installed as well. (Note that yahoo isn't tested because the
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // its host name varies a lot for different locales unlike Google and Bing,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which would make the test fail depending on the machine's locale.)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* test_hosts[] = { "www.google.com",
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               "www.bing.com",
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               "localhost" };
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* expected_results[] = { "2",
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "1",
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "0" };
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPILE_ASSERT(arraysize(test_hosts) == arraysize(expected_results),
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 there_should_be_a_result_for_each_host);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IsSearchProviderTestData test_data[2 * arraysize(test_hosts)];
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start results for the normal mode.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(test_hosts); ++i) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_data[i] = StartIsSearchProviderInstalledTest(
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        browser(), test_hosts[i], expected_results[i]);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FinishIsSearchProviderInstalledTest(test_data[i]);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start tests for incognito mode (and verify the result is 0).
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* incognito_browser = CreateIncognitoBrowser();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(test_hosts); ++i) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_data[i + arraysize(test_hosts)] = StartIsSearchProviderInstalledTest(
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        incognito_browser, test_hosts[i], "0");
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FinishIsSearchProviderInstalledTest(test_data[i + arraysize(test_hosts)]);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following should be re-enabled. At the moment, there are problems with
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // doing all of these queries in parallel -- see http://crbug.com/60043.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove the calls to FinishIsSearchProviderInstalledTest above when
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // re-enabling this code.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do the verification.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(test_data); ++i) {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FinishIsSearchProviderInstalledTest(test_data[i]);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SearchProviderTest,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       TestIsSearchProviderInstalledWithException) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change the url for the test page to one that throws an exception when
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // toString is called on the argument given to isSearchProviderInstalled.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  search_provider_test_url_ = test_server()->GetURL(
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/is_search_provider_installed_with_exception.html");
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FinishIsSearchProviderInstalledTest(StartIsSearchProviderInstalledTest(
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser(), "www.google.com", ""));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
151