| OLD | NEW |
| (Empty) |
| 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 import logging | |
| 7 import os | |
| 8 import time | |
| 9 | |
| 10 import pyauto_functional | |
| 11 import pyauto | |
| 12 import test_utils | |
| 13 | |
| 14 | |
| 15 class NetflixTestHelper(): | |
| 16 """Helper functions for Netflix tests. | |
| 17 | |
| 18 For sample usage, look at class NetflixTest. | |
| 19 """ | |
| 20 | |
| 21 # Netflix player states. | |
| 22 IS_GUEST_MODE_ERROR = '0' | |
| 23 IS_PLAYING = '4' | |
| 24 | |
| 25 TITLE_HOMEPAGE = 'http://movies.netflix.com/WiHome' | |
| 26 SIGNOUT_PAGE = 'https://account.netflix.com/Logout' | |
| 27 # 30 Rock. | |
| 28 VIDEO_URL = 'https://movies.netflix.com/WiPlayer?movieid=70136124' | |
| 29 ALT_VIDEO_URL = 'https://movies.netflix.com/WiPlayer?movieid=70133713' | |
| 30 _pyauto = None | |
| 31 | |
| 32 def __init__(self, pyauto): | |
| 33 self._pyauto = pyauto | |
| 34 | |
| 35 def _IsNetflixPluginEnabled(self): | |
| 36 """Determine Netflix plugin availability and its state.""" | |
| 37 return [x for x in self._pyauto.GetPluginsInfo().Plugins() \ | |
| 38 if x['name'] == 'Netflix' and x['enabled']] | |
| 39 | |
| 40 def _LoginToNetflix(self): | |
| 41 """Login to Netflix.""" | |
| 42 credentials = self._pyauto.GetPrivateInfo()['test_netflix_acct'] | |
| 43 board_name = self._pyauto.ChromeOSBoard() | |
| 44 assert credentials.get(board_name), \ | |
| 45 'No netflix credentials for %s.' % board_name | |
| 46 self._pyauto.NavigateToURL(credentials['login_url']) | |
| 47 login_js = """ | |
| 48 document.getElementById('email').value='%s'; | |
| 49 document.getElementById('password').value='%s'; | |
| 50 window.domAutomationController.send('ok'); | |
| 51 """ % (credentials[board_name], credentials['password']) | |
| 52 self._pyauto.assertEqual(self._pyauto.ExecuteJavascript(login_js), 'ok', | |
| 53 msg='Failed to set login credentials.') | |
| 54 self._pyauto.assertTrue(self._pyauto.SubmitForm('login-form'), | |
| 55 msg='Login to Netflix failed. We think this is an authetication ' | |
| 56 'problem from the Netflix side. Sometimes we also see this while ' | |
| 57 'login in manually.') | |
| 58 | |
| 59 def _GetVideoDroppedFrames(self, tab_index=0, windex=0): | |
| 60 """Returns total Netflix video dropped frames.""" | |
| 61 js = """ | |
| 62 var frames = nrdp.video.droppedFrames; | |
| 63 window.domAutomationController.send(frames + ''); | |
| 64 """ | |
| 65 return int(self._pyauto.ExecuteJavascript(js, tab_index=tab_index, | |
| 66 windex=windex)) | |
| 67 | |
| 68 def _GetVideoFrames(self, tab_index=0, windex=0): | |
| 69 """Returns Netflix video total frames.""" | |
| 70 js = """ | |
| 71 var frames = nrdp.video.totalFrames; | |
| 72 window.domAutomationController.send(frames + ''); | |
| 73 """ | |
| 74 return int(self._pyauto.ExecuteJavascript(js, tab_index=tab_index, | |
| 75 windex=windex)) | |
| 76 | |
| 77 def _HandleInfobars(self, err_msg): | |
| 78 """Manage infobars that come up during the test.""" | |
| 79 def _HandleNetflixInfobar(): | |
| 80 tab_info = self._pyauto.GetBrowserInfo()['windows'][0]['tabs'][0] | |
| 81 infobars = tab_info['infobars'] | |
| 82 index = 0 | |
| 83 for infobar in infobars: | |
| 84 if 'netflix' in infobar['text']: | |
| 85 # After storage infobar pops up, clicking the Ok button immediately | |
| 86 # returns the Storage error on faster machines like Stumpy/Lumpy so | |
| 87 # adding a delay of 1 second here. | |
| 88 time.sleep(1) | |
| 89 self._pyauto.PerformActionOnInfobar('accept', infobar_index=index) | |
| 90 return True | |
| 91 index = index + 1 | |
| 92 return False | |
| 93 self._pyauto.assertTrue(self._pyauto.WaitUntil(_HandleNetflixInfobar), | |
| 94 msg=err_msg) | |
| 95 | |
| 96 def CurrentPlaybackTime(self): | |
| 97 """Returns the current playback time in seconds.""" | |
| 98 time = self._pyauto.ExecuteJavascript(""" | |
| 99 time = nrdp.video.currentTime; | |
| 100 window.domAutomationController.send(time + ''); | |
| 101 """) | |
| 102 return int(float(time)) | |
| 103 | |
| 104 def SignOut(self): | |
| 105 """Sign out from Netflix Login.""" | |
| 106 self._pyauto.NavigateToURL(self.SIGNOUT_PAGE) | |
| 107 | |
| 108 def LoginAndStartPlaying(self): | |
| 109 """Login and start playing the video.""" | |
| 110 self._pyauto.assertTrue(self._pyauto._IsNetflixPluginEnabled(), | |
| 111 msg='Netflix plugin is disabled or not available.') | |
| 112 self._pyauto._LoginToNetflix() | |
| 113 self._pyauto.assertTrue(self._pyauto.WaitUntil( | |
| 114 lambda: self._pyauto.GetActiveTabURL().spec(), | |
| 115 expect_retval=self.TITLE_HOMEPAGE), | |
| 116 msg='Login to Netflix failed.') | |
| 117 self._pyauto.NavigateToURL(self.VIDEO_URL) | |
| 118 self._pyauto._HandleInfobars(err_msg='Netflix infobar did not show up') | |
| 119 | |
| 120 def CheckNetflixPlaying(self, expected_result, error_msg): | |
| 121 """Check if Netflix is playing the video or not. | |
| 122 | |
| 123 Args: | |
| 124 expected_result: expected return value from Netflix player. | |
| 125 error_msg: If expected value isn't matching, error message to throw. | |
| 126 """ | |
| 127 self._pyauto.assertTrue(self._pyauto.WaitUntil( | |
| 128 lambda: self._pyauto.ExecuteJavascript(""" | |
| 129 if (typeof nrdp == 'undefined') { | |
| 130 window.domAutomationController.send('not ready'); | |
| 131 } | |
| 132 player_status = nrdp.video.readyState; | |
| 133 window.domAutomationController.send(player_status + ''); | |
| 134 """), expect_retval=expected_result), | |
| 135 msg=error_msg) | |
| 136 | |
| 137 | |
| 138 class NetflixTest(pyauto.PyUITest, NetflixTestHelper): | |
| 139 """Test case for Netflix player.""" | |
| 140 | |
| 141 def __init__(self, methodName='runTest', **kwargs): | |
| 142 pyauto.PyUITest.__init__(self, methodName, **kwargs) | |
| 143 NetflixTestHelper.__init__(self, self) | |
| 144 | |
| 145 def ShouldAutoLogin(self): | |
| 146 return False | |
| 147 | |
| 148 def _Login(self): | |
| 149 """Perform login""" | |
| 150 credentials = self.GetPrivateInfo()['test_google_account'] | |
| 151 self.Login(credentials['username'], credentials['password']) | |
| 152 logging.info('Logged in as %s' % credentials['username']) | |
| 153 login_info = self.GetLoginInfo() | |
| 154 self.assertTrue(login_info['is_logged_in'], msg='Login failed.') | |
| 155 self.assertFalse(login_info['is_guest'], | |
| 156 msg='Should not be logged in as guest.') | |
| 157 | |
| 158 def setUp(self): | |
| 159 assert os.geteuid() == 0, 'Run test as root since we might need to logout' | |
| 160 pyauto.PyUITest.setUp(self) | |
| 161 if self.GetLoginInfo()['is_logged_in']: | |
| 162 self.Logout() | |
| 163 self._Login() | |
| 164 | |
| 165 def tearDown(self): | |
| 166 self.SignOut() | |
| 167 pyauto.PyUITest.tearDown(self) | |
| 168 | |
| 169 def testPlayerLoadsAndPlays(self): | |
| 170 """Test that Netflix player loads and plays the title.""" | |
| 171 self.LoginAndStartPlaying() | |
| 172 self._HandleInfobars(err_msg='Netflix plugin access infobar did not show up'
) | |
| 173 self.CheckNetflixPlaying(self.IS_PLAYING, | |
| 174 'Player did not start playing the title.') | |
| 175 | |
| 176 def testMultiplePlayback(self): | |
| 177 """Test that playing two titles, Netflix returns multiple play error.""" | |
| 178 self.LoginAndStartPlaying() | |
| 179 self._HandleInfobars(err_msg='Netflix plugin access infobar did not show up'
) | |
| 180 self.CheckNetflixPlaying(self.IS_PLAYING, | |
| 181 'Player did not start playing the title.') | |
| 182 self.AppendTab(self.ALT_VIDEO_URL) | |
| 183 self.assertTrue('Multiple Play Error' in self.GetTabContents(), | |
| 184 msg='Multiple Play Error is not found on the page.') | |
| 185 | |
| 186 def testPlaying(self): | |
| 187 """Test that title playing progresses.""" | |
| 188 self.LoginAndStartPlaying() | |
| 189 self._HandleInfobars(err_msg='Netflix plugin access infobar did not show up'
) | |
| 190 self.CheckNetflixPlaying(self.IS_PLAYING, | |
| 191 'Player did not start playing the title.') | |
| 192 title_length = self.ExecuteJavascript(""" | |
| 193 time = nrdp.video.duration; | |
| 194 window.domAutomationController.send(time + ''); | |
| 195 """) | |
| 196 title_length = int(float(title_length)) | |
| 197 prev_time = 0 | |
| 198 current_time = 0 | |
| 199 count = 0 | |
| 200 while current_time < title_length: | |
| 201 # We want to test playing only for ten seconds. | |
| 202 count = count + 1 | |
| 203 if count == 10: | |
| 204 break | |
| 205 current_time = self.CurrentPlaybackTime() | |
| 206 self.assertTrue(prev_time <= current_time, | |
| 207 msg='Prev playing time %s is greater than current time %s.' | |
| 208 % (prev_time, current_time)) | |
| 209 prev_time = current_time | |
| 210 # play video for some time | |
| 211 time.sleep(1) | |
| 212 # In case player doesn't start playing at all, above while loop may | |
| 213 # still pass. So re-verifying and assuming that player did play something | |
| 214 # during last 10 seconds. | |
| 215 self.assertTrue(current_time > 0, | |
| 216 msg='Netflix player did not start playing.') | |
| 217 | |
| 218 | |
| 219 class NetflixGuestModeTest(pyauto.PyUITest, NetflixTestHelper): | |
| 220 """Netflix in guest mode.""" | |
| 221 | |
| 222 def __init__(self, methodName='runTest', **kwargs): | |
| 223 pyauto.PyUITest.__init__(self, methodName, **kwargs) | |
| 224 NetflixTestHelper.__init__(self, self) | |
| 225 | |
| 226 def setUp(self): | |
| 227 assert os.geteuid() == 0, 'Run test as root since we might need to logout' | |
| 228 pyauto.PyUITest.setUp(self) | |
| 229 if self.GetLoginInfo()['is_logged_in']: | |
| 230 self.Logout() | |
| 231 self.LoginAsGuest() | |
| 232 login_info = self.GetLoginInfo() | |
| 233 self.assertTrue(login_info['is_logged_in'], msg='Not logged in at all.') | |
| 234 self.assertTrue(login_info['is_guest'], msg='Not logged in as guest.') | |
| 235 | |
| 236 def ShouldAutoLogin(self): | |
| 237 return False | |
| 238 | |
| 239 def tearDown(self): | |
| 240 self.AppendTab(self.SIGNOUT_PAGE) | |
| 241 self.Logout() | |
| 242 pyauto.PyUITest.tearDown(self) | |
| 243 | |
| 244 def testGuestMode(self): | |
| 245 """Test that Netflix doesn't play in guest mode login.""" | |
| 246 self.LoginAndStartPlaying() | |
| 247 self.CheckNetflixPlaying( | |
| 248 self.IS_GUEST_MODE_ERROR, | |
| 249 'Netflix player did not return a Guest mode error.') | |
| 250 # crosbug.com/p/14009 | |
| 251 self.assertTrue('Netflix Video Player Unavailable' in self.GetTabContents(), | |
| 252 msg='Guest Mode error is not found on the page.') | |
| 253 | |
| 254 | |
| 255 if __name__ == '__main__': | |
| 256 pyauto_functional.Main() | |
| OLD | NEW |