blob: f539f8e2ce2bd6f3979f48beed842e74500e5c6b [file] [log] [blame]
# Copyright (c) 2012 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.
import logging, time
from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib.cros import chrome
from autotest_lib.client.cros import httpd
WAIT_TIMEOUT_S = 5
PLAYBACK_TEST_TIME_S = 5
MEDIA_SUPPORT_AVAILABLE = 'maybe'
class video_VideoSanity(test.test):
"""This test verify the media elements and video sanity.
- verify support for mp4, ogg and webm media.
- verify html5 video playback.
"""
version = 2
def initialize(self):
self._testServer = httpd.HTTPListener(8000, docroot=self.bindir)
self._testServer.run()
def cleanup(self):
if self._testServer:
self._testServer.stop()
def video_current_time(self):
"""Returns video's current playback time.
Returns:
returns the current playback location in seconds (int).
"""
return self.tab.EvaluateJavaScript('testvideo.currentTime')
def video_duration(self):
"""Returns video total length.
Returns:
returns the total video length in seconds (int).
"""
return self.tab.EvaluateJavaScript('testvideo.duration')
def run_video_sanity_test(self, browser):
"""Run the video sanity test.
@param browser: The Browser object to run the test with.
"""
self.tab = browser.tabs[0]
# Verifying <video> support.
video_containers = ('mp4', 'ogg', 'webm')
self.tab.Navigate('http://localhost:8000/video.html')
for container in video_containers:
logging.info('Verifying video support for %s.', container)
js_script = ("document.createElement('video').canPlayType"
"('video/" + container + "')")
status = self.tab.EvaluateJavaScript(js_script)
if status != MEDIA_SUPPORT_AVAILABLE:
raise error.TestError('No media support available for %s.'
% container)
# Waiting for test video to load.
wait_time = 0 # seconds
while float(
self.tab.EvaluateJavaScript('videoCurTime.innerHTML')) < 1.0:
time.sleep(1)
wait_time = wait_time + 1
if wait_time > WAIT_TIMEOUT_S:
raise error.TestError('Video failed to load.')
# Muting the video.
self.tab.EvaluateJavaScript('testvideo.volume=0')
playback_test_count = 0
prev_time_s = -1
duration = self.video_duration()
while True:
current_time_s = self.video_current_time()
if (current_time_s >= duration
or playback_test_count >= PLAYBACK_TEST_TIME_S):
break
if current_time_s <= prev_time_s:
msg = ("Current time is %.3fs while Previous time was %.3fs. "
"Video is not playing" % (current_time_s, prev_time_s))
raise error.TestError(msg)
prev_time_s = current_time_s
playback_test_count += 1
time.sleep(1)
def run_once(self):
boards_to_skip = ['x86-mario', 'x86-zgb']
# TODO(scottz): Remove this when crbug.com/220147 is fixed.
dut_board = utils.get_current_board()
if dut_board in boards_to_skip:
logging.info("Skipping test run on this board.")
return
with chrome.Chrome() as cr:
self.run_video_sanity_test(cr.browser)