# Copyright 2014 The Chromium OS 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 is a client side graphics stress test.""" import logging, os, time from autotest_lib.client.bin import test from autotest_lib.client.common_lib.cros import chrome from autotest_lib.client.cros import service_stopper from autotest_lib.client.cros.graphics import graphics_utils BIG_BUCK_BUNNY_VM_URL = 'http://vimeo.com/1084537' BIG_BUCK_BUNNY_YT_URL = 'https://www.youtube.com/watch?v=YE7VzlLtp-4' GMAPS_MTV_URL = 'https://www.google.com/maps/@37.4249155,-122.072205,13z?force=webgl' WEBGL_AQUARIUM_URL = \ 'http://webglsamples.org/aquarium/aquarium.html' WEBGL_BLOB_URL = 'http://webglsamples.org/blob/blob.html' WEBGL_SPIRITBOX_URL = \ 'http://www.webkit.org/blog-files/webgl/SpiritBox.html' VIMEO_COUCHMODE_URL = 'http://vimeo.com/couchmode/' class graphics_Stress(graphics_utils.GraphicsTest): """Graphics stress test.""" version = 1 def setup(self): self.job.setup_dep(['graphics']) def new_chrome(self): browser_args = ['--disable-features=PreferHtmlOverPlugins'] return chrome.Chrome(extra_browser_args=browser_args, extension_paths=self.ext_paths, logged_in=True, autotest_ext=True) def create_window(self, cr, url): cmd = 'chrome.windows.create( { url: \'%s\' } )' % ( url ) cr.autotest_ext.ExecuteJavaScript(cmd) tab = cr.browser.tabs[-1] return tab def open_urls(self, cr, url_list, window=True): """Opens a list of the given urls. @param browser: The Browser object to run the test with. @param url_list: The list of URLs to open. """ tabs = [] first = True cr.browser.tabs[0].WaitForDocumentReadyStateToBeComplete() for url in url_list: tab = None if first: tab = cr.browser.tabs[0] tab.Navigate(url) else: if window: tab = self.create_window(cr, url) else: tab = cr.browser.tabs.New() tab.Navigate(url) logging.info('Opening URL %s', url) first = False tab.WaitForDocumentReadyStateToBeComplete() tab.Activate() tabs.append(tab) return tabs def maps_zoom_cycle(self): """Performs one cycle of the maps zooming.""" # Zoom in on purpose once more than out. for _ in range(1, 11): graphics_utils.press_keys(['KEY_KPPLUS']) time.sleep(0.1) time.sleep(0.5) for _ in range(1, 10): graphics_utils.press_keys(['KEY_KPMINUS']) time.sleep(0.1) time.sleep(0.5) def fifty_spirits_test(self): """ Open 50 tabs of WebGL SpiritBox, and let them run for a while. """ with self.new_chrome() as cr: tabs = self.open_urls(cr, [WEBGL_SPIRITBOX_URL] * 50, window=False) time.sleep(self._test_duration_secs - (time.time() - self._start_time)) for tab in tabs: tab.Close() def blob_aquarium_yt_test(self): """ Open WebGL Blob, WebGL Aquarium, and Youtube video, and switch between tabs, pausing for 2 seconds at each tab, for the duration of the test. """ with self.new_chrome() as cr: tabs = self.open_urls(cr, [WEBGL_BLOB_URL, WEBGL_AQUARIUM_URL, BIG_BUCK_BUNNY_YT_URL], window=False) tabidx = 0 while time.time() - self._start_time < self._test_duration_secs: cr.browser.tabs[tabidx].Activate() tabidx = (tabidx + 1) % len(cr.browser.tabs) time.sleep(2) for tab in tabs: tab.Close() def gmaps_test(self): """ Google Maps test. Load maps and zoom in and out. """ with self.new_chrome() as cr: tabs = self.open_urls(cr, [GMAPS_MTV_URL]) # Click into the map area to achieve focus. time.sleep(5) graphics_utils.click_mouse() # Do the stress test. cycle = 0 while time.time() - self._start_time < self._test_duration_secs: logging.info('Maps zoom cycle %d', cycle) cycle += 1 self.maps_zoom_cycle() for tab in tabs: tab.Close() def restart_test(self): """ Restart UI, excercises X server startup and shutdown and related kernel paths. """ # Ui respawn will reboot us if we restart ui too many times, so stop # it for the duration of the test. stopped_services = service_stopper.ServiceStopper(['ui-respawn']) stopped_services.stop_services() while time.time() - self._start_time < self._test_duration_secs: stopped_ui = service_stopper.ServiceStopper(['ui']) stopped_ui.stop_services() time.sleep(1) stopped_ui.restore_services() stopped_services.restore_services() def tab_open_close_test(self): """ Open 10 tabs of WebGL SpiritBox, close them, repeat. """ with self.new_chrome() as cr: while time.time() - self._start_time < self._test_duration_secs: tabs = self.open_urls(cr, [WEBGL_SPIRITBOX_URL] * 10, window=False) for tab in tabs: tab.Close() time.sleep(1) def yt_vimeo_webgl_test(self): """ Youtube + Vimeo + WebGL, just running at the same time. """ with self.new_chrome() as cr: tabs = self.open_urls(cr, [BIG_BUCK_BUNNY_YT_URL, VIMEO_COUCHMODE_URL, WEBGL_AQUARIUM_URL]) time.sleep(self._test_duration_secs - (time.time() - self._start_time)) for tab in tabs: tab.Close() subtests = { '50spirit' : fifty_spirits_test, 'blob+aquarium+yt' : blob_aquarium_yt_test, 'gmaps' : gmaps_test, 'restart' : restart_test, 'tabopenclose' : tab_open_close_test, 'yt+vimeo+webgl' : yt_vimeo_webgl_test } def run_once(self, test_duration_secs=600, fullscreen=True, subtest='gmaps'): """Finds a browser with telemetry, and runs the test. @param test_duration_secs: The test duration in seconds. @param fullscreen: Whether to run the test in fullscreen. """ self._start_time = time.time() self._test_duration_secs = test_duration_secs self._fullscreeen = fullscreen self.ext_paths = [] if fullscreen: self.ext_paths.append( os.path.join(self.autodir, 'deps', 'graphics', 'graphics_test_extension')) self._test_failure_description = 'Failures_%s' % subtest self.add_failures(subtest) self.subtests[subtest](self) self.remove_failures(subtest)