blob: ac1af1cfbbbc243cfb96f1e207838321e73b0ccf [file] [log] [blame]
Zhi Huangf2d7beb2017-11-20 14:35:11 -08001/*
2 * Copyright 2017 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "pc/dtlssrtptransport.h"
12
13#include <memory>
14#include <utility>
15
16#include "media/base/fakertp.h"
17#include "p2p/base/dtlstransportinternal.h"
18#include "p2p/base/fakedtlstransport.h"
19#include "p2p/base/fakepackettransport.h"
20#include "p2p/base/p2pconstants.h"
21#include "pc/rtptransport.h"
22#include "pc/rtptransporttestutil.h"
23#include "rtc_base/asyncpacketsocket.h"
24#include "rtc_base/gunit.h"
25#include "rtc_base/ptr_util.h"
26#include "rtc_base/sslstreamadapter.h"
27
28using cricket::FakeDtlsTransport;
29using cricket::FakeIceTransport;
30using webrtc::DtlsSrtpTransport;
31using webrtc::SrtpTransport;
32using webrtc::RtpTransport;
33
34const int kRtpAuthTagLen = 10;
35
36class TransportObserver : public sigslot::has_slots<> {
37 public:
38 void OnPacketReceived(bool rtcp,
39 rtc::CopyOnWriteBuffer* packet,
40 const rtc::PacketTime& packet_time) {
41 rtcp ? last_recv_rtcp_packet_ = *packet : last_recv_rtp_packet_ = *packet;
42 }
43
44 void OnReadyToSend(bool ready) { ready_to_send_ = ready; }
45
46 rtc::CopyOnWriteBuffer last_recv_rtp_packet() {
47 return last_recv_rtp_packet_;
48 }
49
50 rtc::CopyOnWriteBuffer last_recv_rtcp_packet() {
51 return last_recv_rtcp_packet_;
52 }
53
54 bool ready_to_send() { return ready_to_send_; }
55
56 private:
57 rtc::CopyOnWriteBuffer last_recv_rtp_packet_;
58 rtc::CopyOnWriteBuffer last_recv_rtcp_packet_;
59 bool ready_to_send_ = false;
60};
61
62class DtlsSrtpTransportTest : public testing::Test,
63 public sigslot::has_slots<> {
64 protected:
65 DtlsSrtpTransportTest() {}
66
67 std::unique_ptr<DtlsSrtpTransport> MakeDtlsSrtpTransport(
68 FakeDtlsTransport* rtp_dtls,
69 FakeDtlsTransport* rtcp_dtls,
70 bool rtcp_mux_enabled) {
71 auto rtp_transport = rtc::MakeUnique<RtpTransport>(rtcp_mux_enabled);
72
73 rtp_transport->SetRtpPacketTransport(rtp_dtls);
74 rtp_transport->SetRtcpPacketTransport(rtcp_dtls);
75 rtp_transport->AddHandledPayloadType(0x00);
76 rtp_transport->AddHandledPayloadType(0xc9);
77
78 auto srtp_transport =
79 rtc::MakeUnique<SrtpTransport>(std::move(rtp_transport), "content");
80 auto dtls_srtp_transport =
81 rtc::MakeUnique<DtlsSrtpTransport>(std::move(srtp_transport));
82
83 dtls_srtp_transport->SetDtlsTransports(rtp_dtls, rtcp_dtls);
84
85 return dtls_srtp_transport;
86 }
87
88 void MakeDtlsSrtpTransports(FakeDtlsTransport* rtp_dtls1,
89 FakeDtlsTransport* rtcp_dtls1,
90 FakeDtlsTransport* rtp_dtls2,
91 FakeDtlsTransport* rtcp_dtls2,
92 bool rtcp_mux_enabled) {
93 dtls_srtp_transport1_ =
94 MakeDtlsSrtpTransport(rtp_dtls1, rtcp_dtls1, rtcp_mux_enabled);
95 dtls_srtp_transport2_ =
96 MakeDtlsSrtpTransport(rtp_dtls2, rtcp_dtls2, rtcp_mux_enabled);
97
98 dtls_srtp_transport1_->SignalPacketReceived.connect(
99 &transport_observer1_, &TransportObserver::OnPacketReceived);
100 dtls_srtp_transport1_->SignalReadyToSend.connect(
101 &transport_observer1_, &TransportObserver::OnReadyToSend);
102
103 dtls_srtp_transport2_->SignalPacketReceived.connect(
104 &transport_observer2_, &TransportObserver::OnPacketReceived);
105 dtls_srtp_transport2_->SignalReadyToSend.connect(
106 &transport_observer2_, &TransportObserver::OnReadyToSend);
107 }
108
109 void CompleteDtlsHandshake(FakeDtlsTransport* fake_dtls1,
110 FakeDtlsTransport* fake_dtls2) {
111 auto cert1 = rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
112 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
113 fake_dtls1->SetLocalCertificate(cert1);
114 auto cert2 = rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
115 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
116 fake_dtls2->SetLocalCertificate(cert2);
117 fake_dtls1->SetDestination(fake_dtls2);
118 }
119
120 void SendRecvRtpPackets() {
121 ASSERT_TRUE(dtls_srtp_transport1_);
122 ASSERT_TRUE(dtls_srtp_transport2_);
123 ASSERT_TRUE(dtls_srtp_transport1_->IsActive());
124 ASSERT_TRUE(dtls_srtp_transport2_->IsActive());
125
126 size_t rtp_len = sizeof(kPcmuFrame);
127 size_t packet_size = rtp_len + kRtpAuthTagLen;
128 rtc::Buffer rtp_packet_buffer(packet_size);
129 char* rtp_packet_data = rtp_packet_buffer.data<char>();
130 memcpy(rtp_packet_data, kPcmuFrame, rtp_len);
131 // In order to be able to run this test function multiple times we can not
132 // use the same sequence number twice. Increase the sequence number by one.
133 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_data) + 2,
134 ++sequence_number_);
135 rtc::CopyOnWriteBuffer rtp_packet1to2(rtp_packet_data, rtp_len,
136 packet_size);
137 rtc::CopyOnWriteBuffer rtp_packet2to1(rtp_packet_data, rtp_len,
138 packet_size);
139
140 rtc::PacketOptions options;
141 // Send a packet from |srtp_transport1_| to |srtp_transport2_| and verify
142 // that the packet can be successfully received and decrypted.
143 ASSERT_TRUE(dtls_srtp_transport1_->SendRtpPacket(&rtp_packet1to2, options,
144 cricket::PF_SRTP_BYPASS));
145 ASSERT_TRUE(transport_observer2_.last_recv_rtp_packet().data());
146 EXPECT_EQ(0, memcmp(transport_observer2_.last_recv_rtp_packet().data(),
147 kPcmuFrame, rtp_len));
148 ASSERT_TRUE(dtls_srtp_transport2_->SendRtpPacket(&rtp_packet2to1, options,
149 cricket::PF_SRTP_BYPASS));
150 ASSERT_TRUE(transport_observer1_.last_recv_rtp_packet().data());
151 EXPECT_EQ(0, memcmp(transport_observer1_.last_recv_rtp_packet().data(),
152 kPcmuFrame, rtp_len));
153 }
154
155 void SendRecvRtcpPackets() {
156 size_t rtcp_len = sizeof(kRtcpReport);
157 size_t packet_size = rtcp_len + 4 + kRtpAuthTagLen;
158 rtc::Buffer rtcp_packet_buffer(packet_size);
159
160 // TODO(zhihuang): Remove the extra copy when the SendRtpPacket method
161 // doesn't take the CopyOnWriteBuffer by pointer.
162 rtc::CopyOnWriteBuffer rtcp_packet1to2(kRtcpReport, rtcp_len, packet_size);
163 rtc::CopyOnWriteBuffer rtcp_packet2to1(kRtcpReport, rtcp_len, packet_size);
164
165 rtc::PacketOptions options;
166 // Send a packet from |srtp_transport1_| to |srtp_transport2_| and verify
167 // that the packet can be successfully received and decrypted.
168 ASSERT_TRUE(dtls_srtp_transport1_->SendRtcpPacket(&rtcp_packet1to2, options,
169 cricket::PF_SRTP_BYPASS));
170 ASSERT_TRUE(transport_observer2_.last_recv_rtcp_packet().data());
171 EXPECT_EQ(0, memcmp(transport_observer2_.last_recv_rtcp_packet().data(),
172 kRtcpReport, rtcp_len));
173
174 // Do the same thing in the opposite direction;
175 ASSERT_TRUE(dtls_srtp_transport2_->SendRtcpPacket(&rtcp_packet2to1, options,
176 cricket::PF_SRTP_BYPASS));
177 ASSERT_TRUE(transport_observer1_.last_recv_rtcp_packet().data());
178 EXPECT_EQ(0, memcmp(transport_observer1_.last_recv_rtcp_packet().data(),
179 kRtcpReport, rtcp_len));
180 }
181
182 void SendRecvRtpPacketsWithHeaderExtension(
183 const std::vector<int>& encrypted_header_ids) {
184 ASSERT_TRUE(dtls_srtp_transport1_);
185 ASSERT_TRUE(dtls_srtp_transport2_);
186 ASSERT_TRUE(dtls_srtp_transport1_->IsActive());
187 ASSERT_TRUE(dtls_srtp_transport2_->IsActive());
188
189 size_t rtp_len = sizeof(kPcmuFrameWithExtensions);
190 size_t packet_size = rtp_len + kRtpAuthTagLen;
191 rtc::Buffer rtp_packet_buffer(packet_size);
192 char* rtp_packet_data = rtp_packet_buffer.data<char>();
193 memcpy(rtp_packet_data, kPcmuFrameWithExtensions, rtp_len);
194 // In order to be able to run this test function multiple times we can not
195 // use the same sequence number twice. Increase the sequence number by one.
196 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_data) + 2,
197 ++sequence_number_);
198 rtc::CopyOnWriteBuffer rtp_packet1to2(rtp_packet_data, rtp_len,
199 packet_size);
200 rtc::CopyOnWriteBuffer rtp_packet2to1(rtp_packet_data, rtp_len,
201 packet_size);
202
203 char original_rtp_data[sizeof(kPcmuFrameWithExtensions)];
204 memcpy(original_rtp_data, rtp_packet_data, rtp_len);
205
206 rtc::PacketOptions options;
207 // Send a packet from |srtp_transport1_| to |srtp_transport2_| and verify
208 // that the packet can be successfully received and decrypted.
209 ASSERT_TRUE(dtls_srtp_transport1_->SendRtpPacket(&rtp_packet1to2, options,
210 cricket::PF_SRTP_BYPASS));
211 ASSERT_TRUE(transport_observer2_.last_recv_rtp_packet().data());
212 EXPECT_EQ(0, memcmp(transport_observer2_.last_recv_rtp_packet().data(),
213 original_rtp_data, rtp_len));
214 // Get the encrypted packet from underneath packet transport and verify the
215 // data and header extension are actually encrypted.
216 auto fake_dtls_transport = static_cast<FakeDtlsTransport*>(
217 dtls_srtp_transport1_->rtp_packet_transport());
218 auto fake_ice_transport =
219 static_cast<FakeIceTransport*>(fake_dtls_transport->ice_transport());
220 EXPECT_NE(0, memcmp(fake_ice_transport->last_sent_packet().data(),
221 original_rtp_data, rtp_len));
222 CompareHeaderExtensions(reinterpret_cast<const char*>(
223 fake_ice_transport->last_sent_packet().data()),
224 fake_ice_transport->last_sent_packet().size(),
225 original_rtp_data, rtp_len, encrypted_header_ids,
226 false);
227
228 // Do the same thing in the opposite direction.
229 ASSERT_TRUE(dtls_srtp_transport2_->SendRtpPacket(&rtp_packet2to1, options,
230 cricket::PF_SRTP_BYPASS));
231 ASSERT_TRUE(transport_observer1_.last_recv_rtp_packet().data());
232 EXPECT_EQ(0, memcmp(transport_observer1_.last_recv_rtp_packet().data(),
233 original_rtp_data, rtp_len));
234 // Get the encrypted packet from underneath packet transport and verify the
235 // data and header extension are actually encrypted.
236 fake_dtls_transport = static_cast<FakeDtlsTransport*>(
237 dtls_srtp_transport2_->rtp_packet_transport());
238 fake_ice_transport =
239 static_cast<FakeIceTransport*>(fake_dtls_transport->ice_transport());
240 EXPECT_NE(0, memcmp(fake_ice_transport->last_sent_packet().data(),
241 original_rtp_data, rtp_len));
242 CompareHeaderExtensions(reinterpret_cast<const char*>(
243 fake_ice_transport->last_sent_packet().data()),
244 fake_ice_transport->last_sent_packet().size(),
245 original_rtp_data, rtp_len, encrypted_header_ids,
246 false);
247 }
248
249 void SendRecvPackets() {
250 SendRecvRtpPackets();
251 SendRecvRtcpPackets();
252 }
253
254 std::unique_ptr<DtlsSrtpTransport> dtls_srtp_transport1_;
255 std::unique_ptr<DtlsSrtpTransport> dtls_srtp_transport2_;
256 TransportObserver transport_observer1_;
257 TransportObserver transport_observer2_;
258
259 int sequence_number_ = 0;
260};
261
262// Tests that if RTCP muxing is enabled and transports are set after RTP
263// transport finished the handshake, SRTP is set up.
264TEST_F(DtlsSrtpTransportTest, SetTransportsAfterHandshakeCompleteWithRtcpMux) {
265 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
266 "video", cricket::ICE_CANDIDATE_COMPONENT_RTP);
267 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
268 "video", cricket::ICE_CANDIDATE_COMPONENT_RTP);
269
270 MakeDtlsSrtpTransports(rtp_dtls1.get(), nullptr, rtp_dtls2.get(), nullptr,
271 /*rtcp_mux_enabled=*/true);
272
273 auto rtp_dtls3 = rtc::MakeUnique<FakeDtlsTransport>(
274 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
275 auto rtp_dtls4 = rtc::MakeUnique<FakeDtlsTransport>(
276 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
277
278 CompleteDtlsHandshake(rtp_dtls3.get(), rtp_dtls4.get());
279
280 dtls_srtp_transport1_->SetDtlsTransports(rtp_dtls3.get(), nullptr);
281 dtls_srtp_transport2_->SetDtlsTransports(rtp_dtls4.get(), nullptr);
282
283 SendRecvPackets();
284}
285
286// Tests that if RTCP muxing is not enabled and transports are set after both
287// RTP and RTCP transports finished the handshake, SRTP is set up.
288TEST_F(DtlsSrtpTransportTest,
289 SetTransportsAfterHandshakeCompleteWithoutRtcpMux) {
290 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
291 "video", cricket::ICE_CANDIDATE_COMPONENT_RTP);
292 auto rtcp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
293 "video", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
294 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
295 "video", cricket::ICE_CANDIDATE_COMPONENT_RTP);
296 auto rtcp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
297 "video", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
298
299 MakeDtlsSrtpTransports(rtp_dtls1.get(), rtcp_dtls1.get(), rtp_dtls2.get(),
300 rtcp_dtls2.get(), /*rtcp_mux_enabled=*/false);
301
302 auto rtp_dtls3 = rtc::MakeUnique<FakeDtlsTransport>(
303 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
304 auto rtcp_dtls3 = rtc::MakeUnique<FakeDtlsTransport>(
305 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
306 auto rtp_dtls4 = rtc::MakeUnique<FakeDtlsTransport>(
307 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
308 auto rtcp_dtls4 = rtc::MakeUnique<FakeDtlsTransport>(
309 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
310 CompleteDtlsHandshake(rtp_dtls3.get(), rtp_dtls4.get());
311 CompleteDtlsHandshake(rtcp_dtls3.get(), rtcp_dtls4.get());
312
313 dtls_srtp_transport1_->SetDtlsTransports(rtp_dtls3.get(), rtcp_dtls3.get());
314 dtls_srtp_transport2_->SetDtlsTransports(rtp_dtls4.get(), rtcp_dtls4.get());
315
316 SendRecvPackets();
317}
318
319// Tests if RTCP muxing is enabled, SRTP is set up as soon as the RTP DTLS
320// handshake is finished.
321TEST_F(DtlsSrtpTransportTest, SetTransportsBeforeHandshakeCompleteWithRtcpMux) {
322 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
323 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
324 auto rtcp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
325 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
326 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
327 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
328 auto rtcp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
329 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
330
331 MakeDtlsSrtpTransports(rtp_dtls1.get(), rtcp_dtls1.get(), rtp_dtls2.get(),
332 rtcp_dtls2.get(),
333 /*rtcp_mux_enabled=*/false);
334
335 dtls_srtp_transport1_->SetRtcpMuxEnabled(true);
336 dtls_srtp_transport2_->SetRtcpMuxEnabled(true);
337 CompleteDtlsHandshake(rtp_dtls1.get(), rtp_dtls2.get());
338 SendRecvPackets();
339}
340
341// Tests if RTCP muxing is not enabled, SRTP is set up when both the RTP and
342// RTCP DTLS handshake are finished.
343TEST_F(DtlsSrtpTransportTest,
344 SetTransportsBeforeHandshakeCompleteWithoutRtcpMux) {
345 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
346 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
347 auto rtcp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
348 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
349 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
350 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
351 auto rtcp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
352 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
353
354 MakeDtlsSrtpTransports(rtp_dtls1.get(), rtcp_dtls1.get(), rtp_dtls2.get(),
355 rtcp_dtls2.get(), /*rtcp_mux_enabled=*/false);
356
357 CompleteDtlsHandshake(rtp_dtls1.get(), rtp_dtls2.get());
358 EXPECT_FALSE(dtls_srtp_transport1_->IsActive());
359 EXPECT_FALSE(dtls_srtp_transport2_->IsActive());
360 CompleteDtlsHandshake(rtcp_dtls1.get(), rtcp_dtls2.get());
361 SendRecvPackets();
362}
363
364// Tests that if the DtlsTransport underneath is changed, the previous DTLS-SRTP
365// context will be reset and will be re-setup once the new transports' handshake
366// complete.
367TEST_F(DtlsSrtpTransportTest, DtlsSrtpResetAfterDtlsTransportChange) {
368 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
369 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
370 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
371 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
372
373 MakeDtlsSrtpTransports(rtp_dtls1.get(), nullptr, rtp_dtls2.get(), nullptr,
374 /*rtcp_mux_enabled=*/true);
375
376 CompleteDtlsHandshake(rtp_dtls1.get(), rtp_dtls2.get());
377 EXPECT_TRUE(dtls_srtp_transport1_->IsActive());
378 EXPECT_TRUE(dtls_srtp_transport2_->IsActive());
379
380 auto rtp_dtls3 = rtc::MakeUnique<FakeDtlsTransport>(
381 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
382 auto rtp_dtls4 = rtc::MakeUnique<FakeDtlsTransport>(
383 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
384
385 // The previous context is reset.
386 dtls_srtp_transport1_->SetDtlsTransports(rtp_dtls3.get(), nullptr);
387 dtls_srtp_transport2_->SetDtlsTransports(rtp_dtls4.get(), nullptr);
388 EXPECT_FALSE(dtls_srtp_transport1_->IsActive());
389 EXPECT_FALSE(dtls_srtp_transport2_->IsActive());
390
391 // Re-setup.
392 CompleteDtlsHandshake(rtp_dtls3.get(), rtp_dtls4.get());
393 SendRecvPackets();
394}
395
396// Tests if only the RTP DTLS handshake complete, and then RTCP muxing is
397// enabled, SRTP is set up.
398TEST_F(DtlsSrtpTransportTest,
399 RtcpMuxEnabledAfterRtpTransportHandshakeComplete) {
400 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
401 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
402 auto rtcp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
403 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
404 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
405 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
406 auto rtcp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
407 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
408
409 MakeDtlsSrtpTransports(rtp_dtls1.get(), rtcp_dtls1.get(), rtp_dtls2.get(),
410 rtcp_dtls2.get(), /*rtcp_mux_enabled=*/false);
411
412 CompleteDtlsHandshake(rtp_dtls1.get(), rtp_dtls2.get());
413 // Inactive because the RTCP transport handshake didn't complete.
414 EXPECT_FALSE(dtls_srtp_transport1_->IsActive());
415 EXPECT_FALSE(dtls_srtp_transport2_->IsActive());
416
417 dtls_srtp_transport1_->SetRtcpMuxEnabled(true);
418 dtls_srtp_transport2_->SetRtcpMuxEnabled(true);
419 // The transports should be active and be able to send packets when the
420 // RTCP muxing is enabled.
421 SendRecvPackets();
422}
423
424// Tests that when SetSend/RecvEncryptedHeaderExtensionIds is called, the SRTP
425// sessions are updated with new encryped header extension IDs immediately.
426TEST_F(DtlsSrtpTransportTest, EncryptedHeaderExtensionIdUpdated) {
427 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
428 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
429 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
430 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
431
432 MakeDtlsSrtpTransports(rtp_dtls1.get(), nullptr, rtp_dtls2.get(), nullptr,
433 /*rtcp_mux_enabled=*/true);
434 CompleteDtlsHandshake(rtp_dtls1.get(), rtp_dtls2.get());
435
436 std::vector<int> encrypted_headers;
437 encrypted_headers.push_back(kHeaderExtensionIDs[0]);
438 encrypted_headers.push_back(kHeaderExtensionIDs[1]);
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800439
440 dtls_srtp_transport1_->SetSendEncryptedHeaderExtensionIds(encrypted_headers);
441 dtls_srtp_transport1_->SetRecvEncryptedHeaderExtensionIds(encrypted_headers);
442 dtls_srtp_transport2_->SetSendEncryptedHeaderExtensionIds(encrypted_headers);
443 dtls_srtp_transport2_->SetRecvEncryptedHeaderExtensionIds(encrypted_headers);
444 SendRecvRtpPacketsWithHeaderExtension(encrypted_headers);
445}
446
447// Tests if RTCP muxing is enabled. DtlsSrtpTransport is ready to send once the
448// RTP DtlsTransport is ready.
449TEST_F(DtlsSrtpTransportTest, SignalReadyToSendFiredWithRtcpMux) {
450 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
451 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
452 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
453 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
454
455 MakeDtlsSrtpTransports(rtp_dtls1.get(), nullptr, rtp_dtls2.get(), nullptr,
456 /*rtcp_mux_enabled=*/true);
457
458 rtp_dtls1->SetDestination(rtp_dtls2.get());
459 EXPECT_TRUE(transport_observer1_.ready_to_send());
460 EXPECT_TRUE(transport_observer2_.ready_to_send());
461}
462
463// Tests if RTCP muxing is not enabled. DtlsSrtpTransport is ready to send once
464// both the RTP and RTCP DtlsTransport are ready.
465TEST_F(DtlsSrtpTransportTest, SignalReadyToSendFiredWithoutRtcpMux) {
466 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
467 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
468 auto rtcp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
469 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
470 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
471 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
472 auto rtcp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
473 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
474
475 MakeDtlsSrtpTransports(rtp_dtls1.get(), rtcp_dtls1.get(), rtp_dtls2.get(),
476 rtcp_dtls2.get(), /*rtcp_mux_enabled=*/false);
477
478 rtp_dtls1->SetDestination(rtp_dtls2.get());
479 EXPECT_FALSE(transport_observer1_.ready_to_send());
480 EXPECT_FALSE(transport_observer2_.ready_to_send());
481
482 rtcp_dtls1->SetDestination(rtcp_dtls2.get());
483 EXPECT_TRUE(transport_observer1_.ready_to_send());
484 EXPECT_TRUE(transport_observer2_.ready_to_send());
485}