15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2011 The Chromium Authors. All rights reserved.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import logging
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import time
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import pyauto_functional
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import pyauto
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import pyauto_utils
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import timer_queue
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromeOSLongTerm(pyauto.PyUITest):
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Set of long running tests for ChromeOS.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  This class is comprised of several tests that perform long term tests.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _ActivateTabWithURL(self, url):
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Activates the window that has the given tab url.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url: The url of the tab to find.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Returns:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      An array of the index values of the tab and window.  Returns None if the
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tab connot be found.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info = self.GetBrowserInfo()
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    windows = info['windows']
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for window_index, window in enumerate(windows):
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tabs = window['tabs']
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for tab_index, tab in enumerate(tabs):
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tab['url'] = tab['url'].strip('/')
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if tab['url'] == url:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          self.ActivateTab(tab_index, window_index)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return [tab_index, window_index]
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return None
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _SetupLongTermWindow(self, long_term_pages):
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Appends a list of tab to the current active window.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      long_term_pages: The list of urls to open.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for url in long_term_pages:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.AppendTab(pyauto.GURL(url))
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _RefreshLongTermWindow(self, long_term_pages):
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """ Refreshes all of the tabs from the given list.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      long_term_pages: The list of urls to refresh.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for page in long_term_pages:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      long_index = self._ActivateTabWithURL(page)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if not long_index:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        logging.info('Unable to find page with url: %s.')
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.ActivateTab(long_index[0], long_index[1])
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.ReloadActiveTab(long_index[1])
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _ConfigureNewWindow(self, pages, incognito=False):
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Setups a windows with multiple tabs running.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    This method acts as a state machine.  If a window containing a tab with the
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url of the first item of pages it closes that window.  If that window
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cannot be found then a new window with the urls in pages is opened.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pages: The list of urls to load.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    page_index = self._ActivateTabWithURL(pages[0])
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if not page_index:
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # This means the pages do not exist, load them
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if incognito:
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.OpenNewBrowserWindow(True)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for url in pages:
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.AppendTab(pyauto.GURL(url), self.GetBrowserWindowCount() - 1)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Cycle through the pages to make sure they render
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      win = self.GetBrowserInfo()['windows'][self.GetBrowserWindowCount() - 1]
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for tab in win['tabs']:
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.ActivateTab(tab['index'], self.GetBrowserWindowCount() - 1)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # Give the plugin time to activate
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        time.sleep(1.5)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.CloseBrowserWindow(page_index[1])
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testLongTerm(self):
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Main entry point for the long term tests.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    This method will spin in a while loop forever until it encounters a keyboard
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interrupt.  Other worker methods will be managed by the TimerQueue.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    long_term_pages = ['http://news.google.com', 'http://www.engadget.com',
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       'http://www.washingtonpost.com']
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flash_pages = [
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       'http://www.craftymind.com/factory/guimark2/FlashChartingTest.swf',
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       'http://www.craftymind.com/factory/guimark2/FlashGamingTest.swf',
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       'http://www.craftymind.com/factory/guimark2/FlashTextTest.swf']
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    incognito_pages = ['http://www.msn.com', 'http://www.ebay.com',
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       'http://www.bu.edu', 'http://www.youtube.com']
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    start_time = time.time()
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._SetupLongTermWindow(long_term_pages)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    timers = timer_queue.TimerQueue()
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    timers.AddTimer(self._ConfigureNewWindow, 90, args=(flash_pages,))
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    timers.AddTimer(self._RefreshLongTermWindow, 30, args=(long_term_pages,))
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    timers.AddTimer(self._ConfigureNewWindow, 15, args=(incognito_pages, True))
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    timers.start()
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while True:
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if not timers.is_alive():
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          logging.error('Timer queue died, shutting down.')
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        time.sleep(1)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    except KeyboardInterrupt:
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Kill the timers
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      timers.Stop()
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pyauto_functional.Main()
132