Index: chrome/test/functional/gtalk/gtalk_base_test.py |
=================================================================== |
--- chrome/test/functional/gtalk/gtalk_base_test.py (revision 261231) |
+++ chrome/test/functional/gtalk/gtalk_base_test.py (working copy) |
@@ -1,348 +0,0 @@ |
-# 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. |
- |
-"""Base GTalk tests. |
- |
-This module contains a set of common utilities for querying |
-and manipulating the Google Talk Chrome Extension. |
-""" |
- |
-import logging |
-import re |
-import os |
- |
-import pyauto_gtalk |
-import pyauto |
-import pyauto_errors |
- |
- |
-class GTalkBaseTest(pyauto.PyUITest): |
- """Base test class for testing GTalk.""" |
- |
- _injected_js = None |
- |
- def Prompt(self, text): |
- """Pause execution with debug output. |
- |
- Args: |
- text: The debug output. |
- """ |
- text = str(text) |
- raw_input('--------------------> ' + text) |
- |
- def InstallGTalkExtension(self, gtalk_version): |
- """Download and install the GTalk extension.""" |
- extension_path = os.path.abspath( |
- os.path.join(self.DataDir(), 'extensions', 'gtalk', |
- gtalk_version + '.crx')) |
- self.assertTrue( |
- os.path.exists(extension_path), |
- msg='Failed to find GTalk extension: ' + extension_path) |
- |
- extension = self.GetGTalkExtensionInfo() |
- if extension: |
- logging.info('Extension already installed. Skipping install...\n') |
- return |
- |
- self.InstallExtension(extension_path, False) |
- extension = self.GetGTalkExtensionInfo() |
- self.assertTrue(extension, msg='Failed to install GTalk extension.') |
- self.assertTrue(extension['is_enabled'], msg='GTalk extension is disabled.') |
- |
- def UninstallGTalkExtension(self): |
- """Uninstall the GTalk extension (if present)""" |
- extension = self.GetGTalkExtensionInfo() |
- if extension: |
- self.UninstallExtensionById(extension['id']) |
- |
- def GetGTalkExtensionInfo(self): |
- """Get the data object about the GTalk extension.""" |
- extensions = [x for x in self.GetExtensionsInfo() |
- if x['name'] == 'Chat for Google'] |
- return extensions[0] if len(extensions) == 1 else None |
- |
- def RunInMole(self, js, mole_index=0): |
- """Execute javascript in a chat mole. |
- |
- Args: |
- js: The javascript to run. |
- mole_index: The index of the mole in which to run the JS. |
- |
- Returns: |
- The resulting value from executing the javascript. |
- """ |
- return self._RunInRenderView(self.GetMoleInfo(mole_index), js, |
- '//iframe[1]') |
- |
- def RunInAllMoles(self, js): |
- """Execute javascript in all chat moles. |
- |
- Args: |
- js: The javascript to run. |
- """ |
- moles = self.GetMolesInfo() |
- for mole in moles: |
- self._RunInRenderView(mole, js, '//iframe[1]') |
- |
- def RunInRoster(self, js): |
- """Execute javascript in the chat roster. |
- |
- Args: |
- js: The javascript to run. |
- |
- Returns: |
- The resulting value from executing the javascript. |
- """ |
- return self._RunInRenderView(self.GetViewerInfo(), js, |
- '//iframe[1]\n//iframe[1]') |
- |
- def RunInLoginPage(self, js, xpath=''): |
- """Execute javascript in the gaia login popup. |
- |
- Args: |
- js: The javascript to run. |
- xpath: The xpath to the frame in which to execute the javascript. |
- |
- Returns: |
- The resulting value from executing the javascript. |
- """ |
- return self._RunInTab(self.GetLoginPageInfo(), js, xpath) |
- |
- def RunInViewer(self, js, xpath=''): |
- """Execute javascript in the GTalk viewer window. |
- |
- Args: |
- js: The javascript to run. |
- xpath: The xpath to the frame in which to execute the javascript. |
- |
- Returns: |
- The resulting value from executing the javascript. |
- """ |
- return self._RunInRenderView(self.GetViewerInfo(), js, xpath) |
- |
- def RunInBackground(self, js, xpath=''): |
- """Execute javascript in the GTalk viewer window. |
- |
- Args: |
- js: The javascript to run. |
- xpath: The xpath to the frame in which to execute the javascript. |
- |
- Returns: |
- The resulting value from executing the javascript. |
- """ |
- background_view = self.GetBackgroundInfo() |
- return self._RunInRenderView(background_view['view'], js, xpath) |
- |
- def GetMoleInfo(self, mole_index=0): |
- """Get the data object about a given chat mole. |
- |
- Args: |
- mole_index: The index of the mole to retrieve. |
- |
- Returns: |
- Data object describing mole. |
- """ |
- extension = self.GetGTalkExtensionInfo() |
- return self._GetExtensionViewInfo( |
- 'chrome-extension://%s/panel.html' % extension['id'], |
- mole_index) |
- |
- def GetMolesInfo(self): |
- """Get the data objects for all of the chat moles. |
- |
- Returns: |
- Set of data objects describing moles. |
- """ |
- extension = self.GetGTalkExtensionInfo() |
- return self._GetMatchingExtensionViews( |
- 'chrome-extension://%s/panel.html' % extension['id']) |
- |
- def GetViewerInfo(self): |
- """Get the data object about the GTalk viewer dialog.""" |
- extension = self.GetGTalkExtensionInfo() |
- return self._GetExtensionViewInfo( |
- 'chrome-extension://%s/viewer.html' % extension['id']) |
- |
- def GetLoginPageInfo(self): |
- """Get the data object about the gaia login popup.""" |
- return self._GetTabInfo('https://accounts.google.com/ServiceLogin?') |
- |
- def GetBackgroundInfo(self): |
- """Get the data object about the GTalk background page.""" |
- extension_views = self.GetBrowserInfo()['extension_views'] |
- for extension_view in extension_views: |
- if 'Google Talk' in extension_view['name'] and \ |
- 'EXTENSION_BACKGROUND_PAGE' == extension_view['view_type']: |
- return extension_view |
- return None |
- |
- def WaitUntilResult(self, result, func, msg): |
- """Loop func until a condition matches is satified. |
- |
- Args: |
- result: Value of func() at which to stop. |
- func: Function to run at each iteration. |
- msg: Error to print upon timing out. |
- """ |
- assert callable(func) |
- self.assertTrue(self.WaitUntil( |
- lambda: func(), expect_retval=result), msg=msg) |
- |
- def WaitUntilCondition(self, func, matches, msg): |
- """Loop func until condition matches is satified. |
- |
- Args: |
- func: Function to run at each iteration. |
- matches: Funtion to evalute output and determine whether to stop. |
- msg: Error to print upon timing out. |
- """ |
- assert callable(func) |
- assert callable(matches) |
- self.assertTrue(self.WaitUntil( |
- lambda: matches(func())), msg=msg) |
- |
- def _WrapJs(self, statement): |
- """Wrap the javascript to be executed. |
- |
- Args: |
- statement: The piece of javascript to wrap. |
- |
- Returns: |
- The wrapped javascript. |
- """ |
- return """ |
- window.domAutomationController.send( |
- (function(){ |
- %s |
- try{return %s} |
- catch(e){return "JS_ERROR: " + e}})()) |
- """ % (self._GetInjectedJs(), statement) |
- |
- def _RunInTab(self, tab, js, xpath=''): |
- """Execute javascript in a given tab. |
- |
- Args: |
- tab: The data object for the Chrome window tab returned by |
- _GetTabInfo. |
- js: The javascript to run. |
- xpath: The xpath to the frame in which to execute the javascript. |
- |
- Returns: |
- The resulting value from executing the javascript. |
- """ |
- if not tab: |
- logging.debug('Tab not found: %s' % tab) |
- return False |
- logging.info('Run in tab: %s' % js) |
- |
- value = self.ExecuteJavascript( |
- self._WrapJs(js), |
- tab_index = tab['index'], |
- windex = tab['windex'], |
- frame_xpath = xpath) |
- self._LogRun(js, value) |
- return value |
- |
- def _RunInRenderView(self, view, js, xpath=''): |
- """Execute javascript in a given render view. |
- |
- Args: |
- view: The data object for the Chrome render view returned by |
- _GetExtensionViewInfo. |
- js: The javascript to run. |
- xpath: The xpath to the frame in which to execute the javascript. |
- |
- Returns: |
- The resulting value from executing the javascript. |
- """ |
- if not view: |
- logging.debug('View not found: %s' % view) |
- return False |
- logging.info('Run in view: %s' % js) |
- |
- value = self.ExecuteJavascriptInRenderView( |
- self._WrapJs(js), |
- view, |
- frame_xpath = xpath) |
- self._LogRun(js, value) |
- return value |
- |
- def _LogRun(self, js, value): |
- """Log a particular run. |
- |
- Args: |
- js: The javascript statement executed. |
- value: The return value for the execution. |
- """ |
- # works around UnicodeEncodeError: 'ascii' codec can't encode... |
- out = value |
- if not isinstance(value, basestring): |
- out = str(value) |
- out = re.sub('\s', ';', out[:300]) |
- logging.info(js + ' ===> ' + out.encode('utf-8')) |
- |
- def _GetTabInfo(self, url_query, index=0): |
- """Get the data object for a given tab. |
- |
- Args: |
- url_query: The substring of the URL to search for. |
- index: The index within the list of matches to return. |
- |
- Returns: |
- The data object for the tab. |
- """ |
- windows = self.GetBrowserInfo()['windows'] |
- i = 0 |
- for win in windows: |
- for tab in win['tabs']: |
- if tab['url'] and url_query in tab['url']: |
- # Store reference to windex used in _RunInTab. |
- tab['windex'] = win['index'] |
- if i == index: |
- return tab |
- i = i + 1 |
- return None |
- |
- def _GetExtensionViewInfo(self, url_query, index=0): |
- """Get the data object for a given extension view. |
- |
- Args: |
- url_query: The substring of the URL to search for. |
- index: The index within the list of matches to return. |
- |
- Returns: |
- The data object for the tab. |
- """ |
- |
- candidate_views = self._GetMatchingExtensionViews(url_query) |
- if len(candidate_views) > index: |
- return candidate_views[index] |
- return None |
- |
- def _GetMatchingExtensionViews(self, url_query): |
- """Gets the data objects for the extension views matching the url_query. |
- |
- Args: |
- url_query: The substring of the URL to search for. |
- |
- Returns: |
- An array of matching data objects. |
- """ |
- extension_views = self.GetBrowserInfo()['extension_views'] |
- candidate_views = list() |
- for extension_view in extension_views: |
- if extension_view['url'] and url_query in extension_view['url']: |
- candidate_views.append(extension_view['view']) |
- |
- # No guarantee on view order, so sort the views to get the correct one for |
- # a given index. |
- candidate_views.sort() |
- return candidate_views |
- |
- def _GetInjectedJs(self): |
- """Get the javascript to inject in the execution environment.""" |
- if self._injected_js is None: |
- self._injected_js = open( |
- os.path.join(os.path.dirname(__file__), 'jsutils.js')).read() |
- return self._injected_js |