1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/command_line.h" 6 #include "base/files/file_util.h" 7 #include "base/strings/stringprintf.h" 8 #include "base/threading/platform_thread.h" 9 #include "content/browser/web_contents/web_contents_impl.h" 10 #include "content/public/common/content_switches.h" 11 #include "content/public/test/browser_test_utils.h" 12 #include "content/public/test/content_browser_test_utils.h" 13 #include "content/public/test/test_utils.h" 14 #include "content/test/webrtc_content_browsertest_base.h" 15 #include "media/audio/audio_manager.h" 16 #include "media/base/media_switches.h" 17 #include "net/test/embedded_test_server/embedded_test_server.h" 18 19 namespace { 20 21 #if defined (OS_ANDROID) || defined(THREAD_SANITIZER) 22 // Just do the bare minimum of audio checking on Android and under TSAN since 23 // it's a bit sensitive to device performance. 24 const char kUseLenientAudioChecking[] = "true"; 25 #else 26 const char kUseLenientAudioChecking[] = "false"; 27 #endif 28 29 } // namespace 30 31 namespace content { 32 33 #if defined(OS_ANDROID) && defined(ADDRESS_SANITIZER) 34 // Renderer crashes under Android ASAN: https://crbug.com/408496. 35 #define MAYBE_WebRtcBrowserTest DISABLED_WebRtcBrowserTest 36 #elif defined(OS_ANDROID) && defined(__aarch64__) 37 // Failures on ARM64 Android: http://crbug.com/408179. 38 #define MAYBE_WebRtcBrowserTest DISABLED_WebRtcBrowserTest 39 #else 40 #define MAYBE_WebRtcBrowserTest WebRtcBrowserTest 41 #endif 42 43 class MAYBE_WebRtcBrowserTest : public WebRtcContentBrowserTest { 44 public: 45 MAYBE_WebRtcBrowserTest() {} 46 virtual ~MAYBE_WebRtcBrowserTest() {} 47 48 // Convenience function since most peerconnection-call.html tests just load 49 // the page, kick off some javascript and wait for the title to change to OK. 50 void MakeTypicalPeerConnectionCall(const std::string& javascript) { 51 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 52 53 GURL url(embedded_test_server()->GetURL("/media/peerconnection-call.html")); 54 NavigateToURL(shell(), url); 55 56 DisableOpusIfOnAndroid(); 57 ExecuteJavascriptAndWaitForOk(javascript); 58 } 59 60 // Convenience method for making calls that detect if audio os playing (which 61 // has some special prerequisites, such that there needs to be an audio output 62 // device on the executing machine). 63 void MakeAudioDetectingPeerConnectionCall(const std::string& javascript) { 64 if (!media::AudioManager::Get()->HasAudioOutputDevices()) { 65 // Bots with no output devices will force the audio code into a state 66 // where it doesn't manage to set either the low or high latency path. 67 // This test will compute useless values in that case, so skip running on 68 // such bots (see crbug.com/326338). 69 LOG(INFO) << "Missing output devices: skipping test..."; 70 return; 71 } 72 73 ASSERT_TRUE(base::CommandLine::ForCurrentProcess()->HasSwitch( 74 switches::kUseFakeDeviceForMediaStream)) 75 << "Must run with fake devices since the test will explicitly look " 76 << "for the fake device signal."; 77 78 MakeTypicalPeerConnectionCall(javascript); 79 } 80 }; 81 82 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) 83 // Timing out on ARM linux bot: http://crbug.com/238490 84 #define MAYBE_CanSetupDefaultVideoCall DISABLED_CanSetupDefaultVideoCall 85 // Flaky on TSAN v2. http://crbug.com/408006 86 #elif defined(THREAD_SANITIZER) 87 #define MAYBE_CanSetupDefaultVideoCall DISABLED_CanSetupDefaultVideoCall 88 #else 89 #define MAYBE_CanSetupDefaultVideoCall CanSetupDefaultVideoCall 90 #endif 91 92 // These tests will make a complete PeerConnection-based call and verify that 93 // video is playing for the call. 94 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 95 MAYBE_CanSetupDefaultVideoCall) { 96 MakeTypicalPeerConnectionCall( 97 "callAndExpectResolution({video: true}, 640, 480);"); 98 } 99 100 // Flaky on TSAN v2. http://crbug.com/408006 101 #if defined(THREAD_SANITIZER) 102 #define MAYBE_CanSetupVideoCallWith1To1AspectRatio \ 103 DISABLED_CanSetupVideoCallWith1To1AspectRatio 104 #else 105 #define MAYBE_CanSetupVideoCallWith1To1AspectRatio \ 106 CanSetupVideoCallWith1To1AspectRatio 107 #endif 108 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 109 MAYBE_CanSetupVideoCallWith1To1AspectRatio) { 110 const std::string javascript = 111 "callAndExpectResolution({video: {mandatory: {minWidth: 320," 112 " maxWidth: 320, minHeight: 320, maxHeight: 320}}}, 320, 320);"; 113 MakeTypicalPeerConnectionCall(javascript); 114 } 115 116 #if defined(OS_ANDROID) && defined(ARCH_CPU_ARM64) 117 // Failing on ARM64 Android bot: http://crbug.com/408179 118 #define MAYBE_CanSetupVideoCallWith16To9AspectRatio \ 119 DISABLED_CanSetupVideoCallWith16To9AspectRatio 120 // Flaky on TSAN v2. http://crbug.com/408006 121 #elif defined(THREAD_SANITIZER) 122 #define MAYBE_CanSetupVideoCallWith16To9AspectRatio \ 123 DISABLED_CanSetupVideoCallWith16To9AspectRatio 124 #else 125 #define MAYBE_CanSetupVideoCallWith16To9AspectRatio \ 126 CanSetupVideoCallWith16To9AspectRatio 127 #endif 128 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 129 MAYBE_CanSetupVideoCallWith16To9AspectRatio) { 130 const std::string javascript = 131 "callAndExpectResolution({video: {mandatory: {minWidth: 640," 132 " maxWidth: 640, minAspectRatio: 1.777}}}, 640, 360);"; 133 MakeTypicalPeerConnectionCall(javascript); 134 } 135 136 // Flaky on TSAN v2. http://crbug.com/408006 137 #if defined(THREAD_SANITIZER) 138 #define MAYBE_CanSetupVideoCallWith4To3AspectRatio \ 139 DISABLED_CanSetupVideoCallWith4To3AspectRatio 140 #else 141 #define MAYBE_CanSetupVideoCallWith4To3AspectRatio \ 142 CanSetupVideoCallWith4To3AspectRatio 143 #endif 144 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 145 MAYBE_CanSetupVideoCallWith4To3AspectRatio) { 146 const std::string javascript = 147 "callAndExpectResolution({video: {mandatory: {minWidth: 960," 148 "maxAspectRatio: 1.333}}}, 960, 720);"; 149 MakeTypicalPeerConnectionCall(javascript); 150 } 151 152 // Flaky on TSAN v2. http://crbug.com/408006 153 #if defined(THREAD_SANITIZER) 154 #define MAYBE_CanSetupVideoCallAndDisableLocalVideo \ 155 DISABLED_CanSetupVideoCallAndDisableLocalVideo 156 #else 157 #define MAYBE_CanSetupVideoCallAndDisableLocalVideo \ 158 CanSetupVideoCallAndDisableLocalVideo 159 #endif 160 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 161 MAYBE_CanSetupVideoCallAndDisableLocalVideo) { 162 const std::string javascript = 163 "callAndDisableLocalVideo({video: true});"; 164 MakeTypicalPeerConnectionCall(javascript); 165 } 166 167 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) 168 // Timing out on ARM linux, see http://crbug.com/240376 169 #define MAYBE_CanSetupAudioAndVideoCall DISABLED_CanSetupAudioAndVideoCall 170 #else 171 #define MAYBE_CanSetupAudioAndVideoCall CanSetupAudioAndVideoCall 172 #endif 173 174 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 175 MAYBE_CanSetupAudioAndVideoCall) { 176 MakeTypicalPeerConnectionCall("call({video: true, audio: true});"); 177 } 178 179 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 180 MANUAL_CanSetupCallAndSendDtmf) { 181 MakeTypicalPeerConnectionCall("callAndSendDtmf(\'123,abc\');"); 182 } 183 184 // TODO(phoglund): this test fails because the peer connection state will be 185 // stable in the second negotiation round rather than have-local-offer. 186 // http://crbug.com/293125. 187 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 188 DISABLED_CanMakeEmptyCallThenAddStreamsAndRenegotiate) { 189 const char* kJavascript = 190 "callEmptyThenAddOneStreamAndRenegotiate({video: true, audio: true});"; 191 MakeTypicalPeerConnectionCall(kJavascript); 192 } 193 194 // Below 2 test will make a complete PeerConnection-based call between pc1 and 195 // pc2, and then use the remote stream to setup a call between pc3 and pc4, and 196 // then verify that video is received on pc3 and pc4. 197 // The stream sent from pc3 to pc4 is the stream received on pc1. 198 // The stream sent from pc4 to pc3 is cloned from stream the stream received 199 // on pc2. 200 // Flaky on win xp. http://crbug.com/304775 201 #if defined(OS_WIN) 202 #define MAYBE_CanForwardRemoteStream DISABLED_CanForwardRemoteStream 203 #define MAYBE_CanForwardRemoteStream720p DISABLED_CanForwardRemoteStream720p 204 #else 205 #define MAYBE_CanForwardRemoteStream CanForwardRemoteStream 206 // Flaky on TSAN v2. http://crbug.com/373637 207 #if defined(THREAD_SANITIZER) 208 #define MAYBE_CanForwardRemoteStream720p DISABLED_CanForwardRemoteStream720p 209 #else 210 #define MAYBE_CanForwardRemoteStream720p CanForwardRemoteStream720p 211 #endif 212 #endif 213 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, MAYBE_CanForwardRemoteStream) { 214 #if defined (OS_ANDROID) 215 // This test fails on Nexus 5 devices. 216 // TODO(henrika): see http://crbug.com/362437 and http://crbug.com/359389 217 // for details. 218 base::CommandLine::ForCurrentProcess()->AppendSwitch( 219 switches::kDisableWebRtcHWDecoding); 220 #endif 221 MakeTypicalPeerConnectionCall( 222 "callAndForwardRemoteStream({video: true, audio: false});"); 223 } 224 225 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 226 MAYBE_CanForwardRemoteStream720p) { 227 #if defined (OS_ANDROID) 228 // This test fails on Nexus 5 devices. 229 // TODO(henrika): see http://crbug.com/362437 and http://crbug.com/359389 230 // for details. 231 base::CommandLine::ForCurrentProcess()->AppendSwitch( 232 switches::kDisableWebRtcHWDecoding); 233 #endif 234 const std::string javascript = GenerateGetUserMediaCall( 235 "callAndForwardRemoteStream", 1280, 1280, 720, 720, 10, 30); 236 MakeTypicalPeerConnectionCall(javascript); 237 } 238 239 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 240 NoCrashWhenConnectChromiumSinkToRemoteTrack) { 241 MakeTypicalPeerConnectionCall("ConnectChromiumSinkToRemoteAudioTrack();"); 242 } 243 244 // This test will make a complete PeerConnection-based call but remove the 245 // MSID and bundle attribute from the initial offer to verify that 246 // video is playing for the call even if the initiating client don't support 247 // MSID. http://tools.ietf.org/html/draft-alvestrand-rtcweb-msid-02 248 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) 249 // Timing out on ARM linux, see http://crbug.com/240373 250 #define MAYBE_CanSetupAudioAndVideoCallWithoutMsidAndBundle\ 251 DISABLED_CanSetupAudioAndVideoCallWithoutMsidAndBundle 252 #else 253 #define MAYBE_CanSetupAudioAndVideoCallWithoutMsidAndBundle\ 254 CanSetupAudioAndVideoCallWithoutMsidAndBundle 255 #endif 256 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 257 MAYBE_CanSetupAudioAndVideoCallWithoutMsidAndBundle) { 258 MakeTypicalPeerConnectionCall("callWithoutMsidAndBundle();"); 259 } 260 261 // This test will modify the SDP offer to an unsupported codec, which should 262 // cause SetLocalDescription to fail. 263 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 264 NegotiateUnsupportedVideoCodec) { 265 MakeTypicalPeerConnectionCall("negotiateUnsupportedVideoCodec();"); 266 } 267 268 // This test will modify the SDP offer to use no encryption, which should 269 // cause SetLocalDescription to fail. 270 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, NegotiateNonCryptoCall) { 271 MakeTypicalPeerConnectionCall("negotiateNonCryptoCall();"); 272 } 273 274 // This test can negotiate an SDP offer that includes a b=AS:xx to control 275 // the bandwidth for audio and video 276 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, NegotiateOfferWithBLine) { 277 MakeTypicalPeerConnectionCall("negotiateOfferWithBLine();"); 278 } 279 280 // This test will make a complete PeerConnection-based call using legacy SDP 281 // settings: GIce, external SDES, and no BUNDLE. 282 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) 283 // Timing out on ARM linux, see http://crbug.com/240373 284 #define MAYBE_CanSetupLegacyCall DISABLED_CanSetupLegacyCall 285 #else 286 #define MAYBE_CanSetupLegacyCall CanSetupLegacyCall 287 #endif 288 289 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, MAYBE_CanSetupLegacyCall) { 290 MakeTypicalPeerConnectionCall("callWithLegacySdp();"); 291 } 292 293 // This test will make a PeerConnection-based call and test an unreliable text 294 // dataChannel. 295 // TODO(mallinath) - Remove this test after rtp based data channel is disabled. 296 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, CallWithDataOnly) { 297 MakeTypicalPeerConnectionCall("callWithDataOnly();"); 298 } 299 300 #if defined(MEMORY_SANITIZER) 301 // Fails under MemorySanitizer: http://crbug.com/405951 302 #define MAYBE_CallWithSctpDataOnly DISABLED_CallWithSctpDataOnly 303 #else 304 #define MAYBE_CallWithSctpDataOnly CallWithSctpDataOnly 305 #endif 306 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, MAYBE_CallWithSctpDataOnly) { 307 MakeTypicalPeerConnectionCall("callWithSctpDataOnly();"); 308 } 309 310 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) 311 // Timing out on ARM linux bot: http://crbug.com/238490 312 #define MAYBE_CallWithDataAndMedia DISABLED_CallWithDataAndMedia 313 #else 314 #define MAYBE_CallWithDataAndMedia CallWithDataAndMedia 315 #endif 316 317 // This test will make a PeerConnection-based call and test an unreliable text 318 // dataChannel and audio and video tracks. 319 // TODO(mallinath) - Remove this test after rtp based data channel is disabled. 320 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, DISABLED_CallWithDataAndMedia) { 321 MakeTypicalPeerConnectionCall("callWithDataAndMedia();"); 322 } 323 324 325 #if (defined(OS_LINUX) && !defined(OS_CHROMEOS) && \ 326 defined(ARCH_CPU_ARM_FAMILY)) || defined(MEMORY_SANITIZER) 327 // Timing out on ARM linux bot: http://crbug.com/238490 328 // Fails under MemorySanitizer: http://crbug.com/405951 329 #define MAYBE_CallWithSctpDataAndMedia DISABLED_CallWithSctpDataAndMedia 330 #else 331 #define MAYBE_CallWithSctpDataAndMedia CallWithSctpDataAndMedia 332 #endif 333 334 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 335 MAYBE_CallWithSctpDataAndMedia) { 336 MakeTypicalPeerConnectionCall("callWithSctpDataAndMedia();"); 337 } 338 339 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) 340 // Timing out on ARM linux bot: http://crbug.com/238490 341 #define MAYBE_CallWithDataAndLaterAddMedia DISABLED_CallWithDataAndLaterAddMedia 342 #else 343 // Temporarily disable the test on all platforms. http://crbug.com/293252 344 #define MAYBE_CallWithDataAndLaterAddMedia DISABLED_CallWithDataAndLaterAddMedia 345 #endif 346 347 // This test will make a PeerConnection-based call and test an unreliable text 348 // dataChannel and later add an audio and video track. 349 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 350 MAYBE_CallWithDataAndLaterAddMedia) { 351 MakeTypicalPeerConnectionCall("callWithDataAndLaterAddMedia();"); 352 } 353 354 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) 355 // Timing out on ARM linux bot: http://crbug.com/238490 356 #define MAYBE_CallWithNewVideoMediaStream DISABLED_CallWithNewVideoMediaStream 357 #else 358 #define MAYBE_CallWithNewVideoMediaStream CallWithNewVideoMediaStream 359 #endif 360 361 // This test will make a PeerConnection-based call and send a new Video 362 // MediaStream that has been created based on a MediaStream created with 363 // getUserMedia. 364 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 365 MAYBE_CallWithNewVideoMediaStream) { 366 MakeTypicalPeerConnectionCall("callWithNewVideoMediaStream();"); 367 } 368 369 // This test will make a PeerConnection-based call and send a new Video 370 // MediaStream that has been created based on a MediaStream created with 371 // getUserMedia. When video is flowing, the VideoTrack is removed and an 372 // AudioTrack is added instead. 373 // TODO(phoglund): This test is manual since not all buildbots has an audio 374 // input. 375 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, MANUAL_CallAndModifyStream) { 376 MakeTypicalPeerConnectionCall( 377 "callWithNewVideoMediaStreamLaterSwitchToAudio();"); 378 } 379 380 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, AddTwoMediaStreamsToOnePC) { 381 MakeTypicalPeerConnectionCall("addTwoMediaStreamsToOneConnection();"); 382 } 383 384 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 385 EstablishAudioVideoCallAndEnsureAudioIsPlaying) { 386 MakeAudioDetectingPeerConnectionCall(base::StringPrintf( 387 "callAndEnsureAudioIsPlaying(%s, {audio:true, video:true});", 388 kUseLenientAudioChecking)); 389 } 390 391 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 392 EstablishAudioOnlyCallAndEnsureAudioIsPlaying) { 393 MakeAudioDetectingPeerConnectionCall(base::StringPrintf( 394 "callAndEnsureAudioIsPlaying(%s, {audio:true});", 395 kUseLenientAudioChecking)); 396 } 397 398 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 399 EstablishAudioVideoCallAndVerifyRemoteMutingWorks) { 400 MakeAudioDetectingPeerConnectionCall(base::StringPrintf( 401 "callAndEnsureRemoteAudioTrackMutingWorks(%s);", 402 kUseLenientAudioChecking)); 403 } 404 405 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 406 EstablishAudioVideoCallAndVerifyLocalMutingWorks) { 407 MakeAudioDetectingPeerConnectionCall(base::StringPrintf( 408 "callAndEnsureLocalAudioTrackMutingWorks(%s);", 409 kUseLenientAudioChecking)); 410 } 411 412 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 413 EnsureLocalVideoMuteDoesntMuteAudio) { 414 MakeAudioDetectingPeerConnectionCall(base::StringPrintf( 415 "callAndEnsureLocalVideoMutingDoesntMuteAudio(%s);", 416 kUseLenientAudioChecking)); 417 } 418 419 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 420 EnsureRemoteVideoMuteDoesntMuteAudio) { 421 MakeAudioDetectingPeerConnectionCall(base::StringPrintf( 422 "callAndEnsureRemoteVideoMutingDoesntMuteAudio(%s);", 423 kUseLenientAudioChecking)); 424 } 425 426 // Flaky on TSAN v2: http://crbug.com/373637 427 #if defined(THREAD_SANITIZER) 428 #define MAYBE_EstablishAudioVideoCallAndVerifyUnmutingWorks\ 429 DISABLED_EstablishAudioVideoCallAndVerifyUnmutingWorks 430 #else 431 #define MAYBE_EstablishAudioVideoCallAndVerifyUnmutingWorks\ 432 EstablishAudioVideoCallAndVerifyUnmutingWorks 433 #endif 434 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, 435 MAYBE_EstablishAudioVideoCallAndVerifyUnmutingWorks) { 436 MakeAudioDetectingPeerConnectionCall(base::StringPrintf( 437 "callAndEnsureAudioTrackUnmutingWorks(%s);", kUseLenientAudioChecking)); 438 } 439 440 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, CallAndVerifyVideoMutingWorks) { 441 MakeTypicalPeerConnectionCall("callAndEnsureVideoTrackMutingWorks();"); 442 } 443 444 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest, CreateOfferWithOfferOptions) { 445 MakeTypicalPeerConnectionCall("testCreateOfferOptions();"); 446 } 447 448 } // namespace content 449