blob: 27c77abcb51578ba9fba51b0fd1363c19722ddd0 [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
zstein56162b92017-04-24 16:54:35 -070013#include "webrtc/p2p/base/fakepackettransport.h"
14#include "webrtc/pc/rtptransport.h"
zstein398c3fd2017-07-19 13:38:02 -070015#include "webrtc/pc/rtptransporttestutil.h"
Edward Lemurc20978e2017-07-06 19:44:34 +020016#include "webrtc/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);
25 RtcpParameters params;
26 transport.SetRtcpParameters(params);
27 params.mux = false;
28 EXPECT_FALSE(transport.SetRtcpParameters(params).ok());
29}
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);
34 RtcpParameters params_with_name;
35 params_with_name.cname = kName;
36 transport.SetRtcpParameters(params_with_name);
37 EXPECT_EQ(transport.GetRtcpParameters().cname, kName);
38
39 RtcpParameters params_without_name;
40 transport.SetRtcpParameters(params_without_name);
41 EXPECT_EQ(transport.GetRtcpParameters().cname, kName);
42}
43
44class SignalObserver : public sigslot::has_slots<> {
45 public:
46 explicit SignalObserver(RtpTransport* transport) {
47 transport->SignalReadyToSend.connect(this, &SignalObserver::OnReadyToSend);
48 }
zstein3dcf0e92017-06-01 13:22:42 -070049 bool ready() const { return ready_; }
zstein56162b92017-04-24 16:54:35 -070050 void OnReadyToSend(bool ready) { ready_ = ready; }
zstein3dcf0e92017-06-01 13:22:42 -070051
52 private:
zstein56162b92017-04-24 16:54:35 -070053 bool ready_ = false;
54};
55
zstein3dcf0e92017-06-01 13:22:42 -070056TEST(RtpTransportTest, SettingRtcpAndRtpSignalsReady) {
zstein56162b92017-04-24 16:54:35 -070057 RtpTransport transport(kMuxDisabled);
58 SignalObserver observer(&transport);
59 rtc::FakePacketTransport fake_rtcp("fake_rtcp");
60 fake_rtcp.SetWritable(true);
61 rtc::FakePacketTransport fake_rtp("fake_rtp");
62 fake_rtp.SetWritable(true);
63
64 transport.SetRtcpPacketTransport(&fake_rtcp); // rtcp ready
zstein3dcf0e92017-06-01 13:22:42 -070065 EXPECT_FALSE(observer.ready());
zstein56162b92017-04-24 16:54:35 -070066 transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
zstein3dcf0e92017-06-01 13:22:42 -070067 EXPECT_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -070068}
69
zstein3dcf0e92017-06-01 13:22:42 -070070TEST(RtpTransportTest, SettingRtpAndRtcpSignalsReady) {
zstein56162b92017-04-24 16:54:35 -070071 RtpTransport transport(kMuxDisabled);
72 SignalObserver observer(&transport);
73 rtc::FakePacketTransport fake_rtcp("fake_rtcp");
74 fake_rtcp.SetWritable(true);
75 rtc::FakePacketTransport fake_rtp("fake_rtp");
76 fake_rtp.SetWritable(true);
77
78 transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
zstein3dcf0e92017-06-01 13:22:42 -070079 EXPECT_FALSE(observer.ready());
zstein56162b92017-04-24 16:54:35 -070080 transport.SetRtcpPacketTransport(&fake_rtcp); // rtcp ready
zstein3dcf0e92017-06-01 13:22:42 -070081 EXPECT_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -070082}
83
zstein3dcf0e92017-06-01 13:22:42 -070084TEST(RtpTransportTest, SettingRtpWithRtcpMuxEnabledSignalsReady) {
zstein56162b92017-04-24 16:54:35 -070085 RtpTransport transport(kMuxEnabled);
86 SignalObserver observer(&transport);
87 rtc::FakePacketTransport fake_rtp("fake_rtp");
88 fake_rtp.SetWritable(true);
89
90 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, DisablingRtcpMuxSignalsNotReady) {
zstein56162b92017-04-24 16:54:35 -070095 RtpTransport transport(kMuxEnabled);
96 SignalObserver observer(&transport);
97 rtc::FakePacketTransport fake_rtp("fake_rtp");
98 fake_rtp.SetWritable(true);
99
100 transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
zstein3dcf0e92017-06-01 13:22:42 -0700101 EXPECT_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700102
103 transport.SetRtcpMuxEnabled(false);
zstein3dcf0e92017-06-01 13:22:42 -0700104 EXPECT_FALSE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700105}
106
zstein3dcf0e92017-06-01 13:22:42 -0700107TEST(RtpTransportTest, EnablingRtcpMuxSignalsReady) {
zstein56162b92017-04-24 16:54:35 -0700108 RtpTransport transport(kMuxDisabled);
109 SignalObserver observer(&transport);
110 rtc::FakePacketTransport fake_rtp("fake_rtp");
111 fake_rtp.SetWritable(true);
112
113 transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
zstein3dcf0e92017-06-01 13:22:42 -0700114 EXPECT_FALSE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700115
116 transport.SetRtcpMuxEnabled(true);
zstein3dcf0e92017-06-01 13:22:42 -0700117 EXPECT_TRUE(observer.ready());
zstein56162b92017-04-24 16:54:35 -0700118}
119
120class SignalCounter : public sigslot::has_slots<> {
121 public:
122 explicit SignalCounter(RtpTransport* transport) {
123 transport->SignalReadyToSend.connect(this, &SignalCounter::OnReadyToSend);
124 }
zstein3dcf0e92017-06-01 13:22:42 -0700125 int count() const { return count_; }
zstein56162b92017-04-24 16:54:35 -0700126 void OnReadyToSend(bool ready) { ++count_; }
zstein3dcf0e92017-06-01 13:22:42 -0700127
128 private:
zstein56162b92017-04-24 16:54:35 -0700129 int count_ = 0;
130};
131
zstein3dcf0e92017-06-01 13:22:42 -0700132TEST(RtpTransportTest, ChangingReadyToSendStateOnlySignalsWhenChanged) {
zstein56162b92017-04-24 16:54:35 -0700133 RtpTransport transport(kMuxEnabled);
134 SignalCounter observer(&transport);
135 rtc::FakePacketTransport fake_rtp("fake_rtp");
136 fake_rtp.SetWritable(true);
137
138 // State changes, so we should signal.
139 transport.SetRtpPacketTransport(&fake_rtp);
zstein3dcf0e92017-06-01 13:22:42 -0700140 EXPECT_EQ(observer.count(), 1);
zstein56162b92017-04-24 16:54:35 -0700141
142 // State does not change, so we should not signal.
143 transport.SetRtpPacketTransport(&fake_rtp);
zstein3dcf0e92017-06-01 13:22:42 -0700144 EXPECT_EQ(observer.count(), 1);
zstein56162b92017-04-24 16:54:35 -0700145
146 // State does not change, so we should not signal.
147 transport.SetRtcpMuxEnabled(true);
zstein3dcf0e92017-06-01 13:22:42 -0700148 EXPECT_EQ(observer.count(), 1);
zstein56162b92017-04-24 16:54:35 -0700149
150 // State changes, so we should signal.
151 transport.SetRtcpMuxEnabled(false);
zstein3dcf0e92017-06-01 13:22:42 -0700152 EXPECT_EQ(observer.count(), 2);
153}
154
zstein3dcf0e92017-06-01 13:22:42 -0700155// Test that SignalPacketReceived fires with rtcp=true when a RTCP packet is
156// received.
157TEST(RtpTransportTest, SignalDemuxedRtcp) {
158 RtpTransport transport(kMuxDisabled);
159 SignalPacketReceivedCounter observer(&transport);
160 rtc::FakePacketTransport fake_rtp("fake_rtp");
161 fake_rtp.SetDestination(&fake_rtp, true);
162 transport.SetRtpPacketTransport(&fake_rtp);
163
164 // An rtcp packet.
165 const char data[] = {0, 73, 0, 0};
166 const int len = 4;
167 const rtc::PacketOptions options;
168 const int flags = 0;
169 fake_rtp.SendPacket(data, len, options, flags);
170 EXPECT_EQ(0, observer.rtp_count());
171 EXPECT_EQ(1, observer.rtcp_count());
172}
173
174static const unsigned char kRtpData[] = {0x80, 0x11, 0, 0, 0, 0,
175 0, 0, 0, 0, 0, 0};
176static const int kRtpLen = 12;
177
178// Test that SignalPacketReceived fires with rtcp=false when a RTP packet with a
179// handled payload type is received.
180TEST(RtpTransportTest, SignalHandledRtpPayloadType) {
181 RtpTransport transport(kMuxDisabled);
182 SignalPacketReceivedCounter observer(&transport);
183 rtc::FakePacketTransport fake_rtp("fake_rtp");
184 fake_rtp.SetDestination(&fake_rtp, true);
185 transport.SetRtpPacketTransport(&fake_rtp);
186 transport.AddHandledPayloadType(0x11);
187
188 // An rtp packet.
189 const rtc::PacketOptions options;
190 const int flags = 0;
191 rtc::Buffer rtp_data(kRtpData, kRtpLen);
192 fake_rtp.SendPacket(rtp_data.data<char>(), kRtpLen, options, flags);
193 EXPECT_EQ(1, observer.rtp_count());
194 EXPECT_EQ(0, observer.rtcp_count());
195}
196
197// Test that SignalPacketReceived does not fire when a RTP packet with an
198// unhandled payload type is received.
199TEST(RtpTransportTest, DontSignalUnhandledRtpPayloadType) {
200 RtpTransport transport(kMuxDisabled);
201 SignalPacketReceivedCounter observer(&transport);
202 rtc::FakePacketTransport fake_rtp("fake_rtp");
203 fake_rtp.SetDestination(&fake_rtp, true);
204 transport.SetRtpPacketTransport(&fake_rtp);
205
206 const rtc::PacketOptions options;
207 const int flags = 0;
208 rtc::Buffer rtp_data(kRtpData, kRtpLen);
209 fake_rtp.SendPacket(rtp_data.data<char>(), kRtpLen, options, flags);
210 EXPECT_EQ(0, observer.rtp_count());
211 EXPECT_EQ(0, observer.rtcp_count());
zstein56162b92017-04-24 16:54:35 -0700212}
213
214} // namespace webrtc