1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * Copyright 2017 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker #include "pc/rtp_transport.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/fake_packet_transport.h"
14*d9f75844SAndroid Build Coastguard Worker #include "pc/test/rtp_transport_test_util.h"
15*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/buffer.h"
16*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/containers/flat_set.h"
17*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/third_party/sigslot/sigslot.h"
18*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h"
19*d9f75844SAndroid Build Coastguard Worker
20*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
21*d9f75844SAndroid Build Coastguard Worker
22*d9f75844SAndroid Build Coastguard Worker constexpr bool kMuxDisabled = false;
23*d9f75844SAndroid Build Coastguard Worker constexpr bool kMuxEnabled = true;
24*d9f75844SAndroid Build Coastguard Worker constexpr uint16_t kLocalNetId = 1;
25*d9f75844SAndroid Build Coastguard Worker constexpr uint16_t kRemoteNetId = 2;
26*d9f75844SAndroid Build Coastguard Worker constexpr int kLastPacketId = 100;
27*d9f75844SAndroid Build Coastguard Worker constexpr int kTransportOverheadPerPacket = 28; // Ipv4(20) + UDP(8).
28*d9f75844SAndroid Build Coastguard Worker
29*d9f75844SAndroid Build Coastguard Worker class SignalObserver : public sigslot::has_slots<> {
30*d9f75844SAndroid Build Coastguard Worker public:
SignalObserver(RtpTransport * transport)31*d9f75844SAndroid Build Coastguard Worker explicit SignalObserver(RtpTransport* transport) {
32*d9f75844SAndroid Build Coastguard Worker transport_ = transport;
33*d9f75844SAndroid Build Coastguard Worker transport->SignalReadyToSend.connect(this, &SignalObserver::OnReadyToSend);
34*d9f75844SAndroid Build Coastguard Worker transport->SignalNetworkRouteChanged.connect(
35*d9f75844SAndroid Build Coastguard Worker this, &SignalObserver::OnNetworkRouteChanged);
36*d9f75844SAndroid Build Coastguard Worker if (transport->rtp_packet_transport()) {
37*d9f75844SAndroid Build Coastguard Worker transport->rtp_packet_transport()->SignalSentPacket.connect(
38*d9f75844SAndroid Build Coastguard Worker this, &SignalObserver::OnSentPacket);
39*d9f75844SAndroid Build Coastguard Worker }
40*d9f75844SAndroid Build Coastguard Worker
41*d9f75844SAndroid Build Coastguard Worker if (transport->rtcp_packet_transport()) {
42*d9f75844SAndroid Build Coastguard Worker transport->rtcp_packet_transport()->SignalSentPacket.connect(
43*d9f75844SAndroid Build Coastguard Worker this, &SignalObserver::OnSentPacket);
44*d9f75844SAndroid Build Coastguard Worker }
45*d9f75844SAndroid Build Coastguard Worker }
46*d9f75844SAndroid Build Coastguard Worker
ready() const47*d9f75844SAndroid Build Coastguard Worker bool ready() const { return ready_; }
OnReadyToSend(bool ready)48*d9f75844SAndroid Build Coastguard Worker void OnReadyToSend(bool ready) { ready_ = ready; }
49*d9f75844SAndroid Build Coastguard Worker
network_route()50*d9f75844SAndroid Build Coastguard Worker absl::optional<rtc::NetworkRoute> network_route() { return network_route_; }
OnNetworkRouteChanged(absl::optional<rtc::NetworkRoute> network_route)51*d9f75844SAndroid Build Coastguard Worker void OnNetworkRouteChanged(absl::optional<rtc::NetworkRoute> network_route) {
52*d9f75844SAndroid Build Coastguard Worker network_route_ = network_route;
53*d9f75844SAndroid Build Coastguard Worker }
54*d9f75844SAndroid Build Coastguard Worker
OnSentPacket(rtc::PacketTransportInternal * packet_transport,const rtc::SentPacket & sent_packet)55*d9f75844SAndroid Build Coastguard Worker void OnSentPacket(rtc::PacketTransportInternal* packet_transport,
56*d9f75844SAndroid Build Coastguard Worker const rtc::SentPacket& sent_packet) {
57*d9f75844SAndroid Build Coastguard Worker if (packet_transport == transport_->rtp_packet_transport()) {
58*d9f75844SAndroid Build Coastguard Worker rtp_transport_sent_count_++;
59*d9f75844SAndroid Build Coastguard Worker } else {
60*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ(transport_->rtcp_packet_transport(), packet_transport);
61*d9f75844SAndroid Build Coastguard Worker rtcp_transport_sent_count_++;
62*d9f75844SAndroid Build Coastguard Worker }
63*d9f75844SAndroid Build Coastguard Worker }
64*d9f75844SAndroid Build Coastguard Worker
rtp_transport_sent_count()65*d9f75844SAndroid Build Coastguard Worker int rtp_transport_sent_count() { return rtp_transport_sent_count_; }
66*d9f75844SAndroid Build Coastguard Worker
rtcp_transport_sent_count()67*d9f75844SAndroid Build Coastguard Worker int rtcp_transport_sent_count() { return rtcp_transport_sent_count_; }
68*d9f75844SAndroid Build Coastguard Worker
69*d9f75844SAndroid Build Coastguard Worker private:
70*d9f75844SAndroid Build Coastguard Worker int rtp_transport_sent_count_ = 0;
71*d9f75844SAndroid Build Coastguard Worker int rtcp_transport_sent_count_ = 0;
72*d9f75844SAndroid Build Coastguard Worker RtpTransport* transport_ = nullptr;
73*d9f75844SAndroid Build Coastguard Worker bool ready_ = false;
74*d9f75844SAndroid Build Coastguard Worker absl::optional<rtc::NetworkRoute> network_route_;
75*d9f75844SAndroid Build Coastguard Worker };
76*d9f75844SAndroid Build Coastguard Worker
TEST(RtpTransportTest,SettingRtcpAndRtpSignalsReady)77*d9f75844SAndroid Build Coastguard Worker TEST(RtpTransportTest, SettingRtcpAndRtpSignalsReady) {
78*d9f75844SAndroid Build Coastguard Worker RtpTransport transport(kMuxDisabled);
79*d9f75844SAndroid Build Coastguard Worker SignalObserver observer(&transport);
80*d9f75844SAndroid Build Coastguard Worker rtc::FakePacketTransport fake_rtcp("fake_rtcp");
81*d9f75844SAndroid Build Coastguard Worker fake_rtcp.SetWritable(true);
82*d9f75844SAndroid Build Coastguard Worker rtc::FakePacketTransport fake_rtp("fake_rtp");
83*d9f75844SAndroid Build Coastguard Worker fake_rtp.SetWritable(true);
84*d9f75844SAndroid Build Coastguard Worker
85*d9f75844SAndroid Build Coastguard Worker transport.SetRtcpPacketTransport(&fake_rtcp); // rtcp ready
86*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(observer.ready());
87*d9f75844SAndroid Build Coastguard Worker transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
88*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(observer.ready());
89*d9f75844SAndroid Build Coastguard Worker }
90*d9f75844SAndroid Build Coastguard Worker
TEST(RtpTransportTest,SettingRtpAndRtcpSignalsReady)91*d9f75844SAndroid Build Coastguard Worker TEST(RtpTransportTest, SettingRtpAndRtcpSignalsReady) {
92*d9f75844SAndroid Build Coastguard Worker RtpTransport transport(kMuxDisabled);
93*d9f75844SAndroid Build Coastguard Worker SignalObserver observer(&transport);
94*d9f75844SAndroid Build Coastguard Worker rtc::FakePacketTransport fake_rtcp("fake_rtcp");
95*d9f75844SAndroid Build Coastguard Worker fake_rtcp.SetWritable(true);
96*d9f75844SAndroid Build Coastguard Worker rtc::FakePacketTransport fake_rtp("fake_rtp");
97*d9f75844SAndroid Build Coastguard Worker fake_rtp.SetWritable(true);
98*d9f75844SAndroid Build Coastguard Worker
99*d9f75844SAndroid Build Coastguard Worker transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
100*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(observer.ready());
101*d9f75844SAndroid Build Coastguard Worker transport.SetRtcpPacketTransport(&fake_rtcp); // rtcp ready
102*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(observer.ready());
103*d9f75844SAndroid Build Coastguard Worker }
104*d9f75844SAndroid Build Coastguard Worker
TEST(RtpTransportTest,SettingRtpWithRtcpMuxEnabledSignalsReady)105*d9f75844SAndroid Build Coastguard Worker TEST(RtpTransportTest, SettingRtpWithRtcpMuxEnabledSignalsReady) {
106*d9f75844SAndroid Build Coastguard Worker RtpTransport transport(kMuxEnabled);
107*d9f75844SAndroid Build Coastguard Worker SignalObserver observer(&transport);
108*d9f75844SAndroid Build Coastguard Worker rtc::FakePacketTransport fake_rtp("fake_rtp");
109*d9f75844SAndroid Build Coastguard Worker fake_rtp.SetWritable(true);
110*d9f75844SAndroid Build Coastguard Worker
111*d9f75844SAndroid Build Coastguard Worker transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
112*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(observer.ready());
113*d9f75844SAndroid Build Coastguard Worker }
114*d9f75844SAndroid Build Coastguard Worker
TEST(RtpTransportTest,DisablingRtcpMuxSignalsNotReady)115*d9f75844SAndroid Build Coastguard Worker TEST(RtpTransportTest, DisablingRtcpMuxSignalsNotReady) {
116*d9f75844SAndroid Build Coastguard Worker RtpTransport transport(kMuxEnabled);
117*d9f75844SAndroid Build Coastguard Worker SignalObserver observer(&transport);
118*d9f75844SAndroid Build Coastguard Worker rtc::FakePacketTransport fake_rtp("fake_rtp");
119*d9f75844SAndroid Build Coastguard Worker fake_rtp.SetWritable(true);
120*d9f75844SAndroid Build Coastguard Worker
121*d9f75844SAndroid Build Coastguard Worker transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
122*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(observer.ready());
123*d9f75844SAndroid Build Coastguard Worker
124*d9f75844SAndroid Build Coastguard Worker transport.SetRtcpMuxEnabled(false);
125*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(observer.ready());
126*d9f75844SAndroid Build Coastguard Worker }
127*d9f75844SAndroid Build Coastguard Worker
TEST(RtpTransportTest,EnablingRtcpMuxSignalsReady)128*d9f75844SAndroid Build Coastguard Worker TEST(RtpTransportTest, EnablingRtcpMuxSignalsReady) {
129*d9f75844SAndroid Build Coastguard Worker RtpTransport transport(kMuxDisabled);
130*d9f75844SAndroid Build Coastguard Worker SignalObserver observer(&transport);
131*d9f75844SAndroid Build Coastguard Worker rtc::FakePacketTransport fake_rtp("fake_rtp");
132*d9f75844SAndroid Build Coastguard Worker fake_rtp.SetWritable(true);
133*d9f75844SAndroid Build Coastguard Worker
134*d9f75844SAndroid Build Coastguard Worker transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
135*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(observer.ready());
136*d9f75844SAndroid Build Coastguard Worker
137*d9f75844SAndroid Build Coastguard Worker transport.SetRtcpMuxEnabled(true);
138*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(observer.ready());
139*d9f75844SAndroid Build Coastguard Worker }
140*d9f75844SAndroid Build Coastguard Worker
141*d9f75844SAndroid Build Coastguard Worker // Tests the SignalNetworkRoute is fired when setting a packet transport.
TEST(RtpTransportTest,SetRtpTransportWithNetworkRouteChanged)142*d9f75844SAndroid Build Coastguard Worker TEST(RtpTransportTest, SetRtpTransportWithNetworkRouteChanged) {
143*d9f75844SAndroid Build Coastguard Worker RtpTransport transport(kMuxDisabled);
144*d9f75844SAndroid Build Coastguard Worker SignalObserver observer(&transport);
145*d9f75844SAndroid Build Coastguard Worker rtc::FakePacketTransport fake_rtp("fake_rtp");
146*d9f75844SAndroid Build Coastguard Worker
147*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(observer.network_route());
148*d9f75844SAndroid Build Coastguard Worker
149*d9f75844SAndroid Build Coastguard Worker rtc::NetworkRoute network_route;
150*d9f75844SAndroid Build Coastguard Worker // Set a non-null RTP transport with a new network route.
151*d9f75844SAndroid Build Coastguard Worker network_route.connected = true;
152*d9f75844SAndroid Build Coastguard Worker network_route.local = rtc::RouteEndpoint::CreateWithNetworkId(kLocalNetId);
153*d9f75844SAndroid Build Coastguard Worker network_route.remote = rtc::RouteEndpoint::CreateWithNetworkId(kRemoteNetId);
154*d9f75844SAndroid Build Coastguard Worker network_route.last_sent_packet_id = kLastPacketId;
155*d9f75844SAndroid Build Coastguard Worker network_route.packet_overhead = kTransportOverheadPerPacket;
156*d9f75844SAndroid Build Coastguard Worker fake_rtp.SetNetworkRoute(absl::optional<rtc::NetworkRoute>(network_route));
157*d9f75844SAndroid Build Coastguard Worker transport.SetRtpPacketTransport(&fake_rtp);
158*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(observer.network_route());
159*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(observer.network_route()->connected);
160*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kLocalNetId, observer.network_route()->local.network_id());
161*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kRemoteNetId, observer.network_route()->remote.network_id());
162*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kTransportOverheadPerPacket,
163*d9f75844SAndroid Build Coastguard Worker observer.network_route()->packet_overhead);
164*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kLastPacketId, observer.network_route()->last_sent_packet_id);
165*d9f75844SAndroid Build Coastguard Worker
166*d9f75844SAndroid Build Coastguard Worker // Set a null RTP transport.
167*d9f75844SAndroid Build Coastguard Worker transport.SetRtpPacketTransport(nullptr);
168*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(observer.network_route());
169*d9f75844SAndroid Build Coastguard Worker }
170*d9f75844SAndroid Build Coastguard Worker
TEST(RtpTransportTest,SetRtcpTransportWithNetworkRouteChanged)171*d9f75844SAndroid Build Coastguard Worker TEST(RtpTransportTest, SetRtcpTransportWithNetworkRouteChanged) {
172*d9f75844SAndroid Build Coastguard Worker RtpTransport transport(kMuxDisabled);
173*d9f75844SAndroid Build Coastguard Worker SignalObserver observer(&transport);
174*d9f75844SAndroid Build Coastguard Worker rtc::FakePacketTransport fake_rtcp("fake_rtcp");
175*d9f75844SAndroid Build Coastguard Worker
176*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(observer.network_route());
177*d9f75844SAndroid Build Coastguard Worker
178*d9f75844SAndroid Build Coastguard Worker rtc::NetworkRoute network_route;
179*d9f75844SAndroid Build Coastguard Worker // Set a non-null RTCP transport with a new network route.
180*d9f75844SAndroid Build Coastguard Worker network_route.connected = true;
181*d9f75844SAndroid Build Coastguard Worker network_route.local = rtc::RouteEndpoint::CreateWithNetworkId(kLocalNetId);
182*d9f75844SAndroid Build Coastguard Worker network_route.remote = rtc::RouteEndpoint::CreateWithNetworkId(kRemoteNetId);
183*d9f75844SAndroid Build Coastguard Worker network_route.last_sent_packet_id = kLastPacketId;
184*d9f75844SAndroid Build Coastguard Worker network_route.packet_overhead = kTransportOverheadPerPacket;
185*d9f75844SAndroid Build Coastguard Worker fake_rtcp.SetNetworkRoute(absl::optional<rtc::NetworkRoute>(network_route));
186*d9f75844SAndroid Build Coastguard Worker transport.SetRtcpPacketTransport(&fake_rtcp);
187*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(observer.network_route());
188*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(observer.network_route()->connected);
189*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kLocalNetId, observer.network_route()->local.network_id());
190*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kRemoteNetId, observer.network_route()->remote.network_id());
191*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kTransportOverheadPerPacket,
192*d9f75844SAndroid Build Coastguard Worker observer.network_route()->packet_overhead);
193*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kLastPacketId, observer.network_route()->last_sent_packet_id);
194*d9f75844SAndroid Build Coastguard Worker
195*d9f75844SAndroid Build Coastguard Worker // Set a null RTCP transport.
196*d9f75844SAndroid Build Coastguard Worker transport.SetRtcpPacketTransport(nullptr);
197*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(observer.network_route());
198*d9f75844SAndroid Build Coastguard Worker }
199*d9f75844SAndroid Build Coastguard Worker
200*d9f75844SAndroid Build Coastguard Worker // Test that RTCP packets are sent over correct transport based on the RTCP-mux
201*d9f75844SAndroid Build Coastguard Worker // status.
TEST(RtpTransportTest,RtcpPacketSentOverCorrectTransport)202*d9f75844SAndroid Build Coastguard Worker TEST(RtpTransportTest, RtcpPacketSentOverCorrectTransport) {
203*d9f75844SAndroid Build Coastguard Worker // If the RTCP-mux is not enabled, RTCP packets are expected to be sent over
204*d9f75844SAndroid Build Coastguard Worker // the RtcpPacketTransport.
205*d9f75844SAndroid Build Coastguard Worker RtpTransport transport(kMuxDisabled);
206*d9f75844SAndroid Build Coastguard Worker rtc::FakePacketTransport fake_rtcp("fake_rtcp");
207*d9f75844SAndroid Build Coastguard Worker rtc::FakePacketTransport fake_rtp("fake_rtp");
208*d9f75844SAndroid Build Coastguard Worker transport.SetRtcpPacketTransport(&fake_rtcp); // rtcp ready
209*d9f75844SAndroid Build Coastguard Worker transport.SetRtpPacketTransport(&fake_rtp); // rtp ready
210*d9f75844SAndroid Build Coastguard Worker SignalObserver observer(&transport);
211*d9f75844SAndroid Build Coastguard Worker
212*d9f75844SAndroid Build Coastguard Worker fake_rtp.SetDestination(&fake_rtp, true);
213*d9f75844SAndroid Build Coastguard Worker fake_rtcp.SetDestination(&fake_rtcp, true);
214*d9f75844SAndroid Build Coastguard Worker
215*d9f75844SAndroid Build Coastguard Worker rtc::CopyOnWriteBuffer packet;
216*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(transport.SendRtcpPacket(&packet, rtc::PacketOptions(), 0));
217*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1, observer.rtcp_transport_sent_count());
218*d9f75844SAndroid Build Coastguard Worker
219*d9f75844SAndroid Build Coastguard Worker // The RTCP packets are expected to be sent over RtpPacketTransport if
220*d9f75844SAndroid Build Coastguard Worker // RTCP-mux is enabled.
221*d9f75844SAndroid Build Coastguard Worker transport.SetRtcpMuxEnabled(true);
222*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(transport.SendRtcpPacket(&packet, rtc::PacketOptions(), 0));
223*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1, observer.rtp_transport_sent_count());
224*d9f75844SAndroid Build Coastguard Worker }
225*d9f75844SAndroid Build Coastguard Worker
TEST(RtpTransportTest,ChangingReadyToSendStateOnlySignalsWhenChanged)226*d9f75844SAndroid Build Coastguard Worker TEST(RtpTransportTest, ChangingReadyToSendStateOnlySignalsWhenChanged) {
227*d9f75844SAndroid Build Coastguard Worker RtpTransport transport(kMuxEnabled);
228*d9f75844SAndroid Build Coastguard Worker TransportObserver observer(&transport);
229*d9f75844SAndroid Build Coastguard Worker rtc::FakePacketTransport fake_rtp("fake_rtp");
230*d9f75844SAndroid Build Coastguard Worker fake_rtp.SetWritable(true);
231*d9f75844SAndroid Build Coastguard Worker
232*d9f75844SAndroid Build Coastguard Worker // State changes, so we should signal.
233*d9f75844SAndroid Build Coastguard Worker transport.SetRtpPacketTransport(&fake_rtp);
234*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(observer.ready_to_send_signal_count(), 1);
235*d9f75844SAndroid Build Coastguard Worker
236*d9f75844SAndroid Build Coastguard Worker // State does not change, so we should not signal.
237*d9f75844SAndroid Build Coastguard Worker transport.SetRtpPacketTransport(&fake_rtp);
238*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(observer.ready_to_send_signal_count(), 1);
239*d9f75844SAndroid Build Coastguard Worker
240*d9f75844SAndroid Build Coastguard Worker // State does not change, so we should not signal.
241*d9f75844SAndroid Build Coastguard Worker transport.SetRtcpMuxEnabled(true);
242*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(observer.ready_to_send_signal_count(), 1);
243*d9f75844SAndroid Build Coastguard Worker
244*d9f75844SAndroid Build Coastguard Worker // State changes, so we should signal.
245*d9f75844SAndroid Build Coastguard Worker transport.SetRtcpMuxEnabled(false);
246*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(observer.ready_to_send_signal_count(), 2);
247*d9f75844SAndroid Build Coastguard Worker }
248*d9f75844SAndroid Build Coastguard Worker
249*d9f75844SAndroid Build Coastguard Worker // Test that SignalPacketReceived fires with rtcp=true when a RTCP packet is
250*d9f75844SAndroid Build Coastguard Worker // received.
TEST(RtpTransportTest,SignalDemuxedRtcp)251*d9f75844SAndroid Build Coastguard Worker TEST(RtpTransportTest, SignalDemuxedRtcp) {
252*d9f75844SAndroid Build Coastguard Worker RtpTransport transport(kMuxDisabled);
253*d9f75844SAndroid Build Coastguard Worker rtc::FakePacketTransport fake_rtp("fake_rtp");
254*d9f75844SAndroid Build Coastguard Worker fake_rtp.SetDestination(&fake_rtp, true);
255*d9f75844SAndroid Build Coastguard Worker transport.SetRtpPacketTransport(&fake_rtp);
256*d9f75844SAndroid Build Coastguard Worker TransportObserver observer(&transport);
257*d9f75844SAndroid Build Coastguard Worker
258*d9f75844SAndroid Build Coastguard Worker // An rtcp packet.
259*d9f75844SAndroid Build Coastguard Worker const unsigned char data[] = {0x80, 73, 0, 0};
260*d9f75844SAndroid Build Coastguard Worker const int len = 4;
261*d9f75844SAndroid Build Coastguard Worker const rtc::PacketOptions options;
262*d9f75844SAndroid Build Coastguard Worker const int flags = 0;
263*d9f75844SAndroid Build Coastguard Worker fake_rtp.SendPacket(reinterpret_cast<const char*>(data), len, options, flags);
264*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, observer.rtp_count());
265*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1, observer.rtcp_count());
266*d9f75844SAndroid Build Coastguard Worker }
267*d9f75844SAndroid Build Coastguard Worker
268*d9f75844SAndroid Build Coastguard Worker static const unsigned char kRtpData[] = {0x80, 0x11, 0, 0, 0, 0,
269*d9f75844SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0};
270*d9f75844SAndroid Build Coastguard Worker static const int kRtpLen = 12;
271*d9f75844SAndroid Build Coastguard Worker
272*d9f75844SAndroid Build Coastguard Worker // Test that SignalPacketReceived fires with rtcp=false when a RTP packet with a
273*d9f75844SAndroid Build Coastguard Worker // handled payload type is received.
TEST(RtpTransportTest,SignalHandledRtpPayloadType)274*d9f75844SAndroid Build Coastguard Worker TEST(RtpTransportTest, SignalHandledRtpPayloadType) {
275*d9f75844SAndroid Build Coastguard Worker RtpTransport transport(kMuxDisabled);
276*d9f75844SAndroid Build Coastguard Worker rtc::FakePacketTransport fake_rtp("fake_rtp");
277*d9f75844SAndroid Build Coastguard Worker fake_rtp.SetDestination(&fake_rtp, true);
278*d9f75844SAndroid Build Coastguard Worker transport.SetRtpPacketTransport(&fake_rtp);
279*d9f75844SAndroid Build Coastguard Worker TransportObserver observer(&transport);
280*d9f75844SAndroid Build Coastguard Worker RtpDemuxerCriteria demuxer_criteria;
281*d9f75844SAndroid Build Coastguard Worker // Add a handled payload type.
282*d9f75844SAndroid Build Coastguard Worker demuxer_criteria.payload_types().insert(0x11);
283*d9f75844SAndroid Build Coastguard Worker transport.RegisterRtpDemuxerSink(demuxer_criteria, &observer);
284*d9f75844SAndroid Build Coastguard Worker
285*d9f75844SAndroid Build Coastguard Worker // An rtp packet.
286*d9f75844SAndroid Build Coastguard Worker const rtc::PacketOptions options;
287*d9f75844SAndroid Build Coastguard Worker const int flags = 0;
288*d9f75844SAndroid Build Coastguard Worker rtc::Buffer rtp_data(kRtpData, kRtpLen);
289*d9f75844SAndroid Build Coastguard Worker fake_rtp.SendPacket(rtp_data.data<char>(), kRtpLen, options, flags);
290*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1, observer.rtp_count());
291*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, observer.rtcp_count());
292*d9f75844SAndroid Build Coastguard Worker // Remove the sink before destroying the transport.
293*d9f75844SAndroid Build Coastguard Worker transport.UnregisterRtpDemuxerSink(&observer);
294*d9f75844SAndroid Build Coastguard Worker }
295*d9f75844SAndroid Build Coastguard Worker
296*d9f75844SAndroid Build Coastguard Worker // Test that SignalPacketReceived does not fire when a RTP packet with an
297*d9f75844SAndroid Build Coastguard Worker // unhandled payload type is received.
TEST(RtpTransportTest,DontSignalUnhandledRtpPayloadType)298*d9f75844SAndroid Build Coastguard Worker TEST(RtpTransportTest, DontSignalUnhandledRtpPayloadType) {
299*d9f75844SAndroid Build Coastguard Worker RtpTransport transport(kMuxDisabled);
300*d9f75844SAndroid Build Coastguard Worker rtc::FakePacketTransport fake_rtp("fake_rtp");
301*d9f75844SAndroid Build Coastguard Worker fake_rtp.SetDestination(&fake_rtp, true);
302*d9f75844SAndroid Build Coastguard Worker transport.SetRtpPacketTransport(&fake_rtp);
303*d9f75844SAndroid Build Coastguard Worker TransportObserver observer(&transport);
304*d9f75844SAndroid Build Coastguard Worker RtpDemuxerCriteria demuxer_criteria;
305*d9f75844SAndroid Build Coastguard Worker // Add an unhandled payload type.
306*d9f75844SAndroid Build Coastguard Worker demuxer_criteria.payload_types().insert(0x12);
307*d9f75844SAndroid Build Coastguard Worker transport.RegisterRtpDemuxerSink(demuxer_criteria, &observer);
308*d9f75844SAndroid Build Coastguard Worker
309*d9f75844SAndroid Build Coastguard Worker const rtc::PacketOptions options;
310*d9f75844SAndroid Build Coastguard Worker const int flags = 0;
311*d9f75844SAndroid Build Coastguard Worker rtc::Buffer rtp_data(kRtpData, kRtpLen);
312*d9f75844SAndroid Build Coastguard Worker fake_rtp.SendPacket(rtp_data.data<char>(), kRtpLen, options, flags);
313*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, observer.rtp_count());
314*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, observer.rtcp_count());
315*d9f75844SAndroid Build Coastguard Worker // Remove the sink before destroying the transport.
316*d9f75844SAndroid Build Coastguard Worker transport.UnregisterRtpDemuxerSink(&observer);
317*d9f75844SAndroid Build Coastguard Worker }
318*d9f75844SAndroid Build Coastguard Worker
319*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc
320