blob: 12b706590a98450d2198cc1ab3f9ab3ac557bdfe [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>
Harald Alvestrand3af79d12022-04-29 15:04:58 +000016#include <utility>
Markus Handell0357b3e2020-03-16 13:40:51 +010017
Harald Alvestrandc24a2182022-02-23 13:44:59 +000018#include "absl/strings/string_view.h"
Markus Handell5932fe12020-12-17 22:19:40 +010019#include "absl/types/optional.h"
20#include "api/rtp_parameters.h"
Markus Handell0357b3e2020-03-16 13:40:51 +010021#include "media/base/fake_media_engine.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000022#include "media/base/media_engine.h"
Steve Anton10542f22019-01-11 09:11:00 -080023#include "pc/test/mock_channel_interface.h"
Markus Handell0357b3e2020-03-16 13:40:51 +010024#include "pc/test/mock_rtp_receiver_internal.h"
25#include "pc/test/mock_rtp_sender_internal.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000026#include "rtc_base/thread.h"
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080027#include "test/gmock.h"
Yves Gerey3e707812018-11-28 16:47:49 +010028#include "test/gtest.h"
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080029
Tommi99c8a802021-04-27 15:00:00 +020030using ::testing::_;
Markus Handell0357b3e2020-03-16 13:40:51 +010031using ::testing::ElementsAre;
Markus Handell5932fe12020-12-17 22:19:40 +010032using ::testing::Optional;
Markus Handell755c65d2020-06-24 01:06:10 +020033using ::testing::Property;
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080034using ::testing::Return;
35using ::testing::ReturnRef;
36
37namespace webrtc {
38
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010039namespace {
40class ChannelManagerForTest : public cricket::ChannelManager {
41 public:
42 ChannelManagerForTest()
43 : cricket::ChannelManager(std::make_unique<cricket::FakeMediaEngine>(),
44 true,
45 rtc::Thread::Current(),
46 rtc::Thread::Current()) {}
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010047};
48} // namespace
49
Artem Titov880fa812021-07-30 22:30:23 +020050// Checks that a channel cannot be set on a stopped `RtpTransceiver`.
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080051TEST(RtpTransceiverTest, CannotSetChannelOnStoppedTransceiver) {
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010052 ChannelManagerForTest cm;
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010053 const std::string content_name("my_mid");
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010054 auto transceiver = rtc::make_ref_counted<RtpTransceiver>(
55 cricket::MediaType::MEDIA_TYPE_AUDIO, &cm);
Harald Alvestrand3af79d12022-04-29 15:04:58 +000056 auto channel1 = std::make_unique<cricket::MockChannelInterface>();
57 EXPECT_CALL(*channel1, media_type())
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080058 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
Harald Alvestrand3af79d12022-04-29 15:04:58 +000059 EXPECT_CALL(*channel1, mid()).WillRepeatedly(ReturnRef(content_name));
60 EXPECT_CALL(*channel1, SetFirstPacketReceivedCallback(_));
61 EXPECT_CALL(*channel1, SetRtpTransport(_)).WillRepeatedly(Return(true));
62 auto channel1_ptr = channel1.get();
63 transceiver->SetChannel(std::move(channel1), [&](const std::string& mid) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010064 EXPECT_EQ(mid, content_name);
65 return nullptr;
66 });
Harald Alvestrand3af79d12022-04-29 15:04:58 +000067 EXPECT_EQ(channel1_ptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080068
69 // Stop the transceiver.
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010070 transceiver->StopInternal();
Harald Alvestrand3af79d12022-04-29 15:04:58 +000071 EXPECT_EQ(channel1_ptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080072
Harald Alvestrand3af79d12022-04-29 15:04:58 +000073 auto channel2 = std::make_unique<cricket::MockChannelInterface>();
74 EXPECT_CALL(*channel2, media_type())
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080075 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
76
Harald Alvestranddaee8702022-04-29 11:42:55 +000077 // Clear the current channel - required to allow SetChannel()
Harald Alvestrand3af79d12022-04-29 15:04:58 +000078 EXPECT_CALL(*channel1_ptr, SetFirstPacketReceivedCallback(_));
Harald Alvestranddaee8702022-04-29 11:42:55 +000079 transceiver->ClearChannel();
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080080 // Channel can no longer be set, so this call should be a no-op.
Harald Alvestrand3af79d12022-04-29 15:04:58 +000081 transceiver->SetChannel(std::move(channel2),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010082 [](const std::string&) { return nullptr; });
Harald Alvestranddaee8702022-04-29 11:42:55 +000083 EXPECT_EQ(nullptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080084}
85
Artem Titov880fa812021-07-30 22:30:23 +020086// Checks that a channel can be unset on a stopped `RtpTransceiver`
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080087TEST(RtpTransceiverTest, CanUnsetChannelOnStoppedTransceiver) {
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010088 ChannelManagerForTest cm;
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010089 const std::string content_name("my_mid");
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010090 auto transceiver = rtc::make_ref_counted<RtpTransceiver>(
91 cricket::MediaType::MEDIA_TYPE_VIDEO, &cm);
Harald Alvestrand3af79d12022-04-29 15:04:58 +000092 auto channel = std::make_unique<cricket::MockChannelInterface>();
93 EXPECT_CALL(*channel, media_type())
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080094 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_VIDEO));
Harald Alvestrand3af79d12022-04-29 15:04:58 +000095 EXPECT_CALL(*channel, mid()).WillRepeatedly(ReturnRef(content_name));
96 EXPECT_CALL(*channel, SetFirstPacketReceivedCallback(_))
Tommi99c8a802021-04-27 15:00:00 +020097 .WillRepeatedly(testing::Return());
Harald Alvestrand3af79d12022-04-29 15:04:58 +000098 EXPECT_CALL(*channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080099
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000100 auto channel_ptr = channel.get();
101 transceiver->SetChannel(std::move(channel), [&](const std::string& mid) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100102 EXPECT_EQ(mid, content_name);
103 return nullptr;
104 });
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000105 EXPECT_EQ(channel_ptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800106
107 // Stop the transceiver.
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100108 transceiver->StopInternal();
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000109 EXPECT_EQ(channel_ptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800110
Artem Titov880fa812021-07-30 22:30:23 +0200111 // Set the channel to `nullptr`.
Harald Alvestrand19ebabc2022-04-28 13:31:17 +0000112 transceiver->ClearChannel();
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100113 EXPECT_EQ(nullptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800114}
115
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000116class RtpTransceiverUnifiedPlanTest : public ::testing::Test {
117 public:
118 RtpTransceiverUnifiedPlanTest()
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100119 : transceiver_(rtc::make_ref_counted<RtpTransceiver>(
120 RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
121 rtc::Thread::Current(),
122 sender_),
123 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
124 rtc::Thread::Current(),
125 rtc::Thread::Current(),
126 receiver_),
127 &channel_manager_,
128 channel_manager_.GetSupportedAudioRtpHeaderExtensions(),
129 /* on_negotiation_needed= */ [] {})) {}
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000130
Tommi99c8a802021-04-27 15:00:00 +0200131 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
132 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
133 EXPECT_CALL(*receiver.get(), media_type())
134 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
135 return receiver;
136 }
137
138 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
139 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
140 EXPECT_CALL(*sender.get(), media_type())
141 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
142 return sender;
143 }
144
145 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
146 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100147 ChannelManagerForTest channel_manager_;
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100148 rtc::scoped_refptr<RtpTransceiver> transceiver_;
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000149};
150
151// Basic tests for Stop()
152TEST_F(RtpTransceiverUnifiedPlanTest, StopSetsDirection) {
Tommi6589def2022-02-17 23:36:47 +0100153 EXPECT_CALL(*receiver_.get(), Stop());
154 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200155 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
156 EXPECT_CALL(*sender_.get(), Stop());
157
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100158 EXPECT_EQ(RtpTransceiverDirection::kInactive, transceiver_->direction());
159 EXPECT_FALSE(transceiver_->current_direction());
160 transceiver_->StopStandard();
161 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_->direction());
162 EXPECT_FALSE(transceiver_->current_direction());
163 transceiver_->StopTransceiverProcedure();
164 EXPECT_TRUE(transceiver_->current_direction());
165 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_->direction());
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000166 EXPECT_EQ(RtpTransceiverDirection::kStopped,
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100167 *transceiver_->current_direction());
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000168}
169
Markus Handell755c65d2020-06-24 01:06:10 +0200170class RtpTransceiverTestForHeaderExtensions : public ::testing::Test {
171 public:
172 RtpTransceiverTestForHeaderExtensions()
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100173 : extensions_(
Markus Handell755c65d2020-06-24 01:06:10 +0200174 {RtpHeaderExtensionCapability("uri1",
175 1,
176 RtpTransceiverDirection::kSendOnly),
177 RtpHeaderExtensionCapability("uri2",
178 2,
179 RtpTransceiverDirection::kRecvOnly),
180 RtpHeaderExtensionCapability(RtpExtension::kMidUri,
181 3,
182 RtpTransceiverDirection::kSendRecv),
183 RtpHeaderExtensionCapability(RtpExtension::kVideoRotationUri,
184 4,
185 RtpTransceiverDirection::kSendRecv)}),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100186 transceiver_(rtc::make_ref_counted<RtpTransceiver>(
187 RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
188 rtc::Thread::Current(),
189 sender_),
190 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
191 rtc::Thread::Current(),
192 rtc::Thread::Current(),
193 receiver_),
194 &channel_manager_,
195 extensions_,
196 /* on_negotiation_needed= */ [] {})) {}
Markus Handell755c65d2020-06-24 01:06:10 +0200197
Tommi99c8a802021-04-27 15:00:00 +0200198 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
199 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
200 EXPECT_CALL(*receiver.get(), media_type())
201 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
202 return receiver;
203 }
204
205 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
206 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
207 EXPECT_CALL(*sender.get(), media_type())
208 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
209 return sender;
210 }
211
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000212 void ClearChannel() {
Tommi6589def2022-02-17 23:36:47 +0100213 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
Harald Alvestrand19ebabc2022-04-28 13:31:17 +0000214 transceiver_->ClearChannel();
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100215 }
216
Tommi99c8a802021-04-27 15:00:00 +0200217 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
218 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
219
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100220 ChannelManagerForTest channel_manager_;
Markus Handell755c65d2020-06-24 01:06:10 +0200221 std::vector<RtpHeaderExtensionCapability> extensions_;
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100222 rtc::scoped_refptr<RtpTransceiver> transceiver_;
Markus Handell755c65d2020-06-24 01:06:10 +0200223};
224
225TEST_F(RtpTransceiverTestForHeaderExtensions, OffersChannelManagerList) {
Tommi6589def2022-02-17 23:36:47 +0100226 EXPECT_CALL(*receiver_.get(), Stop());
227 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200228 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
229 EXPECT_CALL(*sender_.get(), Stop());
230
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100231 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell755c65d2020-06-24 01:06:10 +0200232}
233
234TEST_F(RtpTransceiverTestForHeaderExtensions, ModifiesDirection) {
Tommi6589def2022-02-17 23:36:47 +0100235 EXPECT_CALL(*receiver_.get(), Stop());
236 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200237 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
238 EXPECT_CALL(*sender_.get(), Stop());
239
Markus Handell755c65d2020-06-24 01:06:10 +0200240 auto modified_extensions = extensions_;
241 modified_extensions[0].direction = RtpTransceiverDirection::kSendOnly;
242 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100243 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
244 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200245 modified_extensions[0].direction = RtpTransceiverDirection::kRecvOnly;
246 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100247 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
248 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200249 modified_extensions[0].direction = RtpTransceiverDirection::kSendRecv;
250 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100251 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
252 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200253 modified_extensions[0].direction = RtpTransceiverDirection::kInactive;
254 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100255 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
256 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200257}
258
259TEST_F(RtpTransceiverTestForHeaderExtensions, AcceptsStoppedExtension) {
Tommi6589def2022-02-17 23:36:47 +0100260 EXPECT_CALL(*receiver_.get(), Stop());
261 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200262 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
263 EXPECT_CALL(*sender_.get(), Stop());
264
Markus Handell755c65d2020-06-24 01:06:10 +0200265 auto modified_extensions = extensions_;
266 modified_extensions[0].direction = RtpTransceiverDirection::kStopped;
267 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100268 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
269 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200270}
271
272TEST_F(RtpTransceiverTestForHeaderExtensions, RejectsUnsupportedExtension) {
Tommi6589def2022-02-17 23:36:47 +0100273 EXPECT_CALL(*receiver_.get(), Stop());
274 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200275 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
276 EXPECT_CALL(*sender_.get(), Stop());
277
Markus Handell755c65d2020-06-24 01:06:10 +0200278 std::vector<RtpHeaderExtensionCapability> modified_extensions(
279 {RtpHeaderExtensionCapability("uri3", 1,
280 RtpTransceiverDirection::kSendRecv)});
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100281 EXPECT_THAT(transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handellc17bca72021-01-14 17:08:01 +0100282 Property(&RTCError::type, RTCErrorType::UNSUPPORTED_PARAMETER));
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100283 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell755c65d2020-06-24 01:06:10 +0200284}
285
286TEST_F(RtpTransceiverTestForHeaderExtensions,
287 RejectsStoppedMandatoryExtensions) {
Tommi6589def2022-02-17 23:36:47 +0100288 EXPECT_CALL(*receiver_.get(), Stop());
289 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200290 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
291 EXPECT_CALL(*sender_.get(), Stop());
292
Markus Handell755c65d2020-06-24 01:06:10 +0200293 std::vector<RtpHeaderExtensionCapability> modified_extensions = extensions_;
294 // Attempting to stop the mandatory MID extension.
295 modified_extensions[2].direction = RtpTransceiverDirection::kStopped;
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100296 EXPECT_THAT(transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handell755c65d2020-06-24 01:06:10 +0200297 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100298 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell755c65d2020-06-24 01:06:10 +0200299 modified_extensions = extensions_;
300 // Attempting to stop the mandatory video orientation extension.
301 modified_extensions[3].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 Handell0357b3e2020-03-16 13:40:51 +0100305}
306
Markus Handell5932fe12020-12-17 22:19:40 +0100307TEST_F(RtpTransceiverTestForHeaderExtensions,
308 NoNegotiatedHdrExtsWithoutChannel) {
Tommi6589def2022-02-17 23:36:47 +0100309 EXPECT_CALL(*receiver_.get(), Stop());
310 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200311 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
312 EXPECT_CALL(*sender_.get(), Stop());
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100313 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(), ElementsAre());
Markus Handell5932fe12020-12-17 22:19:40 +0100314}
315
316TEST_F(RtpTransceiverTestForHeaderExtensions,
317 NoNegotiatedHdrExtsWithChannelWithoutNegotiation) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100318 const std::string content_name("my_mid");
Tommi6589def2022-02-17 23:36:47 +0100319 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_)).WillRepeatedly(Return());
320 EXPECT_CALL(*receiver_.get(), Stop()).WillRepeatedly(Return());
Tommi99c8a802021-04-27 15:00:00 +0200321 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
322 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
323 EXPECT_CALL(*sender_.get(), Stop());
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000324 auto mock_channel = std::make_unique<cricket::MockChannelInterface>();
325 auto mock_channel_ptr = mock_channel.get();
326 EXPECT_CALL(*mock_channel, SetFirstPacketReceivedCallback(_));
327 EXPECT_CALL(*mock_channel, media_type())
Tommi99c8a802021-04-27 15:00:00 +0200328 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000329 EXPECT_CALL(*mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
330 EXPECT_CALL(*mock_channel, mid()).WillRepeatedly(ReturnRef(content_name));
331 EXPECT_CALL(*mock_channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
332 transceiver_->SetChannel(std::move(mock_channel),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100333 [](const std::string&) { return nullptr; });
334 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(), ElementsAre());
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100335
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000336 EXPECT_CALL(*mock_channel_ptr, SetFirstPacketReceivedCallback(_));
337 ClearChannel();
Markus Handell5932fe12020-12-17 22:19:40 +0100338}
339
340TEST_F(RtpTransceiverTestForHeaderExtensions, ReturnsNegotiatedHdrExts) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100341 const std::string content_name("my_mid");
Tommi6589def2022-02-17 23:36:47 +0100342 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_)).WillRepeatedly(Return());
343 EXPECT_CALL(*receiver_.get(), Stop()).WillRepeatedly(Return());
Tommi99c8a802021-04-27 15:00:00 +0200344 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
345 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
346 EXPECT_CALL(*sender_.get(), Stop());
347
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000348 auto mock_channel = std::make_unique<cricket::MockChannelInterface>();
349 auto mock_channel_ptr = mock_channel.get();
350 EXPECT_CALL(*mock_channel, SetFirstPacketReceivedCallback(_));
351 EXPECT_CALL(*mock_channel, media_type())
Tommi99c8a802021-04-27 15:00:00 +0200352 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000353 EXPECT_CALL(*mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
354 EXPECT_CALL(*mock_channel, mid()).WillRepeatedly(ReturnRef(content_name));
355 EXPECT_CALL(*mock_channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
Tommicc7a3682021-05-04 14:59:38 +0200356
Markus Handell5932fe12020-12-17 22:19:40 +0100357 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
358 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200359 cricket::AudioContentDescription description;
360 description.set_rtp_header_extensions(extensions);
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100361 transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
Tommicc7a3682021-05-04 14:59:38 +0200362
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000363 transceiver_->SetChannel(std::move(mock_channel),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100364 [](const std::string&) { return nullptr; });
365 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
Markus Handell5932fe12020-12-17 22:19:40 +0100366 ElementsAre(RtpHeaderExtensionCapability(
367 "uri1", 1, RtpTransceiverDirection::kSendRecv),
368 RtpHeaderExtensionCapability(
369 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100370
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000371 EXPECT_CALL(*mock_channel_ptr, SetFirstPacketReceivedCallback(_));
372 ClearChannel();
Markus Handell5932fe12020-12-17 22:19:40 +0100373}
374
375TEST_F(RtpTransceiverTestForHeaderExtensions,
376 ReturnsNegotiatedHdrExtsSecondTime) {
Tommi6589def2022-02-17 23:36:47 +0100377 EXPECT_CALL(*receiver_.get(), Stop());
378 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200379 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
380 EXPECT_CALL(*sender_.get(), Stop());
381
Markus Handell5932fe12020-12-17 22:19:40 +0100382 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
383 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200384 cricket::AudioContentDescription description;
385 description.set_rtp_header_extensions(extensions);
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100386 transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
Markus Handell5932fe12020-12-17 22:19:40 +0100387
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100388 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
Tommicc7a3682021-05-04 14:59:38 +0200389 ElementsAre(RtpHeaderExtensionCapability(
390 "uri1", 1, RtpTransceiverDirection::kSendRecv),
391 RtpHeaderExtensionCapability(
392 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
Markus Handell5932fe12020-12-17 22:19:40 +0100393
394 extensions = {webrtc::RtpExtension("uri3", 4),
395 webrtc::RtpExtension("uri5", 6)};
Tommicc7a3682021-05-04 14:59:38 +0200396 description.set_rtp_header_extensions(extensions);
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100397 transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
Tommicc7a3682021-05-04 14:59:38 +0200398
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100399 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
Markus Handell5932fe12020-12-17 22:19:40 +0100400 ElementsAre(RtpHeaderExtensionCapability(
401 "uri3", 4, RtpTransceiverDirection::kSendRecv),
402 RtpHeaderExtensionCapability(
403 "uri5", 6, RtpTransceiverDirection::kSendRecv)));
404}
405
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800406} // namespace webrtc