blob: 35d9265e03896d96a75c4fe8628dd05b65f97f29 [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());
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
Artem Titov880fa812021-07-30 22:30:23 +020061// Checks that a channel can be unset on a stopped `RtpTransceiver`
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080062TEST(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
Artem Titov880fa812021-07-30 22:30:23 +020079 // Set the channel to `nullptr`.
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080080 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(),
Tommi4ccdf932021-05-17 14:50:10 +020097 rtc::Thread::Current(),
Tommi99c8a802021-04-27 15:00:00 +020098 receiver_),
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +020099 channel_manager_.get(),
100 channel_manager_->GetSupportedAudioRtpHeaderExtensions(),
Harald Alvestrand280054f2020-11-10 13:12:53 +0000101 /* on_negotiation_needed= */ [] {}) {}
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000102
Tommi99c8a802021-04-27 15:00:00 +0200103 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
104 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
105 EXPECT_CALL(*receiver.get(), media_type())
106 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
107 return receiver;
108 }
109
110 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
111 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
112 EXPECT_CALL(*sender.get(), media_type())
113 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
114 return sender;
115 }
116
117 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
118 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200119 std::unique_ptr<cricket::ChannelManager> channel_manager_;
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000120 RtpTransceiver transceiver_;
121};
122
123// Basic tests for Stop()
124TEST_F(RtpTransceiverUnifiedPlanTest, StopSetsDirection) {
Tommi99c8a802021-04-27 15:00:00 +0200125 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
126 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
127 EXPECT_CALL(*sender_.get(), Stop());
128
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000129 EXPECT_EQ(RtpTransceiverDirection::kInactive, transceiver_.direction());
130 EXPECT_FALSE(transceiver_.current_direction());
131 transceiver_.StopStandard();
132 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_.direction());
133 EXPECT_FALSE(transceiver_.current_direction());
134 transceiver_.StopTransceiverProcedure();
135 EXPECT_TRUE(transceiver_.current_direction());
136 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_.direction());
137 EXPECT_EQ(RtpTransceiverDirection::kStopped,
138 *transceiver_.current_direction());
139}
140
Markus Handell755c65d2020-06-24 01:06:10 +0200141class RtpTransceiverTestForHeaderExtensions : public ::testing::Test {
142 public:
143 RtpTransceiverTestForHeaderExtensions()
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200144 : channel_manager_(cricket::ChannelManager::Create(
145 std::make_unique<cricket::FakeMediaEngine>(),
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200146 false,
147 rtc::Thread::Current(),
148 rtc::Thread::Current())),
Markus Handell755c65d2020-06-24 01:06:10 +0200149 extensions_(
150 {RtpHeaderExtensionCapability("uri1",
151 1,
152 RtpTransceiverDirection::kSendOnly),
153 RtpHeaderExtensionCapability("uri2",
154 2,
155 RtpTransceiverDirection::kRecvOnly),
156 RtpHeaderExtensionCapability(RtpExtension::kMidUri,
157 3,
158 RtpTransceiverDirection::kSendRecv),
159 RtpHeaderExtensionCapability(RtpExtension::kVideoRotationUri,
160 4,
161 RtpTransceiverDirection::kSendRecv)}),
162 transceiver_(RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
163 rtc::Thread::Current(),
Tommi99c8a802021-04-27 15:00:00 +0200164 sender_),
Markus Handell755c65d2020-06-24 01:06:10 +0200165 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
166 rtc::Thread::Current(),
Tommi4ccdf932021-05-17 14:50:10 +0200167 rtc::Thread::Current(),
Tommi99c8a802021-04-27 15:00:00 +0200168 receiver_),
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200169 channel_manager_.get(),
Harald Alvestrand280054f2020-11-10 13:12:53 +0000170 extensions_,
171 /* on_negotiation_needed= */ [] {}) {}
Markus Handell755c65d2020-06-24 01:06:10 +0200172
Tommi99c8a802021-04-27 15:00:00 +0200173 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
174 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
175 EXPECT_CALL(*receiver.get(), media_type())
176 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
177 return receiver;
178 }
179
180 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
181 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
182 EXPECT_CALL(*sender.get(), media_type())
183 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
184 return sender;
185 }
186
187 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
188 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
189
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200190 std::unique_ptr<cricket::ChannelManager> channel_manager_;
Markus Handell755c65d2020-06-24 01:06:10 +0200191 std::vector<RtpHeaderExtensionCapability> extensions_;
192 RtpTransceiver transceiver_;
193};
194
195TEST_F(RtpTransceiverTestForHeaderExtensions, OffersChannelManagerList) {
Tommi99c8a802021-04-27 15:00:00 +0200196 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
197 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
198 EXPECT_CALL(*sender_.get(), Stop());
199
Markus Handell755c65d2020-06-24 01:06:10 +0200200 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
201}
202
203TEST_F(RtpTransceiverTestForHeaderExtensions, ModifiesDirection) {
Tommi99c8a802021-04-27 15:00:00 +0200204 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
205 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
206 EXPECT_CALL(*sender_.get(), Stop());
207
Markus Handell755c65d2020-06-24 01:06:10 +0200208 auto modified_extensions = extensions_;
209 modified_extensions[0].direction = RtpTransceiverDirection::kSendOnly;
210 EXPECT_TRUE(
211 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
212 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
213 modified_extensions[0].direction = RtpTransceiverDirection::kRecvOnly;
214 EXPECT_TRUE(
215 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
216 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
217 modified_extensions[0].direction = RtpTransceiverDirection::kSendRecv;
218 EXPECT_TRUE(
219 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
220 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
221 modified_extensions[0].direction = RtpTransceiverDirection::kInactive;
222 EXPECT_TRUE(
223 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
224 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
225}
226
227TEST_F(RtpTransceiverTestForHeaderExtensions, AcceptsStoppedExtension) {
Tommi99c8a802021-04-27 15:00:00 +0200228 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
229 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
230 EXPECT_CALL(*sender_.get(), Stop());
231
Markus Handell755c65d2020-06-24 01:06:10 +0200232 auto modified_extensions = extensions_;
233 modified_extensions[0].direction = RtpTransceiverDirection::kStopped;
234 EXPECT_TRUE(
235 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
236 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
237}
238
239TEST_F(RtpTransceiverTestForHeaderExtensions, RejectsUnsupportedExtension) {
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 std::vector<RtpHeaderExtensionCapability> modified_extensions(
245 {RtpHeaderExtensionCapability("uri3", 1,
246 RtpTransceiverDirection::kSendRecv)});
247 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handellc17bca72021-01-14 17:08:01 +0100248 Property(&RTCError::type, RTCErrorType::UNSUPPORTED_PARAMETER));
Markus Handell755c65d2020-06-24 01:06:10 +0200249 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
250}
251
252TEST_F(RtpTransceiverTestForHeaderExtensions,
253 RejectsStoppedMandatoryExtensions) {
Tommi99c8a802021-04-27 15:00:00 +0200254 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
255 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
256 EXPECT_CALL(*sender_.get(), Stop());
257
Markus Handell755c65d2020-06-24 01:06:10 +0200258 std::vector<RtpHeaderExtensionCapability> modified_extensions = extensions_;
259 // Attempting to stop the mandatory MID extension.
260 modified_extensions[2].direction = RtpTransceiverDirection::kStopped;
261 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
262 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
263 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
264 modified_extensions = extensions_;
265 // Attempting to stop the mandatory video orientation extension.
266 modified_extensions[3].direction = RtpTransceiverDirection::kStopped;
267 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
268 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
269 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
Markus Handell0357b3e2020-03-16 13:40:51 +0100270}
271
Markus Handell5932fe12020-12-17 22:19:40 +0100272TEST_F(RtpTransceiverTestForHeaderExtensions,
273 NoNegotiatedHdrExtsWithoutChannel) {
Tommi99c8a802021-04-27 15:00:00 +0200274 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
275 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
276 EXPECT_CALL(*sender_.get(), Stop());
Markus Handell5932fe12020-12-17 22:19:40 +0100277 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(), ElementsAre());
278}
279
280TEST_F(RtpTransceiverTestForHeaderExtensions,
281 NoNegotiatedHdrExtsWithChannelWithoutNegotiation) {
Tommi99c8a802021-04-27 15:00:00 +0200282 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
283 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
284 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
285 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
286 EXPECT_CALL(*sender_.get(), Stop());
Markus Handell5932fe12020-12-17 22:19:40 +0100287 cricket::MockChannelInterface mock_channel;
Tommi99c8a802021-04-27 15:00:00 +0200288 EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
289 EXPECT_CALL(mock_channel, media_type())
290 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
291 EXPECT_CALL(mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
Markus Handell5932fe12020-12-17 22:19:40 +0100292 transceiver_.SetChannel(&mock_channel);
293 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(), ElementsAre());
294}
295
296TEST_F(RtpTransceiverTestForHeaderExtensions, ReturnsNegotiatedHdrExts) {
Tommi99c8a802021-04-27 15:00:00 +0200297 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
298 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
299 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
300 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
301 EXPECT_CALL(*sender_.get(), Stop());
302
Markus Handell5932fe12020-12-17 22:19:40 +0100303 cricket::MockChannelInterface mock_channel;
Tommi99c8a802021-04-27 15:00:00 +0200304 EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
305 EXPECT_CALL(mock_channel, media_type())
306 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
307 EXPECT_CALL(mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
Tommicc7a3682021-05-04 14:59:38 +0200308
Markus Handell5932fe12020-12-17 22:19:40 +0100309 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
310 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200311 cricket::AudioContentDescription description;
312 description.set_rtp_header_extensions(extensions);
313 transceiver_.OnNegotiationUpdate(SdpType::kAnswer, &description);
314
Markus Handell5932fe12020-12-17 22:19:40 +0100315 transceiver_.SetChannel(&mock_channel);
316 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(),
317 ElementsAre(RtpHeaderExtensionCapability(
318 "uri1", 1, RtpTransceiverDirection::kSendRecv),
319 RtpHeaderExtensionCapability(
320 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
321}
322
323TEST_F(RtpTransceiverTestForHeaderExtensions,
324 ReturnsNegotiatedHdrExtsSecondTime) {
Tommi99c8a802021-04-27 15:00:00 +0200325 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
Tommi99c8a802021-04-27 15:00:00 +0200326 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
327 EXPECT_CALL(*sender_.get(), Stop());
328
Markus Handell5932fe12020-12-17 22:19:40 +0100329 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
330 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200331 cricket::AudioContentDescription description;
332 description.set_rtp_header_extensions(extensions);
333 transceiver_.OnNegotiationUpdate(SdpType::kAnswer, &description);
Markus Handell5932fe12020-12-17 22:19:40 +0100334
Tommicc7a3682021-05-04 14:59:38 +0200335 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(),
336 ElementsAre(RtpHeaderExtensionCapability(
337 "uri1", 1, RtpTransceiverDirection::kSendRecv),
338 RtpHeaderExtensionCapability(
339 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
Markus Handell5932fe12020-12-17 22:19:40 +0100340
341 extensions = {webrtc::RtpExtension("uri3", 4),
342 webrtc::RtpExtension("uri5", 6)};
Tommicc7a3682021-05-04 14:59:38 +0200343 description.set_rtp_header_extensions(extensions);
344 transceiver_.OnNegotiationUpdate(SdpType::kAnswer, &description);
345
Markus Handell5932fe12020-12-17 22:19:40 +0100346 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(),
347 ElementsAre(RtpHeaderExtensionCapability(
348 "uri3", 4, RtpTransceiverDirection::kSendRecv),
349 RtpHeaderExtensionCapability(
350 "uri5", 6, RtpTransceiverDirection::kSendRecv)));
351}
352
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800353} // namespace webrtc