Index: chrome/test/functional/gtalk/gtalk_base_test.py |
=================================================================== |
--- chrome/test/functional/gtalk/gtalk_base_test.py (revision 0) |
+++ chrome/test/functional/gtalk/gtalk_base_test.py (revision 0) |
@@ -0,0 +1,259 @@ |
+#!/usr/bin/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. |
+ |
+"""The base test class for GTalk tests. |
+ |
+This module contains a set of common utilities used by unittest for querying |
+and manipulating the Google Talk Chrome Extension (http//go/quasar) |
+""" |
+ |
+import logging |
+import re |
+import os |
+ |
+import pyauto_gtalk # must preceed pyauto |
+import pyauto |
+import pyauto_errors |
+ |
+ |
+class GTalkBaseTest(pyauto.PyUITest): |
+ """Base test class for testing GTalk.""" |
+ |
+ _injected_js = None |
+ |
+ def InstallGTalkExtension(self): |
+ """Download and install the GTalk extension.""" |
+ self.UninstallGTalkExtension() |
+ |
+ extension_path = os.path.abspath( |
+ os.path.join(self.DataDir(), 'extensions', 'gtalk', 'gtalk.crx')) |
+ self.assertTrue(os.path.exists(extension_path), |
+ msg='Failed to find GTalk extension: ' + extension_path) |
+ |
+ 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'] == 'Google Talk'] |
+ 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._RunInTab(self.GetMoleInfo(mole_index), js) |
+ |
+ 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._RunInTab(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._RunInTab(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() |
+ value = self.ExecuteJavascriptInRenderView( |
+ self._WrapJs(js), background_view['view']) |
+ self._LogRun(js, value) |
+ return value |
+ |
+ 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. |
+ """ |
+ return self._GetTabInfo('/pmole?', mole_index) |
+ |
+ def GetViewerInfo(self): |
+ """Get the data object about the GTalk viewer dialog.""" |
+ extension = self.GetGTalkExtensionInfo() |
+ return self._GetTabInfo( |
+ 'chrome-extension://' + extension['id'] + '/viewer.html') |
+ |
+ 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; |
Nirnimesh
2011/11/30 23:57:36
nit: remove ;
wud
2011/12/13 19:36:24
Done.
|
+ |
+ 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) |
+ |
+ # Catch any JSONInterfaceError thrown while running. |
+ try: |
Nirnimesh
2011/11/30 23:57:36
I really think you should fix the javascript code
wud
2011/12/13 19:36:24
Ok, I've removed the "except" and haven't been abl
|
+ value = self.ExecuteJavascriptInTab(self._WrapJs(js), |
+ windex = tab['windex'], |
+ frame_xpath = xpath) |
+ except pyauto_error.JSONInterfaceError as e: |
+ logging.debug('Error running JS: %s' % js) |
+ value = False |
+ 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 _GetInjectedJs(self): |
+ """Get the javascript to inject in the execution environment.""" |
+ if self._injected_js is None: |
+ self._injected_js = open(os.path.dirname(__file__) + '/jsutils.js').read() |
+ return self._injected_js |
+ |
+ def action_max_timeout_ms(self): |
+ """Get the default timeout for each WaitUntil command.""" |
+ return 30000; |