Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 psutil | |
|
kjellander_chromium
2012/10/15 21:19:21
psutil sorts after os.
phoglund_chromium
2012/10/16 21:27:08
Done.
| |
| 6 import os | 7 import os |
| 7 import subprocess | 8 import subprocess |
| 8 | 9 |
| 10 # Note: pyauto_functional must come before pyauto. | |
| 9 import pyauto_functional | 11 import pyauto_functional |
| 10 import pyauto | 12 import pyauto |
| 13 import pyauto_utils | |
| 11 import webrtc_test_base | 14 import webrtc_test_base |
| 12 | 15 |
| 13 | 16 |
| 14 class WebrtcCallTest(webrtc_test_base.WebrtcTestBase): | 17 class WebrtcCallTest(webrtc_test_base.WebrtcTestBase): |
| 15 """Test we can set up a WebRTC call and disconnect it. | 18 """Test we can set up a WebRTC call and disconnect it. |
| 16 | 19 |
| 17 Prerequisites: This test case must run on a machine with a webcam, either | 20 Prerequisites: This test case must run on a machine with a webcam, either |
| 18 fake or real, and with some kind of audio device. You must make the | 21 fake or real, and with some kind of audio device. You must make the |
| 19 peerconnection_server target before you run. | 22 peerconnection_server target before you run. |
| 20 | 23 |
| 21 The test case will launch a custom binary | 24 The test case will launch a custom binary |
| 22 (peerconnection_server) which will allow two WebRTC clients to find each | 25 (peerconnection_server) which will allow two WebRTC clients to find each |
| 23 other. For more details, see the source code which is available at the site | 26 other. For more details, see the source code which is available at the site |
| 24 http://code.google.com/p/libjingle/source/browse/ (make sure to browse to | 27 http://code.google.com/p/libjingle/source/browse/ (make sure to browse to |
| 25 trunk/talk/examples/peerconnection/server). | 28 trunk/talk/examples/peerconnection/server). |
| 26 """ | 29 """ |
| 27 | 30 |
| 28 def setUp(self): | 31 def setUp(self): |
| 29 pyauto.PyUITest.setUp(self) | 32 pyauto.PyUITest.setUp(self) |
| 30 self.StartPeerConnectionServer() | 33 self.StartPeerConnectionServer() |
| 31 | 34 |
| 32 def tearDown(self): | 35 def tearDown(self): |
| 33 self.StopPeerConnectionServer() | 36 self.StopPeerConnectionServer() |
| 34 | 37 |
| 35 pyauto.PyUITest.tearDown(self) | 38 pyauto.PyUITest.tearDown(self) |
| 36 self.assertEquals('', self.CheckErrorsAndCrashes()) | 39 self.assertEquals('', self.CheckErrorsAndCrashes()) |
| 37 | 40 |
| 38 def _SimpleWebrtcCall(self, test_page): | 41 def _SimpleWebrtcCall(self): |
| 39 """Tests we can call and hang up with WebRTC. | 42 """Tests we can call and hang up with WebRTC. |
| 40 | 43 |
| 41 This test exercises pretty much the whole happy-case for the WebRTC | 44 This test exercises pretty much the whole happy-case for the WebRTC |
| 42 JavaScript API. Currently, it exercises a normal call setup using the API | 45 JavaScript API. Currently, it exercises a normal call setup using the API |
| 43 defined at http://dev.w3.org/2011/webrtc/editor/webrtc.html. The API is | 46 defined at http://dev.w3.org/2011/webrtc/editor/webrtc.html. The API is |
| 44 still evolving. | 47 still evolving. |
| 45 | 48 |
| 46 The test will load the supplied HTML file, which in turn will load different | 49 Assuming two tabs are loaded using self._LoadPageInTwoTabs, the test will |
| 47 javascript files depending on which version of the signaling protocol | 50 acquire video and audio devices on the system. This will launch a dialog in |
| 48 we are running. | 51 Chrome which we click past using the automation controller. Then, we will |
| 49 The supplied HTML file will be loaded in two tabs and tell the web | 52 order both tabs to connect the peerconnection server, which will make the |
| 50 pages to start up WebRTC, which will acquire video and audio devices on the | 53 two tabs aware of each other. Once that is done we order one tab to call |
| 51 system. This will launch a dialog in Chrome which we click past using the | 54 the other. |
| 52 automation controller. Then, we will order both tabs to connect the server, | |
| 53 which will make the two tabs aware of each other. Once that is done we order | |
| 54 one tab to call the other. | |
| 55 | 55 |
| 56 We make sure that the javascript tells us that the call succeeded, lets it | 56 We make sure that the javascript tells us that the call succeeded, lets it |
| 57 run for a while and try to hang up the call after that. We verify video is | 57 run for a while and try to hang up the call after that. We verify video is |
| 58 playing by using the video detector. | 58 playing by using the video detector. |
| 59 """ | 59 """ |
| 60 self._SetupCall(test_page) | 60 self._SetupCall() |
| 61 | 61 |
| 62 # The hang-up will automatically propagate to the second tab. | 62 # The hang-up will automatically propagate to the second tab. |
| 63 self.HangUp(from_tab_with_index=0) | 63 self.HangUp(from_tab_with_index=0) |
| 64 self.WaitUntilHangUpVerified(tab_index=1) | 64 self.WaitUntilHangUpVerified(tab_index=1) |
| 65 | 65 |
| 66 self.Disconnect(tab_index=0) | |
| 67 self.Disconnect(tab_index=1) | |
| 68 | |
| 69 # Ensure we didn't miss any errors. | 66 # Ensure we didn't miss any errors. |
| 70 self.AssertNoFailures(tab_index=0) | 67 self.AssertNoFailures(tab_index=0) |
| 71 self.AssertNoFailures(tab_index=1) | 68 self.AssertNoFailures(tab_index=1) |
| 72 | 69 |
| 70 self.Disconnect(tab_index=0) | |
| 71 self.Disconnect(tab_index=1) | |
| 72 | |
| 73 def testSimpleWebrtcJsep00Call(self): | 73 def testSimpleWebrtcJsep00Call(self): |
|
kjellander_chromium
2012/10/15 21:19:21
Maybe it's time to drop the 00 version before it g
phoglund_chromium
2012/10/16 21:27:08
Not sure if I should remove it or leave it in, run
| |
| 74 """Uses a draft of the PeerConnection API, using JSEP00.""" | 74 """Uses a draft of the PeerConnection API, using JSEP00.""" |
| 75 self._SimpleWebrtcCall('webrtc_jsep00_test.html') | 75 self._LoadPageInTwoTabs('webrtc_jsep00_test.html') |
| 76 self._SimpleWebrtcCall() | |
| 76 | 77 |
| 77 def testSimpleWebrtcJsep01Call(self): | 78 def testSimpleWebrtcJsep01Call(self): |
| 78 """Uses a draft of the PeerConnection API, using JSEP01.""" | 79 """Uses a draft of the PeerConnection API, using JSEP01.""" |
| 79 self._SimpleWebrtcCall('webrtc_jsep01_test.html') | 80 self._LoadPageInTwoTabs('webrtc_jsep01_test.html') |
| 81 | |
| 82 # Prepare CPU measurements. | |
| 83 renderer_process = self._GetChromeRendererProcess(tab_index=0) | |
| 84 renderer_process.get_cpu_percent() | |
| 85 | |
| 86 self._SimpleWebrtcCall() | |
| 87 | |
| 88 cpu_usage = renderer_process.get_cpu_percent(interval=0) | |
| 89 mem_usage_mb = renderer_process.get_memory_info()[0] / 1024 / 1024 | |
| 90 pyauto_utils.PrintPerfResult('cpu', 'jsep01_call', cpu_usage, '%') | |
| 91 pyauto_utils.PrintPerfResult('memory', 'jsep01_call', mem_usage_mb, 'MB') | |
| 80 | 92 |
| 81 def testLocalPreview(self): | 93 def testLocalPreview(self): |
| 82 """Brings up a local preview and ensures video is playing. | 94 """Brings up a local preview and ensures video is playing. |
| 83 | 95 |
| 84 This test will launch a window with a single tab and run a getUserMedia call | 96 This test will launch a window with a single tab and run a getUserMedia call |
| 85 which will give us access to the webcam and microphone. Then the javascript | 97 which will give us access to the webcam and microphone. Then the javascript |
| 86 code will hook up the webcam data to the local-view video tag. We will | 98 code will hook up the webcam data to the local-view video tag. We will |
| 87 detect video in that tag using the video detector, and if we see video | 99 detect video in that tag using the video detector, and if we see video |
| 88 moving the test passes. | 100 moving the test passes. |
| 89 """ | 101 """ |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 116 """Tests MediaStreamTrack.enable on tracks connected to a PeerConnection. | 128 """Tests MediaStreamTrack.enable on tracks connected to a PeerConnection. |
| 117 | 129 |
| 118 This test will check that if a local track is muted, the remote end don't | 130 This test will check that if a local track is muted, the remote end don't |
| 119 get video. Also test that if a remote track is disabled, the video is not | 131 get video. Also test that if a remote track is disabled, the video is not |
| 120 updated in the video tag.""" | 132 updated in the video tag.""" |
| 121 | 133 |
| 122 # TODO(perkj): Also verify that the local preview is muted when the | 134 # TODO(perkj): Also verify that the local preview is muted when the |
| 123 # feature is implemented. | 135 # feature is implemented. |
| 124 # TODO(perkj): Verify that audio is muted. | 136 # TODO(perkj): Verify that audio is muted. |
| 125 | 137 |
| 126 self._SetupCall('webrtc_jsep01_test.html') | 138 self._LoadPageInTwoTabs('webrtc_jsep01_test.html') |
| 139 self._SetupCall() | |
| 127 select_video_function = 'function(local) { return local.videoTracks[0]; }' | 140 select_video_function = 'function(local) { return local.videoTracks[0]; }' |
| 128 self.assertEquals('ok-video-toggled-to-false', self.ExecuteJavascript( | 141 self.assertEquals('ok-video-toggled-to-false', self.ExecuteJavascript( |
| 129 'toggleLocalStream(' + select_video_function + ', "video")', | 142 'toggleLocalStream(' + select_video_function + ', "video")', |
| 130 tab_index=0)) | 143 tab_index=0)) |
| 131 self._WaitForVideo(tab_index=1, expect_playing=False) | 144 self._WaitForVideo(tab_index=1, expect_playing=False) |
| 132 | 145 |
| 133 self.assertEquals('ok-video-toggled-to-true', self.ExecuteJavascript( | 146 self.assertEquals('ok-video-toggled-to-true', self.ExecuteJavascript( |
| 134 'toggleLocalStream(' + select_video_function + ', "video")', | 147 'toggleLocalStream(' + select_video_function + ', "video")', |
| 135 tab_index=0)) | 148 tab_index=0)) |
| 136 self._WaitForVideo(tab_index=1, expect_playing=True) | 149 self._WaitForVideo(tab_index=1, expect_playing=True) |
| 137 | 150 |
| 138 # Test disabling a remote stream. The remote video is not played.""" | 151 # Test disabling a remote stream. The remote video is not played.""" |
| 139 self.assertEquals('ok-video-toggled-to-false', self.ExecuteJavascript( | 152 self.assertEquals('ok-video-toggled-to-false', self.ExecuteJavascript( |
| 140 'toggleRemoteStream(' + select_video_function + ', "video")', | 153 'toggleRemoteStream(' + select_video_function + ', "video")', |
| 141 tab_index=1)) | 154 tab_index=1)) |
| 142 self._WaitForVideo(tab_index=1, expect_playing=False) | 155 self._WaitForVideo(tab_index=1, expect_playing=False) |
| 143 | 156 |
| 144 self.assertEquals('ok-video-toggled-to-true', self.ExecuteJavascript( | 157 self.assertEquals('ok-video-toggled-to-true', self.ExecuteJavascript( |
| 145 'toggleRemoteStream(' + select_video_function + ', "video")', | 158 'toggleRemoteStream(' + select_video_function + ', "video")', |
| 146 tab_index=1)) | 159 tab_index=1)) |
| 147 self._WaitForVideo(tab_index=1, expect_playing=True) | 160 self._WaitForVideo(tab_index=1, expect_playing=True) |
| 148 | 161 |
| 149 def _SetupCall(self, test_page): | 162 def _LoadPageInTwoTabs(self, test_page): |
| 150 url = self.GetFileURLForDataPath('webrtc', test_page) | 163 url = self.GetFileURLForDataPath('webrtc', test_page) |
| 151 self.NavigateToURL(url) | 164 self.NavigateToURL(url) |
| 152 self.AppendTab(pyauto.GURL(url)) | 165 self.AppendTab(pyauto.GURL(url)) |
| 153 | 166 |
| 167 def _SetupCall(self): | |
| 168 """Gets user media and establishes a call. | |
| 169 | |
| 170 Assumes that two tabs are already opened with a suitable test page. | |
| 171 """ | |
| 154 self.assertEquals('ok-got-stream', self.GetUserMedia(tab_index=0)) | 172 self.assertEquals('ok-got-stream', self.GetUserMedia(tab_index=0)) |
| 155 self.assertEquals('ok-got-stream', self.GetUserMedia(tab_index=1)) | 173 self.assertEquals('ok-got-stream', self.GetUserMedia(tab_index=1)) |
| 156 self.Connect('user_1', tab_index=0) | 174 self.Connect('user_1', tab_index=0) |
| 157 self.Connect('user_2', tab_index=1) | 175 self.Connect('user_2', tab_index=1) |
| 158 | 176 |
| 159 self.EstablishCall(from_tab_with_index=0) | 177 self.EstablishCall(from_tab_with_index=0) |
| 160 | 178 |
| 161 self._StartDetectingVideo(tab_index=0, video_element='remote-view') | 179 self._StartDetectingVideo(tab_index=0, video_element='remote-view') |
| 162 self._StartDetectingVideo(tab_index=1, video_element='remote-view') | 180 self._StartDetectingVideo(tab_index=1, video_element='remote-view') |
| 163 | 181 |
| 164 self._WaitForVideo(tab_index=0, expect_playing=True) | 182 self._WaitForVideo(tab_index=0, expect_playing=True) |
| 165 self._WaitForVideo(tab_index=1, expect_playing=True) | 183 self._WaitForVideo(tab_index=1, expect_playing=True) |
| 166 | 184 |
| 167 def _StartDetectingVideo(self, tab_index, video_element): | 185 def _StartDetectingVideo(self, tab_index, video_element): |
| 168 self.assertEquals('ok-started', self.ExecuteJavascript( | 186 self.assertEquals('ok-started', self.ExecuteJavascript( |
| 169 'startDetection("%s", "frame-buffer", 320, 240)' % video_element, | 187 'startDetection("%s", "frame-buffer", 320, 240)' % video_element, |
| 170 tab_index=tab_index)); | 188 tab_index=tab_index)); |
| 171 | 189 |
| 172 def _WaitForVideo(self, tab_index, expect_playing): | 190 def _WaitForVideo(self, tab_index, expect_playing): |
| 173 expect_retval='video-playing' if expect_playing else 'video-not-playing' | 191 expect_retval='video-playing' if expect_playing else 'video-not-playing' |
| 174 | 192 |
| 175 video_playing = self.WaitUntil( | 193 video_playing = self.WaitUntil( |
| 176 function=lambda: self.ExecuteJavascript('isVideoPlaying()', | 194 function=lambda: self.ExecuteJavascript('isVideoPlaying()', |
| 177 tab_index=tab_index), | 195 tab_index=tab_index), |
| 178 expect_retval=expect_retval) | 196 expect_retval=expect_retval) |
| 179 self.assertTrue(video_playing, | 197 self.assertTrue(video_playing, |
| 180 msg= 'Timed out while waiting for isVideoPlaying to ' + | 198 msg= 'Timed out while waiting for isVideoPlaying to ' + |
| 181 'return ' + expect_retval + '.') | 199 'return ' + expect_retval + '.') |
| 182 | 200 |
| 201 def _GetChromeRendererProcess(self, tab_index): | |
| 202 """Returns the Chrome renderer process.""" | |
|
kjellander_chromium
2012/10/15 21:19:21
Add something about what you get back and what it'
phoglund_chromium
2012/10/16 21:27:08
Done.
| |
| 203 tab_info = self.GetBrowserInfo()['windows'][0]['tabs'][tab_index] | |
| 204 renderer_id = tab_info['renderer_pid'] | |
| 205 if not renderer_id: | |
| 206 self.fail('Can not find the tab renderer process.') | |
| 207 return psutil.Process(renderer_id) | |
| 208 | |
| 183 | 209 |
| 184 if __name__ == '__main__': | 210 if __name__ == '__main__': |
| 185 pyauto_functional.Main() | 211 pyauto_functional.Main() |
| OLD | NEW |