blob: f9f4f205ea522002e55b31bca8fd17d4998cef4d [file] [log] [blame]
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001/*
2 * Copyright 2018 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// This file contains tests for |RtpTransceiver|.
12
Steve Anton10542f22019-01-11 09:11:00 -080013#include "pc/rtp_transceiver.h"
Yves Gerey3e707812018-11-28 16:47:49 +010014
Markus Handell0357b3e2020-03-16 13:40:51 +010015#include <memory>
16
Markus Handell5932fe12020-12-17 22:19:40 +010017#include "absl/types/optional.h"
18#include "api/rtp_parameters.h"
Markus Handell0357b3e2020-03-16 13:40:51 +010019#include "media/base/fake_media_engine.h"
Steve Anton10542f22019-01-11 09:11:00 -080020#include "pc/test/mock_channel_interface.h"
Markus Handell0357b3e2020-03-16 13:40:51 +010021#include "pc/test/mock_rtp_receiver_internal.h"
22#include "pc/test/mock_rtp_sender_internal.h"
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080023#include "test/gmock.h"
Yves Gerey3e707812018-11-28 16:47:49 +010024#include "test/gtest.h"
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080025
Tommi99c8a802021-04-27 15:00:00 +020026using ::testing::_;
Markus Handell0357b3e2020-03-16 13:40:51 +010027using ::testing::ElementsAre;
Markus Handell5932fe12020-12-17 22:19:40 +010028using ::testing::Optional;
Markus Handell755c65d2020-06-24 01:06:10 +020029using ::testing::Property;
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080030using ::testing::Return;
31using ::testing::ReturnRef;
32
33namespace webrtc {
34
35// Checks that a channel cannot be set on a stopped |RtpTransceiver|.
36TEST(RtpTransceiverTest, CannotSetChannelOnStoppedTransceiver) {
Tommi99c8a802021-04-27 15:00:00 +020037 auto cm = cricket::ChannelManager::Create(
38 nullptr, true, rtc::Thread::Current(), rtc::Thread::Current());
39 RtpTransceiver transceiver(cricket::MediaType::MEDIA_TYPE_AUDIO, cm.get());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080040 cricket::MockChannelInterface channel1;
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080041 EXPECT_CALL(channel1, media_type())
42 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
Tommi99c8a802021-04-27 15:00:00 +020043 EXPECT_CALL(channel1, SetFirstPacketReceivedCallback(_));
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080044
45 transceiver.SetChannel(&channel1);
46 EXPECT_EQ(&channel1, transceiver.channel());
47
48 // Stop the transceiver.
Harald Alvestrand6060df52020-08-11 09:54:02 +020049 transceiver.StopInternal();
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080050 EXPECT_EQ(&channel1, transceiver.channel());
51
52 cricket::MockChannelInterface channel2;
53 EXPECT_CALL(channel2, media_type())
54 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
55
56 // Channel can no longer be set, so this call should be a no-op.
57 transceiver.SetChannel(&channel2);
58 EXPECT_EQ(&channel1, transceiver.channel());
59}
60
61// Checks that a channel can be unset on a stopped |RtpTransceiver|
62TEST(RtpTransceiverTest, CanUnsetChannelOnStoppedTransceiver) {
Tommi99c8a802021-04-27 15:00:00 +020063 auto cm = cricket::ChannelManager::Create(
64 nullptr, true, rtc::Thread::Current(), rtc::Thread::Current());
65 RtpTransceiver transceiver(cricket::MediaType::MEDIA_TYPE_VIDEO, cm.get());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080066 cricket::MockChannelInterface channel;
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080067 EXPECT_CALL(channel, media_type())
68 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_VIDEO));
Tommi99c8a802021-04-27 15:00:00 +020069 EXPECT_CALL(channel, SetFirstPacketReceivedCallback(_))
70 .WillRepeatedly(testing::Return());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080071
72 transceiver.SetChannel(&channel);
73 EXPECT_EQ(&channel, transceiver.channel());
74
75 // Stop the transceiver.
Harald Alvestrand6060df52020-08-11 09:54:02 +020076 transceiver.StopInternal();
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080077 EXPECT_EQ(&channel, transceiver.channel());
78
79 // Set the channel to |nullptr|.
80 transceiver.SetChannel(nullptr);
81 EXPECT_EQ(nullptr, transceiver.channel());
82}
83
Harald Alvestrandc75c4282020-08-26 12:17:54 +000084class RtpTransceiverUnifiedPlanTest : public ::testing::Test {
85 public:
86 RtpTransceiverUnifiedPlanTest()
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +020087 : channel_manager_(cricket::ChannelManager::Create(
88 std::make_unique<cricket::FakeMediaEngine>(),
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +020089 false,
90 rtc::Thread::Current(),
91 rtc::Thread::Current())),
Harald Alvestrandc75c4282020-08-26 12:17:54 +000092 transceiver_(RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
93 rtc::Thread::Current(),
Tommi99c8a802021-04-27 15:00:00 +020094 sender_),
Harald Alvestrandc75c4282020-08-26 12:17:54 +000095 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
96 rtc::Thread::Current(),
Tommi99c8a802021-04-27 15:00:00 +020097 receiver_),
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +020098 channel_manager_.get(),
99 channel_manager_->GetSupportedAudioRtpHeaderExtensions(),
Harald Alvestrand280054f2020-11-10 13:12:53 +0000100 /* on_negotiation_needed= */ [] {}) {}
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000101
Tommi99c8a802021-04-27 15:00:00 +0200102 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
103 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
104 EXPECT_CALL(*receiver.get(), media_type())
105 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
106 return receiver;
107 }
108
109 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
110 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
111 EXPECT_CALL(*sender.get(), media_type())
112 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
113 return sender;
114 }
115
116 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
117 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200118 std::unique_ptr<cricket::ChannelManager> channel_manager_;
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000119 RtpTransceiver transceiver_;
120};
121
122// Basic tests for Stop()
123TEST_F(RtpTransceiverUnifiedPlanTest, StopSetsDirection) {
Tommi99c8a802021-04-27 15:00:00 +0200124 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
125 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
126 EXPECT_CALL(*sender_.get(), Stop());
127
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000128 EXPECT_EQ(RtpTransceiverDirection::kInactive, transceiver_.direction());
129 EXPECT_FALSE(transceiver_.current_direction());
130 transceiver_.StopStandard();
131 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_.direction());
132 EXPECT_FALSE(transceiver_.current_direction());
133 transceiver_.StopTransceiverProcedure();
134 EXPECT_TRUE(transceiver_.current_direction());
135 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_.direction());
136 EXPECT_EQ(RtpTransceiverDirection::kStopped,
137 *transceiver_.current_direction());
138}
139
Markus Handell755c65d2020-06-24 01:06:10 +0200140class RtpTransceiverTestForHeaderExtensions : public ::testing::Test {
141 public:
142 RtpTransceiverTestForHeaderExtensions()
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200143 : channel_manager_(cricket::ChannelManager::Create(
144 std::make_unique<cricket::FakeMediaEngine>(),
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200145 false,
146 rtc::Thread::Current(),
147 rtc::Thread::Current())),
Markus Handell755c65d2020-06-24 01:06:10 +0200148 extensions_(
149 {RtpHeaderExtensionCapability("uri1",
150 1,
151 RtpTransceiverDirection::kSendOnly),
152 RtpHeaderExtensionCapability("uri2",
153 2,
154 RtpTransceiverDirection::kRecvOnly),
155 RtpHeaderExtensionCapability(RtpExtension::kMidUri,
156 3,
157 RtpTransceiverDirection::kSendRecv),
158 RtpHeaderExtensionCapability(RtpExtension::kVideoRotationUri,
159 4,
160 RtpTransceiverDirection::kSendRecv)}),
161 transceiver_(RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
162 rtc::Thread::Current(),
Tommi99c8a802021-04-27 15:00:00 +0200163 sender_),
Markus Handell755c65d2020-06-24 01:06:10 +0200164 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
165 rtc::Thread::Current(),
Tommi99c8a802021-04-27 15:00:00 +0200166 receiver_),
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200167 channel_manager_.get(),
Harald Alvestrand280054f2020-11-10 13:12:53 +0000168 extensions_,
169 /* on_negotiation_needed= */ [] {}) {}
Markus Handell755c65d2020-06-24 01:06:10 +0200170
Tommi99c8a802021-04-27 15:00:00 +0200171 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
172 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
173 EXPECT_CALL(*receiver.get(), media_type())
174 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
175 return receiver;
176 }
177
178 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
179 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
180 EXPECT_CALL(*sender.get(), media_type())
181 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
182 return sender;
183 }
184
185 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
186 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
187
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200188 std::unique_ptr<cricket::ChannelManager> channel_manager_;
Markus Handell755c65d2020-06-24 01:06:10 +0200189 std::vector<RtpHeaderExtensionCapability> extensions_;
190 RtpTransceiver transceiver_;
191};
192
193TEST_F(RtpTransceiverTestForHeaderExtensions, OffersChannelManagerList) {
Tommi99c8a802021-04-27 15:00:00 +0200194 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
195 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
196 EXPECT_CALL(*sender_.get(), Stop());
197
Markus Handell755c65d2020-06-24 01:06:10 +0200198 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
199}
200
201TEST_F(RtpTransceiverTestForHeaderExtensions, ModifiesDirection) {
Tommi99c8a802021-04-27 15:00:00 +0200202 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
203 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
204 EXPECT_CALL(*sender_.get(), Stop());
205
Markus Handell755c65d2020-06-24 01:06:10 +0200206 auto modified_extensions = extensions_;
207 modified_extensions[0].direction = RtpTransceiverDirection::kSendOnly;
208 EXPECT_TRUE(
209 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
210 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
211 modified_extensions[0].direction = RtpTransceiverDirection::kRecvOnly;
212 EXPECT_TRUE(
213 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
214 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
215 modified_extensions[0].direction = RtpTransceiverDirection::kSendRecv;
216 EXPECT_TRUE(
217 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
218 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
219 modified_extensions[0].direction = RtpTransceiverDirection::kInactive;
220 EXPECT_TRUE(
221 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
222 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
223}
224
225TEST_F(RtpTransceiverTestForHeaderExtensions, AcceptsStoppedExtension) {
Tommi99c8a802021-04-27 15:00:00 +0200226 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
227 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
228 EXPECT_CALL(*sender_.get(), Stop());
229
Markus Handell755c65d2020-06-24 01:06:10 +0200230 auto modified_extensions = extensions_;
231 modified_extensions[0].direction = RtpTransceiverDirection::kStopped;
232 EXPECT_TRUE(
233 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
234 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
235}
236
237TEST_F(RtpTransceiverTestForHeaderExtensions, RejectsUnsupportedExtension) {
Tommi99c8a802021-04-27 15:00:00 +0200238 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
239 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
240 EXPECT_CALL(*sender_.get(), Stop());
241
Markus Handell755c65d2020-06-24 01:06:10 +0200242 std::vector<RtpHeaderExtensionCapability> modified_extensions(
243 {RtpHeaderExtensionCapability("uri3", 1,
244 RtpTransceiverDirection::kSendRecv)});
245 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handellc17bca72021-01-14 17:08:01 +0100246 Property(&RTCError::type, RTCErrorType::UNSUPPORTED_PARAMETER));
Markus Handell755c65d2020-06-24 01:06:10 +0200247 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
248}
249
250TEST_F(RtpTransceiverTestForHeaderExtensions,
251 RejectsStoppedMandatoryExtensions) {
Tommi99c8a802021-04-27 15:00:00 +0200252 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
253 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
254 EXPECT_CALL(*sender_.get(), Stop());
255
Markus Handell755c65d2020-06-24 01:06:10 +0200256 std::vector<RtpHeaderExtensionCapability> modified_extensions = extensions_;
257 // Attempting to stop the mandatory MID extension.
258 modified_extensions[2].direction = RtpTransceiverDirection::kStopped;
259 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
260 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
261 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
262 modified_extensions = extensions_;
263 // Attempting to stop the mandatory video orientation extension.
264 modified_extensions[3].direction = RtpTransceiverDirection::kStopped;
265 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
266 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
267 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
Markus Handell0357b3e2020-03-16 13:40:51 +0100268}
269
Markus Handell5932fe12020-12-17 22:19:40 +0100270TEST_F(RtpTransceiverTestForHeaderExtensions,
271 NoNegotiatedHdrExtsWithoutChannel) {
Tommi99c8a802021-04-27 15:00:00 +0200272 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
273 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
274 EXPECT_CALL(*sender_.get(), Stop());
Markus Handell5932fe12020-12-17 22:19:40 +0100275 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(), ElementsAre());
276}
277
278TEST_F(RtpTransceiverTestForHeaderExtensions,
279 NoNegotiatedHdrExtsWithChannelWithoutNegotiation) {
Tommi99c8a802021-04-27 15:00:00 +0200280 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
281 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
282 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
283 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
284 EXPECT_CALL(*sender_.get(), Stop());
Markus Handell5932fe12020-12-17 22:19:40 +0100285 cricket::MockChannelInterface mock_channel;
Tommi99c8a802021-04-27 15:00:00 +0200286 EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
287 EXPECT_CALL(mock_channel, media_type())
288 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
289 EXPECT_CALL(mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
Markus Handell5932fe12020-12-17 22:19:40 +0100290 transceiver_.SetChannel(&mock_channel);
291 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(), ElementsAre());
292}
293
294TEST_F(RtpTransceiverTestForHeaderExtensions, ReturnsNegotiatedHdrExts) {
Tommi99c8a802021-04-27 15:00:00 +0200295 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
296 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
297 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
298 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
299 EXPECT_CALL(*sender_.get(), Stop());
300
Markus Handell5932fe12020-12-17 22:19:40 +0100301 cricket::MockChannelInterface mock_channel;
Tommi99c8a802021-04-27 15:00:00 +0200302 EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
303 EXPECT_CALL(mock_channel, media_type())
304 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
305 EXPECT_CALL(mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
Tommicc7a3682021-05-04 14:59:38 +0200306
Markus Handell5932fe12020-12-17 22:19:40 +0100307 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
308 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200309 cricket::AudioContentDescription description;
310 description.set_rtp_header_extensions(extensions);
311 transceiver_.OnNegotiationUpdate(SdpType::kAnswer, &description);
312
Markus Handell5932fe12020-12-17 22:19:40 +0100313 transceiver_.SetChannel(&mock_channel);
314 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(),
315 ElementsAre(RtpHeaderExtensionCapability(
316 "uri1", 1, RtpTransceiverDirection::kSendRecv),
317 RtpHeaderExtensionCapability(
318 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
319}
320
321TEST_F(RtpTransceiverTestForHeaderExtensions,
322 ReturnsNegotiatedHdrExtsSecondTime) {
Tommi99c8a802021-04-27 15:00:00 +0200323 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
Tommi99c8a802021-04-27 15:00:00 +0200324 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
325 EXPECT_CALL(*sender_.get(), Stop());
326
Markus Handell5932fe12020-12-17 22:19:40 +0100327 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
328 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200329 cricket::AudioContentDescription description;
330 description.set_rtp_header_extensions(extensions);
331 transceiver_.OnNegotiationUpdate(SdpType::kAnswer, &description);
Markus Handell5932fe12020-12-17 22:19:40 +0100332
Tommicc7a3682021-05-04 14:59:38 +0200333 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(),
334 ElementsAre(RtpHeaderExtensionCapability(
335 "uri1", 1, RtpTransceiverDirection::kSendRecv),
336 RtpHeaderExtensionCapability(
337 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
Markus Handell5932fe12020-12-17 22:19:40 +0100338
339 extensions = {webrtc::RtpExtension("uri3", 4),
340 webrtc::RtpExtension("uri5", 6)};
Tommicc7a3682021-05-04 14:59:38 +0200341 description.set_rtp_header_extensions(extensions);
342 transceiver_.OnNegotiationUpdate(SdpType::kAnswer, &description);
343
Markus Handell5932fe12020-12-17 22:19:40 +0100344 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(),
345 ElementsAre(RtpHeaderExtensionCapability(
346 "uri3", 4, RtpTransceiverDirection::kSendRecv),
347 RtpHeaderExtensionCapability(
348 "uri5", 6, RtpTransceiverDirection::kSendRecv)));
349}
350
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800351} // namespace webrtc