| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * libjingle | 2  * libjingle | 
| 3  * Copyright 2012 Google Inc. | 3  * Copyright 2012 Google Inc. | 
| 4  * | 4  * | 
| 5  * Redistribution and use in source and binary forms, with or without | 5  * Redistribution and use in source and binary forms, with or without | 
| 6  * modification, are permitted provided that the following conditions are met: | 6  * modification, are permitted provided that the following conditions are met: | 
| 7  * | 7  * | 
| 8  *  1. Redistributions of source code must retain the above copyright notice, | 8  *  1. Redistributions of source code must retain the above copyright notice, | 
| 9  *     this list of conditions and the following disclaimer. | 9  *     this list of conditions and the following disclaimer. | 
| 10  *  2. Redistributions in binary form must reproduce the above copyright notice, | 10  *  2. Redistributions in binary form must reproduce the above copyright notice, | 
| 11  *     this list of conditions and the following disclaimer in the documentation | 11  *     this list of conditions and the following disclaimer in the documentation | 
| 12  *     and/or other materials provided with the distribution. | 12  *     and/or other materials provided with the distribution. | 
| 13  *  3. The name of the author may not be used to endorse or promote products | 13  *  3. The name of the author may not be used to endorse or promote products | 
| 14  *     derived from this software without specific prior written permission. | 14  *     derived from this software without specific prior written permission. | 
| 15  * | 15  * | 
| 16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED | 16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED | 
| 17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | 17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | 
| 18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | 18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | 
| 19  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 19  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
| 20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 
| 21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; | 21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; | 
| 22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | 22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | 
| 23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR | 23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR | 
| 24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | 24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | 
| 25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
| 26  */ | 26  */ | 
| 27 | 27 | 
|  | 28 #include <vector> | 
|  | 29 | 
| 28 #include "talk/app/webrtc/audiotrack.h" | 30 #include "talk/app/webrtc/audiotrack.h" | 
| 29 #include "talk/app/webrtc/fakemetricsobserver.h" | 31 #include "talk/app/webrtc/fakemetricsobserver.h" | 
| 30 #include "talk/app/webrtc/jsepicecandidate.h" | 32 #include "talk/app/webrtc/jsepicecandidate.h" | 
| 31 #include "talk/app/webrtc/jsepsessiondescription.h" | 33 #include "talk/app/webrtc/jsepsessiondescription.h" | 
| 32 #include "talk/app/webrtc/mediastreamsignaling.h" | 34 #include "talk/app/webrtc/mediastreamsignaling.h" | 
| 33 #include "talk/app/webrtc/streamcollection.h" | 35 #include "talk/app/webrtc/streamcollection.h" | 
| 34 #include "talk/app/webrtc/test/fakeconstraints.h" | 36 #include "talk/app/webrtc/test/fakeconstraints.h" | 
| 35 #include "talk/app/webrtc/test/fakedtlsidentitystore.h" | 37 #include "talk/app/webrtc/test/fakedtlsidentitystore.h" | 
| 36 #include "talk/app/webrtc/test/fakemediastreamsignaling.h" | 38 #include "talk/app/webrtc/test/fakemediastreamsignaling.h" | 
| 37 #include "talk/app/webrtc/videotrack.h" | 39 #include "talk/app/webrtc/videotrack.h" | 
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 156     "a=rtpmap:96 rtx/90000\r\n" | 158     "a=rtpmap:96 rtx/90000\r\n" | 
| 157     "a=fmtp:96 apt=0\r\n"; | 159     "a=fmtp:96 apt=0\r\n"; | 
| 158 | 160 | 
| 159 enum RTCCertificateGenerationMethod { ALREADY_GENERATED, DTLS_IDENTITY_STORE }; | 161 enum RTCCertificateGenerationMethod { ALREADY_GENERATED, DTLS_IDENTITY_STORE }; | 
| 160 | 162 | 
| 161 // Add some extra |newlines| to the |message| after |line|. | 163 // Add some extra |newlines| to the |message| after |line|. | 
| 162 static void InjectAfter(const std::string& line, | 164 static void InjectAfter(const std::string& line, | 
| 163                         const std::string& newlines, | 165                         const std::string& newlines, | 
| 164                         std::string* message) { | 166                         std::string* message) { | 
| 165   const std::string tmp = line + newlines; | 167   const std::string tmp = line + newlines; | 
| 166   rtc::replace_substrs(line.c_str(), line.length(), | 168   rtc::replace_substrs(line.c_str(), line.length(), tmp.c_str(), tmp.length(), | 
| 167                        tmp.c_str(), tmp.length(), message); | 169                        message); | 
| 168 } | 170 } | 
| 169 | 171 | 
| 170 class MockIceObserver : public webrtc::IceObserver { | 172 class MockIceObserver : public webrtc::IceObserver { | 
| 171  public: | 173  public: | 
| 172   MockIceObserver() | 174   MockIceObserver() | 
| 173       : oncandidatesready_(false), | 175       : oncandidatesready_(false), | 
| 174         ice_connection_state_(PeerConnectionInterface::kIceConnectionNew), | 176         ice_connection_state_(PeerConnectionInterface::kIceConnectionNew), | 
| 175         ice_gathering_state_(PeerConnectionInterface::kIceGatheringNew) { | 177         ice_gathering_state_(PeerConnectionInterface::kIceGatheringNew) { | 
| 176   } | 178   } | 
| 177 | 179 | 
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 237                        rtc::Thread* worker_thread, | 239                        rtc::Thread* worker_thread, | 
| 238                        cricket::PortAllocator* port_allocator, | 240                        cricket::PortAllocator* port_allocator, | 
| 239                        webrtc::IceObserver* ice_observer, | 241                        webrtc::IceObserver* ice_observer, | 
| 240                        webrtc::MediaStreamSignaling* mediastream_signaling) | 242                        webrtc::MediaStreamSignaling* mediastream_signaling) | 
| 241     : WebRtcSession(cmgr, signaling_thread, worker_thread, port_allocator, | 243     : WebRtcSession(cmgr, signaling_thread, worker_thread, port_allocator, | 
| 242                     mediastream_signaling) { | 244                     mediastream_signaling) { | 
| 243     RegisterIceObserver(ice_observer); | 245     RegisterIceObserver(ice_observer); | 
| 244   } | 246   } | 
| 245   virtual ~WebRtcSessionForTest() {} | 247   virtual ~WebRtcSessionForTest() {} | 
| 246 | 248 | 
| 247   using cricket::BaseSession::GetTransportProxy; | 249   // Note that these methods are only safe to use if the signaling thread | 
|  | 250   // is the same as the worker thread | 
|  | 251   cricket::TransportChannel* voice_rtp_transport_channel() { | 
|  | 252     return rtp_transport_channel(voice_channel()); | 
|  | 253   } | 
|  | 254 | 
|  | 255   cricket::TransportChannel* voice_rtcp_transport_channel() { | 
|  | 256     return rtcp_transport_channel(voice_channel()); | 
|  | 257   } | 
|  | 258 | 
|  | 259   cricket::TransportChannel* video_rtp_transport_channel() { | 
|  | 260     return rtp_transport_channel(video_channel()); | 
|  | 261   } | 
|  | 262 | 
|  | 263   cricket::TransportChannel* video_rtcp_transport_channel() { | 
|  | 264     return rtcp_transport_channel(video_channel()); | 
|  | 265   } | 
|  | 266 | 
|  | 267   cricket::TransportChannel* data_rtp_transport_channel() { | 
|  | 268     return rtp_transport_channel(data_channel()); | 
|  | 269   } | 
|  | 270 | 
|  | 271   cricket::TransportChannel* data_rtcp_transport_channel() { | 
|  | 272     return rtcp_transport_channel(data_channel()); | 
|  | 273   } | 
|  | 274 | 
| 248   using webrtc::WebRtcSession::SetAudioPlayout; | 275   using webrtc::WebRtcSession::SetAudioPlayout; | 
| 249   using webrtc::WebRtcSession::SetAudioSend; | 276   using webrtc::WebRtcSession::SetAudioSend; | 
| 250   using webrtc::WebRtcSession::SetCaptureDevice; | 277   using webrtc::WebRtcSession::SetCaptureDevice; | 
| 251   using webrtc::WebRtcSession::SetVideoPlayout; | 278   using webrtc::WebRtcSession::SetVideoPlayout; | 
| 252   using webrtc::WebRtcSession::SetVideoSend; | 279   using webrtc::WebRtcSession::SetVideoSend; | 
|  | 280 | 
|  | 281  private: | 
|  | 282   cricket::TransportChannel* rtp_transport_channel(cricket::BaseChannel* ch) { | 
|  | 283     if (!ch) { | 
|  | 284       return nullptr; | 
|  | 285     } | 
|  | 286     return ch->transport_channel(); | 
|  | 287   } | 
|  | 288 | 
|  | 289   cricket::TransportChannel* rtcp_transport_channel(cricket::BaseChannel* ch) { | 
|  | 290     if (!ch) { | 
|  | 291       return nullptr; | 
|  | 292     } | 
|  | 293     return ch->rtcp_transport_channel(); | 
|  | 294   } | 
| 253 }; | 295 }; | 
| 254 | 296 | 
| 255 class WebRtcSessionCreateSDPObserverForTest | 297 class WebRtcSessionCreateSDPObserverForTest | 
| 256     : public rtc::RefCountedObject<CreateSessionDescriptionObserver> { | 298     : public rtc::RefCountedObject<CreateSessionDescriptionObserver> { | 
| 257  public: | 299  public: | 
| 258   enum State { | 300   enum State { | 
| 259     kInit, | 301     kInit, | 
| 260     kFailed, | 302     kFailed, | 
| 261     kSucceeded, | 303     kSucceeded, | 
| 262   }; | 304   }; | 
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 368         channel_manager_.get(), rtc::Thread::Current(), | 410         channel_manager_.get(), rtc::Thread::Current(), | 
| 369         rtc::Thread::Current(), allocator_.get(), | 411         rtc::Thread::Current(), allocator_.get(), | 
| 370         &observer_, | 412         &observer_, | 
| 371         &mediastream_signaling_)); | 413         &mediastream_signaling_)); | 
| 372 | 414 | 
| 373     EXPECT_EQ(PeerConnectionInterface::kIceConnectionNew, | 415     EXPECT_EQ(PeerConnectionInterface::kIceConnectionNew, | 
| 374         observer_.ice_connection_state_); | 416         observer_.ice_connection_state_); | 
| 375     EXPECT_EQ(PeerConnectionInterface::kIceGatheringNew, | 417     EXPECT_EQ(PeerConnectionInterface::kIceGatheringNew, | 
| 376         observer_.ice_gathering_state_); | 418         observer_.ice_gathering_state_); | 
| 377 | 419 | 
| 378     EXPECT_TRUE(session_->Initialize( | 420     EXPECT_TRUE(session_->Initialize(options_, constraints_.get(), | 
| 379         options_, constraints_.get(), dtls_identity_store.Pass(), | 421                                      dtls_identity_store.Pass(), | 
| 380         rtc_configuration)); | 422                                      rtc_configuration)); | 
| 381     session_->set_metrics_observer(metrics_observer_); | 423     session_->set_metrics_observer(metrics_observer_); | 
| 382   } | 424   } | 
| 383 | 425 | 
| 384   void Init() { | 426   void Init() { | 
| 385     PeerConnectionInterface::RTCConfiguration configuration; | 427     PeerConnectionInterface::RTCConfiguration configuration; | 
| 386     Init(nullptr, configuration); | 428     Init(nullptr, configuration); | 
| 387   } | 429   } | 
| 388 | 430 | 
| 389   void InitWithIceTransport( | 431   void InitWithIceTransport( | 
| 390       PeerConnectionInterface::IceTransportsType ice_transport_type) { | 432       PeerConnectionInterface::IceTransportsType ice_transport_type) { | 
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 483         observer->state() != WebRtcSessionCreateSDPObserverForTest::kInit, | 525         observer->state() != WebRtcSessionCreateSDPObserverForTest::kInit, | 
| 484         2000); | 526         2000); | 
| 485     return observer->ReleaseDescription(); | 527     return observer->ReleaseDescription(); | 
| 486   } | 528   } | 
| 487 | 529 | 
| 488   bool ChannelsExist() const { | 530   bool ChannelsExist() const { | 
| 489     return (session_->voice_channel() != NULL && | 531     return (session_->voice_channel() != NULL && | 
| 490             session_->video_channel() != NULL); | 532             session_->video_channel() != NULL); | 
| 491   } | 533   } | 
| 492 | 534 | 
| 493   void CheckTransportChannels() const { |  | 
| 494     EXPECT_TRUE(session_->GetChannel(cricket::CN_AUDIO, 1) != NULL); |  | 
| 495     EXPECT_TRUE(session_->GetChannel(cricket::CN_AUDIO, 2) != NULL); |  | 
| 496     EXPECT_TRUE(session_->GetChannel(cricket::CN_VIDEO, 1) != NULL); |  | 
| 497     EXPECT_TRUE(session_->GetChannel(cricket::CN_VIDEO, 2) != NULL); |  | 
| 498   } |  | 
| 499 |  | 
| 500   void VerifyCryptoParams(const cricket::SessionDescription* sdp) { | 535   void VerifyCryptoParams(const cricket::SessionDescription* sdp) { | 
| 501     ASSERT_TRUE(session_.get() != NULL); | 536     ASSERT_TRUE(session_.get() != NULL); | 
| 502     const cricket::ContentInfo* content = cricket::GetFirstAudioContent(sdp); | 537     const cricket::ContentInfo* content = cricket::GetFirstAudioContent(sdp); | 
| 503     ASSERT_TRUE(content != NULL); | 538     ASSERT_TRUE(content != NULL); | 
| 504     const cricket::AudioContentDescription* audio_content = | 539     const cricket::AudioContentDescription* audio_content = | 
| 505         static_cast<const cricket::AudioContentDescription*>( | 540         static_cast<const cricket::AudioContentDescription*>( | 
| 506             content->description); | 541             content->description); | 
| 507     ASSERT_TRUE(audio_content != NULL); | 542     ASSERT_TRUE(audio_content != NULL); | 
| 508     ASSERT_EQ(1U, audio_content->cryptos().size()); | 543     ASSERT_EQ(1U, audio_content->cryptos().size()); | 
| 509     ASSERT_EQ(47U, audio_content->cryptos()[0].key_params.size()); | 544     ASSERT_EQ(47U, audio_content->cryptos()[0].key_params.size()); | 
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 962                                  &sdp); | 997                                  &sdp); | 
| 963     } | 998     } | 
| 964 | 999 | 
| 965     SessionDescriptionInterface* new_answer = CreateSessionDescription( | 1000     SessionDescriptionInterface* new_answer = CreateSessionDescription( | 
| 966         JsepSessionDescription::kAnswer, sdp, NULL); | 1001         JsepSessionDescription::kAnswer, sdp, NULL); | 
| 967 | 1002 | 
| 968     // SetRemoteDescription to enable rtcp mux. | 1003     // SetRemoteDescription to enable rtcp mux. | 
| 969     SetRemoteDescriptionWithoutError(new_answer); | 1004     SetRemoteDescriptionWithoutError(new_answer); | 
| 970     EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); | 1005     EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); | 
| 971     EXPECT_EQ(expected_candidate_num, observer_.mline_0_candidates_.size()); | 1006     EXPECT_EQ(expected_candidate_num, observer_.mline_0_candidates_.size()); | 
| 972     EXPECT_EQ(expected_candidate_num, observer_.mline_1_candidates_.size()); | 1007     if (bundle) { | 
| 973     for (size_t i = 0; i < observer_.mline_0_candidates_.size(); ++i) { | 1008       EXPECT_EQ(0, observer_.mline_1_candidates_.size()); | 
| 974       cricket::Candidate c0 = observer_.mline_0_candidates_[i]; | 1009     } else { | 
| 975       cricket::Candidate c1 = observer_.mline_1_candidates_[i]; | 1010       EXPECT_EQ(expected_candidate_num, observer_.mline_1_candidates_.size()); | 
| 976       if (bundle) { |  | 
| 977         EXPECT_TRUE(c0.IsEquivalent(c1)); |  | 
| 978       } else { |  | 
| 979         EXPECT_FALSE(c0.IsEquivalent(c1)); |  | 
| 980       } |  | 
| 981     } | 1011     } | 
| 982   } | 1012   } | 
| 983   // Tests that we can only send DTMF when the dtmf codec is supported. | 1013   // Tests that we can only send DTMF when the dtmf codec is supported. | 
| 984   void TestCanInsertDtmf(bool can) { | 1014   void TestCanInsertDtmf(bool can) { | 
| 985     if (can) { | 1015     if (can) { | 
| 986       InitWithDtmfCodec(); | 1016       InitWithDtmfCodec(); | 
| 987     } else { | 1017     } else { | 
| 988       Init(); | 1018       Init(); | 
| 989     } | 1019     } | 
| 990     mediastream_signaling_.SendAudioVideoStream1(); | 1020     mediastream_signaling_.SendAudioVideoStream1(); | 
| 991     CreateAndSetRemoteOfferAndLocalAnswer(); | 1021     CreateAndSetRemoteOfferAndLocalAnswer(); | 
| 992     EXPECT_FALSE(session_->CanInsertDtmf("")); | 1022     EXPECT_FALSE(session_->CanInsertDtmf("")); | 
| 993     EXPECT_EQ(can, session_->CanInsertDtmf(kAudioTrack1)); | 1023     EXPECT_EQ(can, session_->CanInsertDtmf(kAudioTrack1)); | 
| 994   } | 1024   } | 
| 995 | 1025 | 
| 996   // Helper class to configure loopback network and verify Best | 1026   // Helper class to configure loopback network and verify Best | 
| 997   // Connection using right IP protocol for TestLoopbackCall | 1027   // Connection using right IP protocol for TestLoopbackCall | 
| 998   // method. LoopbackNetworkManager applies firewall rules to block | 1028   // method. LoopbackNetworkManager applies firewall rules to block | 
| 999   // all ping traffic once ICE completed, and remove them to observe | 1029   // all ping traffic once ICE completed, and remove them to observe | 
| 1000   // ICE reconnected again. This LoopbackNetworkConfiguration struct | 1030   // ICE reconnected again. This LoopbackNetworkConfiguration struct | 
| 1001   // verifies the best connection is using the right IP protocol after | 1031   // verifies the best connection is using the right IP protocol after | 
| 1002   // initial ICE convergences. | 1032   // initial ICE convergences. | 
| 1003 | 1033 | 
| 1004   class LoopbackNetworkConfiguration { | 1034   class LoopbackNetworkConfiguration { | 
| 1005   public: | 1035    public: | 
| 1006     LoopbackNetworkConfiguration() | 1036     LoopbackNetworkConfiguration() | 
| 1007         : test_ipv6_network_(false), | 1037         : test_ipv6_network_(false), | 
| 1008           test_extra_ipv4_network_(false), | 1038           test_extra_ipv4_network_(false), | 
| 1009           best_connection_after_initial_ice_converged_(1, 0) {} | 1039           best_connection_after_initial_ice_converged_(1, 0) {} | 
| 1010 | 1040 | 
| 1011     // Used to track the expected best connection count in each IP protocol. | 1041     // Used to track the expected best connection count in each IP protocol. | 
| 1012     struct ExpectedBestConnection { | 1042     struct ExpectedBestConnection { | 
| 1013       ExpectedBestConnection(int ipv4_count, int ipv6_count) | 1043       ExpectedBestConnection(int ipv4_count, int ipv6_count) | 
| 1014           : ipv4_count_(ipv4_count), | 1044           : ipv4_count_(ipv4_count), | 
| 1015             ipv6_count_(ipv6_count) {} | 1045             ipv6_count_(ipv6_count) {} | 
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1144 | 1174 | 
| 1145     LOG(LS_INFO) << "Firewall Rules applied"; | 1175     LOG(LS_INFO) << "Firewall Rules applied"; | 
| 1146     EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionDisconnected, | 1176     EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionDisconnected, | 
| 1147                    observer_.ice_connection_state_, | 1177                    observer_.ice_connection_state_, | 
| 1148                    kIceCandidatesTimeout); | 1178                    kIceCandidatesTimeout); | 
| 1149 | 1179 | 
| 1150     metrics_observer_->Reset(); | 1180     metrics_observer_->Reset(); | 
| 1151 | 1181 | 
| 1152     // Clearing the rules, session should move back to completed state. | 1182     // Clearing the rules, session should move back to completed state. | 
| 1153     loopback_network_manager.ClearRules(fss_.get()); | 1183     loopback_network_manager.ClearRules(fss_.get()); | 
| 1154     // Session is automatically calling OnSignalingReady after creation of |  | 
| 1155     // new portallocator session which will allocate new set of candidates. |  | 
| 1156 | 1184 | 
| 1157     LOG(LS_INFO) << "Firewall Rules cleared"; | 1185     LOG(LS_INFO) << "Firewall Rules cleared"; | 
| 1158 |  | 
| 1159     EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionCompleted, | 1186     EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionCompleted, | 
| 1160                    observer_.ice_connection_state_, | 1187                    observer_.ice_connection_state_, | 
| 1161                    kIceCandidatesTimeout); | 1188                    kIceCandidatesTimeout); | 
| 1162 | 1189 | 
| 1163     // Now we block ping requests and wait until the ICE connection transitions | 1190     // Now we block ping requests and wait until the ICE connection transitions | 
| 1164     // to the Failed state.  This will take at least 30 seconds because it must | 1191     // to the Failed state.  This will take at least 30 seconds because it must | 
| 1165     // wait for the Port to timeout. | 1192     // wait for the Port to timeout. | 
| 1166     int port_timeout = 30000; | 1193     int port_timeout = 30000; | 
| 1167 | 1194 | 
| 1168     loopback_network_manager.ApplyFirewallRules(fss_.get()); | 1195     loopback_network_manager.ApplyFirewallRules(fss_.get()); | 
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1218     VerifyMultipleAsyncCreateDescriptionAfterInit(true, type); | 1245     VerifyMultipleAsyncCreateDescriptionAfterInit(true, type); | 
| 1219   } | 1246   } | 
| 1220 | 1247 | 
| 1221   void VerifyMultipleAsyncCreateDescriptionIdentityGenFailure( | 1248   void VerifyMultipleAsyncCreateDescriptionIdentityGenFailure( | 
| 1222       CreateSessionDescriptionRequest::Type type) { | 1249       CreateSessionDescriptionRequest::Type type) { | 
| 1223     InitWithDtlsIdentityGenFail(); | 1250     InitWithDtlsIdentityGenFail(); | 
| 1224     VerifyMultipleAsyncCreateDescriptionAfterInit(false, type); | 1251     VerifyMultipleAsyncCreateDescriptionAfterInit(false, type); | 
| 1225   } | 1252   } | 
| 1226 | 1253 | 
| 1227   void VerifyMultipleAsyncCreateDescriptionAfterInit( | 1254   void VerifyMultipleAsyncCreateDescriptionAfterInit( | 
| 1228       bool success, CreateSessionDescriptionRequest::Type type) { | 1255       bool success, | 
|  | 1256       CreateSessionDescriptionRequest::Type type) { | 
| 1229     CHECK(session_); | 1257     CHECK(session_); | 
| 1230     SetFactoryDtlsSrtp(); | 1258     SetFactoryDtlsSrtp(); | 
| 1231     if (type == CreateSessionDescriptionRequest::kAnswer) { | 1259     if (type == CreateSessionDescriptionRequest::kAnswer) { | 
| 1232       cricket::MediaSessionOptions options; | 1260       cricket::MediaSessionOptions options; | 
| 1233       scoped_ptr<JsepSessionDescription> offer( | 1261       scoped_ptr<JsepSessionDescription> offer( | 
| 1234             CreateRemoteOffer(options, cricket::SEC_DISABLED)); | 1262             CreateRemoteOffer(options, cricket::SEC_DISABLED)); | 
| 1235       ASSERT_TRUE(offer.get() != NULL); | 1263       ASSERT_TRUE(offer.get() != NULL); | 
| 1236       SetRemoteDescriptionWithoutError(offer.release()); | 1264       SetRemoteDescriptionWithoutError(offer.release()); | 
| 1237     } | 1265     } | 
| 1238 | 1266 | 
| (...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1701   // the offer and answer. | 1729   // the offer and answer. | 
| 1702   SetRemoteDescriptionWithoutError(offer); | 1730   SetRemoteDescriptionWithoutError(offer); | 
| 1703   SetLocalDescriptionAnswerExpectError( | 1731   SetLocalDescriptionAnswerExpectError( | 
| 1704       kSdpWithoutDtlsFingerprint, answer); | 1732       kSdpWithoutDtlsFingerprint, answer); | 
| 1705 } | 1733 } | 
| 1706 | 1734 | 
| 1707 // Test that we return a failure when applying a remote answer that doesn't have | 1735 // Test that we return a failure when applying a remote answer that doesn't have | 
| 1708 // a DTLS fingerprint when DTLS is required. | 1736 // a DTLS fingerprint when DTLS is required. | 
| 1709 TEST_P(WebRtcSessionTest, TestSetRemoteNonDtlsAnswerWhenDtlsOn) { | 1737 TEST_P(WebRtcSessionTest, TestSetRemoteNonDtlsAnswerWhenDtlsOn) { | 
| 1710   MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); | 1738   MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); | 
| 1711   // Enable both SDES and DTLS, so that offer won't be outright rejected as a |  | 
| 1712   // result of using the "UDP/TLS/RTP/SAVPF" profile. |  | 
| 1713   InitWithDtls(GetParam()); | 1739   InitWithDtls(GetParam()); | 
| 1714   session_->SetSdesPolicy(cricket::SEC_ENABLED); |  | 
| 1715   SessionDescriptionInterface* offer = CreateOffer(); | 1740   SessionDescriptionInterface* offer = CreateOffer(); | 
| 1716   cricket::MediaSessionOptions options; | 1741   cricket::MediaSessionOptions options; | 
| 1717   options.recv_video = true; | 1742   options.recv_video = true; | 
|  | 1743   rtc::scoped_ptr<SessionDescriptionInterface> temp_offer( | 
|  | 1744       CreateRemoteOffer(options, cricket::SEC_ENABLED)); | 
| 1718   JsepSessionDescription* answer = | 1745   JsepSessionDescription* answer = | 
| 1719       CreateRemoteAnswer(offer, options, cricket::SEC_ENABLED); | 1746       CreateRemoteAnswer(temp_offer.get(), options, cricket::SEC_ENABLED); | 
| 1720 | 1747 | 
| 1721   // SetRemoteDescription and SetLocalDescription will take the ownership of | 1748   // SetRemoteDescription and SetLocalDescription will take the ownership of | 
| 1722   // the offer and answer. | 1749   // the offer and answer. | 
| 1723   SetLocalDescriptionWithoutError(offer); | 1750   SetLocalDescriptionWithoutError(offer); | 
| 1724   SetRemoteDescriptionAnswerExpectError( | 1751   SetRemoteDescriptionAnswerExpectError( | 
| 1725       kSdpWithoutDtlsFingerprint, answer); | 1752       kSdpWithoutDtlsFingerprint, answer); | 
| 1726 } | 1753 } | 
| 1727 | 1754 | 
| 1728 // Test that we create a local offer without SDES or DTLS and accept a remote | 1755 // Test that we create a local offer without SDES or DTLS and accept a remote | 
| 1729 // answer without SDES or DTLS when encryption is disabled. | 1756 // answer without SDES or DTLS when encryption is disabled. | 
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2011   EXPECT_EQ(0u, candidates->count()); | 2038   EXPECT_EQ(0u, candidates->count()); | 
| 2012 | 2039 | 
| 2013   EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); | 2040   EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); | 
| 2014 | 2041 | 
| 2015   local_desc = session_->local_description(); | 2042   local_desc = session_->local_description(); | 
| 2016   candidates = local_desc->candidates(kMediaContentIndex0); | 2043   candidates = local_desc->candidates(kMediaContentIndex0); | 
| 2017   ASSERT_TRUE(candidates != NULL); | 2044   ASSERT_TRUE(candidates != NULL); | 
| 2018   EXPECT_LT(0u, candidates->count()); | 2045   EXPECT_LT(0u, candidates->count()); | 
| 2019   candidates = local_desc->candidates(1); | 2046   candidates = local_desc->candidates(1); | 
| 2020   ASSERT_TRUE(candidates != NULL); | 2047   ASSERT_TRUE(candidates != NULL); | 
| 2021   EXPECT_LT(0u, candidates->count()); | 2048   EXPECT_EQ(0u, candidates->count()); | 
| 2022 | 2049 | 
| 2023   // Update the session descriptions. | 2050   // Update the session descriptions. | 
| 2024   mediastream_signaling_.SendAudioVideoStream1(); | 2051   mediastream_signaling_.SendAudioVideoStream1(); | 
| 2025   CreateAndSetRemoteOfferAndLocalAnswer(); | 2052   CreateAndSetRemoteOfferAndLocalAnswer(); | 
| 2026 | 2053 | 
| 2027   local_desc = session_->local_description(); | 2054   local_desc = session_->local_description(); | 
| 2028   candidates = local_desc->candidates(kMediaContentIndex0); | 2055   candidates = local_desc->candidates(kMediaContentIndex0); | 
| 2029   ASSERT_TRUE(candidates != NULL); | 2056   ASSERT_TRUE(candidates != NULL); | 
| 2030   EXPECT_LT(0u, candidates->count()); | 2057   EXPECT_LT(0u, candidates->count()); | 
| 2031   candidates = local_desc->candidates(1); | 2058   candidates = local_desc->candidates(1); | 
| 2032   ASSERT_TRUE(candidates != NULL); | 2059   ASSERT_TRUE(candidates != NULL); | 
| 2033   EXPECT_LT(0u, candidates->count()); | 2060   EXPECT_EQ(0u, candidates->count()); | 
| 2034 } | 2061 } | 
| 2035 | 2062 | 
| 2036 // Test that we can set a remote session description with remote candidates. | 2063 // Test that we can set a remote session description with remote candidates. | 
| 2037 TEST_F(WebRtcSessionTest, TestSetRemoteSessionDescriptionWithCandidates) { | 2064 TEST_F(WebRtcSessionTest, TestSetRemoteSessionDescriptionWithCandidates) { | 
| 2038   Init(); | 2065   Init(); | 
| 2039 | 2066 | 
| 2040   cricket::Candidate candidate1; | 2067   cricket::Candidate candidate1; | 
| 2041   candidate1.set_component(1); | 2068   candidate1.set_component(1); | 
| 2042   JsepIceCandidate ice_candidate(kMediaContentName0, kMediaContentIndex0, | 2069   JsepIceCandidate ice_candidate(kMediaContentName0, kMediaContentIndex0, | 
| 2043                                  candidate1); | 2070                                  candidate1); | 
| (...skipping 23 matching lines...) Expand all  Loading... | 
| 2067   Init(); | 2094   Init(); | 
| 2068   mediastream_signaling_.SendAudioVideoStream1(); | 2095   mediastream_signaling_.SendAudioVideoStream1(); | 
| 2069   // Ice is started but candidates are not provided until SetLocalDescription | 2096   // Ice is started but candidates are not provided until SetLocalDescription | 
| 2070   // is called. | 2097   // is called. | 
| 2071   EXPECT_EQ(0u, observer_.mline_0_candidates_.size()); | 2098   EXPECT_EQ(0u, observer_.mline_0_candidates_.size()); | 
| 2072   EXPECT_EQ(0u, observer_.mline_1_candidates_.size()); | 2099   EXPECT_EQ(0u, observer_.mline_1_candidates_.size()); | 
| 2073   CreateAndSetRemoteOfferAndLocalAnswer(); | 2100   CreateAndSetRemoteOfferAndLocalAnswer(); | 
| 2074   // Wait until at least one local candidate has been collected. | 2101   // Wait until at least one local candidate has been collected. | 
| 2075   EXPECT_TRUE_WAIT(0u < observer_.mline_0_candidates_.size(), | 2102   EXPECT_TRUE_WAIT(0u < observer_.mline_0_candidates_.size(), | 
| 2076                    kIceCandidatesTimeout); | 2103                    kIceCandidatesTimeout); | 
| 2077   EXPECT_TRUE_WAIT(0u < observer_.mline_1_candidates_.size(), |  | 
| 2078                    kIceCandidatesTimeout); |  | 
| 2079 | 2104 | 
| 2080   rtc::scoped_ptr<SessionDescriptionInterface> local_offer(CreateOffer()); | 2105   rtc::scoped_ptr<SessionDescriptionInterface> local_offer(CreateOffer()); | 
| 2081 | 2106 | 
| 2082   ASSERT_TRUE(local_offer->candidates(kMediaContentIndex0) != NULL); | 2107   ASSERT_TRUE(local_offer->candidates(kMediaContentIndex0) != NULL); | 
| 2083   EXPECT_LT(0u, local_offer->candidates(kMediaContentIndex0)->count()); | 2108   EXPECT_LT(0u, local_offer->candidates(kMediaContentIndex0)->count()); | 
| 2084   ASSERT_TRUE(local_offer->candidates(kMediaContentIndex1) != NULL); |  | 
| 2085   EXPECT_LT(0u, local_offer->candidates(kMediaContentIndex1)->count()); |  | 
| 2086 | 2109 | 
| 2087   SessionDescriptionInterface* remote_offer(CreateRemoteOffer()); | 2110   SessionDescriptionInterface* remote_offer(CreateRemoteOffer()); | 
| 2088   SetRemoteDescriptionWithoutError(remote_offer); | 2111   SetRemoteDescriptionWithoutError(remote_offer); | 
| 2089   SessionDescriptionInterface* answer = CreateAnswer(NULL); | 2112   SessionDescriptionInterface* answer = CreateAnswer(NULL); | 
| 2090   ASSERT_TRUE(answer->candidates(kMediaContentIndex0) != NULL); | 2113   ASSERT_TRUE(answer->candidates(kMediaContentIndex0) != NULL); | 
| 2091   EXPECT_LT(0u, answer->candidates(kMediaContentIndex0)->count()); | 2114   EXPECT_LT(0u, answer->candidates(kMediaContentIndex0)->count()); | 
| 2092   ASSERT_TRUE(answer->candidates(kMediaContentIndex1) != NULL); |  | 
| 2093   EXPECT_LT(0u, answer->candidates(kMediaContentIndex1)->count()); |  | 
| 2094   SetLocalDescriptionWithoutError(answer); | 2115   SetLocalDescriptionWithoutError(answer); | 
| 2095 } | 2116 } | 
| 2096 | 2117 | 
| 2097 // Verifies TransportProxy and media channels are created with content names | 2118 // Verifies TransportProxy and media channels are created with content names | 
| 2098 // present in the SessionDescription. | 2119 // present in the SessionDescription. | 
| 2099 TEST_F(WebRtcSessionTest, TestChannelCreationsWithContentNames) { | 2120 TEST_F(WebRtcSessionTest, TestChannelCreationsWithContentNames) { | 
| 2100   Init(); | 2121   Init(); | 
| 2101   mediastream_signaling_.SendAudioVideoStream1(); | 2122   mediastream_signaling_.SendAudioVideoStream1(); | 
| 2102   rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); | 2123   rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); | 
| 2103 | 2124 | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
| 2125 | 2146 | 
| 2126   SessionDescriptionInterface* modified_offer = | 2147   SessionDescriptionInterface* modified_offer = | 
| 2127       CreateSessionDescription(JsepSessionDescription::kOffer, sdp, NULL); | 2148       CreateSessionDescription(JsepSessionDescription::kOffer, sdp, NULL); | 
| 2128 | 2149 | 
| 2129   SetRemoteDescriptionWithoutError(modified_offer); | 2150   SetRemoteDescriptionWithoutError(modified_offer); | 
| 2130 | 2151 | 
| 2131   SessionDescriptionInterface* answer = | 2152   SessionDescriptionInterface* answer = | 
| 2132       CreateAnswer(NULL); | 2153       CreateAnswer(NULL); | 
| 2133   SetLocalDescriptionWithoutError(answer); | 2154   SetLocalDescriptionWithoutError(answer); | 
| 2134 | 2155 | 
| 2135   EXPECT_TRUE(session_->GetTransportProxy("audio_content_name") != NULL); | 2156   cricket::TransportChannel* voice_transport_channel = | 
| 2136   EXPECT_TRUE(session_->GetTransportProxy("video_content_name") != NULL); | 2157       session_->voice_rtp_transport_channel(); | 
|  | 2158   EXPECT_TRUE(voice_transport_channel != NULL); | 
|  | 2159   EXPECT_EQ(voice_transport_channel->transport_name(), "audio_content_name"); | 
|  | 2160   cricket::TransportChannel* video_transport_channel = | 
|  | 2161       session_->video_rtp_transport_channel(); | 
|  | 2162   EXPECT_TRUE(video_transport_channel != NULL); | 
|  | 2163   EXPECT_EQ(video_transport_channel->transport_name(), "video_content_name"); | 
| 2137   EXPECT_TRUE((video_channel_ = media_engine_->GetVideoChannel(0)) != NULL); | 2164   EXPECT_TRUE((video_channel_ = media_engine_->GetVideoChannel(0)) != NULL); | 
| 2138   EXPECT_TRUE((voice_channel_ = media_engine_->GetVoiceChannel(0)) != NULL); | 2165   EXPECT_TRUE((voice_channel_ = media_engine_->GetVoiceChannel(0)) != NULL); | 
| 2139 } | 2166 } | 
| 2140 | 2167 | 
| 2141 // Test that an offer contains the correct media content descriptions based on | 2168 // Test that an offer contains the correct media content descriptions based on | 
| 2142 // the send streams when no constraints have been set. | 2169 // the send streams when no constraints have been set. | 
| 2143 TEST_F(WebRtcSessionTest, CreateOfferWithoutConstraintsOrStreams) { | 2170 TEST_F(WebRtcSessionTest, CreateOfferWithoutConstraintsOrStreams) { | 
| 2144   Init(); | 2171   Init(); | 
| 2145   rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); | 2172   rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); | 
| 2146 | 2173 | 
| (...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2686 | 2713 | 
| 2687   PeerConnectionInterface::RTCOfferAnswerOptions options; | 2714   PeerConnectionInterface::RTCOfferAnswerOptions options; | 
| 2688   options.use_rtp_mux = true; | 2715   options.use_rtp_mux = true; | 
| 2689 | 2716 | 
| 2690   SessionDescriptionInterface* offer = CreateRemoteOffer(); | 2717   SessionDescriptionInterface* offer = CreateRemoteOffer(); | 
| 2691   SetRemoteDescriptionWithoutError(offer); | 2718   SetRemoteDescriptionWithoutError(offer); | 
| 2692 | 2719 | 
| 2693   SessionDescriptionInterface* answer = CreateAnswer(NULL); | 2720   SessionDescriptionInterface* answer = CreateAnswer(NULL); | 
| 2694   SetLocalDescriptionWithoutError(answer); | 2721   SetLocalDescriptionWithoutError(answer); | 
| 2695 | 2722 | 
| 2696   EXPECT_EQ(session_->GetTransportProxy("audio")->impl(), | 2723   EXPECT_EQ(session_->voice_rtp_transport_channel(), | 
| 2697             session_->GetTransportProxy("video")->impl()); | 2724             session_->video_rtp_transport_channel()); | 
| 2698 | 2725 | 
| 2699   cricket::Transport* t = session_->GetTransport("audio"); | 2726   cricket::BaseChannel* voice_channel = session_->voice_channel(); | 
|  | 2727   ASSERT(voice_channel != NULL); | 
| 2700 | 2728 | 
| 2701   // Checks if one of the transport channels contains a connection using a given | 2729   // Checks if one of the transport channels contains a connection using a given | 
| 2702   // port. | 2730   // port. | 
| 2703   auto connection_with_remote_port = [t](int port) { | 2731   auto connection_with_remote_port = [this, voice_channel](int port) { | 
| 2704     cricket::TransportStats stats; | 2732     cricket::SessionStats stats; | 
| 2705     t->GetStats(&stats); | 2733     session_->GetChannelTransportStats(voice_channel, &stats); | 
| 2706     for (auto& chan_stat : stats.channel_stats) { | 2734     for (auto& kv : stats.transport_stats) { | 
| 2707       for (auto& conn_info : chan_stat.connection_infos) { | 2735       for (auto& chan_stat : kv.second.channel_stats) { | 
| 2708         if (conn_info.remote_candidate.address().port() == port) { | 2736         for (auto& conn_info : chan_stat.connection_infos) { | 
| 2709           return true; | 2737           if (conn_info.remote_candidate.address().port() == port) { | 
|  | 2738             return true; | 
|  | 2739           } | 
| 2710         } | 2740         } | 
| 2711       } | 2741       } | 
| 2712     } | 2742     } | 
| 2713     return false; | 2743     return false; | 
| 2714   }; | 2744   }; | 
| 2715 | 2745 | 
| 2716   EXPECT_FALSE(connection_with_remote_port(5000)); | 2746   EXPECT_FALSE(connection_with_remote_port(5000)); | 
| 2717   EXPECT_FALSE(connection_with_remote_port(5001)); | 2747   EXPECT_FALSE(connection_with_remote_port(5001)); | 
| 2718   EXPECT_FALSE(connection_with_remote_port(6000)); | 2748   EXPECT_FALSE(connection_with_remote_port(6000)); | 
| 2719 | 2749 | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2752 | 2782 | 
| 2753   EXPECT_TRUE_WAIT(connection_with_remote_port(5000), 1000); | 2783   EXPECT_TRUE_WAIT(connection_with_remote_port(5000), 1000); | 
| 2754   EXPECT_TRUE_WAIT(connection_with_remote_port(5001), 1000); | 2784   EXPECT_TRUE_WAIT(connection_with_remote_port(5001), 1000); | 
| 2755 | 2785 | 
| 2756   // No need here for a _WAIT check since we are checking that state hasn't | 2786   // No need here for a _WAIT check since we are checking that state hasn't | 
| 2757   // changed: if this is false we would be doing waits for nothing and if this | 2787   // changed: if this is false we would be doing waits for nothing and if this | 
| 2758   // is true then there will be no messages processed anyways. | 2788   // is true then there will be no messages processed anyways. | 
| 2759   EXPECT_FALSE(connection_with_remote_port(6000)); | 2789   EXPECT_FALSE(connection_with_remote_port(6000)); | 
| 2760 } | 2790 } | 
| 2761 | 2791 | 
| 2762 // kBundlePolicyBalanced bundle policy and answer contains BUNDLE. | 2792 // kBundlePolicyBalanced BUNDLE policy and answer contains BUNDLE. | 
| 2763 TEST_F(WebRtcSessionTest, TestBalancedBundleInAnswer) { | 2793 TEST_F(WebRtcSessionTest, TestBalancedBundleInAnswer) { | 
| 2764   InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyBalanced); | 2794   InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyBalanced); | 
| 2765   mediastream_signaling_.SendAudioVideoStream1(); | 2795   mediastream_signaling_.SendAudioVideoStream1(); | 
| 2766 | 2796 | 
| 2767   PeerConnectionInterface::RTCOfferAnswerOptions options; | 2797   PeerConnectionInterface::RTCOfferAnswerOptions options; | 
| 2768   options.use_rtp_mux = true; | 2798   options.use_rtp_mux = true; | 
| 2769 | 2799 | 
| 2770   SessionDescriptionInterface* offer = CreateOffer(options); | 2800   SessionDescriptionInterface* offer = CreateOffer(options); | 
| 2771   SetLocalDescriptionWithoutError(offer); | 2801   SetLocalDescriptionWithoutError(offer); | 
| 2772 | 2802 | 
| 2773   EXPECT_NE(session_->GetTransportProxy("audio")->impl(), | 2803   EXPECT_NE(session_->voice_rtp_transport_channel(), | 
| 2774             session_->GetTransportProxy("video")->impl()); | 2804             session_->video_rtp_transport_channel()); | 
| 2775 | 2805 | 
| 2776   mediastream_signaling_.SendAudioVideoStream2(); | 2806   mediastream_signaling_.SendAudioVideoStream2(); | 
| 2777   SessionDescriptionInterface* answer = | 2807   SessionDescriptionInterface* answer = | 
| 2778       CreateRemoteAnswer(session_->local_description()); | 2808       CreateRemoteAnswer(session_->local_description()); | 
| 2779   SetRemoteDescriptionWithoutError(answer); | 2809   SetRemoteDescriptionWithoutError(answer); | 
| 2780 | 2810 | 
| 2781   EXPECT_EQ(session_->GetTransportProxy("audio")->impl(), | 2811   EXPECT_EQ(session_->voice_rtp_transport_channel(), | 
| 2782             session_->GetTransportProxy("video")->impl()); | 2812             session_->video_rtp_transport_channel()); | 
| 2783 } | 2813 } | 
| 2784 | 2814 | 
| 2785 // kBundlePolicyBalanced bundle policy but no BUNDLE in the answer. | 2815 // kBundlePolicyBalanced BUNDLE policy but no BUNDLE in the answer. | 
| 2786 TEST_F(WebRtcSessionTest, TestBalancedNoBundleInAnswer) { | 2816 TEST_F(WebRtcSessionTest, TestBalancedNoBundleInAnswer) { | 
| 2787   InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyBalanced); | 2817   InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyBalanced); | 
| 2788   mediastream_signaling_.SendAudioVideoStream1(); | 2818   mediastream_signaling_.SendAudioVideoStream1(); | 
| 2789 | 2819 | 
| 2790   PeerConnectionInterface::RTCOfferAnswerOptions options; | 2820   PeerConnectionInterface::RTCOfferAnswerOptions options; | 
| 2791   options.use_rtp_mux = true; | 2821   options.use_rtp_mux = true; | 
| 2792 | 2822 | 
| 2793   SessionDescriptionInterface* offer = CreateOffer(options); | 2823   SessionDescriptionInterface* offer = CreateOffer(options); | 
| 2794   SetLocalDescriptionWithoutError(offer); | 2824   SetLocalDescriptionWithoutError(offer); | 
| 2795 | 2825 | 
| 2796   EXPECT_NE(session_->GetTransportProxy("audio")->impl(), | 2826   EXPECT_NE(session_->voice_rtp_transport_channel(), | 
| 2797             session_->GetTransportProxy("video")->impl()); | 2827             session_->video_rtp_transport_channel()); | 
| 2798 | 2828 | 
| 2799   mediastream_signaling_.SendAudioVideoStream2(); | 2829   mediastream_signaling_.SendAudioVideoStream2(); | 
| 2800 | 2830 | 
| 2801   // Remove BUNDLE from the answer. | 2831   // Remove BUNDLE from the answer. | 
| 2802   rtc::scoped_ptr<SessionDescriptionInterface> answer( | 2832   rtc::scoped_ptr<SessionDescriptionInterface> answer( | 
| 2803       CreateRemoteAnswer(session_->local_description())); | 2833       CreateRemoteAnswer(session_->local_description())); | 
| 2804   cricket::SessionDescription* answer_copy = answer->description()->Copy(); | 2834   cricket::SessionDescription* answer_copy = answer->description()->Copy(); | 
| 2805   answer_copy->RemoveGroupByName(cricket::GROUP_TYPE_BUNDLE); | 2835   answer_copy->RemoveGroupByName(cricket::GROUP_TYPE_BUNDLE); | 
| 2806   JsepSessionDescription* modified_answer = | 2836   JsepSessionDescription* modified_answer = | 
| 2807       new JsepSessionDescription(JsepSessionDescription::kAnswer); | 2837       new JsepSessionDescription(JsepSessionDescription::kAnswer); | 
| 2808   modified_answer->Initialize(answer_copy, "1", "1"); | 2838   modified_answer->Initialize(answer_copy, "1", "1"); | 
| 2809   SetRemoteDescriptionWithoutError(modified_answer);  // | 2839   SetRemoteDescriptionWithoutError(modified_answer);  // | 
| 2810 | 2840 | 
| 2811   EXPECT_NE(session_->GetTransportProxy("audio")->impl(), | 2841   EXPECT_NE(session_->voice_rtp_transport_channel(), | 
| 2812             session_->GetTransportProxy("video")->impl()); | 2842             session_->video_rtp_transport_channel()); | 
| 2813 } | 2843 } | 
| 2814 | 2844 | 
| 2815 // kBundlePolicyMaxBundle policy with BUNDLE in the answer. | 2845 // kBundlePolicyMaxBundle policy with BUNDLE in the answer. | 
| 2816 TEST_F(WebRtcSessionTest, TestMaxBundleBundleInAnswer) { | 2846 TEST_F(WebRtcSessionTest, TestMaxBundleBundleInAnswer) { | 
| 2817   InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxBundle); | 2847   InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxBundle); | 
| 2818   mediastream_signaling_.SendAudioVideoStream1(); | 2848   mediastream_signaling_.SendAudioVideoStream1(); | 
| 2819 | 2849 | 
| 2820   PeerConnectionInterface::RTCOfferAnswerOptions options; | 2850   PeerConnectionInterface::RTCOfferAnswerOptions options; | 
| 2821   options.use_rtp_mux = true; | 2851   options.use_rtp_mux = true; | 
| 2822 | 2852 | 
| 2823   SessionDescriptionInterface* offer = CreateOffer(options); | 2853   SessionDescriptionInterface* offer = CreateOffer(options); | 
| 2824   SetLocalDescriptionWithoutError(offer); | 2854   SetLocalDescriptionWithoutError(offer); | 
| 2825 | 2855 | 
| 2826   EXPECT_EQ(session_->GetTransportProxy("audio")->impl(), | 2856   EXPECT_EQ(session_->voice_rtp_transport_channel(), | 
| 2827             session_->GetTransportProxy("video")->impl()); | 2857             session_->video_rtp_transport_channel()); | 
| 2828 | 2858 | 
| 2829   mediastream_signaling_.SendAudioVideoStream2(); | 2859   mediastream_signaling_.SendAudioVideoStream2(); | 
| 2830   SessionDescriptionInterface* answer = | 2860   SessionDescriptionInterface* answer = | 
| 2831       CreateRemoteAnswer(session_->local_description()); | 2861       CreateRemoteAnswer(session_->local_description()); | 
| 2832   SetRemoteDescriptionWithoutError(answer); | 2862   SetRemoteDescriptionWithoutError(answer); | 
| 2833 | 2863 | 
| 2834   EXPECT_EQ(session_->GetTransportProxy("audio")->impl(), | 2864   EXPECT_EQ(session_->voice_rtp_transport_channel(), | 
| 2835             session_->GetTransportProxy("video")->impl()); | 2865             session_->video_rtp_transport_channel()); | 
|  | 2866 } | 
|  | 2867 | 
|  | 2868 // kBundlePolicyMaxBundle policy with BUNDLE in the answer, but no | 
|  | 2869 // audio content in the answer. | 
|  | 2870 TEST_F(WebRtcSessionTest, TestMaxBundleRejectAudio) { | 
|  | 2871   InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxBundle); | 
|  | 2872   mediastream_signaling_.SendAudioVideoStream1(); | 
|  | 2873 | 
|  | 2874   PeerConnectionInterface::RTCOfferAnswerOptions options; | 
|  | 2875   options.use_rtp_mux = true; | 
|  | 2876 | 
|  | 2877   SessionDescriptionInterface* offer = CreateOffer(options); | 
|  | 2878   SetLocalDescriptionWithoutError(offer); | 
|  | 2879 | 
|  | 2880   EXPECT_EQ(session_->voice_rtp_transport_channel(), | 
|  | 2881             session_->video_rtp_transport_channel()); | 
|  | 2882 | 
|  | 2883   mediastream_signaling_.SendAudioVideoStream2(); | 
|  | 2884   cricket::MediaSessionOptions recv_options; | 
|  | 2885   recv_options.recv_audio = false; | 
|  | 2886   recv_options.recv_video = true; | 
|  | 2887   SessionDescriptionInterface* answer = | 
|  | 2888       CreateRemoteAnswer(session_->local_description(), recv_options); | 
|  | 2889   SetRemoteDescriptionWithoutError(answer); | 
|  | 2890 | 
|  | 2891   EXPECT_TRUE(NULL == session_->voice_channel()); | 
|  | 2892   EXPECT_TRUE(NULL != session_->video_rtp_transport_channel()); | 
|  | 2893 | 
|  | 2894   session_->Terminate(); | 
|  | 2895   EXPECT_TRUE(NULL == session_->voice_rtp_transport_channel()); | 
|  | 2896   EXPECT_TRUE(NULL == session_->voice_rtcp_transport_channel()); | 
|  | 2897   EXPECT_TRUE(NULL == session_->video_rtp_transport_channel()); | 
|  | 2898   EXPECT_TRUE(NULL == session_->video_rtcp_transport_channel()); | 
| 2836 } | 2899 } | 
| 2837 | 2900 | 
| 2838 // kBundlePolicyMaxBundle policy but no BUNDLE in the answer. | 2901 // kBundlePolicyMaxBundle policy but no BUNDLE in the answer. | 
| 2839 TEST_F(WebRtcSessionTest, TestMaxBundleNoBundleInAnswer) { | 2902 TEST_F(WebRtcSessionTest, TestMaxBundleNoBundleInAnswer) { | 
| 2840   InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxBundle); | 2903   InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxBundle); | 
| 2841   mediastream_signaling_.SendAudioVideoStream1(); | 2904   mediastream_signaling_.SendAudioVideoStream1(); | 
| 2842 | 2905 | 
| 2843   PeerConnectionInterface::RTCOfferAnswerOptions options; | 2906   PeerConnectionInterface::RTCOfferAnswerOptions options; | 
| 2844   options.use_rtp_mux = true; | 2907   options.use_rtp_mux = true; | 
| 2845 | 2908 | 
| 2846   SessionDescriptionInterface* offer = CreateOffer(options); | 2909   SessionDescriptionInterface* offer = CreateOffer(options); | 
| 2847   SetLocalDescriptionWithoutError(offer); | 2910   SetLocalDescriptionWithoutError(offer); | 
| 2848 | 2911 | 
| 2849   EXPECT_EQ(session_->GetTransportProxy("audio")->impl(), | 2912   EXPECT_EQ(session_->voice_rtp_transport_channel(), | 
| 2850             session_->GetTransportProxy("video")->impl()); | 2913             session_->video_rtp_transport_channel()); | 
| 2851 | 2914 | 
| 2852   mediastream_signaling_.SendAudioVideoStream2(); | 2915   mediastream_signaling_.SendAudioVideoStream2(); | 
| 2853 | 2916 | 
| 2854   // Remove BUNDLE from the answer. | 2917   // Remove BUNDLE from the answer. | 
| 2855   rtc::scoped_ptr<SessionDescriptionInterface> answer( | 2918   rtc::scoped_ptr<SessionDescriptionInterface> answer( | 
| 2856       CreateRemoteAnswer(session_->local_description())); | 2919       CreateRemoteAnswer(session_->local_description())); | 
| 2857   cricket::SessionDescription* answer_copy = answer->description()->Copy(); | 2920   cricket::SessionDescription* answer_copy = answer->description()->Copy(); | 
| 2858   answer_copy->RemoveGroupByName(cricket::GROUP_TYPE_BUNDLE); | 2921   answer_copy->RemoveGroupByName(cricket::GROUP_TYPE_BUNDLE); | 
| 2859   JsepSessionDescription* modified_answer = | 2922   JsepSessionDescription* modified_answer = | 
| 2860       new JsepSessionDescription(JsepSessionDescription::kAnswer); | 2923       new JsepSessionDescription(JsepSessionDescription::kAnswer); | 
| 2861   modified_answer->Initialize(answer_copy, "1", "1"); | 2924   modified_answer->Initialize(answer_copy, "1", "1"); | 
| 2862   SetRemoteDescriptionWithoutError(modified_answer); | 2925   SetRemoteDescriptionWithoutError(modified_answer); | 
| 2863 | 2926 | 
| 2864   EXPECT_EQ(session_->GetTransportProxy("audio")->impl(), | 2927   EXPECT_EQ(session_->voice_rtp_transport_channel(), | 
| 2865             session_->GetTransportProxy("video")->impl()); | 2928             session_->video_rtp_transport_channel()); | 
|  | 2929 } | 
|  | 2930 | 
|  | 2931 // kBundlePolicyMaxBundle policy with BUNDLE in the remote offer. | 
|  | 2932 TEST_F(WebRtcSessionTest, TestMaxBundleBundleInRemoteOffer) { | 
|  | 2933   InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxBundle); | 
|  | 2934   mediastream_signaling_.SendAudioVideoStream1(); | 
|  | 2935 | 
|  | 2936   SessionDescriptionInterface* offer = CreateRemoteOffer(); | 
|  | 2937   SetRemoteDescriptionWithoutError(offer); | 
|  | 2938 | 
|  | 2939   EXPECT_EQ(session_->voice_rtp_transport_channel(), | 
|  | 2940             session_->video_rtp_transport_channel()); | 
|  | 2941 | 
|  | 2942   mediastream_signaling_.SendAudioVideoStream2(); | 
|  | 2943   SessionDescriptionInterface* answer = CreateAnswer(nullptr); | 
|  | 2944   SetLocalDescriptionWithoutError(answer); | 
|  | 2945 | 
|  | 2946   EXPECT_EQ(session_->voice_rtp_transport_channel(), | 
|  | 2947             session_->video_rtp_transport_channel()); | 
|  | 2948 } | 
|  | 2949 | 
|  | 2950 // kBundlePolicyMaxBundle policy but no BUNDLE in the remote offer. | 
|  | 2951 TEST_F(WebRtcSessionTest, TestMaxBundleNoBundleInRemoteOffer) { | 
|  | 2952   InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxBundle); | 
|  | 2953   mediastream_signaling_.SendAudioVideoStream1(); | 
|  | 2954 | 
|  | 2955   // Remove BUNDLE from the offer. | 
|  | 2956   rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateRemoteOffer()); | 
|  | 2957   cricket::SessionDescription* offer_copy = offer->description()->Copy(); | 
|  | 2958   offer_copy->RemoveGroupByName(cricket::GROUP_TYPE_BUNDLE); | 
|  | 2959   JsepSessionDescription* modified_offer = | 
|  | 2960       new JsepSessionDescription(JsepSessionDescription::kOffer); | 
|  | 2961   modified_offer->Initialize(offer_copy, "1", "1"); | 
|  | 2962 | 
|  | 2963   // Expect an error when applying the remote description | 
|  | 2964   SetRemoteDescriptionExpectError(JsepSessionDescription::kOffer, | 
|  | 2965                                   kCreateChannelFailed, modified_offer); | 
| 2866 } | 2966 } | 
| 2867 | 2967 | 
| 2868 // kBundlePolicyMaxCompat bundle policy and answer contains BUNDLE. | 2968 // kBundlePolicyMaxCompat bundle policy and answer contains BUNDLE. | 
| 2869 TEST_F(WebRtcSessionTest, TestMaxCompatBundleInAnswer) { | 2969 TEST_F(WebRtcSessionTest, TestMaxCompatBundleInAnswer) { | 
| 2870   InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxCompat); | 2970   InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxCompat); | 
| 2871   mediastream_signaling_.SendAudioVideoStream1(); | 2971   mediastream_signaling_.SendAudioVideoStream1(); | 
| 2872 | 2972 | 
| 2873   PeerConnectionInterface::RTCOfferAnswerOptions options; | 2973   PeerConnectionInterface::RTCOfferAnswerOptions options; | 
| 2874   options.use_rtp_mux = true; | 2974   options.use_rtp_mux = true; | 
| 2875 | 2975 | 
| 2876   SessionDescriptionInterface* offer = CreateOffer(options); | 2976   SessionDescriptionInterface* offer = CreateOffer(options); | 
| 2877   SetLocalDescriptionWithoutError(offer); | 2977   SetLocalDescriptionWithoutError(offer); | 
| 2878 | 2978 | 
| 2879   EXPECT_NE(session_->GetTransportProxy("audio")->impl(), | 2979   EXPECT_NE(session_->voice_rtp_transport_channel(), | 
| 2880             session_->GetTransportProxy("video")->impl()); | 2980             session_->video_rtp_transport_channel()); | 
| 2881 | 2981 | 
| 2882   mediastream_signaling_.SendAudioVideoStream2(); | 2982   mediastream_signaling_.SendAudioVideoStream2(); | 
| 2883   SessionDescriptionInterface* answer = | 2983   SessionDescriptionInterface* answer = | 
| 2884       CreateRemoteAnswer(session_->local_description()); | 2984       CreateRemoteAnswer(session_->local_description()); | 
| 2885   SetRemoteDescriptionWithoutError(answer); | 2985   SetRemoteDescriptionWithoutError(answer); | 
| 2886 | 2986 | 
| 2887   // This should lead to an audio-only call but isn't implemented | 2987   // This should lead to an audio-only call but isn't implemented | 
| 2888   // correctly yet. | 2988   // correctly yet. | 
| 2889   EXPECT_EQ(session_->GetTransportProxy("audio")->impl(), | 2989   EXPECT_EQ(session_->voice_rtp_transport_channel(), | 
| 2890             session_->GetTransportProxy("video")->impl()); | 2990             session_->video_rtp_transport_channel()); | 
| 2891 } | 2991 } | 
| 2892 | 2992 | 
| 2893 // kBundlePolicyMaxCompat bundle policy but no BUNDLE in the answer. | 2993 // kBundlePolicyMaxCompat BUNDLE policy but no BUNDLE in the answer. | 
| 2894 TEST_F(WebRtcSessionTest, TestMaxCompatNoBundleInAnswer) { | 2994 TEST_F(WebRtcSessionTest, TestMaxCompatNoBundleInAnswer) { | 
| 2895   InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxCompat); | 2995   InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxCompat); | 
| 2896   mediastream_signaling_.SendAudioVideoStream1(); | 2996   mediastream_signaling_.SendAudioVideoStream1(); | 
| 2897   PeerConnectionInterface::RTCOfferAnswerOptions options; | 2997   PeerConnectionInterface::RTCOfferAnswerOptions options; | 
| 2898   options.use_rtp_mux = true; | 2998   options.use_rtp_mux = true; | 
| 2899 | 2999 | 
| 2900   SessionDescriptionInterface* offer = CreateOffer(options); | 3000   SessionDescriptionInterface* offer = CreateOffer(options); | 
| 2901   SetLocalDescriptionWithoutError(offer); | 3001   SetLocalDescriptionWithoutError(offer); | 
| 2902 | 3002 | 
| 2903   EXPECT_NE(session_->GetTransportProxy("audio")->impl(), | 3003   EXPECT_NE(session_->voice_rtp_transport_channel(), | 
| 2904             session_->GetTransportProxy("video")->impl()); | 3004             session_->video_rtp_transport_channel()); | 
| 2905 | 3005 | 
| 2906   mediastream_signaling_.SendAudioVideoStream2(); | 3006   mediastream_signaling_.SendAudioVideoStream2(); | 
| 2907 | 3007 | 
| 2908   // Remove BUNDLE from the answer. | 3008   // Remove BUNDLE from the answer. | 
| 2909   rtc::scoped_ptr<SessionDescriptionInterface> answer( | 3009   rtc::scoped_ptr<SessionDescriptionInterface> answer( | 
| 2910       CreateRemoteAnswer(session_->local_description())); | 3010       CreateRemoteAnswer(session_->local_description())); | 
| 2911   cricket::SessionDescription* answer_copy = answer->description()->Copy(); | 3011   cricket::SessionDescription* answer_copy = answer->description()->Copy(); | 
| 2912   answer_copy->RemoveGroupByName(cricket::GROUP_TYPE_BUNDLE); | 3012   answer_copy->RemoveGroupByName(cricket::GROUP_TYPE_BUNDLE); | 
| 2913   JsepSessionDescription* modified_answer = | 3013   JsepSessionDescription* modified_answer = | 
| 2914       new JsepSessionDescription(JsepSessionDescription::kAnswer); | 3014       new JsepSessionDescription(JsepSessionDescription::kAnswer); | 
| 2915   modified_answer->Initialize(answer_copy, "1", "1"); | 3015   modified_answer->Initialize(answer_copy, "1", "1"); | 
| 2916   SetRemoteDescriptionWithoutError(modified_answer);  // | 3016   SetRemoteDescriptionWithoutError(modified_answer);  // | 
| 2917 | 3017 | 
| 2918   EXPECT_NE(session_->GetTransportProxy("audio")->impl(), | 3018   EXPECT_NE(session_->voice_rtp_transport_channel(), | 
| 2919             session_->GetTransportProxy("video")->impl()); | 3019             session_->video_rtp_transport_channel()); | 
| 2920 } | 3020 } | 
| 2921 | 3021 | 
| 2922 // kBundlePolicyMaxbundle and then we call SetRemoteDescription first. | 3022 // kBundlePolicyMaxbundle and then we call SetRemoteDescription first. | 
| 2923 TEST_F(WebRtcSessionTest, TestMaxBundleWithSetRemoteDescriptionFirst) { | 3023 TEST_F(WebRtcSessionTest, TestMaxBundleWithSetRemoteDescriptionFirst) { | 
| 2924   InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxBundle); | 3024   InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxBundle); | 
| 2925   mediastream_signaling_.SendAudioVideoStream1(); | 3025   mediastream_signaling_.SendAudioVideoStream1(); | 
| 2926 | 3026 | 
| 2927   PeerConnectionInterface::RTCOfferAnswerOptions options; | 3027   PeerConnectionInterface::RTCOfferAnswerOptions options; | 
| 2928   options.use_rtp_mux = true; | 3028   options.use_rtp_mux = true; | 
| 2929 | 3029 | 
| 2930   SessionDescriptionInterface* offer = CreateOffer(options); | 3030   SessionDescriptionInterface* offer = CreateOffer(options); | 
| 2931   SetRemoteDescriptionWithoutError(offer); | 3031   SetRemoteDescriptionWithoutError(offer); | 
| 2932 | 3032 | 
| 2933   EXPECT_EQ(session_->GetTransportProxy("audio")->impl(), | 3033   EXPECT_EQ(session_->voice_rtp_transport_channel(), | 
| 2934             session_->GetTransportProxy("video")->impl()); | 3034             session_->video_rtp_transport_channel()); | 
| 2935 } | 3035 } | 
| 2936 | 3036 | 
| 2937 TEST_F(WebRtcSessionTest, TestRequireRtcpMux) { | 3037 TEST_F(WebRtcSessionTest, TestRequireRtcpMux) { | 
| 2938   InitWithRtcpMuxPolicy(PeerConnectionInterface::kRtcpMuxPolicyRequire); | 3038   InitWithRtcpMuxPolicy(PeerConnectionInterface::kRtcpMuxPolicyRequire); | 
| 2939   mediastream_signaling_.SendAudioVideoStream1(); | 3039   mediastream_signaling_.SendAudioVideoStream1(); | 
| 2940 | 3040 | 
| 2941   PeerConnectionInterface::RTCOfferAnswerOptions options; | 3041   PeerConnectionInterface::RTCOfferAnswerOptions options; | 
| 2942   SessionDescriptionInterface* offer = CreateOffer(options); | 3042   SessionDescriptionInterface* offer = CreateOffer(options); | 
| 2943   SetLocalDescriptionWithoutError(offer); | 3043   SetLocalDescriptionWithoutError(offer); | 
| 2944 | 3044 | 
| 2945   EXPECT_FALSE(session_->GetTransportProxy("audio")->impl()->HasChannel(2)); | 3045   EXPECT_TRUE(session_->voice_rtcp_transport_channel() == NULL); | 
| 2946   EXPECT_FALSE(session_->GetTransportProxy("video")->impl()->HasChannel(2)); | 3046   EXPECT_TRUE(session_->video_rtcp_transport_channel() == NULL); | 
| 2947 | 3047 | 
| 2948   mediastream_signaling_.SendAudioVideoStream2(); | 3048   mediastream_signaling_.SendAudioVideoStream2(); | 
| 2949   SessionDescriptionInterface* answer = | 3049   SessionDescriptionInterface* answer = | 
| 2950       CreateRemoteAnswer(session_->local_description()); | 3050       CreateRemoteAnswer(session_->local_description()); | 
| 2951   SetRemoteDescriptionWithoutError(answer); | 3051   SetRemoteDescriptionWithoutError(answer); | 
| 2952 | 3052 | 
| 2953   EXPECT_FALSE(session_->GetTransportProxy("audio")->impl()->HasChannel(2)); | 3053   EXPECT_TRUE(session_->voice_rtcp_transport_channel() == NULL); | 
| 2954   EXPECT_FALSE(session_->GetTransportProxy("video")->impl()->HasChannel(2)); | 3054   EXPECT_TRUE(session_->video_rtcp_transport_channel() == NULL); | 
| 2955 } | 3055 } | 
| 2956 | 3056 | 
| 2957 TEST_F(WebRtcSessionTest, TestNegotiateRtcpMux) { | 3057 TEST_F(WebRtcSessionTest, TestNegotiateRtcpMux) { | 
| 2958   InitWithRtcpMuxPolicy(PeerConnectionInterface::kRtcpMuxPolicyNegotiate); | 3058   InitWithRtcpMuxPolicy(PeerConnectionInterface::kRtcpMuxPolicyNegotiate); | 
| 2959   mediastream_signaling_.SendAudioVideoStream1(); | 3059   mediastream_signaling_.SendAudioVideoStream1(); | 
| 2960 | 3060 | 
| 2961   PeerConnectionInterface::RTCOfferAnswerOptions options; | 3061   PeerConnectionInterface::RTCOfferAnswerOptions options; | 
| 2962   SessionDescriptionInterface* offer = CreateOffer(options); | 3062   SessionDescriptionInterface* offer = CreateOffer(options); | 
| 2963   SetLocalDescriptionWithoutError(offer); | 3063   SetLocalDescriptionWithoutError(offer); | 
| 2964 | 3064 | 
| 2965   EXPECT_TRUE(session_->GetTransportProxy("audio")->impl()->HasChannel(2)); | 3065   EXPECT_TRUE(session_->voice_rtcp_transport_channel() != NULL); | 
| 2966   EXPECT_TRUE(session_->GetTransportProxy("video")->impl()->HasChannel(2)); | 3066   EXPECT_TRUE(session_->video_rtcp_transport_channel() != NULL); | 
| 2967 | 3067 | 
| 2968   mediastream_signaling_.SendAudioVideoStream2(); | 3068   mediastream_signaling_.SendAudioVideoStream2(); | 
| 2969   SessionDescriptionInterface* answer = | 3069   SessionDescriptionInterface* answer = | 
| 2970       CreateRemoteAnswer(session_->local_description()); | 3070       CreateRemoteAnswer(session_->local_description()); | 
| 2971   SetRemoteDescriptionWithoutError(answer); | 3071   SetRemoteDescriptionWithoutError(answer); | 
| 2972 | 3072 | 
| 2973   EXPECT_FALSE(session_->GetTransportProxy("audio")->impl()->HasChannel(2)); | 3073   EXPECT_TRUE(session_->voice_rtcp_transport_channel() == NULL); | 
| 2974   EXPECT_FALSE(session_->GetTransportProxy("video")->impl()->HasChannel(2)); | 3074   EXPECT_TRUE(session_->video_rtcp_transport_channel() == NULL); | 
| 2975 } | 3075 } | 
| 2976 | 3076 | 
| 2977 // This test verifies that SetLocalDescription and SetRemoteDescription fails | 3077 // This test verifies that SetLocalDescription and SetRemoteDescription fails | 
| 2978 // if BUNDLE is enabled but rtcp-mux is disabled in m-lines. | 3078 // if BUNDLE is enabled but rtcp-mux is disabled in m-lines. | 
| 2979 TEST_F(WebRtcSessionTest, TestDisabledRtcpMuxWithBundleEnabled) { | 3079 TEST_F(WebRtcSessionTest, TestDisabledRtcpMuxWithBundleEnabled) { | 
| 2980   Init(); | 3080   Init(); | 
| 2981   mediastream_signaling_.SendAudioVideoStream1(); | 3081   mediastream_signaling_.SendAudioVideoStream1(); | 
| 2982 | 3082 | 
| 2983   PeerConnectionInterface::RTCOfferAnswerOptions options; | 3083   PeerConnectionInterface::RTCOfferAnswerOptions options; | 
| 2984   options.use_rtp_mux = true; | 3084   options.use_rtp_mux = true; | 
| 2985 | 3085 | 
| 2986   SessionDescriptionInterface* offer = CreateOffer(options); | 3086   SessionDescriptionInterface* offer = CreateOffer(options); | 
| 2987   std::string offer_str; | 3087   std::string offer_str; | 
| 2988   offer->ToString(&offer_str); | 3088   offer->ToString(&offer_str); | 
| 2989   // Disable rtcp-mux | 3089   // Disable rtcp-mux | 
| 2990   const std::string rtcp_mux = "rtcp-mux"; | 3090   const std::string rtcp_mux = "rtcp-mux"; | 
| 2991   const std::string xrtcp_mux = "xrtcp-mux"; | 3091   const std::string xrtcp_mux = "xrtcp-mux"; | 
| 2992   rtc::replace_substrs(rtcp_mux.c_str(), rtcp_mux.length(), | 3092   rtc::replace_substrs(rtcp_mux.c_str(), rtcp_mux.length(), | 
| 2993                              xrtcp_mux.c_str(), xrtcp_mux.length(), | 3093                              xrtcp_mux.c_str(), xrtcp_mux.length(), | 
| 2994                              &offer_str); | 3094                              &offer_str); | 
| 2995   JsepSessionDescription *local_offer = | 3095   JsepSessionDescription* local_offer = | 
| 2996       new JsepSessionDescription(JsepSessionDescription::kOffer); | 3096       new JsepSessionDescription(JsepSessionDescription::kOffer); | 
| 2997   EXPECT_TRUE((local_offer)->Initialize(offer_str, NULL)); | 3097   EXPECT_TRUE((local_offer)->Initialize(offer_str, NULL)); | 
| 2998   SetLocalDescriptionOfferExpectError(kBundleWithoutRtcpMux, local_offer); | 3098   SetLocalDescriptionOfferExpectError(kBundleWithoutRtcpMux, local_offer); | 
| 2999   JsepSessionDescription *remote_offer = | 3099   JsepSessionDescription* remote_offer = | 
| 3000       new JsepSessionDescription(JsepSessionDescription::kOffer); | 3100       new JsepSessionDescription(JsepSessionDescription::kOffer); | 
| 3001   EXPECT_TRUE((remote_offer)->Initialize(offer_str, NULL)); | 3101   EXPECT_TRUE((remote_offer)->Initialize(offer_str, NULL)); | 
| 3002   SetRemoteDescriptionOfferExpectError(kBundleWithoutRtcpMux, remote_offer); | 3102   SetRemoteDescriptionOfferExpectError(kBundleWithoutRtcpMux, remote_offer); | 
| 3003   // Trying unmodified SDP. | 3103   // Trying unmodified SDP. | 
| 3004   SetLocalDescriptionWithoutError(offer); | 3104   SetLocalDescriptionWithoutError(offer); | 
| 3005 } | 3105 } | 
| 3006 | 3106 | 
| 3007 TEST_F(WebRtcSessionTest, SetAudioPlayout) { | 3107 TEST_F(WebRtcSessionTest, SetAudioPlayout) { | 
| 3008   Init(); | 3108   Init(); | 
| 3009   mediastream_signaling_.SendAudioVideoStream1(); | 3109   mediastream_signaling_.SendAudioVideoStream1(); | 
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3252   candidate.set_component(1); | 3352   candidate.set_component(1); | 
| 3253   JsepIceCandidate ice_candidate(kMediaContentName0, kMediaContentIndex0, | 3353   JsepIceCandidate ice_candidate(kMediaContentName0, kMediaContentIndex0, | 
| 3254                                  candidate); | 3354                                  candidate); | 
| 3255   EXPECT_TRUE(offer->AddCandidate(&ice_candidate)); | 3355   EXPECT_TRUE(offer->AddCandidate(&ice_candidate)); | 
| 3256   cricket::Candidate candidate1; | 3356   cricket::Candidate candidate1; | 
| 3257   candidate1.set_component(1); | 3357   candidate1.set_component(1); | 
| 3258   JsepIceCandidate ice_candidate1(kMediaContentName1, kMediaContentIndex1, | 3358   JsepIceCandidate ice_candidate1(kMediaContentName1, kMediaContentIndex1, | 
| 3259                                   candidate1); | 3359                                   candidate1); | 
| 3260   EXPECT_TRUE(offer->AddCandidate(&ice_candidate1)); | 3360   EXPECT_TRUE(offer->AddCandidate(&ice_candidate1)); | 
| 3261   SetRemoteDescriptionWithoutError(offer); | 3361   SetRemoteDescriptionWithoutError(offer); | 
| 3262   ASSERT_TRUE(session_->GetTransportProxy("audio") != NULL); | 3362   ASSERT_TRUE(session_->voice_rtp_transport_channel() != NULL); | 
| 3263   ASSERT_TRUE(session_->GetTransportProxy("video") != NULL); | 3363   ASSERT_TRUE(session_->video_rtp_transport_channel() != NULL); | 
| 3264 | 3364 | 
| 3265   // Pump for 1 second and verify that no candidates are generated. | 3365   // Pump for 1 second and verify that no candidates are generated. | 
| 3266   rtc::Thread::Current()->ProcessMessages(1000); | 3366   rtc::Thread::Current()->ProcessMessages(1000); | 
| 3267   EXPECT_TRUE(observer_.mline_0_candidates_.empty()); | 3367   EXPECT_TRUE(observer_.mline_0_candidates_.empty()); | 
| 3268   EXPECT_TRUE(observer_.mline_1_candidates_.empty()); | 3368   EXPECT_TRUE(observer_.mline_1_candidates_.empty()); | 
| 3269 | 3369 | 
| 3270   SessionDescriptionInterface* answer = CreateAnswer(NULL); | 3370   SessionDescriptionInterface* answer = CreateAnswer(NULL); | 
| 3271   SetLocalDescriptionWithoutError(answer); | 3371   SetLocalDescriptionWithoutError(answer); | 
| 3272   EXPECT_TRUE(session_->GetTransportProxy("audio")->negotiated()); |  | 
| 3273   EXPECT_TRUE(session_->GetTransportProxy("video")->negotiated()); |  | 
| 3274   EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); | 3372   EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout); | 
| 3275 } | 3373 } | 
| 3276 | 3374 | 
| 3277 // This test verifies that crypto parameter is updated in local session | 3375 // This test verifies that crypto parameter is updated in local session | 
| 3278 // description as per security policy set in MediaSessionDescriptionFactory. | 3376 // description as per security policy set in MediaSessionDescriptionFactory. | 
| 3279 TEST_F(WebRtcSessionTest, TestCryptoAfterSetLocalDescription) { | 3377 TEST_F(WebRtcSessionTest, TestCryptoAfterSetLocalDescription) { | 
| 3280   Init(); | 3378   Init(); | 
| 3281   mediastream_signaling_.SendAudioVideoStream1(); | 3379   mediastream_signaling_.SendAudioVideoStream1(); | 
| 3282   rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); | 3380   rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); | 
| 3283 | 3381 | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 3298   options_.disable_encryption = true; | 3396   options_.disable_encryption = true; | 
| 3299   Init(); | 3397   Init(); | 
| 3300   mediastream_signaling_.SendAudioVideoStream1(); | 3398   mediastream_signaling_.SendAudioVideoStream1(); | 
| 3301   rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); | 3399   rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); | 
| 3302 | 3400 | 
| 3303   // Making sure SetLocalDescription correctly sets crypto value in | 3401   // Making sure SetLocalDescription correctly sets crypto value in | 
| 3304   // SessionDescription object after de-serialization of sdp string. The value | 3402   // SessionDescription object after de-serialization of sdp string. The value | 
| 3305   // will be set as per MediaSessionDescriptionFactory. | 3403   // will be set as per MediaSessionDescriptionFactory. | 
| 3306   std::string offer_str; | 3404   std::string offer_str; | 
| 3307   offer->ToString(&offer_str); | 3405   offer->ToString(&offer_str); | 
| 3308   SessionDescriptionInterface *jsep_offer_str = | 3406   SessionDescriptionInterface* jsep_offer_str = | 
| 3309       CreateSessionDescription(JsepSessionDescription::kOffer, offer_str, NULL); | 3407       CreateSessionDescription(JsepSessionDescription::kOffer, offer_str, NULL); | 
| 3310   SetLocalDescriptionWithoutError(jsep_offer_str); | 3408   SetLocalDescriptionWithoutError(jsep_offer_str); | 
| 3311   EXPECT_FALSE(session_->voice_channel()->secure_required()); | 3409   EXPECT_FALSE(session_->voice_channel()->secure_required()); | 
| 3312   EXPECT_FALSE(session_->video_channel()->secure_required()); | 3410   EXPECT_FALSE(session_->video_channel()->secure_required()); | 
| 3313 } | 3411 } | 
| 3314 | 3412 | 
| 3315 // This test verifies that an answer contains new ufrag and password if an offer | 3413 // This test verifies that an answer contains new ufrag and password if an offer | 
| 3316 // with new ufrag and password is received. | 3414 // with new ufrag and password is received. | 
| 3317 TEST_F(WebRtcSessionTest, TestCreateAnswerWithNewUfragAndPassword) { | 3415 TEST_F(WebRtcSessionTest, TestCreateAnswerWithNewUfragAndPassword) { | 
| 3318   Init(); | 3416   Init(); | 
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3651 | 3749 | 
| 3652   rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); | 3750   rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); | 
| 3653   EXPECT_TRUE(offer == NULL); | 3751   EXPECT_TRUE(offer == NULL); | 
| 3654 } | 3752 } | 
| 3655 | 3753 | 
| 3656 // Verifies that CreateOffer succeeds when Multiple CreateOffer calls are made | 3754 // Verifies that CreateOffer succeeds when Multiple CreateOffer calls are made | 
| 3657 // before async identity generation is finished. | 3755 // before async identity generation is finished. | 
| 3658 TEST_P(WebRtcSessionTest, | 3756 TEST_P(WebRtcSessionTest, | 
| 3659        TestMultipleCreateOfferBeforeIdentityRequestReturnSuccess) { | 3757        TestMultipleCreateOfferBeforeIdentityRequestReturnSuccess) { | 
| 3660   MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); | 3758   MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); | 
| 3661   VerifyMultipleAsyncCreateDescription( | 3759   VerifyMultipleAsyncCreateDescription(GetParam(), | 
| 3662       GetParam(), CreateSessionDescriptionRequest::kOffer); | 3760                                        CreateSessionDescriptionRequest::kOffer); | 
| 3663 } | 3761 } | 
| 3664 | 3762 | 
| 3665 // Verifies that CreateOffer fails when Multiple CreateOffer calls are made | 3763 // Verifies that CreateOffer fails when Multiple CreateOffer calls are made | 
| 3666 // before async identity generation fails. | 3764 // before async identity generation fails. | 
| 3667 TEST_F(WebRtcSessionTest, | 3765 TEST_F(WebRtcSessionTest, | 
| 3668        TestMultipleCreateOfferBeforeIdentityRequestReturnFailure) { | 3766        TestMultipleCreateOfferBeforeIdentityRequestReturnFailure) { | 
| 3669   MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); | 3767   MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); | 
| 3670   VerifyMultipleAsyncCreateDescriptionIdentityGenFailure( | 3768   VerifyMultipleAsyncCreateDescriptionIdentityGenFailure( | 
| 3671       CreateSessionDescriptionRequest::kOffer); | 3769       CreateSessionDescriptionRequest::kOffer); | 
| 3672 } | 3770 } | 
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3879   SessionDescriptionInterface* offer = CreateOffer(options); | 3977   SessionDescriptionInterface* offer = CreateOffer(options); | 
| 3880   SetLocalDescriptionWithoutError(offer); | 3978   SetLocalDescriptionWithoutError(offer); | 
| 3881 | 3979 | 
| 3882   session_->video_channel()->SetOption(cricket::BaseChannel::ST_RTP, | 3980   session_->video_channel()->SetOption(cricket::BaseChannel::ST_RTP, | 
| 3883                                        rtc::Socket::Option::OPT_SNDBUF, 4000); | 3981                                        rtc::Socket::Option::OPT_SNDBUF, 4000); | 
| 3884 | 3982 | 
| 3885   session_->voice_channel()->SetOption(cricket::BaseChannel::ST_RTP, | 3983   session_->voice_channel()->SetOption(cricket::BaseChannel::ST_RTP, | 
| 3886                                        rtc::Socket::Option::OPT_RCVBUF, 8000); | 3984                                        rtc::Socket::Option::OPT_RCVBUF, 8000); | 
| 3887 | 3985 | 
| 3888   int option_val; | 3986   int option_val; | 
| 3889   EXPECT_TRUE(session_->video_channel()->transport_channel()->GetOption( | 3987   EXPECT_TRUE(session_->video_rtp_transport_channel()->GetOption( | 
| 3890       rtc::Socket::Option::OPT_SNDBUF, &option_val)); | 3988       rtc::Socket::Option::OPT_SNDBUF, &option_val)); | 
| 3891   EXPECT_EQ(4000, option_val); | 3989   EXPECT_EQ(4000, option_val); | 
| 3892   EXPECT_FALSE(session_->voice_channel()->transport_channel()->GetOption( | 3990   EXPECT_FALSE(session_->voice_rtp_transport_channel()->GetOption( | 
| 3893       rtc::Socket::Option::OPT_SNDBUF, &option_val)); | 3991       rtc::Socket::Option::OPT_SNDBUF, &option_val)); | 
| 3894 | 3992 | 
| 3895   EXPECT_TRUE(session_->voice_channel()->transport_channel()->GetOption( | 3993   EXPECT_TRUE(session_->voice_rtp_transport_channel()->GetOption( | 
| 3896       rtc::Socket::Option::OPT_RCVBUF, &option_val)); | 3994       rtc::Socket::Option::OPT_RCVBUF, &option_val)); | 
| 3897   EXPECT_EQ(8000, option_val); | 3995   EXPECT_EQ(8000, option_val); | 
| 3898   EXPECT_FALSE(session_->video_channel()->transport_channel()->GetOption( | 3996   EXPECT_FALSE(session_->video_rtp_transport_channel()->GetOption( | 
| 3899       rtc::Socket::Option::OPT_RCVBUF, &option_val)); | 3997       rtc::Socket::Option::OPT_RCVBUF, &option_val)); | 
| 3900 | 3998 | 
| 3901   EXPECT_NE(session_->voice_channel()->transport_channel(), | 3999   EXPECT_NE(session_->voice_rtp_transport_channel(), | 
| 3902             session_->video_channel()->transport_channel()); | 4000             session_->video_rtp_transport_channel()); | 
| 3903 | 4001 | 
| 3904   mediastream_signaling_.SendAudioVideoStream2(); | 4002   mediastream_signaling_.SendAudioVideoStream2(); | 
| 3905   SessionDescriptionInterface* answer = | 4003   SessionDescriptionInterface* answer = | 
| 3906       CreateRemoteAnswer(session_->local_description()); | 4004       CreateRemoteAnswer(session_->local_description()); | 
| 3907   SetRemoteDescriptionWithoutError(answer); | 4005   SetRemoteDescriptionWithoutError(answer); | 
| 3908 | 4006 | 
| 3909   EXPECT_TRUE(session_->voice_channel()->transport_channel()->GetOption( | 4007   EXPECT_TRUE(session_->voice_rtp_transport_channel()->GetOption( | 
| 3910       rtc::Socket::Option::OPT_SNDBUF, &option_val)); | 4008       rtc::Socket::Option::OPT_SNDBUF, &option_val)); | 
| 3911   EXPECT_EQ(4000, option_val); | 4009   EXPECT_EQ(4000, option_val); | 
| 3912 | 4010 | 
| 3913   EXPECT_TRUE(session_->voice_channel()->transport_channel()->GetOption( | 4011   EXPECT_TRUE(session_->voice_rtp_transport_channel()->GetOption( | 
| 3914       rtc::Socket::Option::OPT_RCVBUF, &option_val)); | 4012       rtc::Socket::Option::OPT_RCVBUF, &option_val)); | 
| 3915   EXPECT_EQ(8000, option_val); | 4013   EXPECT_EQ(8000, option_val); | 
| 3916 } | 4014 } | 
| 3917 | 4015 | 
| 3918 // Test creating a session, request multiple offers, destroy the session | 4016 // Test creating a session, request multiple offers, destroy the session | 
| 3919 // and make sure we got success/failure callbacks for all of the requests. | 4017 // and make sure we got success/failure callbacks for all of the requests. | 
| 3920 // Background: crbug.com/507307 | 4018 // Background: crbug.com/507307 | 
| 3921 TEST_F(WebRtcSessionTest, CreateOffersAndShutdown) { | 4019 TEST_F(WebRtcSessionTest, CreateOffersAndShutdown) { | 
| 3922   Init(); | 4020   Init(); | 
| 3923 | 4021 | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 3939     // must have received a notification which, so the only invalid state | 4037     // must have received a notification which, so the only invalid state | 
| 3940     // is kInit. | 4038     // is kInit. | 
| 3941     EXPECT_NE(WebRtcSessionCreateSDPObserverForTest::kInit, o->state()); | 4039     EXPECT_NE(WebRtcSessionCreateSDPObserverForTest::kInit, o->state()); | 
| 3942   } | 4040   } | 
| 3943 } | 4041 } | 
| 3944 | 4042 | 
| 3945 // TODO(bemasc): Add a TestIceStatesBundle with BUNDLE enabled.  That test | 4043 // TODO(bemasc): Add a TestIceStatesBundle with BUNDLE enabled.  That test | 
| 3946 // currently fails because upon disconnection and reconnection OnIceComplete is | 4044 // currently fails because upon disconnection and reconnection OnIceComplete is | 
| 3947 // called more than once without returning to IceGatheringGathering. | 4045 // called more than once without returning to IceGatheringGathering. | 
| 3948 | 4046 | 
| 3949 INSTANTIATE_TEST_CASE_P( | 4047 INSTANTIATE_TEST_CASE_P(WebRtcSessionTests, | 
| 3950     WebRtcSessionTests, WebRtcSessionTest, | 4048                         WebRtcSessionTest, | 
| 3951     testing::Values(ALREADY_GENERATED, DTLS_IDENTITY_STORE)); | 4049                         testing::Values(ALREADY_GENERATED, | 
|  | 4050                                         DTLS_IDENTITY_STORE)); | 
| OLD | NEW | 
|---|