1# Copyright 2013 The Chromium 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
5from telemetry.core import exceptions
6from telemetry import decorators
7from telemetry.internal.actions import play
8from telemetry.testing import tab_test_case
9
10AUDIO_1_PLAYING_CHECK = 'window.__hasEventCompleted("#audio_1", "playing");'
11VIDEO_1_PLAYING_CHECK = 'window.__hasEventCompleted("#video_1", "playing");'
12VIDEO_1_ENDED_CHECK = 'window.__hasEventCompleted("#video_1", "ended");'
13
14
15class PlayActionTest(tab_test_case.TabTestCase):
16
17  def setUp(self):
18    tab_test_case.TabTestCase.setUp(self)
19    self.Navigate('video_test.html')
20
21  @decorators.Disabled('android', 'linux')  # crbug.com/418577
22  def testPlayWithNoSelector(self):
23    """Tests that with no selector Play action plays first video element."""
24    action = play.PlayAction(playing_event_timeout_in_seconds=5)
25    action.WillRunAction(self._tab)
26    # Both videos not playing before running action.
27    self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
28    self.assertFalse(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
29    action.RunAction(self._tab)
30    # Assert only first video has played.
31    self.assertTrue(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
32    self.assertFalse(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
33
34  @decorators.Disabled('android', 'linux')  # crbug.com/418577
35  def testPlayWithVideoSelector(self):
36    """Tests that Play action plays video element matching selector."""
37    action = play.PlayAction(selector='#video_1',
38                             playing_event_timeout_in_seconds=5)
39    action.WillRunAction(self._tab)
40    # Both videos not playing before running action.
41    self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
42    self.assertFalse(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
43    action.RunAction(self._tab)
44    # Assert only video matching selector has played.
45    self.assertTrue(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
46    self.assertFalse(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
47
48  @decorators.Disabled('android', 'linux')  # crbug.com/418577
49  def testPlayWithAllSelector(self):
50    """Tests that Play action plays all video elements with selector='all'."""
51    action = play.PlayAction(selector='all',
52                             playing_event_timeout_in_seconds=5)
53    action.WillRunAction(self._tab)
54    # Both videos not playing before running action.
55    self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
56    self.assertFalse(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
57    action.RunAction(self._tab)
58    # Assert all media elements played.
59    self.assertTrue(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
60    self.assertTrue(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
61
62  # http://crbug.com/273887
63  @decorators.Disabled('linux')  # crbug.com/418577
64  def testPlayWaitForPlayTimeout(self):
65    """Tests that wait_for_playing timeouts if video does not play."""
66    action = play.PlayAction(selector='#video_1',
67                             playing_event_timeout_in_seconds=5)
68    action.WillRunAction(self._tab)
69    self._tab.EvaluateJavaScript('document.getElementById("video_1").src = ""')
70    self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
71    self.assertRaises(exceptions.TimeoutException, action.RunAction, self._tab)
72
73  @decorators.Disabled('android', 'linux')  # crbug.com/418577
74  def testPlayWaitForEnded(self):
75    """Tests that wait_for_ended waits for video to end."""
76    action = play.PlayAction(selector='#video_1',
77                             ended_event_timeout_in_seconds=5)
78    action.WillRunAction(self._tab)
79    # Assert video not playing before running action.
80    self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
81    self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
82    action.RunAction(self._tab)
83    # Assert video ended.
84    self.assertTrue(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
85
86  @decorators.Disabled('linux')  # crbug.com/418577
87  def testPlayWithoutWaitForEnded(self):
88    """Tests that wait_for_ended waits for video to end."""
89    action = play.PlayAction(selector='#video_1',
90                             ended_event_timeout_in_seconds=0)
91    action.WillRunAction(self._tab)
92    # Assert video not playing before running action.
93    self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
94    self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
95    action.RunAction(self._tab)
96    # Assert video did not end.
97    self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
98
99  @decorators.Disabled('linux')  # crbug.com/418577
100  def testPlayWaitForEndedTimeout(self):
101    """Tests that action raises exception if timeout is reached."""
102    action = play.PlayAction(selector='#video_1',
103                             ended_event_timeout_in_seconds=0.1)
104    action.WillRunAction(self._tab)
105    # Assert video not playing before running action.
106    self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
107    self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
108    self.assertRaises(exceptions.TimeoutException, action.RunAction, self._tab)
109    # Assert video did not end.
110    self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
111