blob: df84d471a7a284cdeef06ce9e8ead7acb98bad3d [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
Henrik Kjellandera80c16a2017-07-01 16:48:15 +020013#include "webrtc/base/gunit.h"
zstein56162b92017-04-24 16:54:35 -070014#include "webrtc/p2p/base/fakepackettransport.h"
15#include "webrtc/pc/rtptransport.h"
16
17namespace webrtc {
18
zstein56162b92017-04-24 16:54:35 -070019constexpr bool kMuxDisabled = false;
20constexpr bool kMuxEnabled = true;
21
zstein3dcf0e92017-06-01 13:22:42 -070022TEST(RtpTransportTest, SetRtcpParametersCantDisableRtcpMux) {
zstein56162b92017-04-24 16:54:35 -070023 RtpTransport transport(kMuxDisabled);
24 RtcpParameters params;
25 transport.SetRtcpParameters(params);
26 params.mux = false;
27 EXPECT_FALSE(transport.SetRtcpParameters(params).ok());
28}
29
zstein3dcf0e92017-06-01 13:22:42 -070030TEST(RtpTransportTest, SetRtcpParametersEmptyCnameUsesExisting) {
zstein56162b92017-04-24 16:54:35 -070031 static const char kName[] = "name";
32 RtpTransport transport(kMuxDisabled);
33 RtcpParameters params_with_name;
34 params_with_name.cname = kName;
35 transport.SetRtcpParameters(params_with_name);
36 EXPECT_EQ(transport.GetRtcpParameters().cname, kName);
37
38 RtcpParameters params_without_name;
39 transport.SetRtcpParameters(params_without_name);
40 EXPECT_EQ(transport.GetRtcpParameters().cname, kName);
41}
42
43class SignalObserver : public sigslot::has_slots<> {
44 public:
45 explicit SignalObserver(RtpTransport* transport) {
46 transport->SignalReadyToSend.connect(this, &SignalObserver::OnReadyToSend);
47 }
zstein3dcf0e92017-06-01 13:22:42 -070048 bool ready() const { return ready_; }
zstein56162b92017-04-24 16:54:35 -070049 void OnReadyToSend(bool ready) { ready_ = ready; }
zstein3dcf0e92017-06-01 13:22:42 -070050
51 private:
zstein56162b92017-04-24 16:54:35 -070052 bool ready_ = false;
53};
54
zstein3dcf0e92017-06-01 13:22:42 -070055TEST(RtpTransportTest, SettingRtcpAndRtpSignalsReady) {
zstein56162b92017-04-24 16:54:35 -070056 RtpTransport transport(kMuxDisabled);
57 SignalObserver observer(&transport);
58 rtc::FakePacketTransport fake_rtcp("fake_rtcp");
59 fake_rtcp.SetWritable(true);
60 rtc::FakePacketTransport fake_rtp("fake_rtp");
61 fake_rtp.SetWritable(true);
62
63 transport.SetRtcpPacketTransport(&fake_rtcp); // rtcp ready
zstein3dcf0e92017-06-01 13:22:42 -070064 EXPECT_FALSE(observer.ready());
zstein56162b92017-04-24 16:54:35 -070065 transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
zstein3dcf0e92017-06-01 13:22:42 -070066 EXPECT_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -070067}
68
zstein3dcf0e92017-06-01 13:22:42 -070069TEST(RtpTransportTest, SettingRtpAndRtcpSignalsReady) {
zstein56162b92017-04-24 16:54:35 -070070 RtpTransport transport(kMuxDisabled);
71 SignalObserver observer(&transport);
72 rtc::FakePacketTransport fake_rtcp("fake_rtcp");
73 fake_rtcp.SetWritable(true);
74 rtc::FakePacketTransport fake_rtp("fake_rtp");
75 fake_rtp.SetWritable(true);
76
77 transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
zstein3dcf0e92017-06-01 13:22:42 -070078 EXPECT_FALSE(observer.ready());
zstein56162b92017-04-24 16:54:35 -070079 transport.SetRtcpPacketTransport(&fake_rtcp); // rtcp ready
zstein3dcf0e92017-06-01 13:22:42 -070080 EXPECT_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -070081}
82
zstein3dcf0e92017-06-01 13:22:42 -070083TEST(RtpTransportTest, SettingRtpWithRtcpMuxEnabledSignalsReady) {
zstein56162b92017-04-24 16:54:35 -070084 RtpTransport transport(kMuxEnabled);
85 SignalObserver observer(&transport);
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_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -070091}
92
zstein3dcf0e92017-06-01 13:22:42 -070093TEST(RtpTransportTest, DisablingRtcpMuxSignalsNotReady) {
zstein56162b92017-04-24 16:54:35 -070094 RtpTransport transport(kMuxEnabled);
95 SignalObserver observer(&transport);
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_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700101
102 transport.SetRtcpMuxEnabled(false);
zstein3dcf0e92017-06-01 13:22:42 -0700103 EXPECT_FALSE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700104}
105
zstein3dcf0e92017-06-01 13:22:42 -0700106TEST(RtpTransportTest, EnablingRtcpMuxSignalsReady) {
zstein56162b92017-04-24 16:54:35 -0700107 RtpTransport transport(kMuxDisabled);
108 SignalObserver observer(&transport);
109 rtc::FakePacketTransport fake_rtp("fake_rtp");
110 fake_rtp.SetWritable(true);
111
112 transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
zstein3dcf0e92017-06-01 13:22:42 -0700113 EXPECT_FALSE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700114
115 transport.SetRtcpMuxEnabled(true);
zstein3dcf0e92017-06-01 13:22:42 -0700116 EXPECT_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700117}
118
119class SignalCounter : public sigslot::has_slots<> {
120 public:
121 explicit SignalCounter(RtpTransport* transport) {
122 transport->SignalReadyToSend.connect(this, &SignalCounter::OnReadyToSend);
123 }
zstein3dcf0e92017-06-01 13:22:42 -0700124 int count() const { return count_; }
zstein56162b92017-04-24 16:54:35 -0700125 void OnReadyToSend(bool ready) { ++count_; }
zstein3dcf0e92017-06-01 13:22:42 -0700126
127 private:
zstein56162b92017-04-24 16:54:35 -0700128 int count_ = 0;
129};
130
zstein3dcf0e92017-06-01 13:22:42 -0700131TEST(RtpTransportTest, ChangingReadyToSendStateOnlySignalsWhenChanged) {
zstein56162b92017-04-24 16:54:35 -0700132 RtpTransport transport(kMuxEnabled);
133 SignalCounter observer(&transport);
134 rtc::FakePacketTransport fake_rtp("fake_rtp");
135 fake_rtp.SetWritable(true);
136
137 // State changes, so we should signal.
138 transport.SetRtpPacketTransport(&fake_rtp);
zstein3dcf0e92017-06-01 13:22:42 -0700139 EXPECT_EQ(observer.count(), 1);
zstein56162b92017-04-24 16:54:35 -0700140
141 // State does not change, so we should not signal.
142 transport.SetRtpPacketTransport(&fake_rtp);
zstein3dcf0e92017-06-01 13:22:42 -0700143 EXPECT_EQ(observer.count(), 1);
zstein56162b92017-04-24 16:54:35 -0700144
145 // State does not change, so we should not signal.
146 transport.SetRtcpMuxEnabled(true);
zstein3dcf0e92017-06-01 13:22:42 -0700147 EXPECT_EQ(observer.count(), 1);
zstein56162b92017-04-24 16:54:35 -0700148
149 // State changes, so we should signal.
150 transport.SetRtcpMuxEnabled(false);
zstein3dcf0e92017-06-01 13:22:42 -0700151 EXPECT_EQ(observer.count(), 2);
152}
153
154class SignalPacketReceivedCounter : public sigslot::has_slots<> {
155 public:
156 explicit SignalPacketReceivedCounter(RtpTransport* transport) {
157 transport->SignalPacketReceived.connect(
158 this, &SignalPacketReceivedCounter::OnPacketReceived);
159 }
160 int rtcp_count() const { return rtcp_count_; }
161 int rtp_count() const { return rtp_count_; }
162
163 private:
164 void OnPacketReceived(bool rtcp,
165 rtc::CopyOnWriteBuffer&,
166 const rtc::PacketTime&) {
167 if (rtcp) {
168 ++rtcp_count_;
169 } else {
170 ++rtp_count_;
171 }
172 }
173 int rtcp_count_ = 0;
174 int rtp_count_ = 0;
175};
176
177// Test that SignalPacketReceived fires with rtcp=true when a RTCP packet is
178// received.
179TEST(RtpTransportTest, SignalDemuxedRtcp) {
180 RtpTransport transport(kMuxDisabled);
181 SignalPacketReceivedCounter observer(&transport);
182 rtc::FakePacketTransport fake_rtp("fake_rtp");
183 fake_rtp.SetDestination(&fake_rtp, true);
184 transport.SetRtpPacketTransport(&fake_rtp);
185
186 // An rtcp packet.
187 const char data[] = {0, 73, 0, 0};
188 const int len = 4;
189 const rtc::PacketOptions options;
190 const int flags = 0;
191 fake_rtp.SendPacket(data, len, options, flags);
192 EXPECT_EQ(0, observer.rtp_count());
193 EXPECT_EQ(1, observer.rtcp_count());
194}
195
196static const unsigned char kRtpData[] = {0x80, 0x11, 0, 0, 0, 0,
197 0, 0, 0, 0, 0, 0};
198static const int kRtpLen = 12;
199
200// Test that SignalPacketReceived fires with rtcp=false when a RTP packet with a
201// handled payload type is received.
202TEST(RtpTransportTest, SignalHandledRtpPayloadType) {
203 RtpTransport transport(kMuxDisabled);
204 SignalPacketReceivedCounter observer(&transport);
205 rtc::FakePacketTransport fake_rtp("fake_rtp");
206 fake_rtp.SetDestination(&fake_rtp, true);
207 transport.SetRtpPacketTransport(&fake_rtp);
208 transport.AddHandledPayloadType(0x11);
209
210 // An rtp packet.
211 const rtc::PacketOptions options;
212 const int flags = 0;
213 rtc::Buffer rtp_data(kRtpData, kRtpLen);
214 fake_rtp.SendPacket(rtp_data.data<char>(), kRtpLen, options, flags);
215 EXPECT_EQ(1, observer.rtp_count());
216 EXPECT_EQ(0, observer.rtcp_count());
217}
218
219// Test that SignalPacketReceived does not fire when a RTP packet with an
220// unhandled payload type is received.
221TEST(RtpTransportTest, DontSignalUnhandledRtpPayloadType) {
222 RtpTransport transport(kMuxDisabled);
223 SignalPacketReceivedCounter observer(&transport);
224 rtc::FakePacketTransport fake_rtp("fake_rtp");
225 fake_rtp.SetDestination(&fake_rtp, true);
226 transport.SetRtpPacketTransport(&fake_rtp);
227
228 const rtc::PacketOptions options;
229 const int flags = 0;
230 rtc::Buffer rtp_data(kRtpData, kRtpLen);
231 fake_rtp.SendPacket(rtp_data.data<char>(), kRtpLen, options, flags);
232 EXPECT_EQ(0, observer.rtp_count());
233 EXPECT_EQ(0, observer.rtcp_count());
zstein56162b92017-04-24 16:54:35 -0700234}
235
236} // namespace webrtc