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

Side by Side Diff: webrtc/api/webrtcsession_unittest.cc

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

Powered by Google App Engine
This is Rietveld 408576698