blob: 4951b9b7b4a7b4895d675b4ed19b5770d72db038 [file] [log] [blame]
#!/usr/bin/env python
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import logging
import os
import time
import pyauto_functional
import pyauto
import test_utils
class NetflixTestHelper():
"""Helper functions for Netflix tests.
For sample usage, look at class NetflixTest.
"""
# Netflix player states.
IS_GUEST_MODE_ERROR = '0'
IS_PLAYING = '4'
TITLE_HOMEPAGE = 'http://movies.netflix.com/WiHome'
SIGNOUT_PAGE = 'https://account.netflix.com/Logout'
# 30 Rock.
VIDEO_URL = 'https://movies.netflix.com/WiPlayer?movieid=70136124'
ALT_VIDEO_URL = 'https://movies.netflix.com/WiPlayer?movieid=70133713'
_pyauto = None
def __init__(self, pyauto):
self._pyauto = pyauto
def _IsNetflixPluginEnabled(self):
"""Determine Netflix plugin availability and its state."""
return [x for x in self._pyauto.GetPluginsInfo().Plugins() \
if x['name'] == 'Netflix' and x['enabled']]
def _LoginToNetflix(self):
"""Login to Netflix."""
credentials = self._pyauto.GetPrivateInfo()['test_netflix_acct']
board_name = self._pyauto.ChromeOSBoard()
assert credentials.get(board_name), \
'No netflix credentials for %s.' % board_name
self._pyauto.NavigateToURL(credentials['login_url'])
login_js = """
document.getElementById('email').value='%s';
document.getElementById('password').value='%s';
window.domAutomationController.send('ok');
""" % (credentials[board_name], credentials['password'])
self._pyauto.assertEqual(self._pyauto.ExecuteJavascript(login_js), 'ok',
msg='Failed to set login credentials.')
self._pyauto.assertTrue(self._pyauto.SubmitForm('login-form'),
msg='Login to Netflix failed. We think this is an authetication '
'problem from the Netflix side. Sometimes we also see this while '
'login in manually.')
def _GetVideoDroppedFrames(self, tab_index=0, windex=0):
"""Returns total Netflix video dropped frames."""
js = """
var frames = nrdp.video.droppedFrames;
window.domAutomationController.send(frames + '');
"""
return int(self._pyauto.ExecuteJavascript(js, tab_index=tab_index,
windex=windex))
def _GetVideoFrames(self, tab_index=0, windex=0):
"""Returns Netflix video total frames."""
js = """
var frames = nrdp.video.totalFrames;
window.domAutomationController.send(frames + '');
"""
return int(self._pyauto.ExecuteJavascript(js, tab_index=tab_index,
windex=windex))
def _HandleInfobars(self, err_msg):
"""Manage infobars that come up during the test."""
def _HandleNetflixInfobar():
tab_info = self._pyauto.GetBrowserInfo()['windows'][0]['tabs'][0]
infobars = tab_info['infobars']
index = 0
for infobar in infobars:
if 'netflix' in infobar['text']:
# After storage infobar pops up, clicking the Ok button immediately
# returns the Storage error on faster machines like Stumpy/Lumpy so
# adding a delay of 1 second here.
time.sleep(1)
self._pyauto.PerformActionOnInfobar('accept', infobar_index=index)
return True
index = index + 1
return False
self._pyauto.assertTrue(self._pyauto.WaitUntil(_HandleNetflixInfobar),
msg=err_msg)
def CurrentPlaybackTime(self):
"""Returns the current playback time in seconds."""
time = self._pyauto.ExecuteJavascript("""
time = nrdp.video.currentTime;
window.domAutomationController.send(time + '');
""")
return int(float(time))
def SignOut(self):
"""Sign out from Netflix Login."""
self._pyauto.NavigateToURL(self.SIGNOUT_PAGE)
def LoginAndStartPlaying(self):
"""Login and start playing the video."""
self._pyauto.assertTrue(self._pyauto._IsNetflixPluginEnabled(),
msg='Netflix plugin is disabled or not available.')
self._pyauto._LoginToNetflix()
self._pyauto.assertTrue(self._pyauto.WaitUntil(
lambda: self._pyauto.GetActiveTabURL().spec(),
expect_retval=self.TITLE_HOMEPAGE),
msg='Login to Netflix failed.')
self._pyauto.NavigateToURL(self.VIDEO_URL)
self._pyauto._HandleInfobars(err_msg='Netflix infobar did not show up')
def CheckNetflixPlaying(self, expected_result, error_msg):
"""Check if Netflix is playing the video or not.
Args:
expected_result: expected return value from Netflix player.
error_msg: If expected value isn't matching, error message to throw.
"""
self._pyauto.assertTrue(self._pyauto.WaitUntil(
lambda: self._pyauto.ExecuteJavascript("""
if (typeof nrdp == 'undefined') {
window.domAutomationController.send('not ready');
}
player_status = nrdp.video.readyState;
window.domAutomationController.send(player_status + '');
"""), expect_retval=expected_result),
msg=error_msg)
class NetflixTest(pyauto.PyUITest, NetflixTestHelper):
"""Test case for Netflix player."""
def __init__(self, methodName='runTest', **kwargs):
pyauto.PyUITest.__init__(self, methodName, **kwargs)
NetflixTestHelper.__init__(self, self)
def ShouldAutoLogin(self):
return False
def _Login(self):
"""Perform login"""
credentials = self.GetPrivateInfo()['test_google_account']
self.Login(credentials['username'], credentials['password'])
logging.info('Logged in as %s' % credentials['username'])
login_info = self.GetLoginInfo()
self.assertTrue(login_info['is_logged_in'], msg='Login failed.')
self.assertFalse(login_info['is_guest'],
msg='Should not be logged in as guest.')
def setUp(self):
assert os.geteuid() == 0, 'Run test as root since we might need to logout'
pyauto.PyUITest.setUp(self)
if self.GetLoginInfo()['is_logged_in']:
self.Logout()
self._Login()
def tearDown(self):
self.SignOut()
pyauto.PyUITest.tearDown(self)
def testPlayerLoadsAndPlays(self):
"""Test that Netflix player loads and plays the title."""
self.LoginAndStartPlaying()
self._HandleInfobars(err_msg='Netflix plugin access infobar did not show up')
self.CheckNetflixPlaying(self.IS_PLAYING,
'Player did not start playing the title.')
def testMultiplePlayback(self):
"""Test that playing two titles, Netflix returns multiple play error."""
self.LoginAndStartPlaying()
self._HandleInfobars(err_msg='Netflix plugin access infobar did not show up')
self.CheckNetflixPlaying(self.IS_PLAYING,
'Player did not start playing the title.')
self.AppendTab(self.ALT_VIDEO_URL)
self.assertTrue('Multiple Play Error' in self.GetTabContents(),
msg='Multiple Play Error is not found on the page.')
def testPlaying(self):
"""Test that title playing progresses."""
self.LoginAndStartPlaying()
self._HandleInfobars(err_msg='Netflix plugin access infobar did not show up')
self.CheckNetflixPlaying(self.IS_PLAYING,
'Player did not start playing the title.')
title_length = self.ExecuteJavascript("""
time = nrdp.video.duration;
window.domAutomationController.send(time + '');
""")
title_length = int(float(title_length))
prev_time = 0
current_time = 0
count = 0
while current_time < title_length:
# We want to test playing only for ten seconds.
count = count + 1
if count == 10:
break
current_time = self.CurrentPlaybackTime()
self.assertTrue(prev_time <= current_time,
msg='Prev playing time %s is greater than current time %s.'
% (prev_time, current_time))
prev_time = current_time
# play video for some time
time.sleep(1)
# In case player doesn't start playing at all, above while loop may
# still pass. So re-verifying and assuming that player did play something
# during last 10 seconds.
self.assertTrue(current_time > 0,
msg='Netflix player did not start playing.')
class NetflixGuestModeTest(pyauto.PyUITest, NetflixTestHelper):
"""Netflix in guest mode."""
def __init__(self, methodName='runTest', **kwargs):
pyauto.PyUITest.__init__(self, methodName, **kwargs)
NetflixTestHelper.__init__(self, self)
def setUp(self):
assert os.geteuid() == 0, 'Run test as root since we might need to logout'
pyauto.PyUITest.setUp(self)
if self.GetLoginInfo()['is_logged_in']:
self.Logout()
self.LoginAsGuest()
login_info = self.GetLoginInfo()
self.assertTrue(login_info['is_logged_in'], msg='Not logged in at all.')
self.assertTrue(login_info['is_guest'], msg='Not logged in as guest.')
def ShouldAutoLogin(self):
return False
def tearDown(self):
self.AppendTab(self.SIGNOUT_PAGE)
self.Logout()
pyauto.PyUITest.tearDown(self)
def testGuestMode(self):
"""Test that Netflix doesn't play in guest mode login."""
self.LoginAndStartPlaying()
self.CheckNetflixPlaying(
self.IS_GUEST_MODE_ERROR,
'Netflix player did not return a Guest mode error.')
# crosbug.com/p/14009
self.assertTrue('Netflix Video Player Unavailable' in self.GetTabContents(),
msg='Guest Mode error is not found on the page.')
if __name__ == '__main__':
pyauto_functional.Main()