blob: a65be9ba158ea49923207a7835e33a0ccc56e340 [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
78 // Channel can no longer be set, so this call should be a no-op.
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010079 transceiver->SetChannel(&channel2,
80 [](const std::string&) { return nullptr; });
81 EXPECT_EQ(&channel1, transceiver->channel());
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010082
83 // Clear the current channel before `transceiver` goes out of scope.
84 EXPECT_CALL(channel1, SetFirstPacketReceivedCallback(_));
85 EXPECT_CALL(cm, DestroyChannel(&channel1)).WillRepeatedly(testing::Return());
Harald Alvestrand19ebabc2022-04-28 13:31:17 +000086 transceiver->ClearChannel();
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080087}
88
Artem Titov880fa812021-07-30 22:30:23 +020089// Checks that a channel can be unset on a stopped `RtpTransceiver`
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080090TEST(RtpTransceiverTest, CanUnsetChannelOnStoppedTransceiver) {
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010091 ChannelManagerForTest cm;
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010092 const std::string content_name("my_mid");
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010093 auto transceiver = rtc::make_ref_counted<RtpTransceiver>(
94 cricket::MediaType::MEDIA_TYPE_VIDEO, &cm);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080095 cricket::MockChannelInterface channel;
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080096 EXPECT_CALL(channel, media_type())
97 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_VIDEO));
Tomas Gunnarsson5411b172022-01-24 08:45:26 +010098 EXPECT_CALL(channel, mid()).WillRepeatedly(ReturnRef(content_name));
Tommi99c8a802021-04-27 15:00:00 +020099 EXPECT_CALL(channel, SetFirstPacketReceivedCallback(_))
100 .WillRepeatedly(testing::Return());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100101 EXPECT_CALL(channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100102 EXPECT_CALL(cm, DestroyChannel(&channel)).WillRepeatedly(testing::Return());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800103
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100104 transceiver->SetChannel(&channel, [&](const std::string& mid) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100105 EXPECT_EQ(mid, content_name);
106 return nullptr;
107 });
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100108 EXPECT_EQ(&channel, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800109
110 // Stop the transceiver.
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100111 transceiver->StopInternal();
112 EXPECT_EQ(&channel, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800113
Artem Titov880fa812021-07-30 22:30:23 +0200114 // Set the channel to `nullptr`.
Harald Alvestrand19ebabc2022-04-28 13:31:17 +0000115 transceiver->ClearChannel();
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100116 EXPECT_EQ(nullptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800117}
118
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000119class RtpTransceiverUnifiedPlanTest : public ::testing::Test {
120 public:
121 RtpTransceiverUnifiedPlanTest()
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100122 : transceiver_(rtc::make_ref_counted<RtpTransceiver>(
123 RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
124 rtc::Thread::Current(),
125 sender_),
126 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
127 rtc::Thread::Current(),
128 rtc::Thread::Current(),
129 receiver_),
130 &channel_manager_,
131 channel_manager_.GetSupportedAudioRtpHeaderExtensions(),
132 /* on_negotiation_needed= */ [] {})) {}
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000133
Tommi99c8a802021-04-27 15:00:00 +0200134 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
135 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
136 EXPECT_CALL(*receiver.get(), media_type())
137 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
138 return receiver;
139 }
140
141 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
142 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
143 EXPECT_CALL(*sender.get(), media_type())
144 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
145 return sender;
146 }
147
148 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
149 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100150 ChannelManagerForTest channel_manager_;
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100151 rtc::scoped_refptr<RtpTransceiver> transceiver_;
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000152};
153
154// Basic tests for Stop()
155TEST_F(RtpTransceiverUnifiedPlanTest, StopSetsDirection) {
Tommi6589def2022-02-17 23:36:47 +0100156 EXPECT_CALL(*receiver_.get(), Stop());
157 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200158 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
159 EXPECT_CALL(*sender_.get(), Stop());
160
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100161 EXPECT_EQ(RtpTransceiverDirection::kInactive, transceiver_->direction());
162 EXPECT_FALSE(transceiver_->current_direction());
163 transceiver_->StopStandard();
164 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_->direction());
165 EXPECT_FALSE(transceiver_->current_direction());
166 transceiver_->StopTransceiverProcedure();
167 EXPECT_TRUE(transceiver_->current_direction());
168 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_->direction());
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000169 EXPECT_EQ(RtpTransceiverDirection::kStopped,
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100170 *transceiver_->current_direction());
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000171}
172
Markus Handell755c65d2020-06-24 01:06:10 +0200173class RtpTransceiverTestForHeaderExtensions : public ::testing::Test {
174 public:
175 RtpTransceiverTestForHeaderExtensions()
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100176 : extensions_(
Markus Handell755c65d2020-06-24 01:06:10 +0200177 {RtpHeaderExtensionCapability("uri1",
178 1,
179 RtpTransceiverDirection::kSendOnly),
180 RtpHeaderExtensionCapability("uri2",
181 2,
182 RtpTransceiverDirection::kRecvOnly),
183 RtpHeaderExtensionCapability(RtpExtension::kMidUri,
184 3,
185 RtpTransceiverDirection::kSendRecv),
186 RtpHeaderExtensionCapability(RtpExtension::kVideoRotationUri,
187 4,
188 RtpTransceiverDirection::kSendRecv)}),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100189 transceiver_(rtc::make_ref_counted<RtpTransceiver>(
190 RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
191 rtc::Thread::Current(),
192 sender_),
193 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
194 rtc::Thread::Current(),
195 rtc::Thread::Current(),
196 receiver_),
197 &channel_manager_,
198 extensions_,
199 /* on_negotiation_needed= */ [] {})) {}
Markus Handell755c65d2020-06-24 01:06:10 +0200200
Tommi99c8a802021-04-27 15:00:00 +0200201 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
202 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
203 EXPECT_CALL(*receiver.get(), media_type())
204 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
205 return receiver;
206 }
207
208 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
209 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
210 EXPECT_CALL(*sender.get(), media_type())
211 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
212 return sender;
213 }
214
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100215 void ClearChannel(cricket::MockChannelInterface& mock_channel) {
Tommi6589def2022-02-17 23:36:47 +0100216 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100217 EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
218 EXPECT_CALL(channel_manager_, DestroyChannel(&mock_channel))
219 .WillRepeatedly(testing::Return());
Harald Alvestrand19ebabc2022-04-28 13:31:17 +0000220 transceiver_->ClearChannel();
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100221 }
222
Tommi99c8a802021-04-27 15:00:00 +0200223 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
224 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
225
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100226 ChannelManagerForTest channel_manager_;
Markus Handell755c65d2020-06-24 01:06:10 +0200227 std::vector<RtpHeaderExtensionCapability> extensions_;
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100228 rtc::scoped_refptr<RtpTransceiver> transceiver_;
Markus Handell755c65d2020-06-24 01:06:10 +0200229};
230
231TEST_F(RtpTransceiverTestForHeaderExtensions, OffersChannelManagerList) {
Tommi6589def2022-02-17 23:36:47 +0100232 EXPECT_CALL(*receiver_.get(), Stop());
233 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200234 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
235 EXPECT_CALL(*sender_.get(), Stop());
236
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100237 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell755c65d2020-06-24 01:06:10 +0200238}
239
240TEST_F(RtpTransceiverTestForHeaderExtensions, ModifiesDirection) {
Tommi6589def2022-02-17 23:36:47 +0100241 EXPECT_CALL(*receiver_.get(), Stop());
242 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200243 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
244 EXPECT_CALL(*sender_.get(), Stop());
245
Markus Handell755c65d2020-06-24 01:06:10 +0200246 auto modified_extensions = extensions_;
247 modified_extensions[0].direction = RtpTransceiverDirection::kSendOnly;
248 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100249 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
250 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200251 modified_extensions[0].direction = RtpTransceiverDirection::kRecvOnly;
252 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100253 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
254 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200255 modified_extensions[0].direction = RtpTransceiverDirection::kSendRecv;
256 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100257 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
258 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200259 modified_extensions[0].direction = RtpTransceiverDirection::kInactive;
260 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100261 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
262 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200263}
264
265TEST_F(RtpTransceiverTestForHeaderExtensions, AcceptsStoppedExtension) {
Tommi6589def2022-02-17 23:36:47 +0100266 EXPECT_CALL(*receiver_.get(), Stop());
267 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200268 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
269 EXPECT_CALL(*sender_.get(), Stop());
270
Markus Handell755c65d2020-06-24 01:06:10 +0200271 auto modified_extensions = extensions_;
272 modified_extensions[0].direction = RtpTransceiverDirection::kStopped;
273 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100274 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
275 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200276}
277
278TEST_F(RtpTransceiverTestForHeaderExtensions, RejectsUnsupportedExtension) {
Tommi6589def2022-02-17 23:36:47 +0100279 EXPECT_CALL(*receiver_.get(), Stop());
280 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200281 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
282 EXPECT_CALL(*sender_.get(), Stop());
283
Markus Handell755c65d2020-06-24 01:06:10 +0200284 std::vector<RtpHeaderExtensionCapability> modified_extensions(
285 {RtpHeaderExtensionCapability("uri3", 1,
286 RtpTransceiverDirection::kSendRecv)});
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100287 EXPECT_THAT(transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handellc17bca72021-01-14 17:08:01 +0100288 Property(&RTCError::type, RTCErrorType::UNSUPPORTED_PARAMETER));
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100289 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell755c65d2020-06-24 01:06:10 +0200290}
291
292TEST_F(RtpTransceiverTestForHeaderExtensions,
293 RejectsStoppedMandatoryExtensions) {
Tommi6589def2022-02-17 23:36:47 +0100294 EXPECT_CALL(*receiver_.get(), Stop());
295 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200296 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
297 EXPECT_CALL(*sender_.get(), Stop());
298
Markus Handell755c65d2020-06-24 01:06:10 +0200299 std::vector<RtpHeaderExtensionCapability> modified_extensions = extensions_;
300 // Attempting to stop the mandatory MID extension.
301 modified_extensions[2].direction = RtpTransceiverDirection::kStopped;
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100302 EXPECT_THAT(transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handell755c65d2020-06-24 01:06:10 +0200303 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100304 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell755c65d2020-06-24 01:06:10 +0200305 modified_extensions = extensions_;
306 // Attempting to stop the mandatory video orientation extension.
307 modified_extensions[3].direction = RtpTransceiverDirection::kStopped;
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100308 EXPECT_THAT(transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handell755c65d2020-06-24 01:06:10 +0200309 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100310 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell0357b3e2020-03-16 13:40:51 +0100311}
312
Markus Handell5932fe12020-12-17 22:19:40 +0100313TEST_F(RtpTransceiverTestForHeaderExtensions,
314 NoNegotiatedHdrExtsWithoutChannel) {
Tommi6589def2022-02-17 23:36:47 +0100315 EXPECT_CALL(*receiver_.get(), Stop());
316 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200317 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
318 EXPECT_CALL(*sender_.get(), Stop());
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100319 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(), ElementsAre());
Markus Handell5932fe12020-12-17 22:19:40 +0100320}
321
322TEST_F(RtpTransceiverTestForHeaderExtensions,
323 NoNegotiatedHdrExtsWithChannelWithoutNegotiation) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100324 const std::string content_name("my_mid");
Tommi6589def2022-02-17 23:36:47 +0100325 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_)).WillRepeatedly(Return());
326 EXPECT_CALL(*receiver_.get(), Stop()).WillRepeatedly(Return());
Tommi99c8a802021-04-27 15:00:00 +0200327 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
328 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
329 EXPECT_CALL(*sender_.get(), Stop());
Markus Handell5932fe12020-12-17 22:19:40 +0100330 cricket::MockChannelInterface mock_channel;
Tommi99c8a802021-04-27 15:00:00 +0200331 EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
332 EXPECT_CALL(mock_channel, media_type())
333 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
334 EXPECT_CALL(mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
Tomas Gunnarsson5411b172022-01-24 08:45:26 +0100335 EXPECT_CALL(mock_channel, mid()).WillRepeatedly(ReturnRef(content_name));
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100336 EXPECT_CALL(mock_channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100337 transceiver_->SetChannel(&mock_channel,
338 [](const std::string&) { return nullptr; });
339 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(), ElementsAre());
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100340
341 ClearChannel(mock_channel);
Markus Handell5932fe12020-12-17 22:19:40 +0100342}
343
344TEST_F(RtpTransceiverTestForHeaderExtensions, ReturnsNegotiatedHdrExts) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100345 const std::string content_name("my_mid");
Tommi6589def2022-02-17 23:36:47 +0100346 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_)).WillRepeatedly(Return());
347 EXPECT_CALL(*receiver_.get(), Stop()).WillRepeatedly(Return());
Tommi99c8a802021-04-27 15:00:00 +0200348 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
349 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
350 EXPECT_CALL(*sender_.get(), Stop());
351
Markus Handell5932fe12020-12-17 22:19:40 +0100352 cricket::MockChannelInterface mock_channel;
Tommi99c8a802021-04-27 15:00:00 +0200353 EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
354 EXPECT_CALL(mock_channel, media_type())
355 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
356 EXPECT_CALL(mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
Tomas Gunnarsson5411b172022-01-24 08:45:26 +0100357 EXPECT_CALL(mock_channel, mid()).WillRepeatedly(ReturnRef(content_name));
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100358 EXPECT_CALL(mock_channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
Tommicc7a3682021-05-04 14:59:38 +0200359
Markus Handell5932fe12020-12-17 22:19:40 +0100360 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
361 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200362 cricket::AudioContentDescription description;
363 description.set_rtp_header_extensions(extensions);
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100364 transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
Tommicc7a3682021-05-04 14:59:38 +0200365
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100366 transceiver_->SetChannel(&mock_channel,
367 [](const std::string&) { return nullptr; });
368 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
Markus Handell5932fe12020-12-17 22:19:40 +0100369 ElementsAre(RtpHeaderExtensionCapability(
370 "uri1", 1, RtpTransceiverDirection::kSendRecv),
371 RtpHeaderExtensionCapability(
372 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100373
374 ClearChannel(mock_channel);
Markus Handell5932fe12020-12-17 22:19:40 +0100375}
376
377TEST_F(RtpTransceiverTestForHeaderExtensions,
378 ReturnsNegotiatedHdrExtsSecondTime) {
Tommi6589def2022-02-17 23:36:47 +0100379 EXPECT_CALL(*receiver_.get(), Stop());
380 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200381 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
382 EXPECT_CALL(*sender_.get(), Stop());
383
Markus Handell5932fe12020-12-17 22:19:40 +0100384 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
385 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200386 cricket::AudioContentDescription description;
387 description.set_rtp_header_extensions(extensions);
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100388 transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
Markus Handell5932fe12020-12-17 22:19:40 +0100389
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100390 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
Tommicc7a3682021-05-04 14:59:38 +0200391 ElementsAre(RtpHeaderExtensionCapability(
392 "uri1", 1, RtpTransceiverDirection::kSendRecv),
393 RtpHeaderExtensionCapability(
394 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
Markus Handell5932fe12020-12-17 22:19:40 +0100395
396 extensions = {webrtc::RtpExtension("uri3", 4),
397 webrtc::RtpExtension("uri5", 6)};
Tommicc7a3682021-05-04 14:59:38 +0200398 description.set_rtp_header_extensions(extensions);
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100399 transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
Tommicc7a3682021-05-04 14:59:38 +0200400
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100401 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
Markus Handell5932fe12020-12-17 22:19:40 +0100402 ElementsAre(RtpHeaderExtensionCapability(
403 "uri3", 4, RtpTransceiverDirection::kSendRecv),
404 RtpHeaderExtensionCapability(
405 "uri5", 6, RtpTransceiverDirection::kSendRecv)));
406}
407
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800408} // namespace webrtc