Index: chrome/test/functional/extensions.py |
=================================================================== |
--- chrome/test/functional/extensions.py (revision 261231) |
+++ chrome/test/functional/extensions.py (working copy) |
@@ -1,346 +0,0 @@ |
-#!/usr/bin/env python |
-# Copyright (c) 2011 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. |
- |
-""" |
-This module is a simple qa tool that installs extensions and tests whether the |
-browser crashes while visiting a list of urls. |
- |
-Usage: python extensions.py -v |
- |
-Note: This assumes that there is a directory of extensions called |
-'extensions-tool' and that there is a file of newline-separated urls to visit |
-called 'urls.txt' in the data directory. |
-""" |
- |
-import glob |
-import logging |
-import os |
-import sys |
- |
-import pyauto_functional # must be imported before pyauto |
-import pyauto |
- |
- |
-class ExtensionsPage(object): |
- """Access options in extensions page (chrome://extensions-frame).""" |
- |
- _URL = 'chrome://extensions-frame' |
- |
- def __init__(self, driver): |
- self._driver = driver |
- self._driver.get(ExtensionsPage._URL) |
- |
- def CheckExtensionVisible(self, ext_id): |
- """Returns True if |ext_id| exists on page.""" |
- return len(self._driver.find_elements_by_id(ext_id)) == 1 |
- |
- def SetEnabled(self, ext_id, enabled): |
- """Clicks on 'Enabled' checkbox for specified extension. |
- |
- Args: |
- ext_id: Extension ID to be enabled or disabled. |
- enabled: Boolean indicating whether |ext_id| is to be enabled or disabled. |
- """ |
- checkbox = self._driver.find_element_by_xpath( |
- '//*[@id="%s"]//*[@class="enable-controls"]//*[@type="checkbox"]' % |
- ext_id) |
- if checkbox != enabled: |
- checkbox.click() |
- # Reload page to ensure that the UI is recreated. |
- self._driver.get(ExtensionsPage._URL) |
- |
- def SetAllowInIncognito(self, ext_id, allowed): |
- """Clicks on 'Allow in incognito' checkbox for specified extension. |
- |
- Args: |
- ext_id: Extension ID to be enabled or disabled. |
- allowed: Boolean indicating whether |ext_id| is to be allowed or |
- disallowed in incognito. |
- """ |
- checkbox = self._driver.find_element_by_xpath( |
- '//*[@id="%s"]//*[@class="incognito-control"]//*[@type="checkbox"]' % |
- ext_id) |
- if checkbox.is_selected() != allowed: |
- checkbox.click() |
- # Reload page to ensure that the UI is recreated. |
- self._driver.get(ExtensionsPage._URL) |
- |
- def SetAllowAccessFileURLs(self, ext_id, allowed): |
- """Clicks on 'Allow access to file URLs' checkbox for specified extension. |
- |
- Args: |
- ext_id: Extension ID to be enabled or disabled. |
- allowed: Boolean indicating whether |ext_id| is to be allowed access to |
- file URLs. |
- """ |
- checkbox = self._driver.find_element_by_xpath( |
- '//*[@id="%s"]//*[@class="file-access-control"]//*[@type="checkbox"]' % |
- ext_id) |
- if checkbox.is_selected() != allowed: |
- checkbox.click() |
- |
- |
-class ExtensionsTest(pyauto.PyUITest): |
- """Test of extensions.""" |
- |
- 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 history.') |
- print '*' * 20 |
- self.pprint(self.GetExtensionsInfo()) |
- |
- def _GetInstalledExtensionIds(self): |
- return [extension['id'] for extension in self.GetExtensionsInfo()] |
- |
- def _ReturnCrashingExtensions(self, extensions, group_size, top_urls): |
- """Returns the group of extensions that crashes (if any). |
- |
- Install the given extensions in groups of group_size and return the |
- group of extensions that crashes (if any). |
- |
- Args: |
- extensions: A list of extensions to install. |
- group_size: The number of extensions to install at one time. |
- top_urls: The list of top urls to visit. |
- |
- Returns: |
- The extensions in the crashing group or None if there is no crash. |
- """ |
- curr_extension = 0 |
- num_extensions = len(extensions) |
- self.RestartBrowser() |
- orig_extension_ids = self._GetInstalledExtensionIds() |
- |
- while curr_extension < num_extensions: |
- logging.debug('New group of %d extensions.', group_size) |
- group_end = curr_extension + group_size |
- for extension in extensions[curr_extension:group_end]: |
- logging.debug('Installing extension: %s', extension) |
- self.InstallExtension(extension) |
- |
- for url in top_urls: |
- self.NavigateToURL(url) |
- |
- def _LogAndReturnCrashing(): |
- crashing_extensions = extensions[curr_extension:group_end] |
- logging.debug('Crashing extensions: %s', crashing_extensions) |
- return crashing_extensions |
- |
- # If the browser has crashed, return the extensions in the failing group. |
- try: |
- num_browser_windows = self.GetBrowserWindowCount() |
- except: |
- return _LogAndReturnCrashing() |
- else: |
- if not num_browser_windows: |
- return _LogAndReturnCrashing() |
- else: |
- # Uninstall all extensions that aren't installed by default. |
- new_extension_ids = [id for id in self._GetInstalledExtensionIds() |
- if id not in orig_extension_ids] |
- for extension_id in new_extension_ids: |
- self.UninstallExtensionById(extension_id) |
- |
- curr_extension = group_end |
- |
- # None of the extensions crashed. |
- return None |
- |
- def _GetExtensionInfoById(self, extensions, id): |
- for x in extensions: |
- if x['id'] == id: |
- return x |
- return None |
- |
- def ExtensionCrashes(self): |
- """Add top extensions; confirm browser stays up when visiting top urls.""" |
- # TODO: provide a way in pyauto to pass args to a test - take these as args |
- extensions_dir = os.path.join(self.DataDir(), 'extensions-tool') |
- urls_file = os.path.join(self.DataDir(), 'urls.txt') |
- |
- error_msg = 'The dir "%s" must exist' % os.path.abspath(extensions_dir) |
- assert os.path.exists(extensions_dir), error_msg |
- error_msg = 'The file "%s" must exist' % os.path.abspath(urls_file) |
- assert os.path.exists(urls_file), error_msg |
- |
- num_urls_to_visit = 100 |
- extensions_group_size = 20 |
- |
- top_urls = [l.rstrip() for l in |
- open(urls_file).readlines()[:num_urls_to_visit]] |
- |
- failed_extensions = glob.glob(os.path.join(extensions_dir, '*.crx')) |
- group_size = extensions_group_size |
- |
- while (group_size and failed_extensions): |
- failed_extensions = self._ReturnCrashingExtensions( |
- failed_extensions, group_size, top_urls) |
- group_size = group_size // 2 |
- |
- self.assertFalse(failed_extensions, |
- 'Extension(s) in failing group: %s' % failed_extensions) |
- |
- def _InstallExtensionCheckDefaults(self, crx_file): |
- """Installs extension at extensions/|crx_file| and checks default status. |
- |
- Checks that the installed extension is enabled and not allowed in incognito. |
- |
- Args: |
- crx_file: Relative path from self.DataDir()/extensions to .crx extension |
- to be installed. |
- |
- Returns: |
- The extension ID. |
- """ |
- crx_file_path = os.path.abspath( |
- os.path.join(self.DataDir(), 'extensions', crx_file)) |
- ext_id = self.InstallExtension(crx_file_path) |
- extension = self._GetExtensionInfoById(self.GetExtensionsInfo(), ext_id) |
- self.assertTrue(extension['is_enabled'], |
- msg='Extension was not enabled on installation') |
- self.assertFalse(extension['allowed_in_incognito'], |
- msg='Extension was allowed in incognito on installation.') |
- |
- return ext_id |
- |
- def _ExtensionValue(self, ext_id, key): |
- """Returns the value of |key| for |ext_id|. |
- |
- Args: |
- ext_id: The extension ID. |
- key: The key for which the extensions info value is required. |
- |
- Returns: |
- The value of extensions info |key| for |ext_id|. |
- """ |
- return self._GetExtensionInfoById(self.GetExtensionsInfo(), ext_id)[key] |
- |
- def _FileAccess(self, ext_id): |
- """Returns the value of newAllowFileAccess for |ext_id|. |
- |
- Args: |
- ext_id: The extension ID. |
- |
- Returns: |
- The value of extensions settings newAllowFileAccess for |ext_id|. |
- """ |
- extension_settings = self.GetPrefsInfo().Prefs()['extensions']['settings'] |
- return extension_settings[ext_id]['newAllowFileAccess'] |
- |
- def testGetExtensionPermissions(self): |
- """Ensures we can retrieve the host/api permissions for an extension. |
- |
- This test assumes that the 'Bookmark Manager' extension exists in a fresh |
- profile. |
- """ |
- extensions_info = self.GetExtensionsInfo() |
- bm_exts = [x for x in extensions_info if x['name'] == 'Bookmark Manager'] |
- self.assertTrue(bm_exts, |
- msg='Could not find info for the Bookmark Manager ' |
- 'extension.') |
- ext = bm_exts[0] |
- |
- permissions_host = ext['host_permissions'] |
- self.assertTrue(len(permissions_host) == 2 and |
- 'chrome://favicon/*' in permissions_host and |
- 'chrome://resources/*' in permissions_host, |
- msg='Unexpected host permissions information.') |
- |
- permissions_api = ext['api_permissions'] |
- print permissions_api |
- self.assertTrue(len(permissions_api) == 5 and |
- 'bookmarks' in permissions_api and |
- 'bookmarkManagerPrivate' in permissions_api and |
- 'metricsPrivate' in permissions_api and |
- 'systemPrivate' in permissions_api and |
- 'tabs' in permissions_api, |
- msg='Unexpected API permissions information.') |
- |
- def testDisableEnableExtension(self): |
- """Tests that an extension can be disabled and enabled with the UI.""" |
- ext_id = self._InstallExtensionCheckDefaults('good.crx') |
- |
- # Disable extension. |
- driver = self.NewWebDriver() |
- ext_page = ExtensionsPage(driver) |
- self.WaitUntil(ext_page.CheckExtensionVisible, args=[ext_id]) |
- ext_page.SetEnabled(ext_id, False) |
- self.WaitUntil(self._ExtensionValue, args=[ext_id, 'is_enabled'], |
- expect_retval=False) |
- self.assertFalse(self._ExtensionValue(ext_id, 'is_enabled'), |
- msg='Extension did not get disabled.') |
- |
- # Enable extension. |
- self.WaitUntil(ext_page.CheckExtensionVisible, args=[ext_id]) |
- ext_page.SetEnabled(ext_id, True) |
- self.WaitUntil(self._ExtensionValue, args=[ext_id, 'is_enabled'], |
- expect_retval=True) |
- self.assertTrue(self._ExtensionValue(ext_id, 'is_enabled'), |
- msg='Extension did not get enabled.') |
- |
- def testAllowIncognitoExtension(self): |
- """Tests allowing and disallowing an extension in incognito mode.""" |
- ext_id = self._InstallExtensionCheckDefaults('good.crx') |
- |
- # Allow in incognito. |
- driver = self.NewWebDriver() |
- ext_page = ExtensionsPage(driver) |
- self.WaitUntil(ext_page.CheckExtensionVisible, args=[ext_id]) |
- ext_page.SetAllowInIncognito(ext_id, True) |
- |
- # Check extension now allowed in incognito. |
- self.WaitUntil(self._ExtensionValue, args=[ext_id, 'allowed_in_incognito'], |
- expect_retval=True) |
- self.assertTrue(self._ExtensionValue(ext_id, 'allowed_in_incognito'), |
- msg='Extension did not get allowed in incognito.') |
- |
- # Disallow in incognito. |
- self.WaitUntil(ext_page.CheckExtensionVisible, args=[ext_id]) |
- ext_page.SetAllowInIncognito(ext_id, False) |
- |
- # Check extension now disallowed in incognito. |
- self.WaitUntil(self._ExtensionValue, args=[ext_id, 'allowed_in_incognito'], |
- expect_retval=False) |
- self.assertFalse(self._ExtensionValue(ext_id, 'allowed_in_incognito'), |
- msg='Extension did not get disallowed in incognito.') |
- |
- def testAllowAccessFileURLs(self): |
- """Tests disallowing and allowing and extension access to file URLs.""" |
- ext_id = self._InstallExtensionCheckDefaults(os.path.join('permissions', |
- 'files')) |
- |
- # Check extension allowed access to file URLs by default. |
- extension_settings = self.GetPrefsInfo().Prefs()['extensions']['settings'] |
- self.assertTrue(extension_settings[ext_id]['newAllowFileAccess'], |
- msg='Extension was not allowed access to file URLs on ' |
- 'installation') |
- |
- # Disallow access to file URLs. |
- driver = self.NewWebDriver() |
- ext_page = ExtensionsPage(driver) |
- self.WaitUntil(ext_page.CheckExtensionVisible, args=[ext_id]) |
- ext_page.SetAllowAccessFileURLs(ext_id, False) |
- |
- # Check that extension does not have access to file URLs. |
- self.WaitUntil(self._FileAccess, args=[ext_id], expect_retval=False) |
- self.assertFalse(self._FileAccess(ext_id), |
- msg='Extension did not have access to file URLs denied.') |
- |
- # Allow access to file URLs. |
- self.WaitUntil(ext_page.CheckExtensionVisible, args=[ext_id]) |
- ext_page.SetAllowAccessFileURLs(ext_id, True) |
- |
- # Check that extension now has access to file URLs. |
- self.WaitUntil(self._FileAccess, args=[ext_id], expect_retval=True) |
- self.assertTrue(self._FileAccess(ext_id), |
- msg='Extension did not have access to file URLs granted.') |
- |
- |
-if __name__ == '__main__': |
- pyauto_functional.Main() |