blob: a1a2a197fb6b2b9390fb30cad2fa77499dcf0156 [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
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
Artem Titov880fa812021-07-30 22:30:23 +020035// Checks that a channel cannot be set on a stopped `RtpTransceiver`.
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080036TEST(RtpTransceiverTest, CannotSetChannelOnStoppedTransceiver) {
Tommi99c8a802021-04-27 15:00:00 +020037 auto cm = cricket::ChannelManager::Create(
38 nullptr, true, rtc::Thread::Current(), rtc::Thread::Current());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010039 const std::string content_name("my_mid");
Tommi99c8a802021-04-27 15:00:00 +020040 RtpTransceiver transceiver(cricket::MediaType::MEDIA_TYPE_AUDIO, cm.get());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080041 cricket::MockChannelInterface channel1;
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080042 EXPECT_CALL(channel1, media_type())
43 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010044 EXPECT_CALL(channel1, content_name()).WillRepeatedly(ReturnRef(content_name));
Tommi99c8a802021-04-27 15:00:00 +020045 EXPECT_CALL(channel1, SetFirstPacketReceivedCallback(_));
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010046 EXPECT_CALL(channel1, SetRtpTransport(_)).WillRepeatedly(Return(true));
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080047
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010048 transceiver.SetChannel(&channel1, [&](const std::string& mid) {
49 EXPECT_EQ(mid, content_name);
50 return nullptr;
51 });
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080052 EXPECT_EQ(&channel1, transceiver.channel());
53
54 // Stop the transceiver.
Harald Alvestrand6060df52020-08-11 09:54:02 +020055 transceiver.StopInternal();
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080056 EXPECT_EQ(&channel1, transceiver.channel());
57
58 cricket::MockChannelInterface channel2;
59 EXPECT_CALL(channel2, media_type())
60 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
61
62 // Channel can no longer be set, so this call should be a no-op.
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010063 transceiver.SetChannel(&channel2, [](const std::string&) { return nullptr; });
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080064 EXPECT_EQ(&channel1, transceiver.channel());
65}
66
Artem Titov880fa812021-07-30 22:30:23 +020067// Checks that a channel can be unset on a stopped `RtpTransceiver`
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080068TEST(RtpTransceiverTest, CanUnsetChannelOnStoppedTransceiver) {
Tommi99c8a802021-04-27 15:00:00 +020069 auto cm = cricket::ChannelManager::Create(
70 nullptr, true, rtc::Thread::Current(), rtc::Thread::Current());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010071 const std::string content_name("my_mid");
Tommi99c8a802021-04-27 15:00:00 +020072 RtpTransceiver transceiver(cricket::MediaType::MEDIA_TYPE_VIDEO, cm.get());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080073 cricket::MockChannelInterface channel;
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080074 EXPECT_CALL(channel, media_type())
75 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_VIDEO));
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010076 EXPECT_CALL(channel, content_name()).WillRepeatedly(ReturnRef(content_name));
Tommi99c8a802021-04-27 15:00:00 +020077 EXPECT_CALL(channel, SetFirstPacketReceivedCallback(_))
78 .WillRepeatedly(testing::Return());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010079 EXPECT_CALL(channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080080
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010081 transceiver.SetChannel(&channel, [&](const std::string& mid) {
82 EXPECT_EQ(mid, content_name);
83 return nullptr;
84 });
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080085 EXPECT_EQ(&channel, transceiver.channel());
86
87 // Stop the transceiver.
Harald Alvestrand6060df52020-08-11 09:54:02 +020088 transceiver.StopInternal();
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080089 EXPECT_EQ(&channel, transceiver.channel());
90
Artem Titov880fa812021-07-30 22:30:23 +020091 // Set the channel to `nullptr`.
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010092 transceiver.SetChannel(nullptr, nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080093 EXPECT_EQ(nullptr, transceiver.channel());
94}
95
Harald Alvestrandc75c4282020-08-26 12:17:54 +000096class RtpTransceiverUnifiedPlanTest : public ::testing::Test {
97 public:
98 RtpTransceiverUnifiedPlanTest()
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +020099 : channel_manager_(cricket::ChannelManager::Create(
100 std::make_unique<cricket::FakeMediaEngine>(),
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200101 false,
102 rtc::Thread::Current(),
103 rtc::Thread::Current())),
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000104 transceiver_(RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
105 rtc::Thread::Current(),
Tommi99c8a802021-04-27 15:00:00 +0200106 sender_),
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000107 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
108 rtc::Thread::Current(),
Tommi4ccdf932021-05-17 14:50:10 +0200109 rtc::Thread::Current(),
Tommi99c8a802021-04-27 15:00:00 +0200110 receiver_),
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200111 channel_manager_.get(),
112 channel_manager_->GetSupportedAudioRtpHeaderExtensions(),
Harald Alvestrand280054f2020-11-10 13:12:53 +0000113 /* on_negotiation_needed= */ [] {}) {}
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000114
Tommi99c8a802021-04-27 15:00:00 +0200115 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
116 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
117 EXPECT_CALL(*receiver.get(), media_type())
118 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
119 return receiver;
120 }
121
122 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
123 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
124 EXPECT_CALL(*sender.get(), media_type())
125 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
126 return sender;
127 }
128
129 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
130 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200131 std::unique_ptr<cricket::ChannelManager> channel_manager_;
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000132 RtpTransceiver transceiver_;
133};
134
135// Basic tests for Stop()
136TEST_F(RtpTransceiverUnifiedPlanTest, StopSetsDirection) {
Tommi99c8a802021-04-27 15:00:00 +0200137 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
138 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
139 EXPECT_CALL(*sender_.get(), Stop());
140
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000141 EXPECT_EQ(RtpTransceiverDirection::kInactive, transceiver_.direction());
142 EXPECT_FALSE(transceiver_.current_direction());
143 transceiver_.StopStandard();
144 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_.direction());
145 EXPECT_FALSE(transceiver_.current_direction());
146 transceiver_.StopTransceiverProcedure();
147 EXPECT_TRUE(transceiver_.current_direction());
148 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_.direction());
149 EXPECT_EQ(RtpTransceiverDirection::kStopped,
150 *transceiver_.current_direction());
151}
152
Markus Handell755c65d2020-06-24 01:06:10 +0200153class RtpTransceiverTestForHeaderExtensions : public ::testing::Test {
154 public:
155 RtpTransceiverTestForHeaderExtensions()
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200156 : channel_manager_(cricket::ChannelManager::Create(
157 std::make_unique<cricket::FakeMediaEngine>(),
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200158 false,
159 rtc::Thread::Current(),
160 rtc::Thread::Current())),
Markus Handell755c65d2020-06-24 01:06:10 +0200161 extensions_(
162 {RtpHeaderExtensionCapability("uri1",
163 1,
164 RtpTransceiverDirection::kSendOnly),
165 RtpHeaderExtensionCapability("uri2",
166 2,
167 RtpTransceiverDirection::kRecvOnly),
168 RtpHeaderExtensionCapability(RtpExtension::kMidUri,
169 3,
170 RtpTransceiverDirection::kSendRecv),
171 RtpHeaderExtensionCapability(RtpExtension::kVideoRotationUri,
172 4,
173 RtpTransceiverDirection::kSendRecv)}),
174 transceiver_(RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
175 rtc::Thread::Current(),
Tommi99c8a802021-04-27 15:00:00 +0200176 sender_),
Markus Handell755c65d2020-06-24 01:06:10 +0200177 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
178 rtc::Thread::Current(),
Tommi4ccdf932021-05-17 14:50:10 +0200179 rtc::Thread::Current(),
Tommi99c8a802021-04-27 15:00:00 +0200180 receiver_),
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200181 channel_manager_.get(),
Harald Alvestrand280054f2020-11-10 13:12:53 +0000182 extensions_,
183 /* on_negotiation_needed= */ [] {}) {}
Markus Handell755c65d2020-06-24 01:06:10 +0200184
Tommi99c8a802021-04-27 15:00:00 +0200185 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
186 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
187 EXPECT_CALL(*receiver.get(), media_type())
188 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
189 return receiver;
190 }
191
192 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
193 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
194 EXPECT_CALL(*sender.get(), media_type())
195 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
196 return sender;
197 }
198
199 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
200 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
201
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200202 std::unique_ptr<cricket::ChannelManager> channel_manager_;
Markus Handell755c65d2020-06-24 01:06:10 +0200203 std::vector<RtpHeaderExtensionCapability> extensions_;
204 RtpTransceiver transceiver_;
205};
206
207TEST_F(RtpTransceiverTestForHeaderExtensions, OffersChannelManagerList) {
Tommi99c8a802021-04-27 15:00:00 +0200208 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
209 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
210 EXPECT_CALL(*sender_.get(), Stop());
211
Markus Handell755c65d2020-06-24 01:06:10 +0200212 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
213}
214
215TEST_F(RtpTransceiverTestForHeaderExtensions, ModifiesDirection) {
Tommi99c8a802021-04-27 15:00:00 +0200216 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
217 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
218 EXPECT_CALL(*sender_.get(), Stop());
219
Markus Handell755c65d2020-06-24 01:06:10 +0200220 auto modified_extensions = extensions_;
221 modified_extensions[0].direction = RtpTransceiverDirection::kSendOnly;
222 EXPECT_TRUE(
223 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
224 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
225 modified_extensions[0].direction = RtpTransceiverDirection::kRecvOnly;
226 EXPECT_TRUE(
227 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
228 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
229 modified_extensions[0].direction = RtpTransceiverDirection::kSendRecv;
230 EXPECT_TRUE(
231 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
232 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
233 modified_extensions[0].direction = RtpTransceiverDirection::kInactive;
234 EXPECT_TRUE(
235 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
236 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
237}
238
239TEST_F(RtpTransceiverTestForHeaderExtensions, AcceptsStoppedExtension) {
Tommi99c8a802021-04-27 15:00:00 +0200240 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
241 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
242 EXPECT_CALL(*sender_.get(), Stop());
243
Markus Handell755c65d2020-06-24 01:06:10 +0200244 auto modified_extensions = extensions_;
245 modified_extensions[0].direction = RtpTransceiverDirection::kStopped;
246 EXPECT_TRUE(
247 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
248 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
249}
250
251TEST_F(RtpTransceiverTestForHeaderExtensions, RejectsUnsupportedExtension) {
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(
257 {RtpHeaderExtensionCapability("uri3", 1,
258 RtpTransceiverDirection::kSendRecv)});
259 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handellc17bca72021-01-14 17:08:01 +0100260 Property(&RTCError::type, RTCErrorType::UNSUPPORTED_PARAMETER));
Markus Handell755c65d2020-06-24 01:06:10 +0200261 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
262}
263
264TEST_F(RtpTransceiverTestForHeaderExtensions,
265 RejectsStoppedMandatoryExtensions) {
Tommi99c8a802021-04-27 15:00:00 +0200266 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
267 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
268 EXPECT_CALL(*sender_.get(), Stop());
269
Markus Handell755c65d2020-06-24 01:06:10 +0200270 std::vector<RtpHeaderExtensionCapability> modified_extensions = extensions_;
271 // Attempting to stop the mandatory MID extension.
272 modified_extensions[2].direction = RtpTransceiverDirection::kStopped;
273 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
274 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
275 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
276 modified_extensions = extensions_;
277 // Attempting to stop the mandatory video orientation extension.
278 modified_extensions[3].direction = RtpTransceiverDirection::kStopped;
279 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
280 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
281 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
Markus Handell0357b3e2020-03-16 13:40:51 +0100282}
283
Markus Handell5932fe12020-12-17 22:19:40 +0100284TEST_F(RtpTransceiverTestForHeaderExtensions,
285 NoNegotiatedHdrExtsWithoutChannel) {
Tommi99c8a802021-04-27 15:00:00 +0200286 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
287 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
288 EXPECT_CALL(*sender_.get(), Stop());
Markus Handell5932fe12020-12-17 22:19:40 +0100289 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(), ElementsAre());
290}
291
292TEST_F(RtpTransceiverTestForHeaderExtensions,
293 NoNegotiatedHdrExtsWithChannelWithoutNegotiation) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100294 const std::string content_name("my_mid");
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());
Markus Handell5932fe12020-12-17 22:19:40 +0100300 cricket::MockChannelInterface mock_channel;
Tommi99c8a802021-04-27 15:00:00 +0200301 EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
302 EXPECT_CALL(mock_channel, media_type())
303 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
304 EXPECT_CALL(mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100305 EXPECT_CALL(mock_channel, content_name())
306 .WillRepeatedly(ReturnRef(content_name));
307 EXPECT_CALL(mock_channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
308 transceiver_.SetChannel(&mock_channel,
309 [](const std::string&) { return nullptr; });
Markus Handell5932fe12020-12-17 22:19:40 +0100310 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(), ElementsAre());
311}
312
313TEST_F(RtpTransceiverTestForHeaderExtensions, ReturnsNegotiatedHdrExts) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100314 const std::string content_name("my_mid");
Tommi99c8a802021-04-27 15:00:00 +0200315 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
316 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
317 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
318 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
319 EXPECT_CALL(*sender_.get(), Stop());
320
Markus Handell5932fe12020-12-17 22:19:40 +0100321 cricket::MockChannelInterface mock_channel;
Tommi99c8a802021-04-27 15:00:00 +0200322 EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
323 EXPECT_CALL(mock_channel, media_type())
324 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
325 EXPECT_CALL(mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100326 EXPECT_CALL(mock_channel, content_name())
327 .WillRepeatedly(ReturnRef(content_name));
328 EXPECT_CALL(mock_channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
Tommicc7a3682021-05-04 14:59:38 +0200329
Markus Handell5932fe12020-12-17 22:19:40 +0100330 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
331 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200332 cricket::AudioContentDescription description;
333 description.set_rtp_header_extensions(extensions);
334 transceiver_.OnNegotiationUpdate(SdpType::kAnswer, &description);
335
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100336 transceiver_.SetChannel(&mock_channel,
337 [](const std::string&) { return nullptr; });
Markus Handell5932fe12020-12-17 22:19:40 +0100338 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(),
339 ElementsAre(RtpHeaderExtensionCapability(
340 "uri1", 1, RtpTransceiverDirection::kSendRecv),
341 RtpHeaderExtensionCapability(
342 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
343}
344
345TEST_F(RtpTransceiverTestForHeaderExtensions,
346 ReturnsNegotiatedHdrExtsSecondTime) {
Tommi99c8a802021-04-27 15:00:00 +0200347 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
Tommi99c8a802021-04-27 15:00:00 +0200348 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
349 EXPECT_CALL(*sender_.get(), Stop());
350
Markus Handell5932fe12020-12-17 22:19:40 +0100351 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
352 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200353 cricket::AudioContentDescription description;
354 description.set_rtp_header_extensions(extensions);
355 transceiver_.OnNegotiationUpdate(SdpType::kAnswer, &description);
Markus Handell5932fe12020-12-17 22:19:40 +0100356
Tommicc7a3682021-05-04 14:59:38 +0200357 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(),
358 ElementsAre(RtpHeaderExtensionCapability(
359 "uri1", 1, RtpTransceiverDirection::kSendRecv),
360 RtpHeaderExtensionCapability(
361 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
Markus Handell5932fe12020-12-17 22:19:40 +0100362
363 extensions = {webrtc::RtpExtension("uri3", 4),
364 webrtc::RtpExtension("uri5", 6)};
Tommicc7a3682021-05-04 14:59:38 +0200365 description.set_rtp_header_extensions(extensions);
366 transceiver_.OnNegotiationUpdate(SdpType::kAnswer, &description);
367
Markus Handell5932fe12020-12-17 22:19:40 +0100368 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(),
369 ElementsAre(RtpHeaderExtensionCapability(
370 "uri3", 4, RtpTransceiverDirection::kSendRecv),
371 RtpHeaderExtensionCapability(
372 "uri5", 6, RtpTransceiverDirection::kSendRecv)));
373}
374
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800375} // namespace webrtc