Home | History | Annotate | Download | only in video_VideoSanity
      1 # Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import logging, time
      6 
      7 from autotest_lib.client.bin import test, utils
      8 from autotest_lib.client.common_lib import error
      9 from autotest_lib.client.common_lib.cros import chrome
     10 from autotest_lib.client.cros import httpd
     11 
     12 
     13 WAIT_TIMEOUT_S = 5
     14 PLAYBACK_TEST_TIME_S = 5
     15 MEDIA_SUPPORT_AVAILABLE = 'maybe'
     16 
     17 
     18 class video_VideoSanity(test.test):
     19     """This test verify the media elements and video sanity.
     20 
     21     - verify support for mp4, ogg and webm media.
     22     - verify html5 video playback.
     23 
     24     """
     25     version = 2
     26 
     27 
     28     def initialize(self):
     29         self._testServer = httpd.HTTPListener(8000, docroot=self.bindir)
     30         self._testServer.run()
     31 
     32 
     33     def cleanup(self):
     34         if self._testServer:
     35             self._testServer.stop()
     36 
     37 
     38     def video_current_time(self):
     39         """Returns video's current playback time.
     40 
     41         Returns:
     42             returns the current playback location in seconds (int).
     43 
     44         """
     45         return self.tab.EvaluateJavaScript('testvideo.currentTime')
     46 
     47 
     48     def video_duration(self):
     49         """Returns video total length.
     50 
     51         Returns:
     52             returns the total video length in seconds (int).
     53 
     54         """
     55         return self.tab.EvaluateJavaScript('testvideo.duration')
     56 
     57 
     58     def run_video_sanity_test(self, browser):
     59         """Run the video sanity test.
     60 
     61         @param browser: The Browser object to run the test with.
     62 
     63         """
     64         self.tab = browser.tabs[0]
     65         # Verifying <video> support.
     66         video_containers = ('mp4', 'ogg', 'webm')
     67         self.tab.Navigate('http://localhost:8000/video.html')
     68         for container in video_containers:
     69             logging.info('Verifying video support for %s.', container)
     70             js_script = ("document.createElement('video').canPlayType"
     71                          "('video/" + container + "')")
     72             status = self.tab.EvaluateJavaScript(js_script)
     73             if status != MEDIA_SUPPORT_AVAILABLE:
     74                 raise error.TestError('No media support available for %s.'
     75                                        % container)
     76         # Waiting for test video to load.
     77         wait_time = 0 # seconds
     78         current_time_js = ("typeof videoCurTime != 'undefined' ? "
     79                            "videoCurTime.innerHTML : 0")
     80         while float(self.tab.EvaluateJavaScript(current_time_js)) < 1.0:
     81             time.sleep(1)
     82             wait_time = wait_time + 1
     83             if wait_time > WAIT_TIMEOUT_S:
     84                 raise error.TestError('Video failed to load.')
     85         # Muting the video.
     86         self.tab.EvaluateJavaScript('testvideo.volume=0')
     87 
     88 
     89         playback_test_count = 0
     90         prev_time_s = -1
     91         duration = self.video_duration()
     92 
     93         while True:
     94             current_time_s = self.video_current_time()
     95 
     96             if (current_time_s >= duration
     97                 or playback_test_count >= PLAYBACK_TEST_TIME_S):
     98                 break
     99 
    100             if current_time_s <= prev_time_s:
    101                 msg = ("Current time is %.3fs while Previous time was %.3fs. "
    102                        "Video is not playing" % (current_time_s, prev_time_s))
    103                 raise error.TestError(msg)
    104 
    105             prev_time_s = current_time_s
    106             playback_test_count += 1
    107             time.sleep(1)
    108 
    109 
    110     def run_once(self):
    111         boards_to_skip = ['x86-mario', 'x86-zgb']
    112         # TODO(scottz): Remove this when crbug.com/220147 is fixed.
    113         dut_board = utils.get_current_board()
    114         if dut_board in boards_to_skip:
    115             logging.info("Skipping test run on this board.")
    116             return
    117         with chrome.Chrome() as cr:
    118             self.run_video_sanity_test(cr.browser)
    119