summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrohitbm@chromium.org <rohitbm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-22 01:11:53 +0000
committerrohitbm@chromium.org <rohitbm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-22 01:11:53 +0000
commitf5b26caccf0dae6145b0b81580c59a813fb7b835 (patch)
tree7ab8c1d6c092528b92ed69bbc8c1d871a9a28165
parent4cbf6dfae30159ffbbdefe77055c63f2189fb6c8 (diff)
downloadchromium_src-f5b26caccf0dae6145b0b81580c59a813fb7b835.zip
chromium_src-f5b26caccf0dae6145b0b81580c59a813fb7b835.tar.gz
chromium_src-f5b26caccf0dae6145b0b81580c59a813fb7b835.tar.bz2
Adding Netflix performance tests,
- To measure dropped frames/second. - To calculate extrapolation of the utilization to play the test video. Note: Moving Netflix helper functions to a separate class, so they can be reused easily for other Netflix tests. Review URL: http://codereview.chromium.org/8562006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@111063 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/test/functional/netflix.py134
-rw-r--r--chrome/test/functional/perf.py55
2 files changed, 137 insertions, 52 deletions
diff --git a/chrome/test/functional/netflix.py b/chrome/test/functional/netflix.py
index c3741ea..7ce1d3b 100644
--- a/chrome/test/functional/netflix.py
+++ b/chrome/test/functional/netflix.py
@@ -9,99 +9,131 @@ import pyauto_functional
import pyauto
-class NetflixTest(pyauto.PyUITest):
- """Test case for Netflix player"""
+class NetflixTestHelper():
+ """Helper functions for Netflix tests.
+
+ For sample usage, look at class NetflixTest.
+ """
- # Netflix player states
- _is_playing = '4'
+ # Netflix player states.
+ is_playing = '4'
- _title_homepage = 'http://movies.netflix.com/WiHome'
- _signout_page = 'https://account.netflix.com/Logout'
+ title_homepage = 'http://movies.netflix.com/WiHome'
+ signout_page = 'https://account.netflix.com/Logout'
# 30 Rock
- _test_title = 'http://movies.netflix.com/WiPlayer?'+ \
+ test_title = 'http://movies.netflix.com/WiPlayer?'+ \
'movieid=70136124&trkid=2361637&t=30+Rock'
+ _pyauto = None
- def tearDown(self):
- self._SignOut()
- pyauto.PyUITest.tearDown(self)
+ def __init__(self, pyauto):
+ self._pyauto = pyauto
def _IsNetflixPluginEnabled(self):
- """Determine Netflix plugin availability and its state"""
- return [x for x in self.GetPluginsInfo().Plugins() \
- if x['name'] == 'Netflix' and x['enabled']]
+ """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.GetPrivateInfo()['test_netflix_acct']
- board_name = self.ChromeOSBoard()
+ """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.NavigateToURL(credentials['login_url'])
+ '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.assertEqual(self.ExecuteJavascript(login_js), 'ok',
- msg='Failed to set login credentials')
- self.assertTrue(self.SubmitForm('login-form'),
- msg='Login to Netflix failed')
+ 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.')
+ 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):
"""Manage infobars, come up during the test.
We expect password and Netflix infobars. Processing only Netflix infobar,
since to start a vidoe, pressing the OK button is a must. We can keep other
- inforbars open."""
- self.WaitForInfobarCount(2)
- tab_info = self.GetBrowserInfo()['windows'][0]['tabs'][0]
+ infobars open."""
+ self._pyauto.WaitForInfobarCount(2)
+ tab_info = self._pyauto.GetBrowserInfo()['windows'][0]['tabs'][0]
infobars = tab_info['infobars']
index = 0
netflix_infobar_status = False
for infobar in infobars:
if infobar['buttons'][0] == 'OK':
- self.PerformActionOnInfobar('accept', infobar_index=index)
+ self._pyauto.PerformActionOnInfobar('accept', infobar_index=index)
netflix_infobar_status = True
index = index + 1
- self.assertTrue(netflix_infobar_status,
- msg='Netflix infobar did not show up')
+ self._pyauto.assertTrue(netflix_infobar_status,
+ msg='Netflix infobar did not show up')
def _CurrentPlaybackTime(self):
- """Returns the current playback time in seconds"""
- time = self.ExecuteJavascript("""
+ """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):
- """Sing out from Netflix Login"""
- self.NavigateToURL(self._signout_page)
+ """Sing out from Netflix Login."""
+ self._pyauto.NavigateToURL(self._pyauto.signout_page)
def _LoginAndStartPlaying(self):
- """Login and start playing the video"""
- self.assertTrue(self._IsNetflixPluginEnabled(),
- msg='Netflix plugin is disabled or not available')
- self._LoginToNetflix()
- self.assertTrue(self.WaitUntil(
- lambda:self.GetActiveTabURL().spec(),
- expect_retval=self._title_homepage),
- msg='Login to Netflix failed')
- self.NavigateToURL(self._test_title)
- self._HandleInfobars()
- self.assertTrue(self.WaitUntil(
- lambda: self.ExecuteJavascript("""
+ """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._pyauto.title_homepage),
+ msg='Login to Netflix failed.')
+ self._pyauto.NavigateToURL(self._pyauto.test_title)
+ self._pyauto._HandleInfobars()
+ self._pyauto.assertTrue(self._pyauto.WaitUntil(
+ lambda: self._pyauto.ExecuteJavascript("""
player_status = nrdp.video.readyState;
window.domAutomationController.send(player_status + '');
- """), expect_retval=self._is_playing),
- msg='Player did not start playing the title')
+ """), expect_retval=self._pyauto.is_playing),
+ msg='Player did not start playing the title.')
+
+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 tearDown(self):
+ self._SignOut()
+ pyauto.PyUITest.tearDown(self)
def testPlayerLoadsAndPlays(self):
- """Test that Netflix player loads and plays the title"""
+ """Test that Netflix player loads and plays the title."""
self._LoginAndStartPlaying()
def testPlaying(self):
- """Test that title playing progresses"""
+ """Test that title playing progresses."""
self._LoginAndStartPlaying()
title_length = self.ExecuteJavascript("""
time = nrdp.video.duration;
@@ -112,13 +144,13 @@ class NetflixTest(pyauto.PyUITest):
current_time = 0
count = 0
while current_time < title_length:
- # We want to test playing only for ten seconds
+ # 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'
+ msg='Prev playing time %s is greater than current time %s.'
% (prev_time, current_time))
prev_time = current_time
# play video for some time
@@ -128,7 +160,7 @@ class NetflixTest(pyauto.PyUITest):
# still pass. So re-verifying and assuming that player did play something
# during last 10 seconds.
self.assertTrue(current_time > 0,
- msg='Netflix player didnot start playing')
+ msg='Netflix player didnot start playing.')
if __name__ == '__main__':
diff --git a/chrome/test/functional/perf.py b/chrome/test/functional/perf.py
index 31a19cf..411c1d7 100644
--- a/chrome/test/functional/perf.py
+++ b/chrome/test/functional/perf.py
@@ -41,6 +41,7 @@ import urlparse
import pyauto_functional # Must be imported before pyauto.
import pyauto
+from netflix import NetflixTestHelper
import perf_snapshot
import pyauto_utils
import test_utils
@@ -537,6 +538,58 @@ class LiveWebappLoadTest(BasePerfTest):
self._RunNewTabTest('NewTabDocs', _RunSingleDocsTabOpen)
+class NetflixPerfTest(BasePerfTest, NetflixTestHelper):
+ """Test Netflix video performance."""
+
+ def __init__(self, methodName='runTest', **kwargs):
+ pyauto.PyUITest.__init__(self, methodName, **kwargs)
+ NetflixTestHelper.__init__(self, self)
+
+ def tearDown(self):
+ self._SignOut()
+ pyauto.PyUITest.tearDown(self)
+
+ def testNetflixDroppedFrames(self):
+ """Measures the Netflix video dropped frames/second. Runs for 60 secs."""
+ self._LoginAndStartPlaying()
+ # Ignore first 10 seconds of video playing so we get smooth videoplayback.
+ time.sleep(10)
+ init_dropped_frames = self._GetVideoDroppedFrames()
+ dropped_frames = []
+ prev_dropped_frames = 0
+ for _ in xrange(60):
+ # Ignoring initial dropped frames of first 10 seconds.
+ total_dropped_frames = self._GetVideoDroppedFrames() - init_dropped_frames
+ dropped_frames.append(total_dropped_frames - prev_dropped_frames)
+ prev_dropped_frames = total_dropped_frames
+ # Play the video for some time.
+ time.sleep(1)
+ self._PrintSummaryResults('NetflixDroppedFrames', dropped_frames, 'frames')
+
+ def testNetflixCPU(self):
+ """Measures the Netflix video CPU usage. Runs for 60 seconds."""
+ self._LoginAndStartPlaying()
+ # Ignore first 10 seconds of video playing so we get smooth videoplayback.
+ time.sleep(10)
+ init_dropped_frames = self._GetVideoDroppedFrames()
+ init_video_frames = self._GetVideoFrames()
+ cpu_usage_start = self._GetCPUUsage()
+ total_shown_frames = 0
+ # Play the video for some time.
+ time.sleep(60)
+ total_video_frames = self._GetVideoFrames() - init_video_frames
+ total_dropped_frames = self._GetVideoDroppedFrames() - init_dropped_frames
+ cpu_usage_end = self._GetCPUUsage()
+ fraction_non_idle_time = \
+ self._GetFractionNonIdleCPUTime(cpu_usage_start, cpu_usage_end)
+ # Counting extrapolation for utilization to play the video.
+ extrapolation_value = fraction_non_idle_time * \
+ (total_video_frames + total_dropped_frames) / total_video_frames
+ logging.info('Netflix CPU extrapolation: %.2f' % extrapolation_value)
+ self._OutputPerfGraphValue('extrapolation_NetflixCPUExtrapolation',
+ extrapolation_value)
+
+
class YoutubePerfTest(BasePerfTest, YoutubeTestHelper):
"""Test Youtube video performance."""
@@ -578,7 +631,7 @@ class YoutubePerfTest(BasePerfTest, YoutubeTestHelper):
time.sleep(10)
def testYoutubeDroppedFrames(self):
- """Measures the Youtube video dropped frames. Runs for 60 secs."""
+ """Measures the Youtube video dropped frames/second. Runs for 60 secs."""
self.StartVideoForPerformance()
init_dropped_frames = self.GetVideoDroppedFrames()
total_dropped_frames = 0