213 lines
7.3 KiB
Python
213 lines
7.3 KiB
Python
# 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)
|
|
|