blob: d6eb3363092639eb937208b2cdaf2ebfe0e7a6d7 [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
11#include <string>
12
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "p2p/base/fakepackettransport.h"
14#include "pc/rtptransport.h"
15#include "pc/rtptransporttestutil.h"
16#include "rtc_base/gunit.h"
zstein56162b92017-04-24 16:54:35 -070017
18namespace webrtc {
19
zstein56162b92017-04-24 16:54:35 -070020constexpr bool kMuxDisabled = false;
21constexpr bool kMuxEnabled = true;
Zhi Huang942bc2e2017-11-13 13:26:07 -080022constexpr uint16_t kLocalNetId = 1;
23constexpr uint16_t kRemoteNetId = 2;
24constexpr int kLastPacketId = 100;
25constexpr int kTransportOverheadPerPacket = 28; // Ipv4(20) + UDP(8).
zstein56162b92017-04-24 16:54:35 -070026
zstein3dcf0e92017-06-01 13:22:42 -070027TEST(RtpTransportTest, SetRtcpParametersCantDisableRtcpMux) {
zstein56162b92017-04-24 16:54:35 -070028 RtpTransport transport(kMuxDisabled);
sprangdb2a9fc2017-08-09 06:42:32 -070029 RtpTransportParameters params;
30 transport.SetParameters(params);
31 params.rtcp.mux = false;
32 EXPECT_FALSE(transport.SetParameters(params).ok());
zstein56162b92017-04-24 16:54:35 -070033}
34
zstein3dcf0e92017-06-01 13:22:42 -070035TEST(RtpTransportTest, SetRtcpParametersEmptyCnameUsesExisting) {
zstein56162b92017-04-24 16:54:35 -070036 static const char kName[] = "name";
37 RtpTransport transport(kMuxDisabled);
sprangdb2a9fc2017-08-09 06:42:32 -070038 RtpTransportParameters params_with_name;
39 params_with_name.rtcp.cname = kName;
40 transport.SetParameters(params_with_name);
41 EXPECT_EQ(transport.GetParameters().rtcp.cname, kName);
zstein56162b92017-04-24 16:54:35 -070042
sprangdb2a9fc2017-08-09 06:42:32 -070043 RtpTransportParameters params_without_name;
44 transport.SetParameters(params_without_name);
45 EXPECT_EQ(transport.GetParameters().rtcp.cname, kName);
46}
47
48TEST(RtpTransportTest, SetRtpTransportKeepAliveNotSupported) {
49 // Tests that we warn users that keep-alive isn't supported yet.
50 // TODO(sprang): Wire up keep-alive and remove this test.
51 RtpTransport transport(kMuxDisabled);
52 RtpTransportParameters params;
53 params.keepalive.timeout_interval_ms = 1;
54 auto result = transport.SetParameters(params);
55 EXPECT_FALSE(result.ok());
56 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
zstein56162b92017-04-24 16:54:35 -070057}
58
59class SignalObserver : public sigslot::has_slots<> {
60 public:
61 explicit SignalObserver(RtpTransport* transport) {
62 transport->SignalReadyToSend.connect(this, &SignalObserver::OnReadyToSend);
Zhi Huang942bc2e2017-11-13 13:26:07 -080063 transport->SignalNetworkRouteChanged.connect(
64 this, &SignalObserver::OnNetworkRouteChanged);
zstein56162b92017-04-24 16:54:35 -070065 }
Zhi Huang942bc2e2017-11-13 13:26:07 -080066
zstein3dcf0e92017-06-01 13:22:42 -070067 bool ready() const { return ready_; }
zstein56162b92017-04-24 16:54:35 -070068 void OnReadyToSend(bool ready) { ready_ = ready; }
zstein3dcf0e92017-06-01 13:22:42 -070069
Zhi Huang942bc2e2017-11-13 13:26:07 -080070 rtc::Optional<rtc::NetworkRoute> network_route() { return network_route_; }
71 void OnNetworkRouteChanged(rtc::Optional<rtc::NetworkRoute> network_route) {
72 network_route_ = network_route;
73 }
74
zstein3dcf0e92017-06-01 13:22:42 -070075 private:
zstein56162b92017-04-24 16:54:35 -070076 bool ready_ = false;
Zhi Huang942bc2e2017-11-13 13:26:07 -080077 rtc::Optional<rtc::NetworkRoute> network_route_;
zstein56162b92017-04-24 16:54:35 -070078};
79
zstein3dcf0e92017-06-01 13:22:42 -070080TEST(RtpTransportTest, SettingRtcpAndRtpSignalsReady) {
zstein56162b92017-04-24 16:54:35 -070081 RtpTransport transport(kMuxDisabled);
82 SignalObserver observer(&transport);
83 rtc::FakePacketTransport fake_rtcp("fake_rtcp");
84 fake_rtcp.SetWritable(true);
85 rtc::FakePacketTransport fake_rtp("fake_rtp");
86 fake_rtp.SetWritable(true);
87
88 transport.SetRtcpPacketTransport(&fake_rtcp); // rtcp ready
zstein3dcf0e92017-06-01 13:22:42 -070089 EXPECT_FALSE(observer.ready());
zstein56162b92017-04-24 16:54:35 -070090 transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
zstein3dcf0e92017-06-01 13:22:42 -070091 EXPECT_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -070092}
93
zstein3dcf0e92017-06-01 13:22:42 -070094TEST(RtpTransportTest, SettingRtpAndRtcpSignalsReady) {
zstein56162b92017-04-24 16:54:35 -070095 RtpTransport transport(kMuxDisabled);
96 SignalObserver observer(&transport);
97 rtc::FakePacketTransport fake_rtcp("fake_rtcp");
98 fake_rtcp.SetWritable(true);
99 rtc::FakePacketTransport fake_rtp("fake_rtp");
100 fake_rtp.SetWritable(true);
101
102 transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
zstein3dcf0e92017-06-01 13:22:42 -0700103 EXPECT_FALSE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700104 transport.SetRtcpPacketTransport(&fake_rtcp); // rtcp ready
zstein3dcf0e92017-06-01 13:22:42 -0700105 EXPECT_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700106}
107
zstein3dcf0e92017-06-01 13:22:42 -0700108TEST(RtpTransportTest, SettingRtpWithRtcpMuxEnabledSignalsReady) {
zstein56162b92017-04-24 16:54:35 -0700109 RtpTransport transport(kMuxEnabled);
110 SignalObserver observer(&transport);
111 rtc::FakePacketTransport fake_rtp("fake_rtp");
112 fake_rtp.SetWritable(true);
113
114 transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
zstein3dcf0e92017-06-01 13:22:42 -0700115 EXPECT_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700116}
117
zstein3dcf0e92017-06-01 13:22:42 -0700118TEST(RtpTransportTest, DisablingRtcpMuxSignalsNotReady) {
zstein56162b92017-04-24 16:54:35 -0700119 RtpTransport transport(kMuxEnabled);
120 SignalObserver observer(&transport);
121 rtc::FakePacketTransport fake_rtp("fake_rtp");
122 fake_rtp.SetWritable(true);
123
124 transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
zstein3dcf0e92017-06-01 13:22:42 -0700125 EXPECT_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700126
127 transport.SetRtcpMuxEnabled(false);
zstein3dcf0e92017-06-01 13:22:42 -0700128 EXPECT_FALSE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700129}
130
zstein3dcf0e92017-06-01 13:22:42 -0700131TEST(RtpTransportTest, EnablingRtcpMuxSignalsReady) {
zstein56162b92017-04-24 16:54:35 -0700132 RtpTransport transport(kMuxDisabled);
133 SignalObserver observer(&transport);
134 rtc::FakePacketTransport fake_rtp("fake_rtp");
135 fake_rtp.SetWritable(true);
136
137 transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
zstein3dcf0e92017-06-01 13:22:42 -0700138 EXPECT_FALSE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700139
140 transport.SetRtcpMuxEnabled(true);
zstein3dcf0e92017-06-01 13:22:42 -0700141 EXPECT_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700142}
143
Zhi Huang942bc2e2017-11-13 13:26:07 -0800144// Tests the SignalNetworkRoute is fired when setting a packet transport.
145TEST(RtpTransportTest, SetRtpTransportWithNetworkRouteChanged) {
146 RtpTransport transport(kMuxDisabled);
147 SignalObserver observer(&transport);
148 rtc::FakePacketTransport fake_rtp("fake_rtp");
149
150 EXPECT_FALSE(observer.network_route());
151
152 rtc::NetworkRoute network_route;
153 // Set a non-null RTP transport with a new network route.
154 network_route.connected = true;
155 network_route.local_network_id = kLocalNetId;
156 network_route.remote_network_id = kRemoteNetId;
157 network_route.last_sent_packet_id = kLastPacketId;
158 network_route.packet_overhead = kTransportOverheadPerPacket;
159 fake_rtp.SetNetworkRoute(rtc::Optional<rtc::NetworkRoute>(network_route));
160 transport.SetRtpPacketTransport(&fake_rtp);
161 ASSERT_TRUE(observer.network_route());
162 EXPECT_EQ(network_route, *(observer.network_route()));
163 EXPECT_EQ(kTransportOverheadPerPacket,
164 observer.network_route()->packet_overhead);
165 EXPECT_EQ(kLastPacketId, observer.network_route()->last_sent_packet_id);
166
167 // Set a null RTP transport.
168 transport.SetRtpPacketTransport(nullptr);
169 EXPECT_FALSE(observer.network_route());
170}
171
172TEST(RtpTransportTest, SetRtcpTransportWithNetworkRouteChanged) {
173 RtpTransport transport(kMuxDisabled);
174 SignalObserver observer(&transport);
175 rtc::FakePacketTransport fake_rtcp("fake_rtcp");
176
177 EXPECT_FALSE(observer.network_route());
178
179 rtc::NetworkRoute network_route;
180 // Set a non-null RTCP transport with a new network route.
181 network_route.connected = true;
182 network_route.local_network_id = kLocalNetId;
183 network_route.remote_network_id = kRemoteNetId;
184 network_route.last_sent_packet_id = kLastPacketId;
185 network_route.packet_overhead = kTransportOverheadPerPacket;
186 fake_rtcp.SetNetworkRoute(rtc::Optional<rtc::NetworkRoute>(network_route));
187 transport.SetRtcpPacketTransport(&fake_rtcp);
188 ASSERT_TRUE(observer.network_route());
189 EXPECT_EQ(network_route, *(observer.network_route()));
190 EXPECT_EQ(kTransportOverheadPerPacket,
191 observer.network_route()->packet_overhead);
192 EXPECT_EQ(kLastPacketId, observer.network_route()->last_sent_packet_id);
193
194 // Set a null RTCP transport.
195 transport.SetRtcpPacketTransport(nullptr);
196 EXPECT_FALSE(observer.network_route());
197}
198
zstein56162b92017-04-24 16:54:35 -0700199class SignalCounter : public sigslot::has_slots<> {
200 public:
201 explicit SignalCounter(RtpTransport* transport) {
202 transport->SignalReadyToSend.connect(this, &SignalCounter::OnReadyToSend);
203 }
zstein3dcf0e92017-06-01 13:22:42 -0700204 int count() const { return count_; }
zstein56162b92017-04-24 16:54:35 -0700205 void OnReadyToSend(bool ready) { ++count_; }
zstein3dcf0e92017-06-01 13:22:42 -0700206
207 private:
zstein56162b92017-04-24 16:54:35 -0700208 int count_ = 0;
209};
210
zstein3dcf0e92017-06-01 13:22:42 -0700211TEST(RtpTransportTest, ChangingReadyToSendStateOnlySignalsWhenChanged) {
zstein56162b92017-04-24 16:54:35 -0700212 RtpTransport transport(kMuxEnabled);
213 SignalCounter observer(&transport);
214 rtc::FakePacketTransport fake_rtp("fake_rtp");
215 fake_rtp.SetWritable(true);
216
217 // State changes, so we should signal.
218 transport.SetRtpPacketTransport(&fake_rtp);
zstein3dcf0e92017-06-01 13:22:42 -0700219 EXPECT_EQ(observer.count(), 1);
zstein56162b92017-04-24 16:54:35 -0700220
221 // State does not change, so we should not signal.
222 transport.SetRtpPacketTransport(&fake_rtp);
zstein3dcf0e92017-06-01 13:22:42 -0700223 EXPECT_EQ(observer.count(), 1);
zstein56162b92017-04-24 16:54:35 -0700224
225 // State does not change, so we should not signal.
226 transport.SetRtcpMuxEnabled(true);
zstein3dcf0e92017-06-01 13:22:42 -0700227 EXPECT_EQ(observer.count(), 1);
zstein56162b92017-04-24 16:54:35 -0700228
229 // State changes, so we should signal.
230 transport.SetRtcpMuxEnabled(false);
zstein3dcf0e92017-06-01 13:22:42 -0700231 EXPECT_EQ(observer.count(), 2);
232}
233
zstein3dcf0e92017-06-01 13:22:42 -0700234// Test that SignalPacketReceived fires with rtcp=true when a RTCP packet is
235// received.
236TEST(RtpTransportTest, SignalDemuxedRtcp) {
237 RtpTransport transport(kMuxDisabled);
238 SignalPacketReceivedCounter observer(&transport);
239 rtc::FakePacketTransport fake_rtp("fake_rtp");
240 fake_rtp.SetDestination(&fake_rtp, true);
241 transport.SetRtpPacketTransport(&fake_rtp);
242
243 // An rtcp packet.
244 const char data[] = {0, 73, 0, 0};
245 const int len = 4;
246 const rtc::PacketOptions options;
247 const int flags = 0;
248 fake_rtp.SendPacket(data, len, options, flags);
249 EXPECT_EQ(0, observer.rtp_count());
250 EXPECT_EQ(1, observer.rtcp_count());
251}
252
253static const unsigned char kRtpData[] = {0x80, 0x11, 0, 0, 0, 0,
254 0, 0, 0, 0, 0, 0};
255static const int kRtpLen = 12;
256
257// Test that SignalPacketReceived fires with rtcp=false when a RTP packet with a
258// handled payload type is received.
259TEST(RtpTransportTest, SignalHandledRtpPayloadType) {
260 RtpTransport transport(kMuxDisabled);
261 SignalPacketReceivedCounter observer(&transport);
262 rtc::FakePacketTransport fake_rtp("fake_rtp");
263 fake_rtp.SetDestination(&fake_rtp, true);
264 transport.SetRtpPacketTransport(&fake_rtp);
265 transport.AddHandledPayloadType(0x11);
266
267 // An rtp packet.
268 const rtc::PacketOptions options;
269 const int flags = 0;
270 rtc::Buffer rtp_data(kRtpData, kRtpLen);
271 fake_rtp.SendPacket(rtp_data.data<char>(), kRtpLen, options, flags);
272 EXPECT_EQ(1, observer.rtp_count());
273 EXPECT_EQ(0, observer.rtcp_count());
274}
275
276// Test that SignalPacketReceived does not fire when a RTP packet with an
277// unhandled payload type is received.
278TEST(RtpTransportTest, DontSignalUnhandledRtpPayloadType) {
279 RtpTransport transport(kMuxDisabled);
280 SignalPacketReceivedCounter observer(&transport);
281 rtc::FakePacketTransport fake_rtp("fake_rtp");
282 fake_rtp.SetDestination(&fake_rtp, true);
283 transport.SetRtpPacketTransport(&fake_rtp);
284
285 const rtc::PacketOptions options;
286 const int flags = 0;
287 rtc::Buffer rtp_data(kRtpData, kRtpLen);
288 fake_rtp.SendPacket(rtp_data.data<char>(), kRtpLen, options, flags);
289 EXPECT_EQ(0, observer.rtp_count());
290 EXPECT_EQ(0, observer.rtcp_count());
zstein56162b92017-04-24 16:54:35 -0700291}
292
293} // namespace webrtc