15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Basic playback test.  Checks playback, seek, and replay based on events.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)This test uses the bear videos from the test matrix in h264, vp8, and theora
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)formats.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import logging
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import pyauto_media
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import pyauto
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# HTML test path; relative to src/chrome/test/data.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_TEST_HTML_PATH = os.path.join('media', 'html', 'media_basic_playback.html')
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Test videos to play.  TODO(dalecurtis): Convert to text matrix parser when we
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# have more test videos in the matrix.  Code already written, see patch here:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# https://chromiumcodereview.appspot.com/9290008/#ps12
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_TEST_VIDEOS = [
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pyauto.PyUITest.GetFileURLForContentDataPath('media', name)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for name in ['bear.mp4', 'bear.ogv', 'bear.webm', 'bear_silent.mp4',
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 'bear_silent.ogv', 'bear_silent.webm']]
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Expected events for the first iteration and every iteration thereafter.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_EXPECTED_EVENTS_0 = [('ended', 2), ('playing', 2), ('seeked', 1),
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      ('suspend', 1)]
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_EXPECTED_EVENTS_n = [('abort', 1), ('emptied', 1)] + _EXPECTED_EVENTS_0
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MediaBasicPlaybackTest(pyauto.PyUITest):
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """PyAuto test container.  See file doc string for more information."""
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testBasicPlaybackMatrix(self):
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Launches HTML test which plays each video until end, seeks, and replays.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Specifically ensures that after the above sequence of events, the following
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    are true:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        1. The first video has only 2x playing, 2x ended, and 1x seeked events.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        2. Each subsequent video additionally has 1x abort and 1x emptied due to
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           switching of the src attribute.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        3. video.currentTime == video.duration for each video.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    See the HTML file at _TEST_HTML_PATH for more information.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.NavigateToURL(self.GetFileURLForDataPath(_TEST_HTML_PATH))
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for i, media in enumerate(_TEST_VIDEOS):
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logging.debug('Running basic playback test for %s', media)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Block until the test finishes and notifies us.  Upon return the value of
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # video.currentTime == video.duration is provided.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      try:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertTrue(self.ExecuteJavascript("startTest('%s');" % media))
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # PyAuto has trouble with arrays, so convert to string prior to request.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        events = self.GetDOMValue("events.join(',')").split(',')
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        counts = [(item, events.count(item)) for item in sorted(set(events))]
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # The first loop will not have the abort and emptied events triggered by
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # changing the video src.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (i == 0):
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          self.assertEqual(counts, _EXPECTED_EVENTS_0)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else:
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          self.assertEqual(counts, _EXPECTED_EVENTS_n)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      except:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        logging.debug(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'Test failed with events: %s', self.GetDOMValue("events.join(',')"))
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        raise
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pyauto_media.Main()
79