blob: 29828a045cca7b573a0e98d7c1e631750a9d9e97 [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
Artem Titov880fa812021-07-30 22:30:23 +020011// This file contains tests for `RtpTransceiver`.
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080012
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
Harald Alvestrandc24a2182022-02-23 13:44:59 +000017#include "absl/strings/string_view.h"
Markus Handell5932fe12020-12-17 22:19:40 +010018#include "absl/types/optional.h"
19#include "api/rtp_parameters.h"
Markus Handell0357b3e2020-03-16 13:40:51 +010020#include "media/base/fake_media_engine.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000021#include "media/base/media_engine.h"
Steve Anton10542f22019-01-11 09:11:00 -080022#include "pc/test/mock_channel_interface.h"
Markus Handell0357b3e2020-03-16 13:40:51 +010023#include "pc/test/mock_rtp_receiver_internal.h"
24#include "pc/test/mock_rtp_sender_internal.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000025#include "rtc_base/thread.h"
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080026#include "test/gmock.h"
Yves Gerey3e707812018-11-28 16:47:49 +010027#include "test/gtest.h"
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080028
Tommi99c8a802021-04-27 15:00:00 +020029using ::testing::_;
Markus Handell0357b3e2020-03-16 13:40:51 +010030using ::testing::ElementsAre;
Markus Handell5932fe12020-12-17 22:19:40 +010031using ::testing::Optional;
Markus Handell755c65d2020-06-24 01:06:10 +020032using ::testing::Property;
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080033using ::testing::Return;
34using ::testing::ReturnRef;
35
36namespace webrtc {
37
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010038namespace {
39class ChannelManagerForTest : public cricket::ChannelManager {
40 public:
41 ChannelManagerForTest()
42 : cricket::ChannelManager(std::make_unique<cricket::FakeMediaEngine>(),
43 true,
44 rtc::Thread::Current(),
45 rtc::Thread::Current()) {}
46
47 MOCK_METHOD(void, DestroyChannel, (cricket::ChannelInterface*), (override));
48};
49} // namespace
50
Artem Titov880fa812021-07-30 22:30:23 +020051// Checks that a channel cannot be set on a stopped `RtpTransceiver`.
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080052TEST(RtpTransceiverTest, CannotSetChannelOnStoppedTransceiver) {
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010053 ChannelManagerForTest cm;
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010054 const std::string content_name("my_mid");
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010055 auto transceiver = rtc::make_ref_counted<RtpTransceiver>(
56 cricket::MediaType::MEDIA_TYPE_AUDIO, &cm);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080057 cricket::MockChannelInterface channel1;
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080058 EXPECT_CALL(channel1, media_type())
59 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
Tomas Gunnarsson5411b172022-01-24 08:45:26 +010060 EXPECT_CALL(channel1, mid()).WillRepeatedly(ReturnRef(content_name));
Tommi99c8a802021-04-27 15:00:00 +020061 EXPECT_CALL(channel1, SetFirstPacketReceivedCallback(_));
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010062 EXPECT_CALL(channel1, SetRtpTransport(_)).WillRepeatedly(Return(true));
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080063
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010064 transceiver->SetChannel(&channel1, [&](const std::string& mid) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010065 EXPECT_EQ(mid, content_name);
66 return nullptr;
67 });
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010068 EXPECT_EQ(&channel1, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080069
70 // Stop the transceiver.
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010071 transceiver->StopInternal();
72 EXPECT_EQ(&channel1, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080073
74 cricket::MockChannelInterface channel2;
75 EXPECT_CALL(channel2, media_type())
76 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
77
Harald Alvestranddaee8702022-04-29 11:42:55 +000078 // Clear the current channel - required to allow SetChannel()
79 EXPECT_CALL(channel1, SetFirstPacketReceivedCallback(_));
80 EXPECT_CALL(cm, DestroyChannel(&channel1)).WillRepeatedly(testing::Return());
81 transceiver->ClearChannel();
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080082 // Channel can no longer be set, so this call should be a no-op.
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010083 transceiver->SetChannel(&channel2,
84 [](const std::string&) { return nullptr; });
Harald Alvestranddaee8702022-04-29 11:42:55 +000085 EXPECT_EQ(nullptr, transceiver->channel());
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010086
Harald Alvestrand19ebabc2022-04-28 13:31:17 +000087 transceiver->ClearChannel();
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080088}
89
Artem Titov880fa812021-07-30 22:30:23 +020090// Checks that a channel can be unset on a stopped `RtpTransceiver`
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080091TEST(RtpTransceiverTest, CanUnsetChannelOnStoppedTransceiver) {
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010092 ChannelManagerForTest cm;
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010093 const std::string content_name("my_mid");
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010094 auto transceiver = rtc::make_ref_counted<RtpTransceiver>(
95 cricket::MediaType::MEDIA_TYPE_VIDEO, &cm);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080096 cricket::MockChannelInterface channel;
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080097 EXPECT_CALL(channel, media_type())
98 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_VIDEO));
Tomas Gunnarsson5411b172022-01-24 08:45:26 +010099 EXPECT_CALL(channel, mid()).WillRepeatedly(ReturnRef(content_name));
Tommi99c8a802021-04-27 15:00:00 +0200100 EXPECT_CALL(channel, SetFirstPacketReceivedCallback(_))
101 .WillRepeatedly(testing::Return());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100102 EXPECT_CALL(channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100103 EXPECT_CALL(cm, DestroyChannel(&channel)).WillRepeatedly(testing::Return());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800104
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100105 transceiver->SetChannel(&channel, [&](const std::string& mid) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100106 EXPECT_EQ(mid, content_name);
107 return nullptr;
108 });
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100109 EXPECT_EQ(&channel, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800110
111 // Stop the transceiver.
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100112 transceiver->StopInternal();
113 EXPECT_EQ(&channel, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800114
Artem Titov880fa812021-07-30 22:30:23 +0200115 // Set the channel to `nullptr`.
Harald Alvestrand19ebabc2022-04-28 13:31:17 +0000116 transceiver->ClearChannel();
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100117 EXPECT_EQ(nullptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800118}
119
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000120class RtpTransceiverUnifiedPlanTest : public ::testing::Test {
121 public:
122 RtpTransceiverUnifiedPlanTest()
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100123 : transceiver_(rtc::make_ref_counted<RtpTransceiver>(
124 RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
125 rtc::Thread::Current(),
126 sender_),
127 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
128 rtc::Thread::Current(),
129 rtc::Thread::Current(),
130 receiver_),
131 &channel_manager_,
132 channel_manager_.GetSupportedAudioRtpHeaderExtensions(),
133 /* on_negotiation_needed= */ [] {})) {}
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000134
Tommi99c8a802021-04-27 15:00:00 +0200135 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
136 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
137 EXPECT_CALL(*receiver.get(), media_type())
138 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
139 return receiver;
140 }
141
142 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
143 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
144 EXPECT_CALL(*sender.get(), media_type())
145 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
146 return sender;
147 }
148
149 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
150 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100151 ChannelManagerForTest channel_manager_;
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100152 rtc::scoped_refptr<RtpTransceiver> transceiver_;
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000153};
154
155// Basic tests for Stop()
156TEST_F(RtpTransceiverUnifiedPlanTest, StopSetsDirection) {
Tommi6589def2022-02-17 23:36:47 +0100157 EXPECT_CALL(*receiver_.get(), Stop());
158 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200159 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
160 EXPECT_CALL(*sender_.get(), Stop());
161
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100162 EXPECT_EQ(RtpTransceiverDirection::kInactive, transceiver_->direction());
163 EXPECT_FALSE(transceiver_->current_direction());
164 transceiver_->StopStandard();
165 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_->direction());
166 EXPECT_FALSE(transceiver_->current_direction());
167 transceiver_->StopTransceiverProcedure();
168 EXPECT_TRUE(transceiver_->current_direction());
169 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_->direction());
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000170 EXPECT_EQ(RtpTransceiverDirection::kStopped,
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100171 *transceiver_->current_direction());
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000172}
173
Markus Handell755c65d2020-06-24 01:06:10 +0200174class RtpTransceiverTestForHeaderExtensions : public ::testing::Test {
175 public:
176 RtpTransceiverTestForHeaderExtensions()
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100177 : extensions_(
Markus Handell755c65d2020-06-24 01:06:10 +0200178 {RtpHeaderExtensionCapability("uri1",
179 1,
180 RtpTransceiverDirection::kSendOnly),
181 RtpHeaderExtensionCapability("uri2",
182 2,
183 RtpTransceiverDirection::kRecvOnly),
184 RtpHeaderExtensionCapability(RtpExtension::kMidUri,
185 3,
186 RtpTransceiverDirection::kSendRecv),
187 RtpHeaderExtensionCapability(RtpExtension::kVideoRotationUri,
188 4,
189 RtpTransceiverDirection::kSendRecv)}),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100190 transceiver_(rtc::make_ref_counted<RtpTransceiver>(
191 RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
192 rtc::Thread::Current(),
193 sender_),
194 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
195 rtc::Thread::Current(),
196 rtc::Thread::Current(),
197 receiver_),
198 &channel_manager_,
199 extensions_,
200 /* on_negotiation_needed= */ [] {})) {}
Markus Handell755c65d2020-06-24 01:06:10 +0200201
Tommi99c8a802021-04-27 15:00:00 +0200202 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
203 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
204 EXPECT_CALL(*receiver.get(), media_type())
205 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
206 return receiver;
207 }
208
209 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
210 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
211 EXPECT_CALL(*sender.get(), media_type())
212 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
213 return sender;
214 }
215
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100216 void ClearChannel(cricket::MockChannelInterface& mock_channel) {
Tommi6589def2022-02-17 23:36:47 +0100217 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100218 EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
219 EXPECT_CALL(channel_manager_, DestroyChannel(&mock_channel))
220 .WillRepeatedly(testing::Return());
Harald Alvestrand19ebabc2022-04-28 13:31:17 +0000221 transceiver_->ClearChannel();
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100222 }
223
Tommi99c8a802021-04-27 15:00:00 +0200224 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
225 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
226
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100227 ChannelManagerForTest channel_manager_;
Markus Handell755c65d2020-06-24 01:06:10 +0200228 std::vector<RtpHeaderExtensionCapability> extensions_;
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100229 rtc::scoped_refptr<RtpTransceiver> transceiver_;
Markus Handell755c65d2020-06-24 01:06:10 +0200230};
231
232TEST_F(RtpTransceiverTestForHeaderExtensions, OffersChannelManagerList) {
Tommi6589def2022-02-17 23:36:47 +0100233 EXPECT_CALL(*receiver_.get(), Stop());
234 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200235 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
236 EXPECT_CALL(*sender_.get(), Stop());
237
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100238 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell755c65d2020-06-24 01:06:10 +0200239}
240
241TEST_F(RtpTransceiverTestForHeaderExtensions, ModifiesDirection) {
Tommi6589def2022-02-17 23:36:47 +0100242 EXPECT_CALL(*receiver_.get(), Stop());
243 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200244 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
245 EXPECT_CALL(*sender_.get(), Stop());
246
Markus Handell755c65d2020-06-24 01:06:10 +0200247 auto modified_extensions = extensions_;
248 modified_extensions[0].direction = RtpTransceiverDirection::kSendOnly;
249 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100250 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
251 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200252 modified_extensions[0].direction = RtpTransceiverDirection::kRecvOnly;
253 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100254 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
255 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200256 modified_extensions[0].direction = RtpTransceiverDirection::kSendRecv;
257 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100258 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
259 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200260 modified_extensions[0].direction = RtpTransceiverDirection::kInactive;
261 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100262 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
263 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200264}
265
266TEST_F(RtpTransceiverTestForHeaderExtensions, AcceptsStoppedExtension) {
Tommi6589def2022-02-17 23:36:47 +0100267 EXPECT_CALL(*receiver_.get(), Stop());
268 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200269 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
270 EXPECT_CALL(*sender_.get(), Stop());
271
Markus Handell755c65d2020-06-24 01:06:10 +0200272 auto modified_extensions = extensions_;
273 modified_extensions[0].direction = RtpTransceiverDirection::kStopped;
274 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100275 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
276 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200277}
278
279TEST_F(RtpTransceiverTestForHeaderExtensions, RejectsUnsupportedExtension) {
Tommi6589def2022-02-17 23:36:47 +0100280 EXPECT_CALL(*receiver_.get(), Stop());
281 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200282 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
283 EXPECT_CALL(*sender_.get(), Stop());
284
Markus Handell755c65d2020-06-24 01:06:10 +0200285 std::vector<RtpHeaderExtensionCapability> modified_extensions(
286 {RtpHeaderExtensionCapability("uri3", 1,
287 RtpTransceiverDirection::kSendRecv)});
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100288 EXPECT_THAT(transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handellc17bca72021-01-14 17:08:01 +0100289 Property(&RTCError::type, RTCErrorType::UNSUPPORTED_PARAMETER));
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100290 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell755c65d2020-06-24 01:06:10 +0200291}
292
293TEST_F(RtpTransceiverTestForHeaderExtensions,
294 RejectsStoppedMandatoryExtensions) {
Tommi6589def2022-02-17 23:36:47 +0100295 EXPECT_CALL(*receiver_.get(), Stop());
296 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200297 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
298 EXPECT_CALL(*sender_.get(), Stop());
299
Markus Handell755c65d2020-06-24 01:06:10 +0200300 std::vector<RtpHeaderExtensionCapability> modified_extensions = extensions_;
301 // Attempting to stop the mandatory MID extension.
302 modified_extensions[2].direction = RtpTransceiverDirection::kStopped;
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100303 EXPECT_THAT(transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handell755c65d2020-06-24 01:06:10 +0200304 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100305 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell755c65d2020-06-24 01:06:10 +0200306 modified_extensions = extensions_;
307 // Attempting to stop the mandatory video orientation extension.
308 modified_extensions[3].direction = RtpTransceiverDirection::kStopped;
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100309 EXPECT_THAT(transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handell755c65d2020-06-24 01:06:10 +0200310 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100311 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell0357b3e2020-03-16 13:40:51 +0100312}
313
Markus Handell5932fe12020-12-17 22:19:40 +0100314TEST_F(RtpTransceiverTestForHeaderExtensions,
315 NoNegotiatedHdrExtsWithoutChannel) {
Tommi6589def2022-02-17 23:36:47 +0100316 EXPECT_CALL(*receiver_.get(), Stop());
317 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200318 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
319 EXPECT_CALL(*sender_.get(), Stop());
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100320 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(), ElementsAre());
Markus Handell5932fe12020-12-17 22:19:40 +0100321}
322
323TEST_F(RtpTransceiverTestForHeaderExtensions,
324 NoNegotiatedHdrExtsWithChannelWithoutNegotiation) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100325 const std::string content_name("my_mid");
Tommi6589def2022-02-17 23:36:47 +0100326 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_)).WillRepeatedly(Return());
327 EXPECT_CALL(*receiver_.get(), Stop()).WillRepeatedly(Return());
Tommi99c8a802021-04-27 15:00:00 +0200328 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
329 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
330 EXPECT_CALL(*sender_.get(), Stop());
Markus Handell5932fe12020-12-17 22:19:40 +0100331 cricket::MockChannelInterface mock_channel;
Tommi99c8a802021-04-27 15:00:00 +0200332 EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
333 EXPECT_CALL(mock_channel, media_type())
334 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
335 EXPECT_CALL(mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
Tomas Gunnarsson5411b172022-01-24 08:45:26 +0100336 EXPECT_CALL(mock_channel, mid()).WillRepeatedly(ReturnRef(content_name));
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100337 EXPECT_CALL(mock_channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100338 transceiver_->SetChannel(&mock_channel,
339 [](const std::string&) { return nullptr; });
340 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(), ElementsAre());
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100341
342 ClearChannel(mock_channel);
Markus Handell5932fe12020-12-17 22:19:40 +0100343}
344
345TEST_F(RtpTransceiverTestForHeaderExtensions, ReturnsNegotiatedHdrExts) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100346 const std::string content_name("my_mid");
Tommi6589def2022-02-17 23:36:47 +0100347 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_)).WillRepeatedly(Return());
348 EXPECT_CALL(*receiver_.get(), Stop()).WillRepeatedly(Return());
Tommi99c8a802021-04-27 15:00:00 +0200349 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
350 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
351 EXPECT_CALL(*sender_.get(), Stop());
352
Markus Handell5932fe12020-12-17 22:19:40 +0100353 cricket::MockChannelInterface mock_channel;
Tommi99c8a802021-04-27 15:00:00 +0200354 EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
355 EXPECT_CALL(mock_channel, media_type())
356 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
357 EXPECT_CALL(mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
Tomas Gunnarsson5411b172022-01-24 08:45:26 +0100358 EXPECT_CALL(mock_channel, mid()).WillRepeatedly(ReturnRef(content_name));
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100359 EXPECT_CALL(mock_channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
Tommicc7a3682021-05-04 14:59:38 +0200360
Markus Handell5932fe12020-12-17 22:19:40 +0100361 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
362 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200363 cricket::AudioContentDescription description;
364 description.set_rtp_header_extensions(extensions);
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100365 transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
Tommicc7a3682021-05-04 14:59:38 +0200366
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100367 transceiver_->SetChannel(&mock_channel,
368 [](const std::string&) { return nullptr; });
369 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
Markus Handell5932fe12020-12-17 22:19:40 +0100370 ElementsAre(RtpHeaderExtensionCapability(
371 "uri1", 1, RtpTransceiverDirection::kSendRecv),
372 RtpHeaderExtensionCapability(
373 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100374
375 ClearChannel(mock_channel);
Markus Handell5932fe12020-12-17 22:19:40 +0100376}
377
378TEST_F(RtpTransceiverTestForHeaderExtensions,
379 ReturnsNegotiatedHdrExtsSecondTime) {
Tommi6589def2022-02-17 23:36:47 +0100380 EXPECT_CALL(*receiver_.get(), Stop());
381 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200382 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
383 EXPECT_CALL(*sender_.get(), Stop());
384
Markus Handell5932fe12020-12-17 22:19:40 +0100385 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
386 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200387 cricket::AudioContentDescription description;
388 description.set_rtp_header_extensions(extensions);
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100389 transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
Markus Handell5932fe12020-12-17 22:19:40 +0100390
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100391 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
Tommicc7a3682021-05-04 14:59:38 +0200392 ElementsAre(RtpHeaderExtensionCapability(
393 "uri1", 1, RtpTransceiverDirection::kSendRecv),
394 RtpHeaderExtensionCapability(
395 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
Markus Handell5932fe12020-12-17 22:19:40 +0100396
397 extensions = {webrtc::RtpExtension("uri3", 4),
398 webrtc::RtpExtension("uri5", 6)};
Tommicc7a3682021-05-04 14:59:38 +0200399 description.set_rtp_header_extensions(extensions);
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100400 transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
Tommicc7a3682021-05-04 14:59:38 +0200401
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100402 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
Markus Handell5932fe12020-12-17 22:19:40 +0100403 ElementsAre(RtpHeaderExtensionCapability(
404 "uri3", 4, RtpTransceiverDirection::kSendRecv),
405 RtpHeaderExtensionCapability(
406 "uri5", 6, RtpTransceiverDirection::kSendRecv)));
407}
408
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800409} // namespace webrtc