blob: d63af9216963489543c3ee4aea53caae8fc2c773 [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
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010035namespace {
36class ChannelManagerForTest : public cricket::ChannelManager {
37 public:
38 ChannelManagerForTest()
39 : cricket::ChannelManager(std::make_unique<cricket::FakeMediaEngine>(),
40 true,
41 rtc::Thread::Current(),
42 rtc::Thread::Current()) {}
43
44 MOCK_METHOD(void, DestroyChannel, (cricket::ChannelInterface*), (override));
45};
46} // namespace
47
Artem Titov880fa812021-07-30 22:30:23 +020048// Checks that a channel cannot be set on a stopped `RtpTransceiver`.
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080049TEST(RtpTransceiverTest, CannotSetChannelOnStoppedTransceiver) {
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010050 ChannelManagerForTest cm;
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010051 const std::string content_name("my_mid");
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010052 RtpTransceiver transceiver(cricket::MediaType::MEDIA_TYPE_AUDIO, &cm);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080053 cricket::MockChannelInterface channel1;
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080054 EXPECT_CALL(channel1, media_type())
55 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
Tomas Gunnarsson5411b172022-01-24 08:45:26 +010056 EXPECT_CALL(channel1, mid()).WillRepeatedly(ReturnRef(content_name));
Tommi99c8a802021-04-27 15:00:00 +020057 EXPECT_CALL(channel1, SetFirstPacketReceivedCallback(_));
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010058 EXPECT_CALL(channel1, SetRtpTransport(_)).WillRepeatedly(Return(true));
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080059
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010060 transceiver.SetChannel(&channel1, [&](const std::string& mid) {
61 EXPECT_EQ(mid, content_name);
62 return nullptr;
63 });
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080064 EXPECT_EQ(&channel1, transceiver.channel());
65
66 // Stop the transceiver.
Harald Alvestrand6060df52020-08-11 09:54:02 +020067 transceiver.StopInternal();
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080068 EXPECT_EQ(&channel1, transceiver.channel());
69
70 cricket::MockChannelInterface channel2;
71 EXPECT_CALL(channel2, media_type())
72 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
73
74 // Channel can no longer be set, so this call should be a no-op.
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010075 transceiver.SetChannel(&channel2, [](const std::string&) { return nullptr; });
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080076 EXPECT_EQ(&channel1, transceiver.channel());
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010077
78 // Clear the current channel before `transceiver` goes out of scope.
79 EXPECT_CALL(channel1, SetFirstPacketReceivedCallback(_));
80 EXPECT_CALL(cm, DestroyChannel(&channel1)).WillRepeatedly(testing::Return());
81 transceiver.SetChannel(nullptr, nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080082}
83
Artem Titov880fa812021-07-30 22:30:23 +020084// Checks that a channel can be unset on a stopped `RtpTransceiver`
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080085TEST(RtpTransceiverTest, CanUnsetChannelOnStoppedTransceiver) {
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010086 ChannelManagerForTest cm;
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010087 const std::string content_name("my_mid");
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010088 RtpTransceiver transceiver(cricket::MediaType::MEDIA_TYPE_VIDEO, &cm);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080089 cricket::MockChannelInterface channel;
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080090 EXPECT_CALL(channel, media_type())
91 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_VIDEO));
Tomas Gunnarsson5411b172022-01-24 08:45:26 +010092 EXPECT_CALL(channel, mid()).WillRepeatedly(ReturnRef(content_name));
Tommi99c8a802021-04-27 15:00:00 +020093 EXPECT_CALL(channel, SetFirstPacketReceivedCallback(_))
94 .WillRepeatedly(testing::Return());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010095 EXPECT_CALL(channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010096 EXPECT_CALL(cm, DestroyChannel(&channel)).WillRepeatedly(testing::Return());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080097
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010098 transceiver.SetChannel(&channel, [&](const std::string& mid) {
99 EXPECT_EQ(mid, content_name);
100 return nullptr;
101 });
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800102 EXPECT_EQ(&channel, transceiver.channel());
103
104 // Stop the transceiver.
Harald Alvestrand6060df52020-08-11 09:54:02 +0200105 transceiver.StopInternal();
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800106 EXPECT_EQ(&channel, transceiver.channel());
107
Artem Titov880fa812021-07-30 22:30:23 +0200108 // Set the channel to `nullptr`.
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100109 transceiver.SetChannel(nullptr, nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800110 EXPECT_EQ(nullptr, transceiver.channel());
111}
112
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000113class RtpTransceiverUnifiedPlanTest : public ::testing::Test {
114 public:
115 RtpTransceiverUnifiedPlanTest()
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100116 : transceiver_(RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000117 rtc::Thread::Current(),
Tommi99c8a802021-04-27 15:00:00 +0200118 sender_),
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000119 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
120 rtc::Thread::Current(),
Tommi4ccdf932021-05-17 14:50:10 +0200121 rtc::Thread::Current(),
Tommi99c8a802021-04-27 15:00:00 +0200122 receiver_),
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100123 &channel_manager_,
124 channel_manager_.GetSupportedAudioRtpHeaderExtensions(),
Harald Alvestrand280054f2020-11-10 13:12:53 +0000125 /* on_negotiation_needed= */ [] {}) {}
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000126
Tommi99c8a802021-04-27 15:00:00 +0200127 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
128 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
129 EXPECT_CALL(*receiver.get(), media_type())
130 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
131 return receiver;
132 }
133
134 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
135 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
136 EXPECT_CALL(*sender.get(), media_type())
137 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
138 return sender;
139 }
140
141 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
142 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100143 ChannelManagerForTest channel_manager_;
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000144 RtpTransceiver transceiver_;
145};
146
147// Basic tests for Stop()
148TEST_F(RtpTransceiverUnifiedPlanTest, StopSetsDirection) {
Tommi99c8a802021-04-27 15:00:00 +0200149 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
150 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
151 EXPECT_CALL(*sender_.get(), Stop());
152
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000153 EXPECT_EQ(RtpTransceiverDirection::kInactive, transceiver_.direction());
154 EXPECT_FALSE(transceiver_.current_direction());
155 transceiver_.StopStandard();
156 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_.direction());
157 EXPECT_FALSE(transceiver_.current_direction());
158 transceiver_.StopTransceiverProcedure();
159 EXPECT_TRUE(transceiver_.current_direction());
160 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_.direction());
161 EXPECT_EQ(RtpTransceiverDirection::kStopped,
162 *transceiver_.current_direction());
163}
164
Markus Handell755c65d2020-06-24 01:06:10 +0200165class RtpTransceiverTestForHeaderExtensions : public ::testing::Test {
166 public:
167 RtpTransceiverTestForHeaderExtensions()
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100168 : extensions_(
Markus Handell755c65d2020-06-24 01:06:10 +0200169 {RtpHeaderExtensionCapability("uri1",
170 1,
171 RtpTransceiverDirection::kSendOnly),
172 RtpHeaderExtensionCapability("uri2",
173 2,
174 RtpTransceiverDirection::kRecvOnly),
175 RtpHeaderExtensionCapability(RtpExtension::kMidUri,
176 3,
177 RtpTransceiverDirection::kSendRecv),
178 RtpHeaderExtensionCapability(RtpExtension::kVideoRotationUri,
179 4,
180 RtpTransceiverDirection::kSendRecv)}),
181 transceiver_(RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
182 rtc::Thread::Current(),
Tommi99c8a802021-04-27 15:00:00 +0200183 sender_),
Markus Handell755c65d2020-06-24 01:06:10 +0200184 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
185 rtc::Thread::Current(),
Tommi4ccdf932021-05-17 14:50:10 +0200186 rtc::Thread::Current(),
Tommi99c8a802021-04-27 15:00:00 +0200187 receiver_),
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100188 &channel_manager_,
Harald Alvestrand280054f2020-11-10 13:12:53 +0000189 extensions_,
190 /* on_negotiation_needed= */ [] {}) {}
Markus Handell755c65d2020-06-24 01:06:10 +0200191
Tommi99c8a802021-04-27 15:00:00 +0200192 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
193 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
194 EXPECT_CALL(*receiver.get(), media_type())
195 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
196 return receiver;
197 }
198
199 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
200 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
201 EXPECT_CALL(*sender.get(), media_type())
202 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
203 return sender;
204 }
205
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100206 void ClearChannel(cricket::MockChannelInterface& mock_channel) {
207 EXPECT_CALL(*sender_.get(), SetMediaChannel(nullptr));
208 EXPECT_CALL(*receiver_.get(), Stop());
209 EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
210 EXPECT_CALL(channel_manager_, DestroyChannel(&mock_channel))
211 .WillRepeatedly(testing::Return());
212 transceiver_.SetChannel(nullptr, nullptr);
213 }
214
Tommi99c8a802021-04-27 15:00:00 +0200215 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
216 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
217
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100218 ChannelManagerForTest channel_manager_;
Markus Handell755c65d2020-06-24 01:06:10 +0200219 std::vector<RtpHeaderExtensionCapability> extensions_;
220 RtpTransceiver transceiver_;
221};
222
223TEST_F(RtpTransceiverTestForHeaderExtensions, OffersChannelManagerList) {
Tommi99c8a802021-04-27 15:00:00 +0200224 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
225 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
226 EXPECT_CALL(*sender_.get(), Stop());
227
Markus Handell755c65d2020-06-24 01:06:10 +0200228 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
229}
230
231TEST_F(RtpTransceiverTestForHeaderExtensions, ModifiesDirection) {
Tommi99c8a802021-04-27 15:00:00 +0200232 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
233 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
234 EXPECT_CALL(*sender_.get(), Stop());
235
Markus Handell755c65d2020-06-24 01:06:10 +0200236 auto modified_extensions = extensions_;
237 modified_extensions[0].direction = RtpTransceiverDirection::kSendOnly;
238 EXPECT_TRUE(
239 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
240 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
241 modified_extensions[0].direction = RtpTransceiverDirection::kRecvOnly;
242 EXPECT_TRUE(
243 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
244 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
245 modified_extensions[0].direction = RtpTransceiverDirection::kSendRecv;
246 EXPECT_TRUE(
247 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
248 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
249 modified_extensions[0].direction = RtpTransceiverDirection::kInactive;
250 EXPECT_TRUE(
251 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
252 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
253}
254
255TEST_F(RtpTransceiverTestForHeaderExtensions, AcceptsStoppedExtension) {
Tommi99c8a802021-04-27 15:00:00 +0200256 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
257 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
258 EXPECT_CALL(*sender_.get(), Stop());
259
Markus Handell755c65d2020-06-24 01:06:10 +0200260 auto modified_extensions = extensions_;
261 modified_extensions[0].direction = RtpTransceiverDirection::kStopped;
262 EXPECT_TRUE(
263 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
264 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
265}
266
267TEST_F(RtpTransceiverTestForHeaderExtensions, RejectsUnsupportedExtension) {
Tommi99c8a802021-04-27 15:00:00 +0200268 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
269 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
270 EXPECT_CALL(*sender_.get(), Stop());
271
Markus Handell755c65d2020-06-24 01:06:10 +0200272 std::vector<RtpHeaderExtensionCapability> modified_extensions(
273 {RtpHeaderExtensionCapability("uri3", 1,
274 RtpTransceiverDirection::kSendRecv)});
275 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handellc17bca72021-01-14 17:08:01 +0100276 Property(&RTCError::type, RTCErrorType::UNSUPPORTED_PARAMETER));
Markus Handell755c65d2020-06-24 01:06:10 +0200277 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
278}
279
280TEST_F(RtpTransceiverTestForHeaderExtensions,
281 RejectsStoppedMandatoryExtensions) {
Tommi99c8a802021-04-27 15:00:00 +0200282 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
283 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
284 EXPECT_CALL(*sender_.get(), Stop());
285
Markus Handell755c65d2020-06-24 01:06:10 +0200286 std::vector<RtpHeaderExtensionCapability> modified_extensions = extensions_;
287 // Attempting to stop the mandatory MID extension.
288 modified_extensions[2].direction = RtpTransceiverDirection::kStopped;
289 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
290 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
291 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
292 modified_extensions = extensions_;
293 // Attempting to stop the mandatory video orientation extension.
294 modified_extensions[3].direction = RtpTransceiverDirection::kStopped;
295 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
296 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
297 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
Markus Handell0357b3e2020-03-16 13:40:51 +0100298}
299
Markus Handell5932fe12020-12-17 22:19:40 +0100300TEST_F(RtpTransceiverTestForHeaderExtensions,
301 NoNegotiatedHdrExtsWithoutChannel) {
Tommi99c8a802021-04-27 15:00:00 +0200302 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
303 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
304 EXPECT_CALL(*sender_.get(), Stop());
Markus Handell5932fe12020-12-17 22:19:40 +0100305 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(), ElementsAre());
306}
307
308TEST_F(RtpTransceiverTestForHeaderExtensions,
309 NoNegotiatedHdrExtsWithChannelWithoutNegotiation) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100310 const std::string content_name("my_mid");
Tommi99c8a802021-04-27 15:00:00 +0200311 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
312 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
313 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
314 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
315 EXPECT_CALL(*sender_.get(), Stop());
Markus Handell5932fe12020-12-17 22:19:40 +0100316 cricket::MockChannelInterface mock_channel;
Tommi99c8a802021-04-27 15:00:00 +0200317 EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
318 EXPECT_CALL(mock_channel, media_type())
319 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
320 EXPECT_CALL(mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
Tomas Gunnarsson5411b172022-01-24 08:45:26 +0100321 EXPECT_CALL(mock_channel, mid()).WillRepeatedly(ReturnRef(content_name));
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100322 EXPECT_CALL(mock_channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
323 transceiver_.SetChannel(&mock_channel,
324 [](const std::string&) { return nullptr; });
Markus Handell5932fe12020-12-17 22:19:40 +0100325 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(), ElementsAre());
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100326
327 ClearChannel(mock_channel);
Markus Handell5932fe12020-12-17 22:19:40 +0100328}
329
330TEST_F(RtpTransceiverTestForHeaderExtensions, ReturnsNegotiatedHdrExts) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100331 const std::string content_name("my_mid");
Tommi99c8a802021-04-27 15:00:00 +0200332 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
333 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
334 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
335 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
336 EXPECT_CALL(*sender_.get(), Stop());
337
Markus Handell5932fe12020-12-17 22:19:40 +0100338 cricket::MockChannelInterface mock_channel;
Tommi99c8a802021-04-27 15:00:00 +0200339 EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
340 EXPECT_CALL(mock_channel, media_type())
341 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
342 EXPECT_CALL(mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
Tomas Gunnarsson5411b172022-01-24 08:45:26 +0100343 EXPECT_CALL(mock_channel, mid()).WillRepeatedly(ReturnRef(content_name));
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100344 EXPECT_CALL(mock_channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
Tommicc7a3682021-05-04 14:59:38 +0200345
Markus Handell5932fe12020-12-17 22:19:40 +0100346 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
347 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200348 cricket::AudioContentDescription description;
349 description.set_rtp_header_extensions(extensions);
350 transceiver_.OnNegotiationUpdate(SdpType::kAnswer, &description);
351
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100352 transceiver_.SetChannel(&mock_channel,
353 [](const std::string&) { return nullptr; });
Markus Handell5932fe12020-12-17 22:19:40 +0100354 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(),
355 ElementsAre(RtpHeaderExtensionCapability(
356 "uri1", 1, RtpTransceiverDirection::kSendRecv),
357 RtpHeaderExtensionCapability(
358 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100359
360 ClearChannel(mock_channel);
Markus Handell5932fe12020-12-17 22:19:40 +0100361}
362
363TEST_F(RtpTransceiverTestForHeaderExtensions,
364 ReturnsNegotiatedHdrExtsSecondTime) {
Tommi99c8a802021-04-27 15:00:00 +0200365 EXPECT_CALL(*receiver_.get(), StopAndEndTrack());
Tommi99c8a802021-04-27 15:00:00 +0200366 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
367 EXPECT_CALL(*sender_.get(), Stop());
368
Markus Handell5932fe12020-12-17 22:19:40 +0100369 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
370 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200371 cricket::AudioContentDescription description;
372 description.set_rtp_header_extensions(extensions);
373 transceiver_.OnNegotiationUpdate(SdpType::kAnswer, &description);
Markus Handell5932fe12020-12-17 22:19:40 +0100374
Tommicc7a3682021-05-04 14:59:38 +0200375 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(),
376 ElementsAre(RtpHeaderExtensionCapability(
377 "uri1", 1, RtpTransceiverDirection::kSendRecv),
378 RtpHeaderExtensionCapability(
379 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
Markus Handell5932fe12020-12-17 22:19:40 +0100380
381 extensions = {webrtc::RtpExtension("uri3", 4),
382 webrtc::RtpExtension("uri5", 6)};
Tommicc7a3682021-05-04 14:59:38 +0200383 description.set_rtp_header_extensions(extensions);
384 transceiver_.OnNegotiationUpdate(SdpType::kAnswer, &description);
385
Markus Handell5932fe12020-12-17 22:19:40 +0100386 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(),
387 ElementsAre(RtpHeaderExtensionCapability(
388 "uri3", 4, RtpTransceiverDirection::kSendRecv),
389 RtpHeaderExtensionCapability(
390 "uri5", 6, RtpTransceiverDirection::kSendRecv)));
391}
392
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800393} // namespace webrtc