blob: 77512d9929a2b8d85b217511eeb6bcd12254d665 [file] [log] [blame]
Bjorn A Mellem44bd71c2019-05-28 15:25:38 -07001/*
2 * Copyright 2019 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 "pc/composite_rtp_transport.h"
12
13#include <memory>
14
15#include "absl/memory/memory.h"
16#include "modules/rtp_rtcp/source/rtp_packet_received.h"
17#include "p2p/base/fake_packet_transport.h"
18#include "pc/rtp_transport.h"
19#include "test/gtest.h"
20
21namespace webrtc {
22namespace {
23
24constexpr char kTransportName[] = "test-transport";
25constexpr char kRtcpTransportName[] = "test-transport-rtcp";
26constexpr uint8_t kRtpPayloadType = 100;
27
28constexpr uint8_t kRtcpPacket[] = {0x80, 73, 0, 0};
29constexpr uint8_t kRtpPacket[] = {0x80, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
30
31class CompositeRtpTransportTest : public ::testing::Test,
32 public sigslot::has_slots<>,
33 public RtpPacketSinkInterface {
34 public:
35 CompositeRtpTransportTest()
36 : packet_transport_1_(
37 absl::make_unique<rtc::FakePacketTransport>(kTransportName)),
38 packet_transport_2_(
39 absl::make_unique<rtc::FakePacketTransport>(kTransportName)),
40 rtcp_transport_1_(
41 absl::make_unique<rtc::FakePacketTransport>(kRtcpTransportName)),
42 rtcp_transport_2_(
43 absl::make_unique<rtc::FakePacketTransport>(kRtcpTransportName)) {}
44
45 void SetupRtpTransports(bool rtcp_mux) {
46 transport_1_ = absl::make_unique<RtpTransport>(rtcp_mux);
47 transport_2_ = absl::make_unique<RtpTransport>(rtcp_mux);
48
49 transport_1_->SetRtpPacketTransport(packet_transport_1_.get());
50 transport_2_->SetRtpPacketTransport(packet_transport_2_.get());
51 if (!rtcp_mux) {
52 transport_1_->SetRtcpPacketTransport(rtcp_transport_1_.get());
53 transport_2_->SetRtcpPacketTransport(rtcp_transport_2_.get());
54 }
55
56 composite_ = absl::make_unique<CompositeRtpTransport>(
57 std::vector<RtpTransportInternal*>{transport_1_.get(),
58 transport_2_.get()});
59
60 composite_->SignalReadyToSend.connect(
61 this, &CompositeRtpTransportTest::OnReadyToSend);
62 composite_->SignalWritableState.connect(
63 this, &CompositeRtpTransportTest::OnWritableState);
64 composite_->SignalSentPacket.connect(
65 this, &CompositeRtpTransportTest::OnSentPacket);
66 composite_->SignalNetworkRouteChanged.connect(
67 this, &CompositeRtpTransportTest::OnNetworkRouteChanged);
68 composite_->SignalRtcpPacketReceived.connect(
69 this, &CompositeRtpTransportTest::OnRtcpPacketReceived);
70
71 RtpDemuxerCriteria criteria;
72 criteria.payload_types.insert(kRtpPayloadType);
73 composite_->RegisterRtpDemuxerSink(criteria, this);
74 }
75
76 void TearDown() override { composite_->UnregisterRtpDemuxerSink(this); }
77
78 void OnReadyToSend(bool ready) { ++ready_to_send_count_; }
79 void OnWritableState(bool writable) { ++writable_state_count_; }
80 void OnSentPacket(const rtc::SentPacket& packet) { ++sent_packet_count_; }
81 void OnNetworkRouteChanged(absl::optional<rtc::NetworkRoute> route) {
82 ++network_route_count_;
83 last_network_route_ = route;
84 }
85 void OnRtcpPacketReceived(rtc::CopyOnWriteBuffer* buffer,
86 int64_t packet_time_us) {
87 ++rtcp_packet_count_;
88 last_packet_ = *buffer;
89 }
90 void OnRtpPacket(const RtpPacketReceived& packet) {
91 ++rtp_packet_count_;
92 last_packet_ = packet.Buffer();
93 }
94
95 protected:
96 std::unique_ptr<rtc::FakePacketTransport> packet_transport_1_;
97 std::unique_ptr<rtc::FakePacketTransport> packet_transport_2_;
98 std::unique_ptr<rtc::FakePacketTransport> rtcp_transport_1_;
99 std::unique_ptr<rtc::FakePacketTransport> rtcp_transport_2_;
100 std::unique_ptr<RtpTransport> transport_1_;
101 std::unique_ptr<RtpTransport> transport_2_;
102 std::unique_ptr<CompositeRtpTransport> composite_;
103
104 int ready_to_send_count_ = 0;
105 int writable_state_count_ = 0;
106 int sent_packet_count_ = 0;
107 int network_route_count_ = 0;
108 int rtcp_packet_count_ = 0;
109 int rtp_packet_count_ = 0;
110
111 absl::optional<rtc::NetworkRoute> last_network_route_;
112 rtc::CopyOnWriteBuffer last_packet_;
113};
114
115TEST_F(CompositeRtpTransportTest, EnableRtcpMux) {
116 SetupRtpTransports(/*rtcp_mux=*/false);
117 EXPECT_FALSE(composite_->rtcp_mux_enabled());
118 EXPECT_FALSE(transport_1_->rtcp_mux_enabled());
119 EXPECT_FALSE(transport_2_->rtcp_mux_enabled());
120
121 composite_->SetRtcpMuxEnabled(true);
122 EXPECT_TRUE(composite_->rtcp_mux_enabled());
123 EXPECT_TRUE(transport_1_->rtcp_mux_enabled());
124 EXPECT_TRUE(transport_2_->rtcp_mux_enabled());
125}
126
127TEST_F(CompositeRtpTransportTest, DisableRtcpMux) {
128 SetupRtpTransports(/*rtcp_mux=*/true);
129 EXPECT_TRUE(composite_->rtcp_mux_enabled());
130 EXPECT_TRUE(transport_1_->rtcp_mux_enabled());
131 EXPECT_TRUE(transport_2_->rtcp_mux_enabled());
132
133 // If the component transports didn't have an RTCP transport before, they need
134 // to be set independently before disabling RTCP mux. There's no other sane
135 // way to do this, as the interface only allows sending a single RTCP
136 // transport, and we need one for each component.
137 transport_1_->SetRtcpPacketTransport(rtcp_transport_1_.get());
138 transport_2_->SetRtcpPacketTransport(rtcp_transport_2_.get());
139
140 composite_->SetRtcpMuxEnabled(false);
141 EXPECT_FALSE(composite_->rtcp_mux_enabled());
142 EXPECT_FALSE(transport_1_->rtcp_mux_enabled());
143 EXPECT_FALSE(transport_2_->rtcp_mux_enabled());
144}
145
146TEST_F(CompositeRtpTransportTest, SetRtpOption) {
147 SetupRtpTransports(/*rtcp_mux=*/true);
148 EXPECT_EQ(0, composite_->SetRtpOption(rtc::Socket::OPT_DSCP, 2));
149
150 int value = 0;
151 EXPECT_TRUE(packet_transport_1_->GetOption(rtc::Socket::OPT_DSCP, &value));
152 EXPECT_EQ(value, 2);
153
154 EXPECT_TRUE(packet_transport_2_->GetOption(rtc::Socket::OPT_DSCP, &value));
155 EXPECT_EQ(value, 2);
156}
157
158TEST_F(CompositeRtpTransportTest, SetRtcpOption) {
159 SetupRtpTransports(/*rtcp_mux=*/false);
160 EXPECT_EQ(0, composite_->SetRtcpOption(rtc::Socket::OPT_DSCP, 2));
161
162 int value = 0;
163 EXPECT_TRUE(rtcp_transport_1_->GetOption(rtc::Socket::OPT_DSCP, &value));
164 EXPECT_EQ(value, 2);
165
166 EXPECT_TRUE(rtcp_transport_2_->GetOption(rtc::Socket::OPT_DSCP, &value));
167 EXPECT_EQ(value, 2);
168}
169
170TEST_F(CompositeRtpTransportTest, NeverWritableWithoutSendTransport) {
171 SetupRtpTransports(/*rtcp_mux=*/true);
172
173 packet_transport_1_->SetWritable(true);
174 packet_transport_2_->SetWritable(true);
175
176 EXPECT_FALSE(composite_->IsWritable(false));
177 EXPECT_FALSE(composite_->IsWritable(true));
178 EXPECT_FALSE(composite_->IsReadyToSend());
179 EXPECT_EQ(0, ready_to_send_count_);
180 EXPECT_EQ(0, writable_state_count_);
181}
182
183TEST_F(CompositeRtpTransportTest, WritableWhenSendTransportBecomesWritable) {
184 SetupRtpTransports(/*rtcp_mux=*/true);
185
186 composite_->SetSendTransport(transport_1_.get());
187
188 EXPECT_FALSE(composite_->IsWritable(false));
189 EXPECT_FALSE(composite_->IsWritable(true));
190 EXPECT_FALSE(composite_->IsReadyToSend());
191 EXPECT_EQ(0, ready_to_send_count_);
192 EXPECT_EQ(1, writable_state_count_);
193
194 packet_transport_2_->SetWritable(true);
195
196 EXPECT_FALSE(composite_->IsWritable(false));
197 EXPECT_FALSE(composite_->IsWritable(true));
198 EXPECT_FALSE(composite_->IsReadyToSend());
199 EXPECT_EQ(0, ready_to_send_count_);
200 EXPECT_EQ(1, writable_state_count_);
201
202 packet_transport_1_->SetWritable(true);
203
204 EXPECT_TRUE(composite_->IsWritable(false));
205 EXPECT_TRUE(composite_->IsWritable(true));
206 EXPECT_TRUE(composite_->IsReadyToSend());
207 EXPECT_EQ(1, ready_to_send_count_);
208 EXPECT_EQ(2, writable_state_count_);
209}
210
211TEST_F(CompositeRtpTransportTest, SendTransportAlreadyWritable) {
212 SetupRtpTransports(/*rtcp_mux=*/true);
213 packet_transport_1_->SetWritable(true);
214
215 composite_->SetSendTransport(transport_1_.get());
216
217 EXPECT_TRUE(composite_->IsWritable(false));
218 EXPECT_TRUE(composite_->IsWritable(true));
219 EXPECT_TRUE(composite_->IsReadyToSend());
220 EXPECT_EQ(1, ready_to_send_count_);
221 EXPECT_EQ(1, writable_state_count_);
222}
223
224TEST_F(CompositeRtpTransportTest, IsSrtpActive) {
225 SetupRtpTransports(/*rtcp_mux=*/true);
226 EXPECT_FALSE(composite_->IsSrtpActive());
227}
228
229TEST_F(CompositeRtpTransportTest, NetworkRouteChange) {
230 SetupRtpTransports(/*rtcp_mux=*/true);
231
232 rtc::NetworkRoute route;
233 route.local_network_id = 7;
234 packet_transport_1_->SetNetworkRoute(route);
235
236 EXPECT_EQ(1, network_route_count_);
237 EXPECT_EQ(7, last_network_route_->local_network_id);
238
239 route.local_network_id = 8;
240 packet_transport_2_->SetNetworkRoute(route);
241
242 EXPECT_EQ(2, network_route_count_);
243 EXPECT_EQ(8, last_network_route_->local_network_id);
244}
245
Bjorn A Mellemc85ebbe2019-06-07 10:28:06 -0700246TEST_F(CompositeRtpTransportTest, RemoveTransport) {
247 SetupRtpTransports(/*rtcp_mux=*/true);
248
249 composite_->RemoveTransport(transport_1_.get());
250
251 // Check that signals are disconnected.
252 rtc::NetworkRoute route;
253 route.local_network_id = 7;
254 packet_transport_1_->SetNetworkRoute(route);
255
256 EXPECT_EQ(0, network_route_count_);
257}
258
Bjorn A Mellem44bd71c2019-05-28 15:25:38 -0700259TEST_F(CompositeRtpTransportTest, SendRtcpBeforeSendTransportSet) {
260 SetupRtpTransports(/*rtcp_mux=*/true);
261
262 rtc::FakePacketTransport remote("remote");
263 remote.SetDestination(packet_transport_1_.get(), false);
264
265 rtc::CopyOnWriteBuffer packet(kRtcpPacket);
266 EXPECT_FALSE(composite_->SendRtcpPacket(&packet, rtc::PacketOptions(), 0));
267 EXPECT_EQ(0, sent_packet_count_);
268}
269
270TEST_F(CompositeRtpTransportTest, SendRtcpOn1) {
271 SetupRtpTransports(/*rtcp_mux=*/true);
272
273 rtc::FakePacketTransport remote("remote");
274 remote.SetDestination(packet_transport_1_.get(), false);
275 composite_->SetSendTransport(transport_1_.get());
276
277 rtc::CopyOnWriteBuffer packet(kRtcpPacket);
278 EXPECT_TRUE(composite_->SendRtcpPacket(&packet, rtc::PacketOptions(), 0));
279 EXPECT_EQ(1, sent_packet_count_);
280 EXPECT_EQ(packet, *packet_transport_1_->last_sent_packet());
281}
282
283TEST_F(CompositeRtpTransportTest, SendRtcpOn2) {
284 SetupRtpTransports(/*rtcp_mux=*/true);
285
286 rtc::FakePacketTransport remote("remote");
287 remote.SetDestination(packet_transport_2_.get(), false);
288 composite_->SetSendTransport(transport_2_.get());
289
290 rtc::CopyOnWriteBuffer packet(kRtcpPacket);
291 EXPECT_TRUE(composite_->SendRtcpPacket(&packet, rtc::PacketOptions(), 0));
292 EXPECT_EQ(1, sent_packet_count_);
293 EXPECT_EQ(packet, *packet_transport_2_->last_sent_packet());
294}
295
296TEST_F(CompositeRtpTransportTest, SendRtpBeforeSendTransportSet) {
297 SetupRtpTransports(/*rtcp_mux=*/true);
298
299 rtc::FakePacketTransport remote("remote");
300 remote.SetDestination(packet_transport_1_.get(), false);
301
302 rtc::CopyOnWriteBuffer packet(kRtpPacket);
303 EXPECT_FALSE(composite_->SendRtpPacket(&packet, rtc::PacketOptions(), 0));
304 EXPECT_EQ(0, sent_packet_count_);
305}
306
307TEST_F(CompositeRtpTransportTest, SendRtpOn1) {
308 SetupRtpTransports(/*rtcp_mux=*/true);
309
310 rtc::FakePacketTransport remote("remote");
311 remote.SetDestination(packet_transport_1_.get(), false);
312 composite_->SetSendTransport(transport_1_.get());
313
314 rtc::CopyOnWriteBuffer packet(kRtpPacket);
315 EXPECT_TRUE(composite_->SendRtpPacket(&packet, rtc::PacketOptions(), 0));
316 EXPECT_EQ(1, sent_packet_count_);
317 EXPECT_EQ(packet, *packet_transport_1_->last_sent_packet());
318}
319
320TEST_F(CompositeRtpTransportTest, SendRtpOn2) {
321 SetupRtpTransports(/*rtcp_mux=*/true);
322
323 rtc::FakePacketTransport remote("remote");
324 remote.SetDestination(packet_transport_2_.get(), false);
325 composite_->SetSendTransport(transport_2_.get());
326
327 rtc::CopyOnWriteBuffer packet(kRtpPacket);
328 EXPECT_TRUE(composite_->SendRtpPacket(&packet, rtc::PacketOptions(), 0));
329 EXPECT_EQ(1, sent_packet_count_);
330 EXPECT_EQ(packet, *packet_transport_2_->last_sent_packet());
331}
332
333TEST_F(CompositeRtpTransportTest, ReceiveRtcpFrom1) {
334 SetupRtpTransports(/*rtcp_mux=*/true);
335
336 rtc::FakePacketTransport remote("remote");
337 remote.SetDestination(packet_transport_1_.get(), false);
338
339 rtc::CopyOnWriteBuffer packet(kRtcpPacket);
340 remote.SendPacket(packet.cdata<char>(), packet.size(), rtc::PacketOptions(),
341 0);
342
343 EXPECT_EQ(1, rtcp_packet_count_);
344 EXPECT_EQ(packet, last_packet_);
345}
346
347TEST_F(CompositeRtpTransportTest, ReceiveRtcpFrom2) {
348 SetupRtpTransports(/*rtcp_mux=*/true);
349
350 rtc::FakePacketTransport remote("remote");
351 remote.SetDestination(packet_transport_2_.get(), false);
352
353 rtc::CopyOnWriteBuffer packet(kRtcpPacket);
354 remote.SendPacket(packet.cdata<char>(), packet.size(), rtc::PacketOptions(),
355 0);
356
357 EXPECT_EQ(1, rtcp_packet_count_);
358 EXPECT_EQ(packet, last_packet_);
359}
360
361TEST_F(CompositeRtpTransportTest, ReceiveRtpFrom1) {
362 SetupRtpTransports(/*rtcp_mux=*/true);
363
364 rtc::FakePacketTransport remote("remote");
365 remote.SetDestination(packet_transport_1_.get(), false);
366
367 rtc::CopyOnWriteBuffer packet(kRtpPacket);
368 remote.SendPacket(packet.cdata<char>(), packet.size(), rtc::PacketOptions(),
369 0);
370
371 EXPECT_EQ(1, rtp_packet_count_);
372 EXPECT_EQ(packet, last_packet_);
373}
374
375TEST_F(CompositeRtpTransportTest, ReceiveRtpFrom2) {
376 SetupRtpTransports(/*rtcp_mux=*/true);
377
378 rtc::FakePacketTransport remote("remote");
379 remote.SetDestination(packet_transport_2_.get(), false);
380
381 rtc::CopyOnWriteBuffer packet(kRtpPacket);
382 remote.SendPacket(packet.cdata<char>(), packet.size(), rtc::PacketOptions(),
383 0);
384
385 EXPECT_EQ(1, rtp_packet_count_);
386 EXPECT_EQ(packet, last_packet_);
387}
388
389} // namespace
390} // namespace webrtc