blob: 1e1657d20cb49ba5289cb1b53154758278c688b6 [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;
22
zstein3dcf0e92017-06-01 13:22:42 -070023TEST(RtpTransportTest, SetRtcpParametersCantDisableRtcpMux) {
zstein56162b92017-04-24 16:54:35 -070024 RtpTransport transport(kMuxDisabled);
sprangdb2a9fc2017-08-09 06:42:32 -070025 RtpTransportParameters params;
26 transport.SetParameters(params);
27 params.rtcp.mux = false;
28 EXPECT_FALSE(transport.SetParameters(params).ok());
zstein56162b92017-04-24 16:54:35 -070029}
30
zstein3dcf0e92017-06-01 13:22:42 -070031TEST(RtpTransportTest, SetRtcpParametersEmptyCnameUsesExisting) {
zstein56162b92017-04-24 16:54:35 -070032 static const char kName[] = "name";
33 RtpTransport transport(kMuxDisabled);
sprangdb2a9fc2017-08-09 06:42:32 -070034 RtpTransportParameters params_with_name;
35 params_with_name.rtcp.cname = kName;
36 transport.SetParameters(params_with_name);
37 EXPECT_EQ(transport.GetParameters().rtcp.cname, kName);
zstein56162b92017-04-24 16:54:35 -070038
sprangdb2a9fc2017-08-09 06:42:32 -070039 RtpTransportParameters params_without_name;
40 transport.SetParameters(params_without_name);
41 EXPECT_EQ(transport.GetParameters().rtcp.cname, kName);
42}
43
44TEST(RtpTransportTest, SetRtpTransportKeepAliveNotSupported) {
45 // Tests that we warn users that keep-alive isn't supported yet.
46 // TODO(sprang): Wire up keep-alive and remove this test.
47 RtpTransport transport(kMuxDisabled);
48 RtpTransportParameters params;
49 params.keepalive.timeout_interval_ms = 1;
50 auto result = transport.SetParameters(params);
51 EXPECT_FALSE(result.ok());
52 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
zstein56162b92017-04-24 16:54:35 -070053}
54
55class SignalObserver : public sigslot::has_slots<> {
56 public:
57 explicit SignalObserver(RtpTransport* transport) {
58 transport->SignalReadyToSend.connect(this, &SignalObserver::OnReadyToSend);
59 }
zstein3dcf0e92017-06-01 13:22:42 -070060 bool ready() const { return ready_; }
zstein56162b92017-04-24 16:54:35 -070061 void OnReadyToSend(bool ready) { ready_ = ready; }
zstein3dcf0e92017-06-01 13:22:42 -070062
63 private:
zstein56162b92017-04-24 16:54:35 -070064 bool ready_ = false;
65};
66
zstein3dcf0e92017-06-01 13:22:42 -070067TEST(RtpTransportTest, SettingRtcpAndRtpSignalsReady) {
zstein56162b92017-04-24 16:54:35 -070068 RtpTransport transport(kMuxDisabled);
69 SignalObserver observer(&transport);
70 rtc::FakePacketTransport fake_rtcp("fake_rtcp");
71 fake_rtcp.SetWritable(true);
72 rtc::FakePacketTransport fake_rtp("fake_rtp");
73 fake_rtp.SetWritable(true);
74
75 transport.SetRtcpPacketTransport(&fake_rtcp); // rtcp ready
zstein3dcf0e92017-06-01 13:22:42 -070076 EXPECT_FALSE(observer.ready());
zstein56162b92017-04-24 16:54:35 -070077 transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
zstein3dcf0e92017-06-01 13:22:42 -070078 EXPECT_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -070079}
80
zstein3dcf0e92017-06-01 13:22:42 -070081TEST(RtpTransportTest, SettingRtpAndRtcpSignalsReady) {
zstein56162b92017-04-24 16:54:35 -070082 RtpTransport transport(kMuxDisabled);
83 SignalObserver observer(&transport);
84 rtc::FakePacketTransport fake_rtcp("fake_rtcp");
85 fake_rtcp.SetWritable(true);
86 rtc::FakePacketTransport fake_rtp("fake_rtp");
87 fake_rtp.SetWritable(true);
88
89 transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
zstein3dcf0e92017-06-01 13:22:42 -070090 EXPECT_FALSE(observer.ready());
zstein56162b92017-04-24 16:54:35 -070091 transport.SetRtcpPacketTransport(&fake_rtcp); // rtcp ready
zstein3dcf0e92017-06-01 13:22:42 -070092 EXPECT_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -070093}
94
zstein3dcf0e92017-06-01 13:22:42 -070095TEST(RtpTransportTest, SettingRtpWithRtcpMuxEnabledSignalsReady) {
zstein56162b92017-04-24 16:54:35 -070096 RtpTransport transport(kMuxEnabled);
97 SignalObserver observer(&transport);
98 rtc::FakePacketTransport fake_rtp("fake_rtp");
99 fake_rtp.SetWritable(true);
100
101 transport.SetRtpPacketTransport(&fake_rtp); // rtp 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, DisablingRtcpMuxSignalsNotReady) {
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 transport.SetRtcpMuxEnabled(false);
zstein3dcf0e92017-06-01 13:22:42 -0700115 EXPECT_FALSE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700116}
117
zstein3dcf0e92017-06-01 13:22:42 -0700118TEST(RtpTransportTest, EnablingRtcpMuxSignalsReady) {
zstein56162b92017-04-24 16:54:35 -0700119 RtpTransport transport(kMuxDisabled);
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_FALSE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700126
127 transport.SetRtcpMuxEnabled(true);
zstein3dcf0e92017-06-01 13:22:42 -0700128 EXPECT_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700129}
130
131class SignalCounter : public sigslot::has_slots<> {
132 public:
133 explicit SignalCounter(RtpTransport* transport) {
134 transport->SignalReadyToSend.connect(this, &SignalCounter::OnReadyToSend);
135 }
zstein3dcf0e92017-06-01 13:22:42 -0700136 int count() const { return count_; }
zstein56162b92017-04-24 16:54:35 -0700137 void OnReadyToSend(bool ready) { ++count_; }
zstein3dcf0e92017-06-01 13:22:42 -0700138
139 private:
zstein56162b92017-04-24 16:54:35 -0700140 int count_ = 0;
141};
142
zstein3dcf0e92017-06-01 13:22:42 -0700143TEST(RtpTransportTest, ChangingReadyToSendStateOnlySignalsWhenChanged) {
zstein56162b92017-04-24 16:54:35 -0700144 RtpTransport transport(kMuxEnabled);
145 SignalCounter observer(&transport);
146 rtc::FakePacketTransport fake_rtp("fake_rtp");
147 fake_rtp.SetWritable(true);
148
149 // State changes, so we should signal.
150 transport.SetRtpPacketTransport(&fake_rtp);
zstein3dcf0e92017-06-01 13:22:42 -0700151 EXPECT_EQ(observer.count(), 1);
zstein56162b92017-04-24 16:54:35 -0700152
153 // State does not change, so we should not signal.
154 transport.SetRtpPacketTransport(&fake_rtp);
zstein3dcf0e92017-06-01 13:22:42 -0700155 EXPECT_EQ(observer.count(), 1);
zstein56162b92017-04-24 16:54:35 -0700156
157 // State does not change, so we should not signal.
158 transport.SetRtcpMuxEnabled(true);
zstein3dcf0e92017-06-01 13:22:42 -0700159 EXPECT_EQ(observer.count(), 1);
zstein56162b92017-04-24 16:54:35 -0700160
161 // State changes, so we should signal.
162 transport.SetRtcpMuxEnabled(false);
zstein3dcf0e92017-06-01 13:22:42 -0700163 EXPECT_EQ(observer.count(), 2);
164}
165
zstein3dcf0e92017-06-01 13:22:42 -0700166// Test that SignalPacketReceived fires with rtcp=true when a RTCP packet is
167// received.
168TEST(RtpTransportTest, SignalDemuxedRtcp) {
169 RtpTransport transport(kMuxDisabled);
170 SignalPacketReceivedCounter observer(&transport);
171 rtc::FakePacketTransport fake_rtp("fake_rtp");
172 fake_rtp.SetDestination(&fake_rtp, true);
173 transport.SetRtpPacketTransport(&fake_rtp);
174
175 // An rtcp packet.
176 const char data[] = {0, 73, 0, 0};
177 const int len = 4;
178 const rtc::PacketOptions options;
179 const int flags = 0;
180 fake_rtp.SendPacket(data, len, options, flags);
181 EXPECT_EQ(0, observer.rtp_count());
182 EXPECT_EQ(1, observer.rtcp_count());
183}
184
185static const unsigned char kRtpData[] = {0x80, 0x11, 0, 0, 0, 0,
186 0, 0, 0, 0, 0, 0};
187static const int kRtpLen = 12;
188
189// Test that SignalPacketReceived fires with rtcp=false when a RTP packet with a
190// handled payload type is received.
191TEST(RtpTransportTest, SignalHandledRtpPayloadType) {
192 RtpTransport transport(kMuxDisabled);
193 SignalPacketReceivedCounter observer(&transport);
194 rtc::FakePacketTransport fake_rtp("fake_rtp");
195 fake_rtp.SetDestination(&fake_rtp, true);
196 transport.SetRtpPacketTransport(&fake_rtp);
197 transport.AddHandledPayloadType(0x11);
198
199 // An rtp packet.
200 const rtc::PacketOptions options;
201 const int flags = 0;
202 rtc::Buffer rtp_data(kRtpData, kRtpLen);
203 fake_rtp.SendPacket(rtp_data.data<char>(), kRtpLen, options, flags);
204 EXPECT_EQ(1, observer.rtp_count());
205 EXPECT_EQ(0, observer.rtcp_count());
206}
207
208// Test that SignalPacketReceived does not fire when a RTP packet with an
209// unhandled payload type is received.
210TEST(RtpTransportTest, DontSignalUnhandledRtpPayloadType) {
211 RtpTransport transport(kMuxDisabled);
212 SignalPacketReceivedCounter observer(&transport);
213 rtc::FakePacketTransport fake_rtp("fake_rtp");
214 fake_rtp.SetDestination(&fake_rtp, true);
215 transport.SetRtpPacketTransport(&fake_rtp);
216
217 const rtc::PacketOptions options;
218 const int flags = 0;
219 rtc::Buffer rtp_data(kRtpData, kRtpLen);
220 fake_rtp.SendPacket(rtp_data.data<char>(), kRtpLen, options, flags);
221 EXPECT_EQ(0, observer.rtp_count());
222 EXPECT_EQ(0, observer.rtcp_count());
zstein56162b92017-04-24 16:54:35 -0700223}
224
225} // namespace webrtc