Home | History | Annotate | Download | only in media
      1 #!/usr/bin/env python
      2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 
      6 """Basic playback test.  Checks playback, seek, and replay based on events.
      7 
      8 This test uses the bear videos from the test matrix in h264, vp8, and theora
      9 formats.
     10 """
     11 import logging
     12 import os
     13 
     14 import pyauto_media
     15 import pyauto
     16 
     17 
     18 # HTML test path; relative to src/chrome/test/data.
     19 _TEST_HTML_PATH = os.path.join('media', 'html', 'media_basic_playback.html')
     20 
     21 # Test videos to play.  TODO(dalecurtis): Convert to text matrix parser when we
     22 # have more test videos in the matrix.  Code already written, see patch here:
     23 # https://chromiumcodereview.appspot.com/9290008/#ps12
     24 _TEST_VIDEOS = [
     25     pyauto.PyUITest.GetFileURLForContentDataPath('media', name)
     26     for name in ['bear.mp4', 'bear.ogv', 'bear.webm', 'bear_silent.mp4',
     27                  'bear_silent.ogv', 'bear_silent.webm']]
     28 
     29 # Expected events for the first iteration and every iteration thereafter.
     30 _EXPECTED_EVENTS_0 = [('ended', 2), ('playing', 2), ('seeked', 1),
     31                       ('suspend', 1)]
     32 _EXPECTED_EVENTS_n = [('abort', 1), ('emptied', 1)] + _EXPECTED_EVENTS_0
     33 
     34 
     35 class MediaBasicPlaybackTest(pyauto.PyUITest):
     36   """PyAuto test container.  See file doc string for more information."""
     37 
     38   def testBasicPlaybackMatrix(self):
     39     """Launches HTML test which plays each video until end, seeks, and replays.
     40 
     41     Specifically ensures that after the above sequence of events, the following
     42     are true:
     43 
     44         1. The first video has only 2x playing, 2x ended, and 1x seeked events.
     45         2. Each subsequent video additionally has 1x abort and 1x emptied due to
     46            switching of the src attribute.
     47         3. video.currentTime == video.duration for each video.
     48 
     49     See the HTML file at _TEST_HTML_PATH for more information.
     50     """
     51     self.NavigateToURL(self.GetFileURLForDataPath(_TEST_HTML_PATH))
     52 
     53     for i, media in enumerate(_TEST_VIDEOS):
     54       logging.debug('Running basic playback test for %s', media)
     55 
     56       # Block until the test finishes and notifies us.  Upon return the value of
     57       # video.currentTime == video.duration is provided.
     58       try:
     59         self.assertTrue(self.ExecuteJavascript("startTest('%s');" % media))
     60 
     61         # PyAuto has trouble with arrays, so convert to string prior to request.
     62         events = self.GetDOMValue("events.join(',')").split(',')
     63         counts = [(item, events.count(item)) for item in sorted(set(events))]
     64 
     65         # The first loop will not have the abort and emptied events triggered by
     66         # changing the video src.
     67         if (i == 0):
     68           self.assertEqual(counts, _EXPECTED_EVENTS_0)
     69         else:
     70           self.assertEqual(counts, _EXPECTED_EVENTS_n)
     71       except:
     72         logging.debug(
     73             'Test failed with events: %s', self.GetDOMValue("events.join(',')"))
     74         raise
     75 
     76 
     77 if __name__ == '__main__':
     78   pyauto_media.Main()
     79