1# Copyright (c) 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 5import logging, os 6 7from autotest_lib.client.bin import test, utils 8from autotest_lib.client.common_lib import error 9from autotest_lib.client.common_lib.cros import chrome 10from autotest_lib.client.cros import httpd 11 12 13class video_YouTubeMseEme(test.test): 14 """The main test class for MSE/EME. 15 16 """ 17 18 19 version = 1 20 21 PLAYER_PAGE = 'http://localhost:8000/files/video_YouTubeMseEme.html' 22 TEST_JS = 'files/video_YouTubeMseEme.js' 23 24 POLLING_TIME = 0.1 25 26 27 def init(self, chrome, player_page): 28 """Initialization function for this test class. 29 30 @param chrome: An Autotest Chrome instance. 31 @param player_page: Dummy HTML file to load. 32 33 """ 34 self._testServer = httpd.HTTPListener(8000, docroot=self.bindir) 35 self._testServer.run() 36 37 self.tab = chrome.browser.tabs[0] 38 self.tab.Navigate(player_page) 39 self.tab.WaitForDocumentReadyStateToBeComplete() 40 self.load_javascript(self.TEST_JS) 41 42 43 def _check_event_happened(self, event_name): 44 """A wrapper to check if an event in JS has fired. 45 46 @param event_name: A string to denote the name of the event to check. 47 """ 48 self.tab.WaitForJavaScriptExpression( 49 'window.__eventReporter["%s"] === true;' % event_name, 5) 50 51 52 def load_javascript(self, sub_path): 53 """A wrapper to load a JS file into the current tab. 54 55 @param sub_path: The relative path from the current .py file. 56 57 """ 58 full_path = os.path.join(os.path.dirname(__file__), sub_path) 59 with open(full_path) as f: 60 js = f.read() 61 self.tab.ExecuteJavaScript(js) 62 logging.info('Loaded accompanying .js script.') 63 64 65 def get_test_state(self, test_name, delay_time_sec=5): 66 """A wrapper to check the state of a test in the accompanying JS. 67 68 @param test_name: The name of the test that was ran. 69 @param delay_time_sec: Time to wait before querying the test (float). 70 This is to give the VM some time to schedule the next execution. 71 72 @returns: A boolean value indicating the success of the test. 73 74 """ 75 def _test_passed_condition(test_name): 76 """An inner function to test if the test passed. 77 78 @param test_name: The name of the test that was ran. 79 80 @returns: A boolean indicating if the test passed. 81 82 """ 83 return self.tab.EvaluateJavaScript( 84 'window.__testState["%s"];' % test_name) 85 86 return utils.poll_for_condition( 87 lambda: _test_passed_condition(test_name), 88 timeout=delay_time_sec, 89 desc=test_name) 90 91 92 def test_media_source_presence(self): 93 """Tests for the existence of the Media Source Extension. 94 95 """ 96 self.assert_( 97 self.tab.EvaluateJavaScript( 98 'window.WebKitMediaSource !== undefined'), 99 msg='test_media_source_presence failed.') 100 101 102 def test_attach_source(self): 103 """Tests if attaching a the MediaSource to the video tag is successful. 104 105 """ 106 self.tab.ExecuteJavaScript('window.__testAttach();') 107 self._check_event_happened('sourceopen') 108 109 110 def test_add_source_buffer(self): 111 """Tests adding the source buffer to the MediaSource is successful. 112 113 """ 114 self.tab.ExecuteJavaScript('window.__testAddSourceBuffer();') 115 self.assert_( 116 self.get_test_state('addSourceBuffer'), 117 msg='test_add_source_buffer failed.') 118 119 120 def test_add_supported_formats(self): 121 """Tests adding supported formats to the MediaSource is successful. 122 123 """ 124 self.tab.ExecuteJavaScript('window.__testAddSupportedFormats();') 125 self.assert_( 126 self.get_test_state('addSupportedFormats'), 127 msg='test_add_supported_formats failed.') 128 129 130 def test_add_source_buffer_exception(self): 131 """Tests adding the source buffer to an uninitialized MediaSource. 132 133 """ 134 self.tab.ExecuteJavaScript( 135 'window.__testAddSourceBufferException();') 136 self.assert_( 137 self.get_test_state('addSourceBufferException'), 138 msg='test_add_source_buffer_exception failed.') 139 140 141 def test_initial_video_state(self): 142 """Tests the initial states of the video object. 143 144 """ 145 self.tab.ExecuteJavaScript('window.__testInitialVideoState();') 146 self.assert_( 147 self.get_test_state('initialVideoState'), 148 msg='test_initial_video_state failed.') 149 150 151 def test_initial_media_source_state(self): 152 """Tests the initial states of the MediaSource object. 153 154 """ 155 self.tab.ExecuteJavaScript('window.__testInitialMSState();') 156 self.assert_( 157 self.get_test_state('initialMSState'), 158 msg='test_initial_media_source_state failed.') 159 160 161 def test_append(self): 162 """Tests appending audio and video streams. 163 164 """ 165 self.tab.ExecuteJavaScript('window.__testAppend_audio();') 166 self.assert_( 167 self.get_test_state('append_audio'), 168 msg='test_append failed on audio append.') 169 170 self.tab.ExecuteJavaScript('window.__testAppend_video();') 171 self.assert_( 172 self.get_test_state('append_video'), 173 msg='test_append failed on video append.') 174 175 176 def test_append_abort(self): 177 """Tests appending followed by aborting audio and video streams. 178 179 """ 180 self.tab.ExecuteJavaScript('window.__testAppendAbort_audio();') 181 self.assert_( 182 self.get_test_state('appendAbort_audio'), 183 msg='test_append_abort failed on audio.') 184 185 self.tab.ExecuteJavaScript('window.__testAppendAbort_video();') 186 self.assert_( 187 self.get_test_state('appendAbort_video'), 188 msg='test_append_abort failed on video.') 189 190 191 def test_append_timestamp_offset(self): 192 """Tests appending with a timestamp offset. 193 194 """ 195 self.tab.ExecuteJavaScript( 196 'window.__testAppendTimestampOffset_audio();') 197 self.assert_( 198 self.get_test_state('appendTimestampOffset_audio'), 199 msg='test_append_timestamp_offset failed on audio.') 200 201 self.tab.ExecuteJavaScript( 202 'window.__testAppendTimestampOffset_video();') 203 self.assert_( 204 self.get_test_state('appendTimestampOffset_video'), 205 msg='test_append_timestamp_offset failed on video.') 206 207 208 def test_duration(self): 209 """Tests if it's possible to set the duration on the Media Source. 210 211 """ 212 self.tab.ExecuteJavaScript('window.__testDuration();') 213 self.assert_( 214 self.get_test_state('duration'), 215 msg='test_duration failed.') 216 217 218 def test_duration_after_append(self): 219 """Tests if the duration changes after appending to the source buffer. 220 221 """ 222 self.tab.ExecuteJavaScript('window.__testDurationAfterAppend_audio();') 223 self.assert_( 224 self.get_test_state('durationAfterAppend_audio'), 225 msg='test_duration_after_append failed on audio.') 226 227 self.tab.ExecuteJavaScript('window.__testDurationAfterAppend_video();') 228 self.assert_( 229 self.get_test_state('durationAfterAppend_video'), 230 msg='test_duration_after_append failed on video.') 231 232 233 def test_source_remove(self): 234 """Tests if removing the source buffers works correctly. 235 236 """ 237 self.tab.ExecuteJavaScript('window.__testSourceRemove();') 238 self.assert_( 239 self.get_test_state('sourceRemove'), 240 msg='test_source_remove failed.') 241 242 243 def test_can_play_webm(self): 244 """Tests if it's possible to play WebM content. 245 246 """ 247 self.assert_( 248 self.tab.EvaluateJavaScript('window.__testCanPlayWebM();'), 249 msg='test_can_play_webm failed.') 250 251 252 def test_can_play_clear_key(self): 253 """Tests if it's possible to play ClearKey content. 254 255 """ 256 self.assert_( 257 self.tab.EvaluateJavaScript('window.__testCanPlayClearKey();'), 258 msg='test_can_play_clear_key failed.') 259 260 261 def test_can_not_play_play_ready(self): 262 """Tests if it's impossible to play PlayReady. 263 264 """ 265 self.assert_( 266 self.tab.EvaluateJavaScript( 267 'window.__testCanNotPlayPlayReady();'), 268 msg='test_can_not_play_play_ready failed.') 269 270 271 def test_can_play_widevine(self): 272 """Tests if it's possible to play Widevine content. 273 274 """ 275 self.assert_( 276 self.tab.EvaluateJavaScript('window.__testCanPlayWidevine();'), 277 msg='test_can_play_widevine failed.') 278 279 280 def run_once(self, subtest_name): 281 with chrome.Chrome() as cr: 282 self.init(cr, self.PLAYER_PAGE) 283 284 try: 285 # The control file passes in a test name, which is the name of 286 # the test to run, prepended with 'test_'. 287 function_to_call = getattr(self, 'test_' + subtest_name) 288 function_to_call() 289 except AttributeError: 290 # Just in case the input test name was mistyped in the control 291 # file. 292 raise error.TestFail('No function named: test_' + subtest_name) 293