Home | History | Annotate | Download | only in functional
      1 #!/usr/bin/env python
      2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 
      6 import re
      7 
      8 import pyauto_functional
      9 import pyauto
     10 
     11 
     12 class MultiprofileTest(pyauto.PyUITest):
     13   """Tests for Multi-Profile / Multi-users"""
     14 
     15   _RESTORE_STARTUP_URL_VALUE = 4
     16   _RESTORE_LASTOPEN_URL_VALUE = 1
     17   _RESTORE_DEFAULT_URL_VALUE = 0
     18 
     19   def Debug(self):
     20     """Test method for experimentation.
     21 
     22     This method will not run automatically.
     23     """
     24     while True:
     25       raw_input('Hit <enter> to dump info.. ')
     26       self.pprint(self.GetMultiProfileInfo())
     27 
     28   def _GetSearchEngineWithKeyword(self, keyword, windex=0):
     29     """Get search engine info and return an element that matches keyword.
     30 
     31     Args:
     32       keyword: Search engine keyword field.
     33       windex: The window index, default is 0.
     34 
     35     Returns:
     36       A search engine info dict or None.
     37     """
     38     match_list = ([x for x in self.GetSearchEngineInfo(windex=windex)
     39                    if x['keyword'] == keyword])
     40     if match_list:
     41       return match_list[0]
     42     return None
     43 
     44   def _SetPreferences(self, dict, windex=0):
     45     """Sets preferences settings.
     46 
     47     Args:
     48       _dict: Dictionary of key preferences and its value to be set.
     49       windex: The window index, defaults to 0 (the first window).
     50     """
     51     for key in dict.iterkeys():
     52       self.SetPrefs(key, dict[key], windex=windex)
     53 
     54   def _SetStartUpPage(self, url, windex=0):
     55     """Set start up page.
     56 
     57     Args:
     58       url: URL of the page to be set as start up page.
     59       windex: The window index, default is 0.
     60     """
     61     _dict = {pyauto.kURLsToRestoreOnStartup: [url],
     62              pyauto.kRestoreOnStartup: self._RESTORE_STARTUP_URL_VALUE}
     63     self._SetPreferences(_dict, windex=windex)
     64     prefs_info = self.GetPrefsInfo(windex=windex).Prefs(
     65         pyauto.kURLsToRestoreOnStartup)
     66     self.assertTrue(url in prefs_info)
     67 
     68   def _SetHomePage(self, url, windex=0):
     69     """Create new profile and set home page.
     70 
     71     Args:
     72       url: URL of the page to be set as home page
     73       windex: The window index, default is 0.
     74     """
     75     _dict = {pyauto.kHomePage: url,
     76              pyauto.kHomePageIsNewTabPage: False, pyauto.kShowHomeButton: True,
     77              pyauto.kRestoreOnStartup: self._RESTORE_DEFAULT_URL_VALUE}
     78     self._SetPreferences(_dict, windex=windex)
     79     self.assertTrue(url in
     80                     self.GetPrefsInfo(windex=windex).Prefs(pyauto.kHomePage))
     81 
     82   def _SetSessionRestoreURLs(self, set_restore, windex=0):
     83     """Create new profile and set home page.
     84 
     85     Args:
     86       set_restore: Value of action of start up.
     87       windex: The window index, default is 0.
     88     """
     89     self.NavigateToURL('http://www.google.com/', windex)
     90     self.AppendTab(pyauto.GURL('http://news.google.com/'), windex)
     91     num_tabs = self.GetTabCount(windex)
     92     dict = {pyauto.kRestoreOnStartup: set_restore}
     93     self._SetPreferences(dict, windex=windex)
     94 
     95   def _AddSearchEngine(self, title, keyword, url, windex=0):
     96     """Add search engine.
     97 
     98     Args:
     99       title: Name for search engine.
    100       keyword: Keyword, used to initiate a custom search from omnibox.
    101       url: URL template for this search engine's query.
    102       windex: The window index, default is 0.
    103     """
    104     self.AddSearchEngine(title, keyword, url, windex=windex)
    105     name = self._GetSearchEngineWithKeyword(keyword, windex=windex)
    106     self.assertTrue(name)
    107 
    108   def _AssertStartUpPage(self, url, profile='Default'):
    109     """Asserts start up page for given profile.
    110 
    111     Args:
    112       url: URL of the page to be set as start up page
    113       profile: The profile name, defaults to 'Default'.
    114     """
    115     self.AppendBrowserLaunchSwitch('--profile-directory=' + profile)
    116     self.RestartBrowser(clear_profile=False)
    117     info = self.GetBrowserInfo()
    118     self.assertEqual(url, info['windows'][0]['tabs'][0]['url'].rstrip('/'))
    119     self.assertTrue(url in
    120                     self.GetPrefsInfo().Prefs(pyauto.kURLsToRestoreOnStartup))
    121 
    122   def _AssertHomePage(self, url, profile='Default'):
    123     """Asserts home page for given profile.
    124 
    125     Args:
    126       url: URL of the page to be set as home page
    127       profile: The profile name, defaults to 'Dafault'.
    128     """
    129     self.AppendBrowserLaunchSwitch('--profile-directory=' + profile)
    130     self.RestartBrowser(clear_profile=False)
    131     self.assertTrue(url in self.GetPrefsInfo().Prefs(pyauto.kHomePage))
    132 
    133   def _AssertDefaultSearchEngine(self, search_engine, profile='Default'):
    134     """Asserts default search engine for given profile.
    135 
    136     Args:
    137       search_engine: Name of default search engine.
    138       profile: The profile name, defaults to 'Default'.
    139     """
    140     self.AppendBrowserLaunchSwitch('--profile-directory=' + profile)
    141     self.RestartBrowser(clear_profile=False)
    142     name = self._GetSearchEngineWithKeyword(search_engine)
    143     self.assertTrue(name['is_default'])
    144     self.SetOmniboxText('test search')
    145     self.OmniboxAcceptInput()
    146     self.assertTrue(re.search(search_engine, self.GetActiveTabURL().spec()))
    147 
    148   def _AssertSessionRestore(self, url_list, set_restore, num_tabs=1,
    149                             profile='Default'):
    150     """Asserts urls when session is set to restored or set default.
    151 
    152     Args:
    153       url_list: List of URL to be restored.
    154       set_restore: Value of action of start up.
    155       num_tabs: Number of tabs to be restored, default is 1.
    156       profile: The profile name, defaults to 'Default'.
    157     """
    158     self.AppendBrowserLaunchSwitch('--profile-directory=' + profile)
    159     self.RestartBrowser(clear_profile=False)
    160     self.assertEqual(num_tabs, self.GetTabCount())
    161     self.assertEqual(self.GetPrefsInfo().Prefs(pyauto.kRestoreOnStartup),
    162                      set_restore)
    163     tab_index = 0
    164     while (tab_index < num_tabs):
    165       self.ActivateTab(tab_index)
    166       self.assertEqual(url_list[tab_index], self.GetActiveTabURL().spec())
    167       tab_index += 1
    168 
    169   def testBasic(self):
    170     """Multi-profile windows can open."""
    171     self.assertEqual(1, self.GetBrowserWindowCount())
    172     self.assertTrue(self.GetMultiProfileInfo()['enabled'],
    173         msg='Multi-profile is not enabled')
    174     self.OpenNewBrowserWindowWithNewProfile()
    175     # Verify multi-profile info.
    176     multi_profile = self.GetMultiProfileInfo()
    177     self.assertEqual(2, len(multi_profile['profiles']))
    178     new_profile = multi_profile['profiles'][1]
    179     self.assertTrue(new_profile['name'])
    180 
    181     # Verify browser windows.
    182     self.assertEqual(2, self.GetBrowserWindowCount(),
    183         msg='New browser window did not open')
    184     info = self.GetBrowserInfo()
    185     new_profile_window = info['windows'][1]
    186     self.assertEqual('Profile 1', new_profile_window['profile_path'])
    187     self.assertEqual(1, len(new_profile_window['tabs']))
    188     self.assertEqual('chrome://newtab/', new_profile_window['tabs'][0]['url'])
    189 
    190   def test20NewProfiles(self):
    191     """Verify we can create 20 new profiles."""
    192     for index in range(1, 21):
    193       self.OpenNewBrowserWindowWithNewProfile()
    194       multi_profile = self.GetMultiProfileInfo()
    195       self.assertEqual(index + 1, len(multi_profile['profiles']),
    196           msg='Expected %d profiles after adding %d new users. Got %d' % (
    197               index + 1, index, len(multi_profile['profiles'])))
    198 
    199   def testStartUpPageOptionInMultiProfile(self):
    200     """Test startup page for Multi-profile windows."""
    201     self.assertTrue(self.GetMultiProfileInfo()['enabled'],
    202                     msg='Multi-profile is not enabled')
    203     # Launch browser with new Profile 1, set startup page to 'www.google.com'.
    204     self.OpenNewBrowserWindowWithNewProfile()
    205     self._SetStartUpPage('http://www.google.com', windex=1)
    206     # Launch browser with new Profile 2, set startup page to 'www.yahoo.com'.
    207     self.OpenNewBrowserWindowWithNewProfile()
    208     # Verify start up page for Profile 2 is still newtab page.
    209     info = self.GetBrowserInfo()
    210     self.assertEqual('chrome://newtab/', info['windows'][2]['tabs'][0]['url'])
    211     self._SetStartUpPage('http://www.yahoo.com', windex=2)
    212     # Exit Profile 1 / Profile 2
    213     self.CloseBrowserWindow(2)
    214     self.CloseBrowserWindow(1)
    215     # Relaunch Browser with Profile 2, verify startup page.
    216     self._AssertStartUpPage('http://www.yahoo.com', profile='Profile 2')
    217     # Relaunch Browser with Profile 1, verify startup page.
    218     self._AssertStartUpPage('http://www.google.com', profile='Profile 1')
    219 
    220   def testHomePageOptionMultiProfile(self):
    221     """Test Home page for Multi-profile windows."""
    222     self.assertTrue(self.GetMultiProfileInfo()['enabled'],
    223                     msg='Multi-profile is not enabled')
    224     # Launch browser with new Profile 1, set homepage to 'www.google.com'.
    225     self.OpenNewBrowserWindowWithNewProfile()
    226     self._SetHomePage('http://www.google.com', windex=1)
    227     # Launch browser with new Profile 2, set homepage to 'www.yahoo.com'.
    228     self.OpenNewBrowserWindowWithNewProfile()
    229     self._SetHomePage('http://www.yahoo.com', windex=2)
    230     # Exit Profile 1 / Profile 2
    231     self.CloseBrowserWindow(2)
    232     self.CloseBrowserWindow(1)
    233     # Relaunch Browser with Profile 2, verify startup page.
    234     self._AssertHomePage('http://www.yahoo.com', profile='Profile 2')
    235     # Relaunch Browser with Profile 1, verify startup page.
    236     self._AssertHomePage('http://www.google.com', profile='Profile 1')
    237 
    238   def testSessionRestoreInMultiProfile(self):
    239     """Test session restore preference for Multi-profile windows."""
    240     self.assertTrue(self.GetMultiProfileInfo()['enabled'],
    241                     msg='Multi-profile is not enabled')
    242     # Launch browser with new Profile 1, set pref to restore session on
    243     # startup.
    244     self.OpenNewBrowserWindowWithNewProfile()
    245     self._SetSessionRestoreURLs(self._RESTORE_LASTOPEN_URL_VALUE, windex=1)
    246     # Launch browser with new Profile 2, do not set session restore pref.
    247     self.OpenNewBrowserWindowWithNewProfile()
    248     self._SetSessionRestoreURLs(self._RESTORE_DEFAULT_URL_VALUE, windex=2)
    249     # Exit Profile 1 / Profile 2
    250     self.CloseBrowserWindow(2)
    251     self.CloseBrowserWindow(1)
    252     # Relaunch Browser with Profile 1, verify session restores on startup.
    253     url_list = ['http://www.google.com/', 'http://news.google.com/']
    254     self._AssertSessionRestore(url_list, self._RESTORE_LASTOPEN_URL_VALUE,
    255                                num_tabs=2, profile='Profile 1')
    256     # Relaunch Browser with Profile 2, verify session does not get restored.
    257     url_list = ['chrome://newtab/']
    258     self._AssertSessionRestore(url_list, self._RESTORE_DEFAULT_URL_VALUE,
    259                                num_tabs=1, profile='Profile 2')
    260 
    261   def testMakeSearchEngineDefaultInMultiprofile(self):
    262     """Test adding and making a search engine default for Multi-profiles."""
    263     self.assertTrue(self.GetMultiProfileInfo()['enabled'],
    264                     msg='Multi-profile is not enabled')
    265     # Launch browser with new Profile 1, add search engine to 'Hulu'.
    266     self.OpenNewBrowserWindowWithNewProfile()
    267     self._AddSearchEngine('Hulu', 'hulu.com',
    268         'http://www.hulu.com/search?query=%s&ref=os&src={referrer:source?}', 1)
    269     self.MakeSearchEngineDefault('hulu.com', windex=1)
    270     # Launch browser with new Profile 2, add search engine to 'Youtube'.
    271     self.OpenNewBrowserWindowWithNewProfile()
    272     self._AddSearchEngine('YouTube Video Search', 'youtube.com',
    273         'http://www.youtube.com/results?search_query=%s&page={startPage?}'+
    274         '&utm_source=opensearch', 2)
    275     self.MakeSearchEngineDefault('youtube.com', windex=2)
    276     # Exit Profile 1 / Profile 2
    277     self.CloseBrowserWindow(2)
    278     self.CloseBrowserWindow(1)
    279     # Relaunch Browser with Profile 1, verify default search engine as 'Hulu'.
    280     self._AssertDefaultSearchEngine('hulu.com', profile='Profile 1')
    281     # Relaunch Browser with Profile 2, verify default search engine as
    282     # 'Youtube'.
    283     self._AssertDefaultSearchEngine('youtube.com', profile='Profile 2')
    284 
    285   def testDeleteSearchEngineInMultiprofile(self):
    286     """Test adding then deleting a search engine for Multi-profiles."""
    287     self.assertTrue(self.GetMultiProfileInfo()['enabled'],
    288                     msg='Multi-profile is not enabled')
    289     # Launch browser with new Profile 1, add 'foo.com' as new search engine.
    290     self.OpenNewBrowserWindowWithNewProfile()
    291     self._AddSearchEngine('foo', 'foo.com', 'http://foo/?q=%s', windex=1)
    292     # Launch browser with new Profile 2, add 'foo.com' as new search engine.
    293     self.OpenNewBrowserWindowWithNewProfile()
    294     self._AddSearchEngine('foo', 'foo.com', 'http://foo/?q=%s', windex=2)
    295     # Delete search engine 'foo.com' from Profile 1 and exit.
    296     self.DeleteSearchEngine('foo.com', windex=1)
    297     self.CloseBrowserWindow(2)
    298     self.CloseBrowserWindow(1)
    299     # Relaunch Browser with Profile 1, verify search engine 'foo.com'
    300     # is deleted.
    301     self.AppendBrowserLaunchSwitch('--profile-directory=Profile 1')
    302     self.RestartBrowser(clear_profile=False)
    303     foo = self._GetSearchEngineWithKeyword('foo.com')
    304     self.assertFalse(foo)
    305     # Relaunch Browser with Profile 2, verify search engine 'foo.com'
    306     # is not deleted.
    307     self.AppendBrowserLaunchSwitch('--profile-directory=Profile 2')
    308     self.RestartBrowser(clear_profile=False)
    309     foo = self._GetSearchEngineWithKeyword('foo.com')
    310     self.assertTrue(foo)
    311 
    312 
    313 if __name__ == '__main__':
    314   pyauto_functional.Main()
    315