diff options
Diffstat (limited to 'chrome/test/functional/stress.py')
-rwxr-xr-x | chrome/test/functional/stress.py | 806 |
1 files changed, 0 insertions, 806 deletions
diff --git a/chrome/test/functional/stress.py b/chrome/test/functional/stress.py deleted file mode 100755 index f9a4ffe..0000000 --- a/chrome/test/functional/stress.py +++ /dev/null @@ -1,806 +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. - - -""" -Stess Tests for Google Chrome. - -This script runs 4 different stress tests: -1. Plugin stress. -2. Back and forward stress. -3. Download stress. -4. Preference stress. - -After every cycle (running all 4 stress tests) it checks for crashes. -If there are any crashes, the script generates a report, uploads it to -a server and mails about the crash and the link to the report on the server. -Apart from this whenever the test stops on mac it looks for and reports -zombies. - -Prerequisites: -Test needs the following files/folders in the Data dir. -1. A crash_report tool in "pyauto_private/stress/mac" folder for use on Mac. -2. A "downloads" folder containing stress_downloads and all the files - referenced in it. -3. A pref_dict file in "pyauto_private/stress/mac" folder. -4. A "plugin" folder containing doubleAnimation.xaml, flash.swf, FlashSpin.swf, - generic.html, get_flash_player.gif, js-invoker.swf, mediaplayer.wmv, - NavigatorTicker11.class, Plugins_page.html, sample5.mov, silverlight.xaml, - silverlight.js, embed.pdf, plugins_page.html and test6.swf. -5. A stress_pref file in "pyauto_private/stress". -""" - - -import commands -import glob -import logging -import os -import random -import re -import shutil -import sys -import time -import urllib -import test_utils -import subprocess - -import pyauto_functional -import pyauto -import pyauto_utils - - -CRASHES = 'crashes' # Name of the folder to store crashes - - -class StressTest(pyauto.PyUITest): - """Run all the stress tests.""" - - flash_url1 = pyauto.PyUITest.GetFileURLForPath( - os.path.join(pyauto.PyUITest.DataDir(), 'plugin', 'flash.swf')) - flash_url2 = pyauto.PyUITest.GetFileURLForPath( - os.path.join(pyauto.PyUITest.DataDir(),'plugin', 'js-invoker.swf')) - flash_url3 = pyauto.PyUITest.GetFileURLForPath( - os.path.join(pyauto.PyUITest.DataDir(), 'plugin', 'generic.html')) - plugin_url = pyauto.PyUITest.GetFileURLForPath( - os.path.join(pyauto.PyUITest.DataDir(), 'plugin', 'plugins_page.html')) - empty_url = pyauto.PyUITest.GetFileURLForPath( - os.path.join(pyauto.PyUITest.DataDir(), 'empty.html')) - download_url1 = pyauto.PyUITest.GetFileURLForPath( - os.path.join(pyauto.PyUITest.DataDir(), 'downloads', 'a_zip_file.zip')) - download_url2 = pyauto.PyUITest.GetFileURLForPath( - os.path.join(pyauto.PyUITest.DataDir(),'zip', 'test.zip')) - file_list = pyauto.PyUITest.EvalDataFrom( - os.path.join(pyauto.PyUITest.DataDir(), 'downloads', 'stress_downloads')) - symbols_dir = os.path.join(os.getcwd(), 'Build_Symbols') - stress_pref = pyauto.PyUITest.EvalDataFrom( - os.path.join(pyauto.PyUITest.DataDir(), 'pyauto_private', 'stress', - 'stress_pref')) - breakpad_dir = None - chrome_version = None - bookmarks_list = [] - - - def _FuncDir(self): - """Returns the path to the functional dir chrome/test/functional.""" - return os.path.dirname(__file__) - - def _DownloadSymbols(self): - """Downloads the symbols for the build being tested.""" - download_location = os.path.join(os.getcwd(), 'Build_Symbols') - if os.path.exists(download_location): - shutil.rmtree(download_location) - os.makedirs(download_location) - - url = self.stress_pref['symbols_dir'] + self.chrome_version - # TODO: Add linux symbol_files - if self.IsWin(): - url = url + '/win/' - symbol_files = ['chrome.dll.pdb', 'chrome.exe.pdb'] - elif self.IsMac(): - url = url + '/mac/' - symbol_files = map(urllib.quote, - ['Google Chrome Framework.framework', - 'Google Chrome Helper.app', - 'Google Chrome.app', - 'crash_inspector', - 'crash_report_sender', - 'ffmpegsumo.so', - 'libplugin_carbon_interpose.dylib']) - index = 0 - symbol_files = ['%s-%s-i386.breakpad' % (sym_file, self.chrome_version) \ - for sym_file in symbol_files] - logging.info(symbol_files) - - for sym_file in symbol_files: - sym_url = url + sym_file - logging.info(sym_url) - download_sym_file = os.path.join(download_location, sym_file) - logging.info(download_sym_file) - urllib.urlretrieve(sym_url, download_sym_file) - - def setUp(self): - pyauto.PyUITest.setUp(self) - self.breakpad_dir = self._CrashDumpFolder() - self.chrome_version = self.GetBrowserInfo()['properties']['ChromeVersion'] - - # Plugin stress functions - - def _CheckForPluginProcess(self, plugin_name): - """Checks if a particular plugin process exists. - - Args: - plugin_name : plugin process which should be running. - """ - process = self.GetBrowserInfo()['child_processes'] - self.assertTrue([x for x in process - if x['type'] == 'Plug-in' and - x['name'] == plugin_name]) - - def _GetPluginProcessId(self, plugin_name): - """Get Plugin process id. - - Args: - plugin_name: Plugin whose pid is expected. - Eg: "Shockwave Flash" - - Returns: - Process id if the plugin process is running. - None otherwise. - """ - for process in self.GetBrowserInfo()['child_processes']: - if process['type'] == 'Plug-in' and \ - re.search(plugin_name, process['name']): - return process['pid'] - return None - - def _CloseAllTabs(self): - """Close all but one tab in first window.""" - tab_count = self.GetTabCount(0) - for tab_index in xrange(tab_count - 1, 0, -1): - self.CloseTab(tab_index) - - def _CloseAllWindows(self): - """Close all windows except one.""" - win_count = self.GetBrowserWindowCount() - for windex in xrange(win_count - 1, 0, -1): - self.RunCommand(pyauto.IDC_CLOSE_WINDOW, windex) - - def _ReloadAllTabs(self): - """Reload all the tabs in first window.""" - for tab_index in range(self.GetTabCount()): - self.ReloadTab(tab_index) - - def _LoadFlashInMultipleTabs(self): - """Load Flash in multiple tabs in first window.""" - self.NavigateToURL(self.empty_url) - # Open 18 tabs with flash - for _ in range(9): - self.AppendTab(pyauto.GURL(self.flash_url1)) - self.AppendTab(pyauto.GURL(self.flash_url2)) - - def _OpenAndCloseMultipleTabsWithFlash(self): - """Stress test for flash in multiple tabs.""" - logging.info("In _OpenAndCloseMultipleWindowsWithFlash.") - self._LoadFlashInMultipleTabs() - self._CheckForPluginProcess('Shockwave Flash') - self._CloseAllTabs() - - def _OpenAndCloseMultipleWindowsWithFlash(self): - """Stress test for flash in multiple windows.""" - logging.info('In _OpenAndCloseMultipleWindowsWithFlash.') - # Open 5 Normal and 4 Incognito windows - for tab_index in range(1, 10): - if tab_index < 6: - self.OpenNewBrowserWindow(True) - else: - self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW) - self.NavigateToURL(self.flash_url2, tab_index, 0) - self.AppendTab(pyauto.GURL(self.flash_url2), tab_index) - self._CloseAllWindows() - - def _OpenAndCloseMultipleTabsWithMultiplePlugins(self): - """Stress test using multiple plugins in multiple tabs.""" - logging.info('In _OpenAndCloseMultipleTabsWithMultiplePlugins.') - # Append 4 tabs with URL - for _ in range(5): - self.AppendTab(pyauto.GURL(self.plugin_url)) - self._CloseAllTabs() - - def _OpenAndCloseMultipleWindowsWithMultiplePlugins(self): - """Stress test using multiple plugins in multiple windows.""" - logging.info('In _OpenAndCloseMultipleWindowsWithMultiplePlugins.') - # Open 4 windows with URL - for tab_index in range(1, 5): - if tab_index < 6: - self.OpenNewBrowserWindow(True) - else: - self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW) - self.NavigateToURL(self.plugin_url, tab_index, 0) - self._CloseAllWindows() - - def _KillAndReloadFlash(self): - """Stress test by killing flash process and reloading tabs.""" - self._LoadFlashInMultipleTabs() - flash_process_id1 = self._GetPluginProcessId('Shockwave Flash') - self.Kill(flash_process_id1) - self._ReloadAllTabs() - self._CloseAllTabs() - - def _KillAndReloadRenderersWithFlash(self): - """Stress test by killing renderer processes and reloading tabs.""" - logging.info('In _KillAndReloadRenderersWithFlash') - self._LoadFlashInMultipleTabs() - info = self.GetBrowserInfo() - # Kill all renderer processes - for tab_index in range(self.GetTabCount(0)): - self.KillRendererProcess( - info['windows'][0]['tabs'][tab_index]['renderer_pid']) - self._ReloadAllTabs() - self._CloseAllTabs() - - def _TogglePlugin(self, plugin_name): - """Toggle plugin status. - - Args: - plugin_name: Name of the plugin to toggle. - """ - plugins = self.GetPluginsInfo().Plugins() - for item in range(len(plugins)): - if re.search(plugin_name, plugins[item]['name']): - if plugins[item]['enabled']: - self.DisablePlugin(plugins[item]['path']) - else: - self.EnablePlugin(plugins[item]['path']) - - def _ToggleAndReloadFlashPlugin(self): - """Toggle flash and reload all tabs.""" - logging.info('In _ToggleAndReloadFlashPlugin') - for _ in range(10): - self.AppendTab(pyauto.GURL(self.flash_url3)) - # Disable Flash Plugin - self._TogglePlugin('Shockwave Flash') - self._ReloadAllTabs() - # Enable Flash Plugin - self._TogglePlugin('Shockwave Flash') - self._ReloadAllTabs() - self._CloseAllTabs() - - # Downloads stress functions - - def _LoadDownloadsInMultipleTabs(self): - """Load Downloads in multiple tabs in the same window.""" - # Open 15 tabs with downloads - logging.info('In _LoadDownloadsInMultipleTabs') - for tab_index in range(15): - # We open an empty tab and then downlad a file from it. - self.AppendTab(pyauto.GURL(self.empty_url)) - self.NavigateToURL(self.download_url1, 0, tab_index + 1) - self.AppendTab(pyauto.GURL(self.empty_url)) - self.NavigateToURL(self.download_url2, 0, tab_index + 2) - - def _OpenAndCloseMultipleTabsWithDownloads(self): - """Download items in multiple tabs.""" - logging.info('In _OpenAndCloseMultipleTabsWithDownloads') - self._LoadDownloadsInMultipleTabs() - self._CloseAllTabs() - - def _OpenAndCloseMultipleWindowsWithDownloads(self): - """Randomly have downloads in multiple windows.""" - logging.info('In _OpenAndCloseMultipleWindowsWithDownloads') - # Open 15 Windows randomly on both regular and incognito with downloads - for window_index in range(15): - tick = round(random.random() * 100) - if tick % 2 != 0: - self.NavigateToURL(self.download_url2, 0, 0) - else: - self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW) - self.AppendTab(pyauto.GURL(self.empty_url), 1) - self.NavigateToURL(self.download_url2, 1, 1) - self._CloseAllWindows() - - def _OpenAndCloseMultipleTabsWithMultipleDownloads(self): - """Download multiple items in multiple tabs.""" - logging.info('In _OpenAndCloseMultipleTabsWithMultipleDownloads') - self.NavigateToURL(self.empty_url) - for _ in range(15): - for file in self.file_list: - count = 1 - url = self.GetFileURLForPath( - os.path.join(self.DataDir(), 'downloads', file)) - self.AppendTab(pyauto.GURL(self.empty_url)) - self.NavigateToURL(url, 0, count) - count = count + 1 - self._CloseAllTabs() - - def _OpenAndCloseMultipleWindowsWithMultipleDownloads(self): - """Randomly multiple downloads in multiple windows.""" - logging.info('In _OpenAndCloseMultipleWindowsWithMultipleDownloads') - for _ in range(15): - for file in self.file_list: - tick = round(random.random() * 100) - url = self.GetFileURLForPath( - os.path.join(self.DataDir(), 'downloads', file)) - if tick % 2!= 0: - self.NavigateToURL(url, 0, 0) - else: - self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW) - self.AppendTab(pyauto.GURL(self.empty_url), 1) - self.NavigateToURL(url, 1, 1) - self._CloseAllWindows() - - # Back and Forward stress functions - - def _BrowserGoBack(self, window_index): - """Go back in the browser history. - - Chrome has limitation on going back and can only go back 49 pages. - - Args: - window_index: the index of the browser window to work on. - """ - for nback in range(48): # Go back 48 times. - if nback % 4 == 0: # Bookmark every 5th url when going back. - self._BookMarkEvery5thURL(window_index) - self.TabGoBack(tab_index=0, windex=window_index) - - def _BrowserGoForward(self, window_index): - """Go Forward in the browser history. - - Chrome has limitation on going back and can only go back 49 pages. - - Args: - window_index: the index of the browser window to work on. - """ - for nforward in range(48): # Go back 48 times. - if nforward % 4 == 0: # Bookmark every 5th url when going Forward - self._BookMarkEvery5thURL(window_index) - self.TabGoForward(tab_index=0, windex=window_index) - - def _AddToListAndBookmark(self, newname, url): - """Bookmark the url to bookmarkbar and to he list of bookmarks. - - Args: - newname: the name of the bookmark. - url: the url to bookmark. - """ - bookmarks = self.GetBookmarkModel() - bar_id = bookmarks.BookmarkBar()['id'] - self.AddBookmarkURL(bar_id, 0, newname, url) - self.bookmarks_list.append(newname) - - def _RemoveFromListAndBookmarkBar(self, name): - """Remove the bookmark bor and bookmarks list. - - Args: - name: the name of bookmark to remove. - """ - bookmarks = self.GetBookmarkModel() - node = bookmarks.FindByTitle(name) - self.RemoveBookmark(node[0]['id']) - self.bookmarks_list.remove(name) - - def _DuplicateBookmarks(self, name): - """Find duplicate bookmark in the bookmarks list. - - Args: - name: name of the bookmark. - - Returns: - True if it's a duplicate. - """ - for index in (self.bookmarks_list): - if index == name: - return True - return False - - def _BookMarkEvery5thURL(self, window_index): - """Check for duplicate in list and bookmark current url. - If its the first time and list is empty add the bookmark. - If its a duplicate remove the bookmark. - If its new tab page move over. - - Args: - window_index: the index of the browser window to work on. - """ - tab_title = self.GetActiveTabTitle(window_index) # get the page title - url = self.GetActiveTabURL(window_index).spec() # get the page url - if not self.bookmarks_list: - self._AddToListAndBookmark(tab_title, url) # first run bookmark the url - return - elif self._DuplicateBookmarks(tab_title): - self._RemoveFromListAndBookmarkBar(tab_title) - return - elif tab_title == 'New Tab': # new tab page pass over - return - else: - # new bookmark add it to bookmarkbar - self._AddToListAndBookmark(tab_title, url) - return - - def _ReadFileAndLoadInNormalAndIncognito(self): - """Read urls and load them in normal and incognito window. - We load 96 urls only as we can go back and forth 48 times. - Uses time to get different urls in normal and incognito window - The source file is taken from stress folder in /data folder. - """ - # URL source from stress folder in data folder - data_file = os.path.join(self.DataDir(), 'pyauto_private', 'stress', - 'urls_and_titles') - url_data = self.EvalDataFrom(data_file) - urls = url_data.keys() - i = 0 - ticks = int(time.time()) # get the latest time. - for url in urls: - if i <= 96 : # load only 96 urls. - if ticks % 2 == 0: # loading in Incognito and Normal window. - self.NavigateToURL(url) - else: - self.NavigateToURL(url, 1, 0) - else: - break - ticks = ticks - 1 - i += 1 - return - - def _StressTestNavigation(self): - """ This is the method from where various navigations are called. - First we load the urls then call navigete back and forth in - incognito window then in normal window. - """ - self._ReadFileAndLoadInNormalAndIncognito() # Load the urls. - self._BrowserGoBack(1) # Navigate back in incognito window. - self._BrowserGoForward(1) # Navigate forward in incognito window - self._BrowserGoBack(0) # Navigate back in normal window - self._BrowserGoForward(0) # Navigate forward in normal window - - # Preference stress functions - - def _RandomBool(self): - """For any preferences bool value, it takes True or False value. - We are generating random True or False value. - """ - return random.randint(0, 1) == 1 - - def _RandomURL(self): - """Some of preferences take string url, so generating random url here.""" - # Site list - site_list = ['test1.html', 'test2.html','test3.html','test4.html', - 'test5.html', 'test7.html', 'test6.html'] - random_site = random.choice(site_list) - # Returning a url of random site - return self.GetFileURLForPath(os.path.join(self.DataDir(), random_site)) - - def _RandomURLArray(self): - """Returns a list of 10 random URLs.""" - return [self._RandomURL() for _ in range(10)] - - def _RandomInt(self, max_number): - """Some of the preferences takes integer value. - Eg: If there are three options, we generate random - value for any option. - - Arg: - max_number: The number of options that a preference has. - """ - return random.randrange(1, max_number) - - def _RandomDownloadDir(self): - """Returns a random download directory.""" - return random.choice(['dl_dir1', 'dl_dir2', 'dl_dir3', - 'dl_dir4', 'dl_dir5']) - - def _SetPref(self): - """Reads the preferences from file and - sets the preferences to Chrome. - """ - raw_dictionary = self.EvalDataFrom(os.path.join(self.DataDir(), - 'pyauto_private', 'stress', 'pref_dict')) - value_dictionary = {} - - for key, value in raw_dictionary.iteritems(): - if value == 'BOOL': - value_dictionary[key] = self._RandomBool() - elif value == 'STRING_URL': - value_dictionary[key] = self._RandomURL() - elif value == 'ARRAY_URL': - value_dictionary[key] = self._RandomURLArray() - elif value == 'STRING_PATH': - value_dictionary[key] = self._RandomDownloadDir() - elif value[0:3] == 'INT': - # Normally we difine INT datatype with number of options, - # so parsing number of options and selecting any of them - # randomly. - value_dictionary[key] = 1 - max_number = raw_dictionary[key][3:4] - if not max_number == 1: - value_dictionary[key]= self._RandomInt(int(max_number)) - self.SetPrefs(getattr(pyauto,key), value_dictionary[key]) - - return value_dictionary - - # Crash reporting functions - - def _CrashDumpFolder(self): - """Get the breakpad folder. - - Returns: - The full path of the Crash Reports folder. - """ - breakpad_folder = self.GetBrowserInfo()['properties']['DIR_CRASH_DUMPS'] - self.assertTrue(breakpad_folder, 'Cannot figure crash dir') - return breakpad_folder - - def _DeleteDumps(self): - """Delete all the dump files in teh Crash Reports folder.""" - # should be called at the start of stress run - if os.path.exists(self.breakpad_dir): - logging.info('xxxxxxxxxxxxxxxINSIDE DELETE DUMPSxxxxxxxxxxxxxxxxx') - if self.IsMac(): - shutil.rmtree(self.breakpad_dir) - elif self.IsWin(): - files = os.listdir(self.breakpad_dir) - for file in files: - os.remove(file) - - first_crash = os.path.join(os.getcwd(), '1stcrash') - crashes_dir = os.path.join(os.getcwd(), 'crashes') - if (os.path.exists(crashes_dir)): - shutil.rmtree(crashes_dir) - shutil.rmtree(first_crash) - - def _SymbolicateCrashDmp(self, dmp_file, symbols_dir, output_file): - """Generate symbolicated crash report. - - Args: - dmp_file: the dmp file to symbolicate. - symbols_dir: the directory containing the symbols. - output_file: the output file. - - Returns: - Crash report text. - """ - report = '' - if self.IsWin(): - windbg_cmd = [ - os.path.join('C:', 'Program Files', 'Debugging Tools for Windows', - 'windbg.exe'), - '-Q', - '-y', - '\"', - symbols_dir, - '\"', - '-c', - '\".ecxr;k50;.logclose;q\"', - '-logo', - output_file, - '-z', - '\"', - dmp_file, - '\"'] - subprocess.call(windbg_cmd) - # Since we are directly writing the info into output_file, - # we just need to copy that in to report - report = open(output_file, 'r').read() - - elif self.IsMac(): - crash_report = os.path.join(self.DataDir(), 'pyauto_private', 'stress', - 'mac', 'crash_report') - for i in range(5): # crash_report doesn't work sometimes. So we retry - report = test_utils.Shell2( - '%s -S "%s" "%s"' % (crash_report, symbols_dir, dmp_file))[0] - if len(report) < 200: - try_again = 'Try %d. crash_report didn\'t work out. Trying again', i - logging.info(try_again) - else: - break - open(output_file, 'w').write(report) - return report - - def _SaveSymbols(self, symbols_dir, dump_dir=' ', multiple_dumps=True): - """Save the symbolicated files for all crash dumps. - - Args: - symbols_dir: the directory containing the symbols. - dump_dir: Path to the directory holding the crash dump files. - multiple_dumps: True if we are processing multiple dump files, - False if we are processing only the first crash. - """ - if multiple_dumps: - dump_dir = self.breakpad_dir - - if not os.path.isdir(CRASHES): - os.makedirs(CRASHES) - - # This will be sent to the method by the caller. - dmp_files = glob.glob(os.path.join(dump_dir, '*.dmp')) - for dmp_file in dmp_files: - dmp_id = os.path.splitext(os.path.basename(dmp_file))[0] - if multiple_dumps: - report_folder = CRASHES - else: - report_folder = dump_dir - report_fname = os.path.join(report_folder, - '%s.txt' % (dmp_id)) - report = self._SymbolicateCrashDmp(dmp_file, symbols_dir, - report_fname) - if report == '': - logging.info('Crash report is empty.') - # This is for copying the original dumps. - if multiple_dumps: - shutil.copy2(dmp_file, CRASHES) - - def _GetFirstCrashDir(self): - """Get first crash file in the crash folder. - Here we create the 1stcrash directory which holds the - first crash report, which will be attached to the mail. - """ - breakpad_folder = self.breakpad_dir - dump_list = glob.glob1(breakpad_folder,'*.dmp') - dump_list.sort(key=lambda s: os.path.getmtime(os.path.join( - breakpad_folder, s))) - first_crash_file = os.path.join(breakpad_folder, dump_list[0]) - - if not os.path.isdir('1stcrash'): - os.makedirs('1stcrash') - shutil.copy2(first_crash_file, '1stcrash') - first_crash_dir = os.path.join(os.getcwd(), '1stcrash') - return first_crash_dir - - def _GetFirstCrashFile(self): - """Get first crash file in the crash folder.""" - first_crash_dir = os.path.join(os.getcwd(), '1stcrash') - for each in os.listdir(first_crash_dir): - if each.endswith('.txt'): - first_crash_file = each - return os.path.join(first_crash_dir, first_crash_file) - - def _ProcessOnlyFirstCrash(self): - """ Process only the first crash report for email.""" - first_dir = self._GetFirstCrashDir() - self._SaveSymbols(self.symbols_dir, first_dir, False) - - def _GetOSName(self): - """Returns the OS type we are running this script on.""" - os_name = '' - if self.IsMac(): - os_number = commands.getoutput('sw_vers -productVersion | cut -c 1-4') - if os_number == '10.6': - os_name = 'Snow_Leopard' - elif os_number == '10.5': - os_name = 'Leopard' - elif self.IsWin(): - # TODO: Windows team need to find the way to get OS name - os_name = 'Windows' - if platform.version()[0] == '5': - os_name = os_name + '_XP' - else: - os_name = os_name + '_Vista/Win7' - return os_name - - def _ProcessUploadAndEmailCrashes(self): - """Upload the crashes found and email the team about this.""" - logging.info('#########INSIDE _ProcessUploadAndEmailCrashes#########') - try: - build_version = self.chrome_version - self._SaveSymbols(self.symbols_dir) - self._ProcessOnlyFirstCrash() - file_to_attach = self._GetFirstCrashFile() - # removing the crash_txt for now, - # since we are getting UnicodeDecodeError - # crash_txt = open(file_to_attach).read() - except ValueError: - test_utils.SendMail(self.stress_pref['mailing_address'], - self.stress_pref['mailing_address'], - "We don't have build version", - "BROWSER CRASHED, PLEASE CHECK", - self.stress_pref['smtp']) - # Move crash reports and dumps to server - os_name = self._GetOSName() - dest_dir = build_version + '_' + os_name - if (test_utils.Shell2(self.stress_pref['script'] % (CRASHES, dest_dir))): - logging.info('Copy Complete') - upload_dir= self.stress_pref['upload_dir'] + dest_dir - num_crashes = '\n \n Number of Crashes :' + \ - str(len(glob.glob1(self.breakpad_dir, '*.dmp'))) - mail_content = '\n\n Crash Report URL :' + upload_dir + '\n' + \ - num_crashes + '\n\n' # + crash_txt - mail_subject = 'Stress Results :' + os_name + '_' + build_version - # Sending mail with first crash report, # of crashes, location of upload - test_utils.SendMail(self.stress_pref['mailing_address'], - self.stress_pref['mailing_address'], - mail_subject, mail_content, - self.stress_pref['smtp'], file_to_attach) - - def _ReportCrashIfAny(self): - """Check for browser crashes and report.""" - if os.path.isdir(self.breakpad_dir): - listOfDumps = glob.glob(os.path.join(self.breakpad_dir, '*.dmp')) - if len(listOfDumps) > 0: - logging.info('========== INSIDE REPORT CRASH++++++++++++++') - # inform a method to process the dumps - self._ProcessUploadAndEmailCrashes() - - # Test functions - - def _PrefStress(self): - """Stress preferences.""" - default_prefs = self.GetPrefsInfo() - pref_dictionary = self._SetPref() - for key, value in pref_dictionary.iteritems(): - self.assertEqual(value, self.GetPrefsInfo().Prefs( - getattr(pyauto, key))) - - for key, value in pref_dictionary.iteritems(): - self.SetPrefs(getattr(pyauto, key), - default_prefs.Prefs(getattr(pyauto, key))) - - def _NavigationStress(self): - """Run back and forward stress in normal and incognito window.""" - self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW) - self._StressTestNavigation() - - def _DownloadStress(self): - """Run all the Download stress test.""" - org_download_dir = self.GetDownloadDirectory().value() - new_dl_dir = os.path.join(org_download_dir, 'My+Downloads Folder') - os.path.exists(new_dl_dir) and shutil.rmtree(new_dl_dir) - os.makedirs(new_dl_dir) - self.SetPrefs(pyauto.kDownloadDefaultDirectory, new_dl_dir) - self._OpenAndCloseMultipleTabsWithDownloads() - self._OpenAndCloseMultipleWindowsWithDownloads() - self._OpenAndCloseMultipleTabsWithMultipleDownloads() - self._OpenAndCloseMultipleWindowsWithMultipleDownloads() - pyauto_utils.RemovePath(new_dl_dir) # cleanup - self.SetPrefs(pyauto.kDownloadDefaultDirectory, org_download_dir) - - def _PluginStress(self): - """Run all the plugin stress tests.""" - self._OpenAndCloseMultipleTabsWithFlash() - self._OpenAndCloseMultipleWindowsWithFlash() - self._OpenAndCloseMultipleTabsWithMultiplePlugins() - self._OpenAndCloseMultipleWindowsWithMultiplePlugins() - self._KillAndReloadRenderersWithFlash() - self._ToggleAndReloadFlashPlugin() - - def testStress(self): - """Run all the stress tests for 24 hrs.""" - if self.GetBrowserInfo()['properties']['branding'] != 'Google Chrome': - logging.info('This is not a branded build, so stopping the stress') - return 1 - self._DownloadSymbols() - run_number = 1 - start_time = time.time() - while True: - logging.info('run %d...' % run_number) - run_number = run_number + 1 - if (time.time() - start_time) >= 24*60*60: - logging.info('Its been 24hrs, so we break now.') - break - try: - methods = [self._NavigationStress, self._DownloadStress, - self._PluginStress, self._PrefStress] - random.shuffle(methods) - for method in methods: - method() - logging.info('Method %s done' % method) - except KeyboardInterrupt: - logging.info('----------We got a KeyboardInterrupt-----------') - except Exception, error: - logging.info('-------------There was an ERROR---------------') - logging.info(error) - - # Crash Reporting - self._ReportCrashIfAny() - self._DeleteDumps() - - if self.IsMac(): - zombie = 'ps -el | grep Chrom | grep -v grep | grep Z | wc -l' - zombie_count = int(commands.getoutput(zombie)) - if zombie_count > 0: - logging.info('WE HAVE ZOMBIES = %d' % zombie_count) - - -if __name__ == '__main__': - pyauto_functional.Main() |