Index: chrome/test/functional/ntp.py |
=================================================================== |
--- chrome/test/functional/ntp.py (revision 261231) |
+++ chrome/test/functional/ntp.py (working copy) |
@@ -1,473 +0,0 @@ |
-#!/usr/bin/env python |
-# 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. |
- |
-import copy |
-import os |
- |
-import pyauto_functional # Must be imported before pyauto |
-import pyauto |
-import test_utils |
- |
- |
-class NTPTest(pyauto.PyUITest): |
- """Test of the NTP.""" |
- |
- # Default apps are registered in ProfileImpl::RegisterComponentExtensions(). |
- _EXPECTED_DEFAULT_APPS = [ |
- {u'title': u'Chrome Web Store'}, |
- ] |
- if pyauto.PyUITest.IsChromeOS(): |
- _EXPECTED_DEFAULT_APPS.append({u'title': u'Files'}) |
- _EXPECTED_DEFAULT_APPS.append({u'title': u'Chrome'}) |
- else: |
- _EXPECTED_DEFAULT_APPS.append({u'title': u'Cloud Print'}) |
- |
- # Default menu and thumbnail mode preferences are set in |
- # ShownSectionsHandler::RegisterUserPrefs. |
- if pyauto.PyUITest.IsChromeOS(): |
- _EXPECTED_DEFAULT_THUMB_INFO = { |
- u'apps': True, |
- u'most_visited': False |
- } |
- _EXPECTED_DEFAULT_MENU_INFO = { |
- u'apps': False, |
- u'most_visited': True, |
- u'recently_closed': True |
- } |
- else: |
- _EXPECTED_DEFAULT_THUMB_INFO = { |
- u'apps': False, |
- u'most_visited': True |
- } |
- _EXPECTED_DEFAULT_MENU_INFO = { |
- u'apps': False, |
- u'most_visited': False, |
- u'recently_closed': False |
- } |
- |
- def Debug(self): |
- """Test method for experimentation. |
- |
- This method is not run automatically. |
- """ |
- while True: |
- raw_input('Interact with the browser and hit <enter> to dump NTP info...') |
- print '*' * 20 |
- self.pprint(self._GetNTPInfo()) |
- |
- def __init__(self, methodName='runTest'): |
- super(NTPTest, self).__init__(methodName) |
- |
- # Create some dummy file urls we can use in the tests. |
- filenames = ['title1.html', 'title2.html'] |
- titles = [u'', u'Title Of Awesomeness'] |
- urls = map(lambda name: self.GetFileURLForDataPath(name), filenames) |
- self.PAGES = map(lambda url, title: {'url': url, 'title': title}, |
- urls, titles) |
- |
- def _NTPContainsThumbnail(self, check_thumbnail): |
- """Returns whether the NTP's Most Visited section contains the given |
- thumbnail.""" |
- for thumbnail in self.GetNTPThumbnails(): |
- if check_thumbnail['url'] == thumbnail['url']: |
- return True |
- return False |
- |
- def testFreshProfile(self): |
- """Tests that the NTP with a fresh profile is correct""" |
- thumbnails = self.GetNTPThumbnails() |
- default_sites = self.GetNTPDefaultSites() |
- self.assertEqual(len(default_sites), len(thumbnails)) |
- for thumbnail, default_site in zip(thumbnails, default_sites): |
- self.assertEqual(thumbnail['url'], default_site) |
- self.assertEqual(0, len(self.GetNTPRecentlyClosed())) |
- |
- def testRemoveDefaultThumbnails(self): |
- """Tests that the default thumbnails can be removed""" |
- self.RemoveNTPDefaultThumbnails() |
- self.assertFalse(self.GetNTPThumbnails()) |
- self.RestoreAllNTPThumbnails() |
- self.assertEqual(len(self.GetNTPDefaultSites()), |
- len(self.GetNTPThumbnails())) |
- self.RemoveNTPDefaultThumbnails() |
- self.assertFalse(self.GetNTPThumbnails()) |
- |
- def testOneMostVisitedSite(self): |
- """Tests that a site is added to the most visited sites""" |
- self.RemoveNTPDefaultThumbnails() |
- self.NavigateToURL(self.PAGES[1]['url']) |
- thumbnail = self.GetNTPThumbnails()[0] |
- self.assertEqual(self.PAGES[1]['url'], thumbnail['url']) |
- self.assertEqual(self.PAGES[1]['title'], thumbnail['title']) |
- |
- def testRemoveThumbnail(self): |
- """Tests removing a thumbnail works""" |
- self.RemoveNTPDefaultThumbnails() |
- for page in self.PAGES: |
- self.AppendTab(pyauto.GURL(page['url'])) |
- |
- thumbnails = self.GetNTPThumbnails() |
- for thumbnail in thumbnails: |
- self.assertEquals(thumbnail, self.GetNTPThumbnails()[0]) |
- self.RemoveNTPThumbnail(thumbnail) |
- self.assertFalse(self._NTPContainsThumbnail(thumbnail)) |
- self.assertFalse(self.GetNTPThumbnails()) |
- |
- def testIncognitoNotAppearInMostVisited(self): |
- """Tests that visiting a page in incognito mode does cause it to appear in |
- the Most Visited section""" |
- self.RemoveNTPDefaultThumbnails() |
- self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW) |
- self.NavigateToURL(self.PAGES[0]['url'], 1, 0) |
- self.assertFalse(self.GetNTPThumbnails()) |
- |
- def testDifferentProfileNotAppearInMostVisited(self): |
- """Tests that visiting a page in one profile does not cause it to appear in |
- the Most Visited section of another.""" |
- self.RemoveNTPDefaultThumbnails() |
- self.OpenNewBrowserWindowWithNewProfile() |
- self.NavigateToURL(self.PAGES[0]['url'], 1, 0) |
- self.assertFalse(self.GetNTPThumbnails()) |
- |
- def testThumbnailPersistence(self): |
- """Tests that thumbnails persist across Chrome restarts""" |
- self.RemoveNTPDefaultThumbnails() |
- for page in self.PAGES: |
- self.AppendTab(pyauto.GURL(page['url'])) |
- thumbnails = self.GetNTPThumbnails() |
- self.RestartBrowser(clear_profile=False) |
- self.assertEqual(thumbnails, self.GetNTPThumbnails()) |
- |
- def testRestoreAllRemovedThumbnails(self): |
- """Tests restoring all removed thumbnails""" |
- for page in self.PAGES: |
- self.AppendTab(pyauto.GURL(page['url'])) |
- |
- thumbnails = self.GetNTPThumbnails() |
- for thumbnail in thumbnails: |
- self.RemoveNTPThumbnail(thumbnail) |
- |
- self.RestoreAllNTPThumbnails() |
- self.assertEquals(thumbnails, self.GetNTPThumbnails()) |
- |
- def testThumbnailRanking(self): |
- """Tests that the thumbnails are ordered according to visit count""" |
- self.RemoveNTPDefaultThumbnails() |
- for page in self.PAGES: |
- self.AppendTab(pyauto.GURL(page['url'])) |
- thumbnails = self.GetNTPThumbnails() |
- self.assertEqual(self.PAGES[0]['url'], self.GetNTPThumbnails()[0]['url']) |
- self.AppendTab(pyauto.GURL(self.PAGES[1]['url'])) |
- self.assertEqual(self.PAGES[1]['url'], self.GetNTPThumbnails()[0]['url']) |
- self.AppendTab(pyauto.GURL(self.PAGES[0]['url'])) |
- self.AppendTab(pyauto.GURL(self.PAGES[0]['url'])) |
- self.assertEqual(self.PAGES[0]['url'], self.GetNTPThumbnails()[0]['url']) |
- |
- def testThumbnailTitleChangeAfterPageTitleChange(self): |
- """Tests that once a page title changes, the thumbnail title changes too""" |
- self.RemoveNTPDefaultThumbnails() |
- self.NavigateToURL(self.PAGES[0]['url']) |
- self.assertEqual(self.PAGES[0]['title'], |
- self.GetNTPThumbnails()[0]['title']) |
- self.ExecuteJavascript('window.domAutomationController.send(' + |
- 'document.title = "new title")') |
- self.assertEqual('new title', self.GetNTPThumbnails()[0]['title']) |
- |
- def testCloseOneTab(self): |
- """Tests that closing a tab populates the recently closed list""" |
- self.RemoveNTPDefaultThumbnails() |
- self.AppendTab(pyauto.GURL(self.PAGES[1]['url'])) |
- self.CloseTab(tab_index=1) |
- self.assertEqual(self.PAGES[1]['url'], |
- self.GetNTPRecentlyClosed()[0]['url']) |
- self.assertEqual(self.PAGES[1]['title'], |
- self.GetNTPRecentlyClosed()[0]['title']) |
- |
- def testCloseOneWindow(self): |
- """Tests that closing a window populates the recently closed list""" |
- self.RemoveNTPDefaultThumbnails() |
- self.OpenNewBrowserWindow(True) |
- self.NavigateToURL(self.PAGES[0]['url'], 1, 0) |
- self.AppendTab(pyauto.GURL(self.PAGES[1]['url']), 1) |
- self.CloseBrowserWindow(1) |
- expected = [{ u'type': u'window', |
- u'tabs': [ |
- { u'type': u'tab', |
- u'url': self.PAGES[0]['url'], |
- u'direction': u'ltr' }, |
- { u'type': u'tab', |
- u'url': self.PAGES[1]['url']}] |
- }] |
- self.assertEquals(expected, test_utils.StripUnmatchedKeys( |
- self.GetNTPRecentlyClosed(), expected)) |
- |
- def testCloseMultipleTabs(self): |
- """Tests closing multiple tabs populates the Recently Closed section in |
- order""" |
- self.RemoveNTPDefaultThumbnails() |
- self.AppendTab(pyauto.GURL(self.PAGES[0]['url'])) |
- self.AppendTab(pyauto.GURL(self.PAGES[1]['url'])) |
- self.CloseTab(tab_index=2) |
- self.CloseTab(tab_index=1) |
- expected = [{ u'type': u'tab', |
- u'url': self.PAGES[0]['url'] |
- }, |
- { u'type': u'tab', |
- u'url': self.PAGES[1]['url'] |
- }] |
- self.assertEquals(expected, test_utils.StripUnmatchedKeys( |
- self.GetNTPRecentlyClosed(), expected)) |
- |
- def testCloseWindowWithOneTab(self): |
- """Tests that closing a window with only one tab only shows up as a tab in |
- the Recently Closed section""" |
- self.RemoveNTPDefaultThumbnails() |
- self.OpenNewBrowserWindow(True) |
- self.NavigateToURL(self.PAGES[0]['url'], 1, 0) |
- self.CloseBrowserWindow(1) |
- expected = [{ u'type': u'tab', |
- u'url': self.PAGES[0]['url'] |
- }] |
- self.assertEquals(expected, test_utils.StripUnmatchedKeys( |
- self.GetNTPRecentlyClosed(), expected)) |
- |
- def testCloseMultipleWindows(self): |
- """Tests closing multiple windows populates the Recently Closed list""" |
- self.RemoveNTPDefaultThumbnails() |
- self.OpenNewBrowserWindow(True) |
- self.NavigateToURL(self.PAGES[0]['url'], 1, 0) |
- self.AppendTab(pyauto.GURL(self.PAGES[1]['url']), 1) |
- self.OpenNewBrowserWindow(True) |
- self.NavigateToURL(self.PAGES[1]['url'], 2, 0) |
- self.AppendTab(pyauto.GURL(self.PAGES[0]['url']), 2) |
- self.CloseBrowserWindow(2) |
- self.CloseBrowserWindow(1) |
- expected = [{ u'type': u'window', |
- u'tabs': [ |
- { u'type': u'tab', |
- u'url': self.PAGES[0]['url'], |
- u'direction': u'ltr' }, |
- { u'type': u'tab', |
- u'url': self.PAGES[1]['url']}] |
- }, |
- { u'type': u'window', |
- u'tabs': [ |
- { u'type': u'tab', |
- u'url': self.PAGES[1]['url'], |
- u'direction': u'ltr' }, |
- { u'type': u'tab', |
- u'url': self.PAGES[0]['url']}] |
- }] |
- self.assertEquals(expected, test_utils.StripUnmatchedKeys( |
- self.GetNTPRecentlyClosed(), expected)) |
- |
- def testRecentlyClosedIncognito(self): |
- """Tests that we don't record closure of Incognito tabs or windows""" |
- #self.RemoveNTPDefaultThumbnails() |
- self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW) |
- self.NavigateToURL(self.PAGES[0]['url'], 1, 0) |
- self.AppendTab(pyauto.GURL(self.PAGES[0]['url']), 1) |
- self.AppendTab(pyauto.GURL(self.PAGES[1]['url']), 1) |
- self.CloseTab(windex=1) |
- self.assertFalse(self.GetNTPRecentlyClosed()) |
- self.CloseBrowserWindow(1) |
- self.assertFalse(self.GetNTPRecentlyClosed()) |
- |
- def _VerifyAppInfo(self, actual_info, expected_info): |
- """Ensures that the actual app info contains the expected app info. |
- |
- This method assumes that both the actual and expected information for each |
- app contains at least the 'title' attribute. Both sets of info are |
- considered to match if the actual info contains at least the specified |
- expected info (if the actual info contains additional values that are not |
- specified in the expected info, that's ok). This function will fail the |
- current test if both sets of info don't match. |
- |
- Args: |
- actual_info: A list of dictionaries representing the information from |
- all apps that would currently be displayed on the NTP. |
- expected_info: A corrresponding list of dictionaries representing the |
- information that is expected. |
- """ |
- # Ensure all app info dictionaries contain at least the 'title' attribute. |
- self.assertTrue(all(map(lambda app: 'title' in app, actual_info)) and |
- all(map(lambda app: 'title' in app, expected_info)), |
- msg='At least one app is missing the "title" attribute.') |
- |
- # Sort both app lists by title to ensure they're in a known order. |
- actual_info = sorted(actual_info, key=lambda app: app['title']) |
- expected_info = sorted(expected_info, key=lambda app: app['title']) |
- |
- # Ensure the expected info matches the actual info. |
- self.assertTrue(len(actual_info) == len(expected_info), |
- msg='Expected %d app(s) on NTP, but got %d instead.' % ( |
- len(expected_info), len(actual_info))) |
- for i, expected_app in enumerate(expected_info): |
- for attribute in expected_app: |
- self.assertTrue(attribute in actual_info[i], |
- msg='Expected attribute "%s" not found in app info.' % ( |
- attribute)) |
- self.assertTrue(expected_app[attribute] == actual_info[i][attribute], |
- msg='For attribute "%s", expected value "%s", but got ' |
- '"%s".' % (attribute, expected_app[attribute], |
- actual_info[i][attribute])) |
- |
- def _InstallAndVerifySamplePackagedApp(self): |
- """Installs a sample packaged app and verifies the install is successful. |
- |
- Returns: |
- The string ID of the installed app. |
- """ |
- app_crx_file = os.path.abspath(os.path.join( |
- self.DataDir(), 'pyauto_private', 'apps', 'countdown.crx')) |
- return self.InstallExtension(app_crx_file) |
- |
- def testGetAppsInNewProfile(self): |
- """Ensures that the only app in a new profile is the Web Store app.""" |
- app_info = self.GetNTPApps() |
- self._VerifyAppInfo(app_info, self._EXPECTED_DEFAULT_APPS) |
- |
- def testGetAppsWhenInstallApp(self): |
- """Ensures that an installed app is reflected in the app info in the NTP.""" |
- self._InstallAndVerifySamplePackagedApp() |
- app_info = self.GetNTPApps() |
- expected_app_info = [ |
- { |
- u'title': u'Countdown' |
- } |
- ] |
- expected_app_info.extend(self._EXPECTED_DEFAULT_APPS) |
- self._VerifyAppInfo(app_info, expected_app_info) |
- |
- def testGetAppsWhenInstallNonApps(self): |
- """Ensures installed non-apps are not reflected in the NTP app info.""" |
- # Install a regular extension and a theme. |
- ext_crx_file = os.path.abspath(os.path.join(self.DataDir(), 'extensions', |
- 'page_action.crx')) |
- self.InstallExtension(ext_crx_file) |
- theme_crx_file = os.path.abspath(os.path.join(self.DataDir(), 'extensions', |
- 'theme.crx')) |
- self.SetTheme(theme_crx_file) |
- # Verify that no apps are listed on the NTP except for the Web Store. |
- app_info = self.GetNTPApps() |
- self._VerifyAppInfo(app_info, self._EXPECTED_DEFAULT_APPS) |
- |
- def testUninstallApp(self): |
- """Ensures that an uninstalled app is reflected in the NTP app info.""" |
- # First, install an app and verify that it exists in the NTP app info. |
- installed_app_id = self._InstallAndVerifySamplePackagedApp() |
- app_info = self.GetNTPApps() |
- expected_app_info = [ |
- { |
- u'title': u'Countdown' |
- } |
- ] |
- expected_app_info.extend(self._EXPECTED_DEFAULT_APPS) |
- self._VerifyAppInfo(app_info, expected_app_info) |
- |
- # Next, uninstall the app and verify that it is removed from the NTP. |
- self.assertTrue(self.UninstallExtensionById(installed_app_id), |
- msg='Call to UninstallExtensionById() returned False.') |
- app_info = self.GetNTPApps() |
- self._VerifyAppInfo(app_info, self._EXPECTED_DEFAULT_APPS) |
- |
- def testCannotUninstallWebStore(self): |
- """Ensures that the WebStore app cannot be uninstalled.""" |
- # Verify that the WebStore app is already installed in a fresh profile. |
- app_info = self.GetNTPApps() |
- self._VerifyAppInfo(app_info, self._EXPECTED_DEFAULT_APPS) |
- self.assertTrue(app_info and 'id' in app_info[0], |
- msg='Cannot identify ID of WebStore app.') |
- webstore_id = app_info[0]['id'] |
- |
- # Attempt to uninstall the WebStore app and verify that it still exists |
- # in the App info of the NTP even after we try to uninstall it. |
- self.assertFalse(self.UninstallExtensionById(webstore_id), |
- msg='Call to UninstallExtensionById() returned True.') |
- self._VerifyAppInfo(self.GetNTPApps(), self._EXPECTED_DEFAULT_APPS) |
- |
- def testLaunchAppWithDefaultSettings(self): |
- """Verifies that an app can be launched with the default settings.""" |
- # Install an app. |
- installed_app_id = self._InstallAndVerifySamplePackagedApp() |
- |
- # Launch the app from the NTP. |
- self.LaunchApp(installed_app_id) |
- |
- # Verify that the second tab in the first window is the app launch URL. |
- # It should be the second tab, not the first, since the call to LaunchApp |
- # should have first opened the NTP in a new tab, and then launched the app |
- # from there. |
- info = self.GetBrowserInfo() |
- actual_tab_url = info['windows'][0]['tabs'][1]['url'] |
- expected_app_url_start = 'chrome-extension://' + installed_app_id |
- self.assertTrue(actual_tab_url.startswith(expected_app_url_start), |
- msg='The app was not launched.') |
- |
- def testLaunchAppRegularTab(self): |
- """Verifies that an app can be launched in a regular tab.""" |
- installed_app_id = self._InstallAndVerifySamplePackagedApp() |
- |
- self.SetAppLaunchType(installed_app_id, 'regular', windex=0) |
- self.LaunchApp(installed_app_id) |
- |
- # Verify that the second tab in the first window is the app launch URL. |
- info = self.GetBrowserInfo() |
- actual_tab_url = info['windows'][0]['tabs'][1]['url'] |
- expected_app_url_start = 'chrome-extension://' + installed_app_id |
- self.assertTrue(actual_tab_url.startswith(expected_app_url_start), |
- msg='The app was not launched in a regular tab.') |
- |
- def testLaunchAppPinnedTab(self): |
- """Verifies that an app can be launched in a pinned tab.""" |
- installed_app_id = self._InstallAndVerifySamplePackagedApp() |
- |
- self.SetAppLaunchType(installed_app_id, 'pinned', windex=0) |
- self.LaunchApp(installed_app_id) |
- |
- # Verify that the first tab in the first window is the app launch URL, and |
- # that it is a pinned tab. |
- info = self.GetBrowserInfo() |
- actual_tab_url = info['windows'][0]['tabs'][0]['url'] |
- expected_app_url_start = 'chrome-extension://' + installed_app_id |
- self.assertTrue(actual_tab_url.startswith(expected_app_url_start) and |
- info['windows'][0]['tabs'][0]['pinned'], |
- msg='The app was not launched in a pinned tab.') |
- |
- def testLaunchAppFullScreen(self): |
- """Verifies that an app can be launched in fullscreen mode.""" |
- installed_app_id = self._InstallAndVerifySamplePackagedApp() |
- |
- self.SetAppLaunchType(installed_app_id, 'fullscreen', windex=0) |
- self.LaunchApp(installed_app_id) |
- |
- # Verify that the second tab in the first window is the app launch URL, and |
- # that the window is fullscreen. |
- info = self.GetBrowserInfo() |
- actual_tab_url = info['windows'][0]['tabs'][1]['url'] |
- expected_app_url_start = 'chrome-extension://' + installed_app_id |
- self.assertTrue(actual_tab_url.startswith(expected_app_url_start) and |
- info['windows'][0]['fullscreen'], |
- msg='The app was not launched in fullscreen mode.') |
- |
- def testLaunchAppNewWindow(self): |
- """Verifies that an app can be launched in a new window.""" |
- installed_app_id = self._InstallAndVerifySamplePackagedApp() |
- |
- self.SetAppLaunchType(installed_app_id, 'window', windex=0) |
- self.LaunchApp(installed_app_id) |
- |
- # Verify that a second window exists (at index 1), and that its first tab |
- # is the app launch URL. |
- info = self.GetBrowserInfo() |
- self.assertTrue(len(info['windows']) == 2, |
- msg='A second window does not exist.') |
- actual_tab_url = info['windows'][1]['tabs'][0]['url'] |
- expected_app_url_start = 'chrome-extension://' + installed_app_id |
- self.assertTrue(actual_tab_url.startswith(expected_app_url_start), |
- msg='The app was not launched in the new window.') |
- |
-if __name__ == '__main__': |
- pyauto_functional.Main() |