blob: 0e6af734f39602dbb10e363ec988436063bd5978 [file] [log] [blame]
zstein56162b92017-04-24 16:54:35 -07001/*
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
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "pc/rtp_transport.h"
12
Steve Anton10542f22019-01-11 09:11:00 -080013#include "p2p/base/fake_packet_transport.h"
Steve Anton10542f22019-01-11 09:11:00 -080014#include "pc/test/rtp_transport_test_util.h"
Yves Gerey3e707812018-11-28 16:47:49 +010015#include "rtc_base/buffer.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000016#include "rtc_base/containers/flat_set.h"
Yves Gerey3e707812018-11-28 16:47:49 +010017#include "rtc_base/third_party/sigslot/sigslot.h"
18#include "test/gtest.h"
zstein56162b92017-04-24 16:54:35 -070019
20namespace webrtc {
21
zstein56162b92017-04-24 16:54:35 -070022constexpr bool kMuxDisabled = false;
23constexpr bool kMuxEnabled = true;
Zhi Huang942bc2e2017-11-13 13:26:07 -080024constexpr uint16_t kLocalNetId = 1;
25constexpr uint16_t kRemoteNetId = 2;
26constexpr int kLastPacketId = 100;
27constexpr int kTransportOverheadPerPacket = 28; // Ipv4(20) + UDP(8).
zstein56162b92017-04-24 16:54:35 -070028
zstein56162b92017-04-24 16:54:35 -070029class SignalObserver : public sigslot::has_slots<> {
30 public:
31 explicit SignalObserver(RtpTransport* transport) {
Zhi Huange830e682018-03-30 10:48:35 -070032 transport_ = transport;
zstein56162b92017-04-24 16:54:35 -070033 transport->SignalReadyToSend.connect(this, &SignalObserver::OnReadyToSend);
Zhi Huang942bc2e2017-11-13 13:26:07 -080034 transport->SignalNetworkRouteChanged.connect(
35 this, &SignalObserver::OnNetworkRouteChanged);
Zhi Huange830e682018-03-30 10:48:35 -070036 if (transport->rtp_packet_transport()) {
37 transport->rtp_packet_transport()->SignalSentPacket.connect(
38 this, &SignalObserver::OnSentPacket);
39 }
40
41 if (transport->rtcp_packet_transport()) {
42 transport->rtcp_packet_transport()->SignalSentPacket.connect(
43 this, &SignalObserver::OnSentPacket);
44 }
zstein56162b92017-04-24 16:54:35 -070045 }
Zhi Huang942bc2e2017-11-13 13:26:07 -080046
zstein3dcf0e92017-06-01 13:22:42 -070047 bool ready() const { return ready_; }
zstein56162b92017-04-24 16:54:35 -070048 void OnReadyToSend(bool ready) { ready_ = ready; }
zstein3dcf0e92017-06-01 13:22:42 -070049
Danil Chapovalov66cadcc2018-06-19 16:47:43 +020050 absl::optional<rtc::NetworkRoute> network_route() { return network_route_; }
51 void OnNetworkRouteChanged(absl::optional<rtc::NetworkRoute> network_route) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +010052 network_route_ = network_route;
Zhi Huang942bc2e2017-11-13 13:26:07 -080053 }
54
Zhi Huange830e682018-03-30 10:48:35 -070055 void OnSentPacket(rtc::PacketTransportInternal* packet_transport,
56 const rtc::SentPacket& sent_packet) {
57 if (packet_transport == transport_->rtp_packet_transport()) {
58 rtp_transport_sent_count_++;
59 } else {
60 ASSERT_EQ(transport_->rtcp_packet_transport(), packet_transport);
61 rtcp_transport_sent_count_++;
62 }
63 }
64
65 int rtp_transport_sent_count() { return rtp_transport_sent_count_; }
66
67 int rtcp_transport_sent_count() { return rtcp_transport_sent_count_; }
68
zstein3dcf0e92017-06-01 13:22:42 -070069 private:
Zhi Huange830e682018-03-30 10:48:35 -070070 int rtp_transport_sent_count_ = 0;
71 int rtcp_transport_sent_count_ = 0;
72 RtpTransport* transport_ = nullptr;
zstein56162b92017-04-24 16:54:35 -070073 bool ready_ = false;
Danil Chapovalov66cadcc2018-06-19 16:47:43 +020074 absl::optional<rtc::NetworkRoute> network_route_;
zstein56162b92017-04-24 16:54:35 -070075};
76
zstein3dcf0e92017-06-01 13:22:42 -070077TEST(RtpTransportTest, SettingRtcpAndRtpSignalsReady) {
zstein56162b92017-04-24 16:54:35 -070078 RtpTransport transport(kMuxDisabled);
79 SignalObserver observer(&transport);
80 rtc::FakePacketTransport fake_rtcp("fake_rtcp");
81 fake_rtcp.SetWritable(true);
82 rtc::FakePacketTransport fake_rtp("fake_rtp");
83 fake_rtp.SetWritable(true);
84
85 transport.SetRtcpPacketTransport(&fake_rtcp); // rtcp ready
zstein3dcf0e92017-06-01 13:22:42 -070086 EXPECT_FALSE(observer.ready());
zstein56162b92017-04-24 16:54:35 -070087 transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
zstein3dcf0e92017-06-01 13:22:42 -070088 EXPECT_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -070089}
90
zstein3dcf0e92017-06-01 13:22:42 -070091TEST(RtpTransportTest, SettingRtpAndRtcpSignalsReady) {
zstein56162b92017-04-24 16:54:35 -070092 RtpTransport transport(kMuxDisabled);
93 SignalObserver observer(&transport);
94 rtc::FakePacketTransport fake_rtcp("fake_rtcp");
95 fake_rtcp.SetWritable(true);
96 rtc::FakePacketTransport fake_rtp("fake_rtp");
97 fake_rtp.SetWritable(true);
98
99 transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
zstein3dcf0e92017-06-01 13:22:42 -0700100 EXPECT_FALSE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700101 transport.SetRtcpPacketTransport(&fake_rtcp); // rtcp ready
zstein3dcf0e92017-06-01 13:22:42 -0700102 EXPECT_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700103}
104
zstein3dcf0e92017-06-01 13:22:42 -0700105TEST(RtpTransportTest, SettingRtpWithRtcpMuxEnabledSignalsReady) {
zstein56162b92017-04-24 16:54:35 -0700106 RtpTransport transport(kMuxEnabled);
107 SignalObserver observer(&transport);
108 rtc::FakePacketTransport fake_rtp("fake_rtp");
109 fake_rtp.SetWritable(true);
110
111 transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
zstein3dcf0e92017-06-01 13:22:42 -0700112 EXPECT_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700113}
114
zstein3dcf0e92017-06-01 13:22:42 -0700115TEST(RtpTransportTest, DisablingRtcpMuxSignalsNotReady) {
zstein56162b92017-04-24 16:54:35 -0700116 RtpTransport transport(kMuxEnabled);
117 SignalObserver observer(&transport);
118 rtc::FakePacketTransport fake_rtp("fake_rtp");
119 fake_rtp.SetWritable(true);
120
121 transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
zstein3dcf0e92017-06-01 13:22:42 -0700122 EXPECT_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700123
124 transport.SetRtcpMuxEnabled(false);
zstein3dcf0e92017-06-01 13:22:42 -0700125 EXPECT_FALSE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700126}
127
zstein3dcf0e92017-06-01 13:22:42 -0700128TEST(RtpTransportTest, EnablingRtcpMuxSignalsReady) {
zstein56162b92017-04-24 16:54:35 -0700129 RtpTransport transport(kMuxDisabled);
130 SignalObserver observer(&transport);
131 rtc::FakePacketTransport fake_rtp("fake_rtp");
132 fake_rtp.SetWritable(true);
133
134 transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
zstein3dcf0e92017-06-01 13:22:42 -0700135 EXPECT_FALSE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700136
137 transport.SetRtcpMuxEnabled(true);
zstein3dcf0e92017-06-01 13:22:42 -0700138 EXPECT_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700139}
140
Zhi Huang942bc2e2017-11-13 13:26:07 -0800141// Tests the SignalNetworkRoute is fired when setting a packet transport.
142TEST(RtpTransportTest, SetRtpTransportWithNetworkRouteChanged) {
143 RtpTransport transport(kMuxDisabled);
144 SignalObserver observer(&transport);
145 rtc::FakePacketTransport fake_rtp("fake_rtp");
146
147 EXPECT_FALSE(observer.network_route());
148
149 rtc::NetworkRoute network_route;
150 // Set a non-null RTP transport with a new network route.
151 network_route.connected = true;
Jonas Oreland71fda362020-03-20 16:11:56 +0100152 network_route.local = rtc::RouteEndpoint::CreateWithNetworkId(kLocalNetId);
153 network_route.remote = rtc::RouteEndpoint::CreateWithNetworkId(kRemoteNetId);
Zhi Huang942bc2e2017-11-13 13:26:07 -0800154 network_route.last_sent_packet_id = kLastPacketId;
155 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200156 fake_rtp.SetNetworkRoute(absl::optional<rtc::NetworkRoute>(network_route));
Zhi Huang942bc2e2017-11-13 13:26:07 -0800157 transport.SetRtpPacketTransport(&fake_rtp);
158 ASSERT_TRUE(observer.network_route());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100159 EXPECT_TRUE(observer.network_route()->connected);
Jonas Oreland71fda362020-03-20 16:11:56 +0100160 EXPECT_EQ(kLocalNetId, observer.network_route()->local.network_id());
161 EXPECT_EQ(kRemoteNetId, observer.network_route()->remote.network_id());
Zhi Huang942bc2e2017-11-13 13:26:07 -0800162 EXPECT_EQ(kTransportOverheadPerPacket,
163 observer.network_route()->packet_overhead);
164 EXPECT_EQ(kLastPacketId, observer.network_route()->last_sent_packet_id);
165
166 // Set a null RTP transport.
167 transport.SetRtpPacketTransport(nullptr);
168 EXPECT_FALSE(observer.network_route());
169}
170
171TEST(RtpTransportTest, SetRtcpTransportWithNetworkRouteChanged) {
172 RtpTransport transport(kMuxDisabled);
173 SignalObserver observer(&transport);
174 rtc::FakePacketTransport fake_rtcp("fake_rtcp");
175
176 EXPECT_FALSE(observer.network_route());
177
178 rtc::NetworkRoute network_route;
179 // Set a non-null RTCP transport with a new network route.
180 network_route.connected = true;
Jonas Oreland71fda362020-03-20 16:11:56 +0100181 network_route.local = rtc::RouteEndpoint::CreateWithNetworkId(kLocalNetId);
182 network_route.remote = rtc::RouteEndpoint::CreateWithNetworkId(kRemoteNetId);
Zhi Huang942bc2e2017-11-13 13:26:07 -0800183 network_route.last_sent_packet_id = kLastPacketId;
184 network_route.packet_overhead = kTransportOverheadPerPacket;
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200185 fake_rtcp.SetNetworkRoute(absl::optional<rtc::NetworkRoute>(network_route));
Zhi Huang942bc2e2017-11-13 13:26:07 -0800186 transport.SetRtcpPacketTransport(&fake_rtcp);
187 ASSERT_TRUE(observer.network_route());
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100188 EXPECT_TRUE(observer.network_route()->connected);
Jonas Oreland71fda362020-03-20 16:11:56 +0100189 EXPECT_EQ(kLocalNetId, observer.network_route()->local.network_id());
190 EXPECT_EQ(kRemoteNetId, observer.network_route()->remote.network_id());
Zhi Huang942bc2e2017-11-13 13:26:07 -0800191 EXPECT_EQ(kTransportOverheadPerPacket,
192 observer.network_route()->packet_overhead);
193 EXPECT_EQ(kLastPacketId, observer.network_route()->last_sent_packet_id);
194
195 // Set a null RTCP transport.
196 transport.SetRtcpPacketTransport(nullptr);
197 EXPECT_FALSE(observer.network_route());
198}
199
Zhi Huange830e682018-03-30 10:48:35 -0700200// Test that RTCP packets are sent over correct transport based on the RTCP-mux
201// status.
202TEST(RtpTransportTest, RtcpPacketSentOverCorrectTransport) {
203 // If the RTCP-mux is not enabled, RTCP packets are expected to be sent over
204 // the RtcpPacketTransport.
205 RtpTransport transport(kMuxDisabled);
206 rtc::FakePacketTransport fake_rtcp("fake_rtcp");
207 rtc::FakePacketTransport fake_rtp("fake_rtp");
208 transport.SetRtcpPacketTransport(&fake_rtcp); // rtcp ready
209 transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
210 SignalObserver observer(&transport);
211
212 fake_rtp.SetDestination(&fake_rtp, true);
213 fake_rtcp.SetDestination(&fake_rtcp, true);
214
215 rtc::CopyOnWriteBuffer packet;
216 EXPECT_TRUE(transport.SendRtcpPacket(&packet, rtc::PacketOptions(), 0));
217 EXPECT_EQ(1, observer.rtcp_transport_sent_count());
218
219 // The RTCP packets are expected to be sent over RtpPacketTransport if
220 // RTCP-mux is enabled.
221 transport.SetRtcpMuxEnabled(true);
222 EXPECT_TRUE(transport.SendRtcpPacket(&packet, rtc::PacketOptions(), 0));
223 EXPECT_EQ(1, observer.rtp_transport_sent_count());
224}
225
zstein3dcf0e92017-06-01 13:22:42 -0700226TEST(RtpTransportTest, ChangingReadyToSendStateOnlySignalsWhenChanged) {
zstein56162b92017-04-24 16:54:35 -0700227 RtpTransport transport(kMuxEnabled);
Zhi Huang365381f2018-04-13 16:44:34 -0700228 TransportObserver observer(&transport);
zstein56162b92017-04-24 16:54:35 -0700229 rtc::FakePacketTransport fake_rtp("fake_rtp");
230 fake_rtp.SetWritable(true);
231
232 // State changes, so we should signal.
233 transport.SetRtpPacketTransport(&fake_rtp);
Zhi Huang365381f2018-04-13 16:44:34 -0700234 EXPECT_EQ(observer.ready_to_send_signal_count(), 1);
zstein56162b92017-04-24 16:54:35 -0700235
236 // State does not change, so we should not signal.
237 transport.SetRtpPacketTransport(&fake_rtp);
Zhi Huang365381f2018-04-13 16:44:34 -0700238 EXPECT_EQ(observer.ready_to_send_signal_count(), 1);
zstein56162b92017-04-24 16:54:35 -0700239
240 // State does not change, so we should not signal.
241 transport.SetRtcpMuxEnabled(true);
Zhi Huang365381f2018-04-13 16:44:34 -0700242 EXPECT_EQ(observer.ready_to_send_signal_count(), 1);
zstein56162b92017-04-24 16:54:35 -0700243
244 // State changes, so we should signal.
245 transport.SetRtcpMuxEnabled(false);
Zhi Huang365381f2018-04-13 16:44:34 -0700246 EXPECT_EQ(observer.ready_to_send_signal_count(), 2);
zstein3dcf0e92017-06-01 13:22:42 -0700247}
248
zstein3dcf0e92017-06-01 13:22:42 -0700249// Test that SignalPacketReceived fires with rtcp=true when a RTCP packet is
250// received.
251TEST(RtpTransportTest, SignalDemuxedRtcp) {
252 RtpTransport transport(kMuxDisabled);
zstein3dcf0e92017-06-01 13:22:42 -0700253 rtc::FakePacketTransport fake_rtp("fake_rtp");
254 fake_rtp.SetDestination(&fake_rtp, true);
255 transport.SetRtpPacketTransport(&fake_rtp);
Zhi Huang365381f2018-04-13 16:44:34 -0700256 TransportObserver observer(&transport);
zstein3dcf0e92017-06-01 13:22:42 -0700257
258 // An rtcp packet.
Piotr (Peter) Slatala042bb002019-01-30 14:57:12 -0800259 const unsigned char data[] = {0x80, 73, 0, 0};
zstein3dcf0e92017-06-01 13:22:42 -0700260 const int len = 4;
261 const rtc::PacketOptions options;
262 const int flags = 0;
Piotr (Peter) Slatala042bb002019-01-30 14:57:12 -0800263 fake_rtp.SendPacket(reinterpret_cast<const char*>(data), len, options, flags);
zstein3dcf0e92017-06-01 13:22:42 -0700264 EXPECT_EQ(0, observer.rtp_count());
265 EXPECT_EQ(1, observer.rtcp_count());
266}
267
268static const unsigned char kRtpData[] = {0x80, 0x11, 0, 0, 0, 0,
269 0, 0, 0, 0, 0, 0};
270static const int kRtpLen = 12;
271
272// Test that SignalPacketReceived fires with rtcp=false when a RTP packet with a
273// handled payload type is received.
274TEST(RtpTransportTest, SignalHandledRtpPayloadType) {
275 RtpTransport transport(kMuxDisabled);
zstein3dcf0e92017-06-01 13:22:42 -0700276 rtc::FakePacketTransport fake_rtp("fake_rtp");
277 fake_rtp.SetDestination(&fake_rtp, true);
278 transport.SetRtpPacketTransport(&fake_rtp);
Zhi Huang365381f2018-04-13 16:44:34 -0700279 TransportObserver observer(&transport);
280 RtpDemuxerCriteria demuxer_criteria;
281 // Add a handled payload type.
Tomas Gunnarsson8a5ac162022-01-03 14:16:46 +0000282 demuxer_criteria.payload_types().insert(0x11);
Zhi Huang365381f2018-04-13 16:44:34 -0700283 transport.RegisterRtpDemuxerSink(demuxer_criteria, &observer);
zstein3dcf0e92017-06-01 13:22:42 -0700284
285 // An rtp packet.
286 const rtc::PacketOptions options;
287 const int flags = 0;
288 rtc::Buffer rtp_data(kRtpData, kRtpLen);
289 fake_rtp.SendPacket(rtp_data.data<char>(), kRtpLen, options, flags);
290 EXPECT_EQ(1, observer.rtp_count());
291 EXPECT_EQ(0, observer.rtcp_count());
Zhi Huang365381f2018-04-13 16:44:34 -0700292 // Remove the sink before destroying the transport.
293 transport.UnregisterRtpDemuxerSink(&observer);
294}
295
296// Test that SignalPacketReceived does not fire when a RTP packet with an
297// unhandled payload type is received.
298TEST(RtpTransportTest, DontSignalUnhandledRtpPayloadType) {
299 RtpTransport transport(kMuxDisabled);
300 rtc::FakePacketTransport fake_rtp("fake_rtp");
301 fake_rtp.SetDestination(&fake_rtp, true);
302 transport.SetRtpPacketTransport(&fake_rtp);
303 TransportObserver observer(&transport);
304 RtpDemuxerCriteria demuxer_criteria;
305 // Add an unhandled payload type.
Tomas Gunnarsson8a5ac162022-01-03 14:16:46 +0000306 demuxer_criteria.payload_types().insert(0x12);
Zhi Huang365381f2018-04-13 16:44:34 -0700307 transport.RegisterRtpDemuxerSink(demuxer_criteria, &observer);
308
309 const rtc::PacketOptions options;
310 const int flags = 0;
311 rtc::Buffer rtp_data(kRtpData, kRtpLen);
312 fake_rtp.SendPacket(rtp_data.data<char>(), kRtpLen, options, flags);
313 EXPECT_EQ(0, observer.rtp_count());
314 EXPECT_EQ(0, observer.rtcp_count());
315 // Remove the sink before destroying the transport.
316 transport.UnregisterRtpDemuxerSink(&observer);
zstein3dcf0e92017-06-01 13:22:42 -0700317}
318
zstein56162b92017-04-24 16:54:35 -0700319} // namespace webrtc