Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Side by Side Diff: functional/youtube.py

Issue 8548002: Adding CPU performance test for Youtube video (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/chrome/test/
Patch Set: '' Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« functional/perf.py ('K') | « functional/perf.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 import re
6 import time 7 import time
7 8
8 import pyauto_functional 9 import pyauto_functional
9 import pyauto 10 import pyauto
10 11
11 12
12 class YoutubeTestHelper(): 13 class YoutubeTestHelper():
13 """Helper functions for Youtube tests. 14 """Helper functions for Youtube tests.
14 15
15 For sample usage, look at class YoutubeTest. 16 For sample usage, look at class YoutubeTest.
16 """ 17 """
17 18
18 # YouTube player states 19 # YouTube player states
19 is_unstarted = '-1' 20 is_unstarted = '-1'
20 is_playing = '1' 21 is_playing = '1'
21 is_paused = '2' 22 is_paused = '2'
22 has_ended = '0' 23 has_ended = '0'
23 _pyauto = None 24 _pyauto = None
24 25
25 def __init__(self, pyauto): 26 def __init__(self, pyauto):
26 self._pyauto = pyauto 27 self._pyauto = pyauto
27 28
28 def IsFlashPluginEnabled(self): 29 def IsFlashPluginEnabled(self):
29 """Verify flash plugin availability and its state""" 30 """Verify flash plugin availability and its state."""
30 return [x for x in self._pyauto.GetPluginsInfo().Plugins() \ 31 return [x for x in self._pyauto.GetPluginsInfo().Plugins() \
31 if x['name'] == 'Shockwave Flash' and x['enabled']] 32 if x['name'] == 'Shockwave Flash' and x['enabled']]
32 33
33 def WaitUntilPlayerReady(self): 34 def WaitUntilPlayerReady(self):
34 """Verify that player is ready""" 35 """Verify that player is ready."""
35 return self._pyauto.WaitUntil(lambda: self._pyauto.ExecuteJavascript(""" 36 return self._pyauto.WaitUntil(lambda: self._pyauto.ExecuteJavascript("""
36 player_status = document.getElementById("player_status"); 37 player_status = document.getElementById("player_status");
37 window.domAutomationController.send(player_status.innerHTML); 38 window.domAutomationController.send(player_status.innerHTML);
38 """), expect_retval='player ready') 39 """), expect_retval='player ready')
39 40
40 def GetPlayerState(self): 41 def GetPlayerState(self):
41 """Returns a player state""" 42 """Returns a player state."""
42 js = """ 43 js = """
43 var val = ytplayer.getPlayerState(); 44 var val = ytplayer.getPlayerState();
44 window.domAutomationController.send(val + ''); 45 window.domAutomationController.send(val + '');
45 """ 46 """
46 return self._pyauto.ExecuteJavascript(js) 47 return self._pyauto.ExecuteJavascript(js)
47 48
49 def GetVideoInfo(self):
50 """Returns Youtube video info."""
51 youtube_apis = self._pyauto.GetPrivateInfo()['youtube_api']
52 youtube_debug_text = youtube_apis['GetDebugText']
53 return self._pyauto.ExecuteJavascript(
54 'window.domAutomationController.send(%s);' % youtube_debug_text)
55
56 def GetVideoDroppedFrames(self):
57 """Returns total Youtube video dropped frames.
58
59 Returns:
60 -1 if failed to get video frames from the video data
61 """
62 video_data = self._pyauto.GetVideoInfo()
63 matched = re.search('droppedFrames=([\d\.]+)', video_data)
64 if matched:
65 return int(matched.group(1))
66 else:
67 return -1
68
69 def GetVideoFrames(self):
70 """Returns Youtube video frames/second.
71
72 Returns:
73 -1 if failed to get droppd frames from the video data.
74 """
75 video_data = self._pyauto.GetVideoInfo()
76 matched = re.search('videoFps=([\d\.]+)', video_data)
77 if matched:
78 return int(matched.group(1))
79 else:
80 return -1
81
48 def GetVideoTotalBytes(self): 82 def GetVideoTotalBytes(self):
49 """Returns video size in bytes 83 """Returns video total size in bytes.
50 84
51 To call this function, video must be in the paying state, 85 To call this function, video must be in the paying state,
52 or this returns 0. 86 or this returns 0.
53 """ 87 """
54 total_bytes = 0 88 total_bytes = 0
55 total_bytes = self._pyauto.ExecuteJavascript(""" 89 total_bytes = self._pyauto.ExecuteJavascript("""
56 bytes = ytplayer.getVideoBytesTotal(); 90 bytes = ytplayer.getVideoBytesTotal();
57 window.domAutomationController.send(bytes + ''); 91 window.domAutomationController.send(bytes + '');
58 """) 92 """)
59 return int(total_bytes) 93 return int(total_bytes)
60 94
95 def GetVideoLoadedBytes(self):
96 """Returns video size in bytes."""
97 loaded_bytes = 0
98 loaded_bytes = self.ExecuteJavascript("""
99 bytes = ytplayer.getVideoBytesLoaded();
100 window.domAutomationController.send(bytes + '');
101 """)
102 return int(loaded_bytes)
103
61 def PlayVideo(self): 104 def PlayVideo(self):
62 """Plays the loaded video""" 105 """Plays the loaded video."""
63 self._pyauto.ExecuteJavascript(""" 106 self._pyauto.ExecuteJavascript("""
64 ytplayer.playVideo(); 107 ytplayer.playVideo();
65 window.domAutomationController.send(''); 108 window.domAutomationController.send('');
66 """) 109 """)
67 110
111 def PauseVideo(self):
112 """Pause the video."""
113 self.ExecuteJavascript("""
114 ytplayer.pauseVideo();
115 window.domAutomationController.send('');
116 """)
117
68 def AssertPlayingState(self): 118 def AssertPlayingState(self):
69 """Assert player's playing state""" 119 """Assert player's playing state."""
70 self._pyauto.assertTrue(self._pyauto.WaitUntil(self._pyauto.GetPlayerState, 120 self._pyauto.assertTrue(self._pyauto.WaitUntil(self._pyauto.GetPlayerState,
71 expect_retval=self._pyauto.is_playing), 121 expect_retval=self._pyauto.is_playing),
72 msg='Player did not enter the playing state') 122 msg='Player did not enter the playing state')
73 123
74 def PlayVideoAndAssert(self): 124 def PlayVideoAndAssert(self):
75 """Start video and assert the playing state""" 125 """Start video and assert the playing state."""
76 self._pyauto.assertTrue(self._pyauto.IsFlashPluginEnabled(), 126 self._pyauto.assertTrue(self._pyauto.IsFlashPluginEnabled(),
77 msg='From here Flash plugin is disabled or not available') 127 msg='From here Flash plugin is disabled or not available')
78 url = self._pyauto.GetHttpURLForDataPath('media', 'youtube.html') 128 url = self._pyauto.GetHttpURLForDataPath('media', 'youtube.html')
79 self._pyauto.NavigateToURL(url) 129 self._pyauto.NavigateToURL(url)
80 self._pyauto.assertTrue(self._pyauto.WaitUntilPlayerReady(), 130 self._pyauto.assertTrue(self._pyauto.WaitUntilPlayerReady(),
81 msg='Failed to load YouTube player') 131 msg='Failed to load YouTube player')
82 self._pyauto.PlayVideo() 132 self._pyauto.PlayVideo()
83 self._pyauto.AssertPlayingState() 133 self._pyauto.AssertPlayingState()
84 134
85 135
86 class YoutubeTest(pyauto.PyUITest, YoutubeTestHelper): 136 class YoutubeTest(pyauto.PyUITest, YoutubeTestHelper):
87 """Test case for Youtube videos.""" 137 """Test case for Youtube videos."""
88 138
89 def __init__(self, methodName='runTest', **kwargs): 139 def __init__(self, methodName='runTest', **kwargs):
90 pyauto.PyUITest.__init__(self, methodName, **kwargs) 140 pyauto.PyUITest.__init__(self, methodName, **kwargs)
91 YoutubeTestHelper.__init__(self, self) 141 YoutubeTestHelper.__init__(self, self)
92 142
93 def testPlayerStatus(self): 143 def testPlayerStatus(self):
94 """Test that YouTube loads a player and changes player states 144 """Test that YouTube loads a player and changes player states
95 145
96 Test verifies various player states like unstarted, playing, paused 146 Test verifies various player states like unstarted, playing, paused
97 and ended. 147 and ended.
98 """ 148 """
99 # Navigating to Youtube video. This video is 122 seconds long. 149 # Navigating to Youtube video. This video is 122 seconds long.
100 # During tests, we are not goinig to play this video full. 150 # During tests, we are not goinig to play this video full.
101 self.PlayVideoAndAssert() 151 self.PlayVideoAndAssert()
102 # Pause the playing video 152 self.PauseVideo()
103 self.ExecuteJavascript("""
104 ytplayer.pauseVideo();
105 window.domAutomationController.send('');
106 """)
107 self.assertEqual(self.GetPlayerState(), self.is_paused, 153 self.assertEqual(self.GetPlayerState(), self.is_paused,
108 msg='Player did not enter the paused state') 154 msg='Player did not enter the paused state')
109 # Seek to the end of video 155 # Seek to the end of video
110 self.ExecuteJavascript(""" 156 self.ExecuteJavascript("""
111 val = ytplayer.getDuration(); 157 val = ytplayer.getDuration();
112 ytplayer.seekTo(val, true); 158 ytplayer.seekTo(val, true);
113 window.domAutomationController.send(''); 159 window.domAutomationController.send('');
114 """) 160 """)
115 self.PlayVideo() 161 self.PlayVideo()
116 # We've seeked to almost the end of the video but not quite. 162 # We've seeked to almost the end of the video but not quite.
117 # Wait until the end. 163 # Wait until the end.
118 self.assertTrue(self.WaitUntil(self.GetPlayerState, 164 self.assertTrue(self.WaitUntil(self.GetPlayerState,
119 expect_retval=self.has_ended), 165 expect_retval=self.has_ended),
120 msg='Player did not reach the stopped state') 166 msg='Player did not reach the stopped state')
121 167
122 def testPlayerResolution(self): 168 def testPlayerResolution(self):
123 """Test various video resolutions""" 169 """Test various video resolutions."""
124 self.PlayVideoAndAssert() 170 self.PlayVideoAndAssert()
125 resolutions = self.ExecuteJavascript(""" 171 resolutions = self.ExecuteJavascript("""
126 res = ytplayer.getAvailableQualityLevels(); 172 res = ytplayer.getAvailableQualityLevels();
127 window.domAutomationController.send(res.toString()); 173 window.domAutomationController.send(res.toString());
128 """) 174 """)
129 resolutions = resolutions.split(',') 175 resolutions = resolutions.split(',')
130 for res in resolutions: 176 for res in resolutions:
131 self.ExecuteJavascript(""" 177 self.ExecuteJavascript("""
132 ytplayer.setPlaybackQuality('%s'); 178 ytplayer.setPlaybackQuality('%s');
133 window.domAutomationController.send(''); 179 window.domAutomationController.send('');
134 """ % res) 180 """ % res)
135 curr_res = self.ExecuteJavascript(""" 181 curr_res = self.ExecuteJavascript("""
136 res = ytplayer.getPlaybackQuality(); 182 res = ytplayer.getPlaybackQuality();
137 window.domAutomationController.send(res + ''); 183 window.domAutomationController.send(res + '');
138 """) 184 """)
139 self.assertEqual(res, curr_res, msg='Resolution is not set to %s.' % res) 185 self.assertEqual(res, curr_res, msg='Resolution is not set to %s.' % res)
140 186
141 def testPlayerBytes(self): 187 def testPlayerBytes(self):
142 """Test that player downloads video bytes""" 188 """Test that player downloads video bytes."""
143 self.PlayVideoAndAssert() 189 self.PlayVideoAndAssert()
144 total_bytes = self.GetVideoTotalBytes() 190 total_bytes = self.GetVideoTotalBytes()
145 prev_loaded_bytes = 0 191 prev_loaded_bytes = 0
146 loaded_bytes = 0 192 loaded_bytes = 0
147 count = 0 193 count = 0
148 while loaded_bytes < total_bytes: 194 while loaded_bytes < total_bytes:
149 # We want to test bytes loading only twice 195 # We want to test bytes loading only twice
150 count = count + 1 196 count = count + 1
151 if count == 2: 197 if count == 2:
152 break 198 break
153 loaded_bytes = self.ExecuteJavascript(""" 199 loaded_bytes = self.GetVideoLoadedBytes()
154 bytes = ytplayer.getVideoBytesLoaded();
155 window.domAutomationController.send(bytes + '');
156 """)
157 loaded_bytes = int(loaded_bytes)
158 self.assertTrue(prev_loaded_bytes <= loaded_bytes) 200 self.assertTrue(prev_loaded_bytes <= loaded_bytes)
159 prev_loaded_bytes = loaded_bytes 201 prev_loaded_bytes = loaded_bytes
160 # Give some time to load a video 202 # Give some time to load a video
161 time.sleep(1) 203 time.sleep(1)
162 204
163 205
164 if __name__ == '__main__': 206 if __name__ == '__main__':
165 pyauto_functional.Main() 207 pyauto_functional.Main()
OLDNEW
« functional/perf.py ('K') | « functional/perf.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698