15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2011 The Chromium Authors. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import re
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import pyauto_functional  # Must be imported before pyauto
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import pyauto
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import test_utils
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SearchEnginesTest(pyauto.PyUITest):
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """TestCase for Search Engines."""
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _localhost_prefix = 'http://localhost:1000/'
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _GetSearchEngineWithKeyword(self, keyword):
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Get search engine info and return an element that matches keyword.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keyword: Search engine keyword field.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Returns:
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      A search engine info dict or None.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    match_list = ([x for x in self.GetSearchEngineInfo()
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   if x['keyword'] == keyword])
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if match_list:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return match_list[0]
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return None
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Debug(self):
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Test method for experimentation.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    This method will not run automatically.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while True:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      raw_input('Interact with the browser and hit <enter>')
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.pprint(self.GetSearchEngineInfo())
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testDiscoverSearchEngine(self):
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Test that chrome discovers youtube search engine after searching."""
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Take a snapshot of current search engine info.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info = self.GetSearchEngineInfo()
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    youtube = self._GetSearchEngineWithKeyword('youtube.com')
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(youtube)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Use omnibox to invoke search engine discovery.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Navigating using NavigateToURL does not currently invoke this logic.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.SetOmniboxText('http://www.youtube.com')
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.OmniboxAcceptInput()
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def InfoUpdated(old_info):
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_info = self.GetSearchEngineInfo()
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if len(new_info) > len(old_info):
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return True
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return False
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WaitUntil(lambda: InfoUpdated(info))
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    youtube = self._GetSearchEngineWithKeyword('youtube.com')
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(youtube)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(re.search('youtube', youtube['short_name'],
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              re.IGNORECASE))
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(youtube['in_default_list'])
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(youtube['is_default'])
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testDeleteSearchEngine(self):
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Test adding then deleting a search engine."""
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.AddSearchEngine(title='foo',
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         keyword='foo.com',
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         url='http://foo/?q=%s')
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foo = self._GetSearchEngineWithKeyword('foo.com')
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(foo)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.DeleteSearchEngine('foo.com')
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foo = self._GetSearchEngineWithKeyword('foo.com')
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(foo)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMakeSearchEngineDefault(self):
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Test adding then making a search engine default."""
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.AddSearchEngine(
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        title='foo',
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keyword='foo.com',
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        url=self._localhost_prefix + '?q=%s')
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foo = self._GetSearchEngineWithKeyword('foo.com')
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(foo)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(foo['is_default'])
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.MakeSearchEngineDefault('foo.com')
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foo = self._GetSearchEngineWithKeyword('foo.com')
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(foo)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(foo['is_default'])
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.SetOmniboxText('foobar')
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.OmniboxAcceptInput()
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(self._localhost_prefix + '?q=foobar',
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     self.GetActiveTabURL().spec())
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testDefaultSearchEngines(self):
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Test that we have 3 default search options."""
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info = self.GetSearchEngineInfo()
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(len(info), 3)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Verify that each can be used as the default search provider.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_providers = ['google.com', 'yahoo.com', 'bing.com']
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for keyword in default_providers:
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.MakeSearchEngineDefault(keyword)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      search_engine = self._GetSearchEngineWithKeyword(keyword)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(search_engine['is_default'])
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.SetOmniboxText('test search')
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.OmniboxAcceptInput()
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(re.search(keyword, self.GetActiveTabURL().spec()))
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pyauto_functional.Main()
111