| # 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 int(self.tab.EvaluateJavaScript('testvideo.currentTime')) |
| |
| |
| def video_duration(self): |
| """Returns video total length. |
| |
| Returns: |
| returns the total video length in seconds (int). |
| |
| """ |
| return int(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.New() |
| # 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') |
| |
| # Verifying video playback. |
| playback = 0 # seconds |
| prev_playback = 0 |
| while (self.video_current_time() < self.video_duration() |
| and playback < PLAYBACK_TEST_TIME_S): |
| if self.video_current_time() <= prev_playback: |
| raise error.TestError('Video is not playing.') |
| prev_playback = self.video_current_time() |
| time.sleep(1) |
| playback = playback + 1 |
| |
| |
| def run_once(self): |
| boards = ['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: |
| raise error.TestNAError('This test is not available on %s' % |
| dut_board) |
| with chrome.Chrome() as cr: |
| self.run_video_sanity_test(cr.browser) |