| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2012 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 #include "webrtc/base/sslidentity.h" | 33 #include "webrtc/base/sslidentity.h" |
| 34 #include "webrtc/base/sslstreamadapter.h" | 34 #include "webrtc/base/sslstreamadapter.h" |
| 35 #include "webrtc/base/stringutils.h" | 35 #include "webrtc/base/stringutils.h" |
| 36 #include "webrtc/base/thread.h" | 36 #include "webrtc/base/thread.h" |
| 37 #include "webrtc/base/virtualsocketserver.h" | 37 #include "webrtc/base/virtualsocketserver.h" |
| 38 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" | 38 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" |
| 39 #include "webrtc/media/base/fakemediaengine.h" | 39 #include "webrtc/media/base/fakemediaengine.h" |
| 40 #include "webrtc/media/base/fakevideorenderer.h" | 40 #include "webrtc/media/base/fakevideorenderer.h" |
| 41 #include "webrtc/media/base/mediachannel.h" | 41 #include "webrtc/media/base/mediachannel.h" |
| 42 #include "webrtc/media/engine/fakewebrtccall.h" | 42 #include "webrtc/media/engine/fakewebrtccall.h" |
| 43 #include "webrtc/media/sctp/sctptransportinternal.h" | |
| 44 #include "webrtc/p2p/base/packettransportinterface.h" | 43 #include "webrtc/p2p/base/packettransportinterface.h" |
| 45 #include "webrtc/p2p/base/stunserver.h" | 44 #include "webrtc/p2p/base/stunserver.h" |
| 46 #include "webrtc/p2p/base/teststunserver.h" | 45 #include "webrtc/p2p/base/teststunserver.h" |
| 47 #include "webrtc/p2p/base/testturnserver.h" | 46 #include "webrtc/p2p/base/testturnserver.h" |
| 48 #include "webrtc/p2p/base/transportchannel.h" | 47 #include "webrtc/p2p/base/transportchannel.h" |
| 49 #include "webrtc/p2p/client/basicportallocator.h" | 48 #include "webrtc/p2p/client/basicportallocator.h" |
| 50 #include "webrtc/pc/channelmanager.h" | 49 #include "webrtc/pc/channelmanager.h" |
| 51 #include "webrtc/pc/mediasession.h" | 50 #include "webrtc/pc/mediasession.h" |
| 52 | 51 |
| 53 #define MAYBE_SKIP_TEST(feature) \ | 52 #define MAYBE_SKIP_TEST(feature) \ |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 103 static const char kSessionVersion[] = "1"; | 102 static const char kSessionVersion[] = "1"; |
| 104 | 103 |
| 105 // Media index of candidates belonging to the first media content. | 104 // Media index of candidates belonging to the first media content. |
| 106 static const int kMediaContentIndex0 = 0; | 105 static const int kMediaContentIndex0 = 0; |
| 107 static const char kMediaContentName0[] = "audio"; | 106 static const char kMediaContentName0[] = "audio"; |
| 108 | 107 |
| 109 // Media index of candidates belonging to the second media content. | 108 // Media index of candidates belonging to the second media content. |
| 110 static const int kMediaContentIndex1 = 1; | 109 static const int kMediaContentIndex1 = 1; |
| 111 static const char kMediaContentName1[] = "video"; | 110 static const char kMediaContentName1[] = "video"; |
| 112 | 111 |
| 113 static const int kDefaultTimeout = 10000; // 10 seconds. | |
| 114 static const int kIceCandidatesTimeout = 10000; | 112 static const int kIceCandidatesTimeout = 10000; |
| 115 // STUN timeout with all retransmissions is a total of 9500ms. | 113 // STUN timeout with all retransmissions is a total of 9500ms. |
| 116 static const int kStunTimeout = 9500; | 114 static const int kStunTimeout = 9500; |
| 117 | 115 |
| 118 static const char kFakeDtlsFingerprint[] = | 116 static const char kFakeDtlsFingerprint[] = |
| 119 "BB:CD:72:F7:2F:D0:BA:43:F3:68:B1:0C:23:72:B6:4A:" | 117 "BB:CD:72:F7:2F:D0:BA:43:F3:68:B1:0C:23:72:B6:4A:" |
| 120 "0F:DE:34:06:BC:E0:FE:01:BC:73:C8:6D:F4:65:D5:24"; | 118 "0F:DE:34:06:BC:E0:FE:01:BC:73:C8:6D:F4:65:D5:24"; |
| 121 | 119 |
| 122 static const char kTooLongIceUfragPwd[] = | 120 static const char kTooLongIceUfragPwd[] = |
| 123 "IceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfrag" | 121 "IceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfrag" |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 bool oncandidatesready_; | 204 bool oncandidatesready_; |
| 207 std::vector<cricket::Candidate> mline_0_candidates_; | 205 std::vector<cricket::Candidate> mline_0_candidates_; |
| 208 std::vector<cricket::Candidate> mline_1_candidates_; | 206 std::vector<cricket::Candidate> mline_1_candidates_; |
| 209 PeerConnectionInterface::IceConnectionState ice_connection_state_; | 207 PeerConnectionInterface::IceConnectionState ice_connection_state_; |
| 210 PeerConnectionInterface::IceGatheringState ice_gathering_state_; | 208 PeerConnectionInterface::IceGatheringState ice_gathering_state_; |
| 211 std::vector<PeerConnectionInterface::IceConnectionState> | 209 std::vector<PeerConnectionInterface::IceConnectionState> |
| 212 ice_connection_state_history_; | 210 ice_connection_state_history_; |
| 213 size_t num_candidates_removed_ = 0; | 211 size_t num_candidates_removed_ = 0; |
| 214 }; | 212 }; |
| 215 | 213 |
| 216 // Used for tests in this file to verify that WebRtcSession responds to signals | |
| 217 // from the SctpTransport correctly, and calls Start with the correct | |
| 218 // local/remote ports. | |
| 219 class FakeSctpTransport : public cricket::SctpTransportInternal { | |
| 220 public: | |
| 221 void SetTransportChannel(cricket::TransportChannel* channel) override {} | |
| 222 bool Start(int local_port, int remote_port) override { | |
| 223 local_port_ = local_port; | |
| 224 remote_port_ = remote_port; | |
| 225 return true; | |
| 226 } | |
| 227 bool OpenStream(int sid) override { return true; } | |
| 228 bool ResetStream(int sid) override { return true; } | |
| 229 bool SendData(const cricket::SendDataParams& params, | |
| 230 const rtc::CopyOnWriteBuffer& payload, | |
| 231 cricket::SendDataResult* result = nullptr) override { | |
| 232 return true; | |
| 233 } | |
| 234 bool ReadyToSendData() override { return true; } | |
| 235 void set_debug_name_for_testing(const char* debug_name) override {} | |
| 236 | |
| 237 int local_port() const { return local_port_; } | |
| 238 int remote_port() const { return remote_port_; } | |
| 239 | |
| 240 private: | |
| 241 int local_port_ = -1; | |
| 242 int remote_port_ = -1; | |
| 243 }; | |
| 244 | |
| 245 class FakeSctpTransportFactory : public cricket::SctpTransportInternalFactory { | |
| 246 public: | |
| 247 std::unique_ptr<cricket::SctpTransportInternal> CreateSctpTransport( | |
| 248 cricket::TransportChannel*) override { | |
| 249 last_fake_sctp_transport_ = new FakeSctpTransport(); | |
| 250 return std::unique_ptr<cricket::SctpTransportInternal>( | |
| 251 last_fake_sctp_transport_); | |
| 252 } | |
| 253 | |
| 254 FakeSctpTransport* last_fake_sctp_transport() { | |
| 255 return last_fake_sctp_transport_; | |
| 256 } | |
| 257 | |
| 258 private: | |
| 259 FakeSctpTransport* last_fake_sctp_transport_ = nullptr; | |
| 260 }; | |
| 261 | |
| 262 class WebRtcSessionForTest : public webrtc::WebRtcSession { | 214 class WebRtcSessionForTest : public webrtc::WebRtcSession { |
| 263 public: | 215 public: |
| 264 WebRtcSessionForTest( | 216 WebRtcSessionForTest( |
| 265 webrtc::MediaControllerInterface* media_controller, | 217 webrtc::MediaControllerInterface* media_controller, |
| 266 rtc::Thread* network_thread, | 218 rtc::Thread* network_thread, |
| 267 rtc::Thread* worker_thread, | 219 rtc::Thread* worker_thread, |
| 268 rtc::Thread* signaling_thread, | 220 rtc::Thread* signaling_thread, |
| 269 cricket::PortAllocator* port_allocator, | 221 cricket::PortAllocator* port_allocator, |
| 270 webrtc::IceObserver* ice_observer, | 222 webrtc::IceObserver* ice_observer, |
| 271 std::unique_ptr<cricket::TransportController> transport_controller, | 223 std::unique_ptr<cricket::TransportController> transport_controller) |
| 272 std::unique_ptr<FakeSctpTransportFactory> sctp_factory) | |
| 273 : WebRtcSession(media_controller, | 224 : WebRtcSession(media_controller, |
| 274 network_thread, | 225 network_thread, |
| 275 worker_thread, | 226 worker_thread, |
| 276 signaling_thread, | 227 signaling_thread, |
| 277 port_allocator, | 228 port_allocator, |
| 278 std::move(transport_controller), | 229 std::move(transport_controller)) { |
| 279 std::move(sctp_factory)) { | |
| 280 RegisterIceObserver(ice_observer); | 230 RegisterIceObserver(ice_observer); |
| 281 } | 231 } |
| 282 virtual ~WebRtcSessionForTest() {} | 232 virtual ~WebRtcSessionForTest() {} |
| 283 | 233 |
| 284 // Note that these methods are only safe to use if the signaling thread | 234 // Note that these methods are only safe to use if the signaling thread |
| 285 // is the same as the worker thread | 235 // is the same as the worker thread |
| 286 rtc::PacketTransportInterface* voice_rtp_transport_channel() { | 236 rtc::PacketTransportInterface* voice_rtp_transport_channel() { |
| 287 return rtp_transport_channel(voice_channel()); | 237 return rtp_transport_channel(voice_channel()); |
| 288 } | 238 } |
| 289 | 239 |
| 290 rtc::PacketTransportInterface* voice_rtcp_transport_channel() { | 240 rtc::PacketTransportInterface* voice_rtcp_transport_channel() { |
| 291 return rtcp_transport_channel(voice_channel()); | 241 return rtcp_transport_channel(voice_channel()); |
| 292 } | 242 } |
| 293 | 243 |
| 294 rtc::PacketTransportInterface* video_rtp_transport_channel() { | 244 rtc::PacketTransportInterface* video_rtp_transport_channel() { |
| 295 return rtp_transport_channel(video_channel()); | 245 return rtp_transport_channel(video_channel()); |
| 296 } | 246 } |
| 297 | 247 |
| 298 rtc::PacketTransportInterface* video_rtcp_transport_channel() { | 248 rtc::PacketTransportInterface* video_rtcp_transport_channel() { |
| 299 return rtcp_transport_channel(video_channel()); | 249 return rtcp_transport_channel(video_channel()); |
| 300 } | 250 } |
| 301 | 251 |
| 252 rtc::PacketTransportInterface* data_rtp_transport_channel() { |
| 253 return rtp_transport_channel(data_channel()); |
| 254 } |
| 255 |
| 256 rtc::PacketTransportInterface* data_rtcp_transport_channel() { |
| 257 return rtcp_transport_channel(data_channel()); |
| 258 } |
| 259 |
| 302 private: | 260 private: |
| 303 rtc::PacketTransportInterface* rtp_transport_channel( | 261 rtc::PacketTransportInterface* rtp_transport_channel( |
| 304 cricket::BaseChannel* ch) { | 262 cricket::BaseChannel* ch) { |
| 305 if (!ch) { | 263 if (!ch) { |
| 306 return nullptr; | 264 return nullptr; |
| 307 } | 265 } |
| 308 return ch->transport_channel(); | 266 return ch->transport_channel(); |
| 309 } | 267 } |
| 310 | 268 |
| 311 rtc::PacketTransportInterface* rtcp_transport_channel( | 269 rtc::PacketTransportInterface* rtcp_transport_channel( |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 421 } | 379 } |
| 422 | 380 |
| 423 // If |cert_generator| != null or |rtc_configuration| contains |certificates| | 381 // If |cert_generator| != null or |rtc_configuration| contains |certificates| |
| 424 // then DTLS will be enabled unless explicitly disabled by |rtc_configuration| | 382 // then DTLS will be enabled unless explicitly disabled by |rtc_configuration| |
| 425 // options. When DTLS is enabled a certificate will be used if provided, | 383 // options. When DTLS is enabled a certificate will be used if provided, |
| 426 // otherwise one will be generated using the |cert_generator|. | 384 // otherwise one will be generated using the |cert_generator|. |
| 427 void Init( | 385 void Init( |
| 428 std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator, | 386 std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator, |
| 429 PeerConnectionInterface::RtcpMuxPolicy rtcp_mux_policy) { | 387 PeerConnectionInterface::RtcpMuxPolicy rtcp_mux_policy) { |
| 430 ASSERT_TRUE(session_.get() == NULL); | 388 ASSERT_TRUE(session_.get() == NULL); |
| 431 fake_sctp_transport_factory_ = new FakeSctpTransportFactory(); | |
| 432 session_.reset(new WebRtcSessionForTest( | 389 session_.reset(new WebRtcSessionForTest( |
| 433 media_controller_.get(), rtc::Thread::Current(), rtc::Thread::Current(), | 390 media_controller_.get(), rtc::Thread::Current(), rtc::Thread::Current(), |
| 434 rtc::Thread::Current(), allocator_.get(), &observer_, | 391 rtc::Thread::Current(), allocator_.get(), &observer_, |
| 435 std::unique_ptr<cricket::TransportController>( | 392 std::unique_ptr<cricket::TransportController>( |
| 436 new cricket::TransportController(rtc::Thread::Current(), | 393 new cricket::TransportController(rtc::Thread::Current(), |
| 437 rtc::Thread::Current(), | 394 rtc::Thread::Current(), |
| 438 allocator_.get())), | 395 allocator_.get())))); |
| 439 std::unique_ptr<FakeSctpTransportFactory>( | |
| 440 fake_sctp_transport_factory_))); | |
| 441 session_->SignalDataChannelOpenMessage.connect( | 396 session_->SignalDataChannelOpenMessage.connect( |
| 442 this, &WebRtcSessionTest::OnDataChannelOpenMessage); | 397 this, &WebRtcSessionTest::OnDataChannelOpenMessage); |
| 443 session_->GetOnDestroyedSignal()->connect( | 398 session_->GetOnDestroyedSignal()->connect( |
| 444 this, &WebRtcSessionTest::OnSessionDestroyed); | 399 this, &WebRtcSessionTest::OnSessionDestroyed); |
| 445 | 400 |
| 446 configuration_.rtcp_mux_policy = rtcp_mux_policy; | 401 configuration_.rtcp_mux_policy = rtcp_mux_policy; |
| 447 EXPECT_EQ(PeerConnectionInterface::kIceConnectionNew, | 402 EXPECT_EQ(PeerConnectionInterface::kIceConnectionNew, |
| 448 observer_.ice_connection_state_); | 403 observer_.ice_connection_state_); |
| 449 EXPECT_EQ(PeerConnectionInterface::kIceGatheringNew, | 404 EXPECT_EQ(PeerConnectionInterface::kIceGatheringNew, |
| 450 observer_.ice_gathering_state_); | 405 observer_.ice_gathering_state_); |
| (...skipping 1083 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1534 turn_server.ports.push_back( | 1489 turn_server.ports.push_back( |
| 1535 cricket::ProtocolAddress(kTurnUdpIntAddr, cricket::PROTO_UDP)); | 1490 cricket::ProtocolAddress(kTurnUdpIntAddr, cricket::PROTO_UDP)); |
| 1536 allocator_->AddTurnServer(turn_server); | 1491 allocator_->AddTurnServer(turn_server); |
| 1537 allocator_->set_step_delay(cricket::kMinimumStepDelay); | 1492 allocator_->set_step_delay(cricket::kMinimumStepDelay); |
| 1538 allocator_->set_flags(cricket::PORTALLOCATOR_DISABLE_TCP); | 1493 allocator_->set_flags(cricket::PORTALLOCATOR_DISABLE_TCP); |
| 1539 } | 1494 } |
| 1540 | 1495 |
| 1541 webrtc::RtcEventLogNullImpl event_log_; | 1496 webrtc::RtcEventLogNullImpl event_log_; |
| 1542 cricket::FakeMediaEngine* media_engine_; | 1497 cricket::FakeMediaEngine* media_engine_; |
| 1543 cricket::FakeDataEngine* data_engine_; | 1498 cricket::FakeDataEngine* data_engine_; |
| 1544 // Actually owned by session_. | |
| 1545 FakeSctpTransportFactory* fake_sctp_transport_factory_ = nullptr; | |
| 1546 std::unique_ptr<cricket::ChannelManager> channel_manager_; | 1499 std::unique_ptr<cricket::ChannelManager> channel_manager_; |
| 1547 cricket::FakeCall fake_call_; | 1500 cricket::FakeCall fake_call_; |
| 1548 std::unique_ptr<webrtc::MediaControllerInterface> media_controller_; | 1501 std::unique_ptr<webrtc::MediaControllerInterface> media_controller_; |
| 1549 std::unique_ptr<cricket::TransportDescriptionFactory> tdesc_factory_; | 1502 std::unique_ptr<cricket::TransportDescriptionFactory> tdesc_factory_; |
| 1550 std::unique_ptr<cricket::MediaSessionDescriptionFactory> desc_factory_; | 1503 std::unique_ptr<cricket::MediaSessionDescriptionFactory> desc_factory_; |
| 1551 std::unique_ptr<rtc::PhysicalSocketServer> pss_; | 1504 std::unique_ptr<rtc::PhysicalSocketServer> pss_; |
| 1552 std::unique_ptr<rtc::VirtualSocketServer> vss_; | 1505 std::unique_ptr<rtc::VirtualSocketServer> vss_; |
| 1553 std::unique_ptr<rtc::FirewallSocketServer> fss_; | 1506 std::unique_ptr<rtc::FirewallSocketServer> fss_; |
| 1554 rtc::SocketServerScope ss_scope_; | 1507 rtc::SocketServerScope ss_scope_; |
| 1555 rtc::SocketAddress stun_socket_addr_; | 1508 rtc::SocketAddress stun_socket_addr_; |
| (...skipping 2359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3915 allocator_->set_flags(cricket::PORTALLOCATOR_DISABLE_TCP | | 3868 allocator_->set_flags(cricket::PORTALLOCATOR_DISABLE_TCP | |
| 3916 cricket::PORTALLOCATOR_DISABLE_RELAY); | 3869 cricket::PORTALLOCATOR_DISABLE_RELAY); |
| 3917 TestLoopbackCall(); | 3870 TestLoopbackCall(); |
| 3918 } | 3871 } |
| 3919 | 3872 |
| 3920 TEST_F(WebRtcSessionTest, TestRtpDataChannel) { | 3873 TEST_F(WebRtcSessionTest, TestRtpDataChannel) { |
| 3921 configuration_.enable_rtp_data_channel = true; | 3874 configuration_.enable_rtp_data_channel = true; |
| 3922 Init(); | 3875 Init(); |
| 3923 SetLocalDescriptionWithDataChannel(); | 3876 SetLocalDescriptionWithDataChannel(); |
| 3924 ASSERT_TRUE(data_engine_); | 3877 ASSERT_TRUE(data_engine_); |
| 3925 EXPECT_NE(nullptr, data_engine_->GetChannel(0)); | 3878 EXPECT_EQ(cricket::DCT_RTP, data_engine_->last_channel_type()); |
| 3926 } | 3879 } |
| 3927 | 3880 |
| 3928 TEST_P(WebRtcSessionTest, TestRtpDataChannelConstraintTakesPrecedence) { | 3881 TEST_P(WebRtcSessionTest, TestRtpDataChannelConstraintTakesPrecedence) { |
| 3929 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); | 3882 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); |
| 3930 | 3883 |
| 3931 configuration_.enable_rtp_data_channel = true; | 3884 configuration_.enable_rtp_data_channel = true; |
| 3932 options_.disable_sctp_data_channels = false; | 3885 options_.disable_sctp_data_channels = false; |
| 3933 | 3886 |
| 3934 InitWithDtls(GetParam()); | 3887 InitWithDtls(GetParam()); |
| 3935 | 3888 |
| 3936 SetLocalDescriptionWithDataChannel(); | 3889 SetLocalDescriptionWithDataChannel(); |
| 3937 EXPECT_NE(nullptr, data_engine_->GetChannel(0)); | 3890 EXPECT_EQ(cricket::DCT_RTP, data_engine_->last_channel_type()); |
| 3938 } | |
| 3939 | |
| 3940 // Test that sctp_content_name/sctp_transport_name (used for stats) are correct | |
| 3941 // before and after BUNDLE is negotiated. | |
| 3942 TEST_P(WebRtcSessionTest, SctpContentAndTransportName) { | |
| 3943 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); | |
| 3944 SetFactoryDtlsSrtp(); | |
| 3945 InitWithDtls(GetParam()); | |
| 3946 | |
| 3947 // Initially these fields should be empty. | |
| 3948 EXPECT_FALSE(session_->sctp_content_name()); | |
| 3949 EXPECT_FALSE(session_->sctp_transport_name()); | |
| 3950 | |
| 3951 // Create offer with audio/video/data. | |
| 3952 // Default bundle policy is "balanced", so data should be using its own | |
| 3953 // transport. | |
| 3954 SendAudioVideoStream1(); | |
| 3955 CreateDataChannel(); | |
| 3956 InitiateCall(); | |
| 3957 ASSERT_TRUE(session_->sctp_content_name()); | |
| 3958 ASSERT_TRUE(session_->sctp_transport_name()); | |
| 3959 EXPECT_EQ("data", *session_->sctp_content_name()); | |
| 3960 EXPECT_EQ("data", *session_->sctp_transport_name()); | |
| 3961 | |
| 3962 // Create answer that finishes BUNDLE negotiation, which means everything | |
| 3963 // should be bundled on the first transport (audio). | |
| 3964 cricket::MediaSessionOptions answer_options; | |
| 3965 answer_options.recv_video = true; | |
| 3966 answer_options.bundle_enabled = true; | |
| 3967 answer_options.data_channel_type = cricket::DCT_SCTP; | |
| 3968 SetRemoteDescriptionWithoutError(CreateRemoteAnswer( | |
| 3969 session_->local_description(), answer_options, cricket::SEC_DISABLED)); | |
| 3970 ASSERT_TRUE(session_->sctp_content_name()); | |
| 3971 ASSERT_TRUE(session_->sctp_transport_name()); | |
| 3972 EXPECT_EQ("data", *session_->sctp_content_name()); | |
| 3973 EXPECT_EQ("audio", *session_->sctp_transport_name()); | |
| 3974 } | 3891 } |
| 3975 | 3892 |
| 3976 TEST_P(WebRtcSessionTest, TestCreateOfferWithSctpEnabledWithoutStreams) { | 3893 TEST_P(WebRtcSessionTest, TestCreateOfferWithSctpEnabledWithoutStreams) { |
| 3977 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); | 3894 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); |
| 3978 | 3895 |
| 3979 InitWithDtls(GetParam()); | 3896 InitWithDtls(GetParam()); |
| 3980 | 3897 |
| 3981 std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer()); | 3898 std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer()); |
| 3982 EXPECT_TRUE(offer->description()->GetContentByName("data") == NULL); | 3899 EXPECT_TRUE(offer->description()->GetContentByName("data") == NULL); |
| 3983 EXPECT_TRUE(offer->description()->GetTransportInfoByName("data") == NULL); | 3900 EXPECT_TRUE(offer->description()->GetTransportInfoByName("data") == NULL); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3995 CreateRemoteOffer(options, cricket::SEC_DISABLED); | 3912 CreateRemoteOffer(options, cricket::SEC_DISABLED); |
| 3996 SetRemoteDescriptionWithoutError(offer); | 3913 SetRemoteDescriptionWithoutError(offer); |
| 3997 | 3914 |
| 3998 // Verifies the answer contains SCTP. | 3915 // Verifies the answer contains SCTP. |
| 3999 std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer()); | 3916 std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer()); |
| 4000 EXPECT_TRUE(answer != NULL); | 3917 EXPECT_TRUE(answer != NULL); |
| 4001 EXPECT_TRUE(answer->description()->GetContentByName("data") != NULL); | 3918 EXPECT_TRUE(answer->description()->GetContentByName("data") != NULL); |
| 4002 EXPECT_TRUE(answer->description()->GetTransportInfoByName("data") != NULL); | 3919 EXPECT_TRUE(answer->description()->GetTransportInfoByName("data") != NULL); |
| 4003 } | 3920 } |
| 4004 | 3921 |
| 4005 // Test that if DTLS is disabled, we don't end up with an SctpTransport | |
| 4006 // created (or an RtpDataChannel). | |
| 4007 TEST_P(WebRtcSessionTest, TestSctpDataChannelWithoutDtls) { | 3922 TEST_P(WebRtcSessionTest, TestSctpDataChannelWithoutDtls) { |
| 4008 configuration_.enable_dtls_srtp = rtc::Optional<bool>(false); | 3923 configuration_.enable_dtls_srtp = rtc::Optional<bool>(false); |
| 4009 InitWithDtls(GetParam()); | 3924 InitWithDtls(GetParam()); |
| 4010 | 3925 |
| 4011 SetLocalDescriptionWithDataChannel(); | 3926 SetLocalDescriptionWithDataChannel(); |
| 4012 EXPECT_EQ(nullptr, data_engine_->GetChannel(0)); | 3927 EXPECT_EQ(cricket::DCT_NONE, data_engine_->last_channel_type()); |
| 4013 EXPECT_EQ(nullptr, fake_sctp_transport_factory_->last_fake_sctp_transport()); | |
| 4014 } | 3928 } |
| 4015 | 3929 |
| 4016 // Test that if DTLS is enabled, we end up with an SctpTransport created | |
| 4017 // (and not an RtpDataChannel). | |
| 4018 TEST_P(WebRtcSessionTest, TestSctpDataChannelWithDtls) { | 3930 TEST_P(WebRtcSessionTest, TestSctpDataChannelWithDtls) { |
| 4019 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); | 3931 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); |
| 4020 | 3932 |
| 4021 InitWithDtls(GetParam()); | 3933 InitWithDtls(GetParam()); |
| 4022 | 3934 |
| 4023 SetLocalDescriptionWithDataChannel(); | 3935 SetLocalDescriptionWithDataChannel(); |
| 4024 EXPECT_EQ(nullptr, data_engine_->GetChannel(0)); | 3936 EXPECT_EQ(cricket::DCT_SCTP, data_engine_->last_channel_type()); |
| 4025 EXPECT_NE(nullptr, fake_sctp_transport_factory_->last_fake_sctp_transport()); | |
| 4026 } | 3937 } |
| 4027 | 3938 |
| 4028 // Test that if SCTP is disabled, we don't end up with an SctpTransport | |
| 4029 // created (or an RtpDataChannel). | |
| 4030 TEST_P(WebRtcSessionTest, TestDisableSctpDataChannels) { | 3939 TEST_P(WebRtcSessionTest, TestDisableSctpDataChannels) { |
| 4031 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); | 3940 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); |
| 4032 options_.disable_sctp_data_channels = true; | 3941 options_.disable_sctp_data_channels = true; |
| 4033 InitWithDtls(GetParam()); | 3942 InitWithDtls(GetParam()); |
| 4034 | 3943 |
| 4035 SetLocalDescriptionWithDataChannel(); | 3944 SetLocalDescriptionWithDataChannel(); |
| 4036 EXPECT_EQ(nullptr, data_engine_->GetChannel(0)); | 3945 EXPECT_EQ(cricket::DCT_NONE, data_engine_->last_channel_type()); |
| 4037 EXPECT_EQ(nullptr, fake_sctp_transport_factory_->last_fake_sctp_transport()); | |
| 4038 } | 3946 } |
| 4039 | 3947 |
| 4040 TEST_P(WebRtcSessionTest, TestSctpDataChannelSendPortParsing) { | 3948 TEST_P(WebRtcSessionTest, TestSctpDataChannelSendPortParsing) { |
| 4041 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); | 3949 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); |
| 4042 const int new_send_port = 9998; | 3950 const int new_send_port = 9998; |
| 4043 const int new_recv_port = 7775; | 3951 const int new_recv_port = 7775; |
| 4044 | 3952 |
| 4045 InitWithDtls(GetParam()); | 3953 InitWithDtls(GetParam()); |
| 4046 SetFactoryDtlsSrtp(); | 3954 SetFactoryDtlsSrtp(); |
| 4047 | 3955 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 4058 | 3966 |
| 4059 SessionDescriptionInterface* answer = | 3967 SessionDescriptionInterface* answer = |
| 4060 ChangeSDPSctpPort(new_recv_port, CreateAnswer()); | 3968 ChangeSDPSctpPort(new_recv_port, CreateAnswer()); |
| 4061 ASSERT_TRUE(answer != NULL); | 3969 ASSERT_TRUE(answer != NULL); |
| 4062 | 3970 |
| 4063 // Now set the local description, which'll take ownership of the answer. | 3971 // Now set the local description, which'll take ownership of the answer. |
| 4064 SetLocalDescriptionWithoutError(answer); | 3972 SetLocalDescriptionWithoutError(answer); |
| 4065 | 3973 |
| 4066 // TEST PLAN: Set the port number to something new, set it in the SDP, | 3974 // TEST PLAN: Set the port number to something new, set it in the SDP, |
| 4067 // and pass it all the way down. | 3975 // and pass it all the way down. |
| 4068 EXPECT_EQ(nullptr, data_engine_->GetChannel(0)); | 3976 EXPECT_EQ(cricket::DCT_SCTP, data_engine_->last_channel_type()); |
| 4069 CreateDataChannel(); | 3977 CreateDataChannel(); |
| 4070 ASSERT_NE(nullptr, fake_sctp_transport_factory_->last_fake_sctp_transport()); | 3978 |
| 4071 EXPECT_EQ( | 3979 cricket::FakeDataMediaChannel* ch = data_engine_->GetChannel(0); |
| 4072 new_recv_port, | 3980 int portnum = -1; |
| 4073 fake_sctp_transport_factory_->last_fake_sctp_transport()->local_port()); | 3981 ASSERT_TRUE(ch != NULL); |
| 4074 EXPECT_EQ( | 3982 ASSERT_EQ(1UL, ch->send_codecs().size()); |
| 4075 new_send_port, | 3983 EXPECT_EQ(cricket::kGoogleSctpDataCodecPlType, ch->send_codecs()[0].id); |
| 4076 fake_sctp_transport_factory_->last_fake_sctp_transport()->remote_port()); | 3984 EXPECT_EQ(0, strcmp(cricket::kGoogleSctpDataCodecName, |
| 3985 ch->send_codecs()[0].name.c_str())); |
| 3986 EXPECT_TRUE(ch->send_codecs()[0].GetParam(cricket::kCodecParamPort, |
| 3987 &portnum)); |
| 3988 EXPECT_EQ(new_send_port, portnum); |
| 3989 |
| 3990 ASSERT_EQ(1UL, ch->recv_codecs().size()); |
| 3991 EXPECT_EQ(cricket::kGoogleSctpDataCodecPlType, ch->recv_codecs()[0].id); |
| 3992 EXPECT_EQ(0, strcmp(cricket::kGoogleSctpDataCodecName, |
| 3993 ch->recv_codecs()[0].name.c_str())); |
| 3994 EXPECT_TRUE(ch->recv_codecs()[0].GetParam(cricket::kCodecParamPort, |
| 3995 &portnum)); |
| 3996 EXPECT_EQ(new_recv_port, portnum); |
| 4077 } | 3997 } |
| 4078 | 3998 |
| 4079 // Verifies that when a session's SctpTransport receives an OPEN message, | 3999 // Verifies that when a session's DataChannel receives an OPEN message, |
| 4080 // WebRtcSession signals the SctpTransport creation request with the expected | 4000 // WebRtcSession signals the DataChannel creation request with the expected |
| 4081 // config. | 4001 // config. |
| 4082 TEST_P(WebRtcSessionTest, TestSctpDataChannelOpenMessage) { | 4002 TEST_P(WebRtcSessionTest, TestSctpDataChannelOpenMessage) { |
| 4083 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); | 4003 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp); |
| 4084 | 4004 |
| 4085 InitWithDtls(GetParam()); | 4005 InitWithDtls(GetParam()); |
| 4086 | 4006 |
| 4087 SetLocalDescriptionWithDataChannel(); | 4007 SetLocalDescriptionWithDataChannel(); |
| 4088 EXPECT_EQ(nullptr, data_engine_->GetChannel(0)); | 4008 EXPECT_EQ(cricket::DCT_SCTP, data_engine_->last_channel_type()); |
| 4089 ASSERT_NE(nullptr, fake_sctp_transport_factory_->last_fake_sctp_transport()); | |
| 4090 | 4009 |
| 4091 // Make the fake SCTP transport pretend it received an OPEN message. | |
| 4092 webrtc::DataChannelInit config; | 4010 webrtc::DataChannelInit config; |
| 4093 config.id = 1; | 4011 config.id = 1; |
| 4094 rtc::CopyOnWriteBuffer payload; | 4012 rtc::CopyOnWriteBuffer payload; |
| 4095 webrtc::WriteDataChannelOpenMessage("a", config, &payload); | 4013 webrtc::WriteDataChannelOpenMessage("a", config, &payload); |
| 4096 cricket::ReceiveDataParams params; | 4014 cricket::ReceiveDataParams params; |
| 4097 params.ssrc = config.id; | 4015 params.ssrc = config.id; |
| 4098 params.type = cricket::DMT_CONTROL; | 4016 params.type = cricket::DMT_CONTROL; |
| 4099 fake_sctp_transport_factory_->last_fake_sctp_transport()->SignalDataReceived( | |
| 4100 params, payload); | |
| 4101 | 4017 |
| 4102 EXPECT_EQ_WAIT("a", last_data_channel_label_, kDefaultTimeout); | 4018 cricket::DataChannel* data_channel = session_->data_channel(); |
| 4019 data_channel->SignalDataReceived(data_channel, params, payload); |
| 4020 |
| 4021 EXPECT_EQ("a", last_data_channel_label_); |
| 4103 EXPECT_EQ(config.id, last_data_channel_config_.id); | 4022 EXPECT_EQ(config.id, last_data_channel_config_.id); |
| 4104 EXPECT_FALSE(last_data_channel_config_.negotiated); | 4023 EXPECT_FALSE(last_data_channel_config_.negotiated); |
| 4105 EXPECT_EQ(webrtc::InternalDataChannelInit::kAcker, | 4024 EXPECT_EQ(webrtc::InternalDataChannelInit::kAcker, |
| 4106 last_data_channel_config_.open_handshake_role); | 4025 last_data_channel_config_.open_handshake_role); |
| 4107 } | 4026 } |
| 4108 | 4027 |
| 4109 TEST_P(WebRtcSessionTest, TestUsesProvidedCertificate) { | 4028 TEST_P(WebRtcSessionTest, TestUsesProvidedCertificate) { |
| 4110 rtc::scoped_refptr<rtc::RTCCertificate> certificate = | 4029 rtc::scoped_refptr<rtc::RTCCertificate> certificate = |
| 4111 FakeRTCCertificateGenerator::GenerateCertificate(); | 4030 FakeRTCCertificateGenerator::GenerateCertificate(); |
| 4112 | 4031 |
| (...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4442 } | 4361 } |
| 4443 | 4362 |
| 4444 // TODO(bemasc): Add a TestIceStatesBundle with BUNDLE enabled. That test | 4363 // TODO(bemasc): Add a TestIceStatesBundle with BUNDLE enabled. That test |
| 4445 // currently fails because upon disconnection and reconnection OnIceComplete is | 4364 // currently fails because upon disconnection and reconnection OnIceComplete is |
| 4446 // called more than once without returning to IceGatheringGathering. | 4365 // called more than once without returning to IceGatheringGathering. |
| 4447 | 4366 |
| 4448 INSTANTIATE_TEST_CASE_P(WebRtcSessionTests, | 4367 INSTANTIATE_TEST_CASE_P(WebRtcSessionTests, |
| 4449 WebRtcSessionTest, | 4368 WebRtcSessionTest, |
| 4450 testing::Values(ALREADY_GENERATED, | 4369 testing::Values(ALREADY_GENERATED, |
| 4451 DTLS_IDENTITY_STORE)); | 4370 DTLS_IDENTITY_STORE)); |
| OLD | NEW |