blob: 680fe111a120e39c6a71bb8077483e80beccc0c1 [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"
Harald Alvestrand9e334b72022-05-04 13:38:31 +000023#include "pc/channel_manager.h"
Steve Anton10542f22019-01-11 09:11:00 -080024#include "pc/test/mock_channel_interface.h"
Markus Handell0357b3e2020-03-16 13:40:51 +010025#include "pc/test/mock_rtp_receiver_internal.h"
26#include "pc/test/mock_rtp_sender_internal.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000027#include "rtc_base/thread.h"
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080028#include "test/gmock.h"
Yves Gerey3e707812018-11-28 16:47:49 +010029#include "test/gtest.h"
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080030
Tommi99c8a802021-04-27 15:00:00 +020031using ::testing::_;
Markus Handell0357b3e2020-03-16 13:40:51 +010032using ::testing::ElementsAre;
Markus Handell5932fe12020-12-17 22:19:40 +010033using ::testing::Optional;
Markus Handell755c65d2020-06-24 01:06:10 +020034using ::testing::Property;
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080035using ::testing::Return;
36using ::testing::ReturnRef;
37
38namespace webrtc {
39
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010040namespace {
Harald Alvestrand0ac50b92022-05-18 07:51:34 +000041
42class RtpTransceiverTest : public testing::Test {
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010043 public:
Harald Alvestrand0ac50b92022-05-18 07:51:34 +000044 RtpTransceiverTest()
45 : channel_manager_(
46 cricket::ChannelManager::Create(&fake_media_engine_,
47 &ssrc_generator_,
48 true,
49 rtc::Thread::Current(),
50 rtc::Thread::Current())) {}
51
52 protected:
53 cricket::ChannelManager* channel_manager() { return channel_manager_.get(); }
54
55 private:
56 cricket::FakeMediaEngine fake_media_engine_;
57 rtc::UniqueRandomIdGenerator ssrc_generator_;
58 std::unique_ptr<cricket::ChannelManager> channel_manager_;
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010059};
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010060
Artem Titov880fa812021-07-30 22:30:23 +020061// Checks that a channel cannot be set on a stopped `RtpTransceiver`.
Harald Alvestrand0ac50b92022-05-18 07:51:34 +000062TEST_F(RtpTransceiverTest, CannotSetChannelOnStoppedTransceiver) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010063 const std::string content_name("my_mid");
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010064 auto transceiver = rtc::make_ref_counted<RtpTransceiver>(
Harald Alvestrand0ac50b92022-05-18 07:51:34 +000065 cricket::MediaType::MEDIA_TYPE_AUDIO, channel_manager());
Harald Alvestrand3af79d12022-04-29 15:04:58 +000066 auto channel1 = std::make_unique<cricket::MockChannelInterface>();
67 EXPECT_CALL(*channel1, media_type())
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080068 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
Harald Alvestrand3af79d12022-04-29 15:04:58 +000069 EXPECT_CALL(*channel1, mid()).WillRepeatedly(ReturnRef(content_name));
70 EXPECT_CALL(*channel1, SetFirstPacketReceivedCallback(_));
71 EXPECT_CALL(*channel1, SetRtpTransport(_)).WillRepeatedly(Return(true));
72 auto channel1_ptr = channel1.get();
73 transceiver->SetChannel(std::move(channel1), [&](const std::string& mid) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010074 EXPECT_EQ(mid, content_name);
75 return nullptr;
76 });
Harald Alvestrand3af79d12022-04-29 15:04:58 +000077 EXPECT_EQ(channel1_ptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080078
79 // Stop the transceiver.
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010080 transceiver->StopInternal();
Harald Alvestrand3af79d12022-04-29 15:04:58 +000081 EXPECT_EQ(channel1_ptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080082
Harald Alvestrand3af79d12022-04-29 15:04:58 +000083 auto channel2 = std::make_unique<cricket::MockChannelInterface>();
84 EXPECT_CALL(*channel2, media_type())
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080085 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
86
Harald Alvestranddaee8702022-04-29 11:42:55 +000087 // Clear the current channel - required to allow SetChannel()
Harald Alvestrand3af79d12022-04-29 15:04:58 +000088 EXPECT_CALL(*channel1_ptr, SetFirstPacketReceivedCallback(_));
Harald Alvestranddaee8702022-04-29 11:42:55 +000089 transceiver->ClearChannel();
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080090 // Channel can no longer be set, so this call should be a no-op.
Harald Alvestrand3af79d12022-04-29 15:04:58 +000091 transceiver->SetChannel(std::move(channel2),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010092 [](const std::string&) { return nullptr; });
Harald Alvestranddaee8702022-04-29 11:42:55 +000093 EXPECT_EQ(nullptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080094}
95
Artem Titov880fa812021-07-30 22:30:23 +020096// Checks that a channel can be unset on a stopped `RtpTransceiver`
Harald Alvestrand0ac50b92022-05-18 07:51:34 +000097TEST_F(RtpTransceiverTest, CanUnsetChannelOnStoppedTransceiver) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010098 const std::string content_name("my_mid");
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010099 auto transceiver = rtc::make_ref_counted<RtpTransceiver>(
Harald Alvestrand0ac50b92022-05-18 07:51:34 +0000100 cricket::MediaType::MEDIA_TYPE_VIDEO, channel_manager());
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000101 auto channel = std::make_unique<cricket::MockChannelInterface>();
102 EXPECT_CALL(*channel, media_type())
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800103 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_VIDEO));
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000104 EXPECT_CALL(*channel, mid()).WillRepeatedly(ReturnRef(content_name));
105 EXPECT_CALL(*channel, SetFirstPacketReceivedCallback(_))
Tommi99c8a802021-04-27 15:00:00 +0200106 .WillRepeatedly(testing::Return());
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000107 EXPECT_CALL(*channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800108
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000109 auto channel_ptr = channel.get();
110 transceiver->SetChannel(std::move(channel), [&](const std::string& mid) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100111 EXPECT_EQ(mid, content_name);
112 return nullptr;
113 });
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000114 EXPECT_EQ(channel_ptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800115
116 // Stop the transceiver.
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100117 transceiver->StopInternal();
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000118 EXPECT_EQ(channel_ptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800119
Artem Titov880fa812021-07-30 22:30:23 +0200120 // Set the channel to `nullptr`.
Harald Alvestrand19ebabc2022-04-28 13:31:17 +0000121 transceiver->ClearChannel();
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100122 EXPECT_EQ(nullptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800123}
124
Harald Alvestrand0ac50b92022-05-18 07:51:34 +0000125class RtpTransceiverUnifiedPlanTest : public RtpTransceiverTest {
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000126 public:
127 RtpTransceiverUnifiedPlanTest()
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100128 : transceiver_(rtc::make_ref_counted<RtpTransceiver>(
129 RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
130 rtc::Thread::Current(),
131 sender_),
132 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
133 rtc::Thread::Current(),
134 rtc::Thread::Current(),
135 receiver_),
Harald Alvestrand0ac50b92022-05-18 07:51:34 +0000136 channel_manager(),
137 channel_manager()->media_engine()->voice().GetRtpHeaderExtensions(),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100138 /* on_negotiation_needed= */ [] {})) {}
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000139
Tommi99c8a802021-04-27 15:00:00 +0200140 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
141 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
142 EXPECT_CALL(*receiver.get(), media_type())
143 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
144 return receiver;
145 }
146
147 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
148 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
149 EXPECT_CALL(*sender.get(), media_type())
150 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
151 return sender;
152 }
153
154 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
155 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100156 rtc::scoped_refptr<RtpTransceiver> transceiver_;
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000157};
158
159// Basic tests for Stop()
160TEST_F(RtpTransceiverUnifiedPlanTest, StopSetsDirection) {
Tommi6589def2022-02-17 23:36:47 +0100161 EXPECT_CALL(*receiver_.get(), Stop());
162 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200163 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
164 EXPECT_CALL(*sender_.get(), Stop());
165
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100166 EXPECT_EQ(RtpTransceiverDirection::kInactive, transceiver_->direction());
167 EXPECT_FALSE(transceiver_->current_direction());
168 transceiver_->StopStandard();
169 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_->direction());
170 EXPECT_FALSE(transceiver_->current_direction());
171 transceiver_->StopTransceiverProcedure();
172 EXPECT_TRUE(transceiver_->current_direction());
173 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_->direction());
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000174 EXPECT_EQ(RtpTransceiverDirection::kStopped,
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100175 *transceiver_->current_direction());
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000176}
177
Harald Alvestrand0ac50b92022-05-18 07:51:34 +0000178class RtpTransceiverTestForHeaderExtensions : public RtpTransceiverTest {
Markus Handell755c65d2020-06-24 01:06:10 +0200179 public:
180 RtpTransceiverTestForHeaderExtensions()
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100181 : extensions_(
Markus Handell755c65d2020-06-24 01:06:10 +0200182 {RtpHeaderExtensionCapability("uri1",
183 1,
184 RtpTransceiverDirection::kSendOnly),
185 RtpHeaderExtensionCapability("uri2",
186 2,
187 RtpTransceiverDirection::kRecvOnly),
188 RtpHeaderExtensionCapability(RtpExtension::kMidUri,
189 3,
190 RtpTransceiverDirection::kSendRecv),
191 RtpHeaderExtensionCapability(RtpExtension::kVideoRotationUri,
192 4,
193 RtpTransceiverDirection::kSendRecv)}),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100194 transceiver_(rtc::make_ref_counted<RtpTransceiver>(
195 RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
196 rtc::Thread::Current(),
197 sender_),
198 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
199 rtc::Thread::Current(),
200 rtc::Thread::Current(),
201 receiver_),
Harald Alvestrand0ac50b92022-05-18 07:51:34 +0000202 channel_manager(),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100203 extensions_,
204 /* on_negotiation_needed= */ [] {})) {}
Markus Handell755c65d2020-06-24 01:06:10 +0200205
Tommi99c8a802021-04-27 15:00:00 +0200206 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
207 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
208 EXPECT_CALL(*receiver.get(), media_type())
209 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
210 return receiver;
211 }
212
213 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
214 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
215 EXPECT_CALL(*sender.get(), media_type())
216 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
217 return sender;
218 }
219
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000220 void ClearChannel() {
Tommi6589def2022-02-17 23:36:47 +0100221 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
Harald Alvestrand19ebabc2022-04-28 13:31:17 +0000222 transceiver_->ClearChannel();
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100223 }
224
Tommi99c8a802021-04-27 15:00:00 +0200225 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
226 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
227
Markus Handell755c65d2020-06-24 01:06:10 +0200228 std::vector<RtpHeaderExtensionCapability> extensions_;
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100229 rtc::scoped_refptr<RtpTransceiver> transceiver_;
Markus Handell755c65d2020-06-24 01:06:10 +0200230};
231
232TEST_F(RtpTransceiverTestForHeaderExtensions, OffersChannelManagerList) {
Tommi6589def2022-02-17 23:36:47 +0100233 EXPECT_CALL(*receiver_.get(), Stop());
234 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200235 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
236 EXPECT_CALL(*sender_.get(), Stop());
237
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100238 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell755c65d2020-06-24 01:06:10 +0200239}
240
241TEST_F(RtpTransceiverTestForHeaderExtensions, ModifiesDirection) {
Tommi6589def2022-02-17 23:36:47 +0100242 EXPECT_CALL(*receiver_.get(), Stop());
243 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200244 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
245 EXPECT_CALL(*sender_.get(), Stop());
246
Markus Handell755c65d2020-06-24 01:06:10 +0200247 auto modified_extensions = extensions_;
248 modified_extensions[0].direction = RtpTransceiverDirection::kSendOnly;
249 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100250 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
251 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200252 modified_extensions[0].direction = RtpTransceiverDirection::kRecvOnly;
253 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100254 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
255 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200256 modified_extensions[0].direction = RtpTransceiverDirection::kSendRecv;
257 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100258 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
259 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200260 modified_extensions[0].direction = RtpTransceiverDirection::kInactive;
261 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100262 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
263 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200264}
265
266TEST_F(RtpTransceiverTestForHeaderExtensions, AcceptsStoppedExtension) {
Tommi6589def2022-02-17 23:36:47 +0100267 EXPECT_CALL(*receiver_.get(), Stop());
268 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200269 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
270 EXPECT_CALL(*sender_.get(), Stop());
271
Markus Handell755c65d2020-06-24 01:06:10 +0200272 auto modified_extensions = extensions_;
273 modified_extensions[0].direction = RtpTransceiverDirection::kStopped;
274 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100275 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
276 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200277}
278
279TEST_F(RtpTransceiverTestForHeaderExtensions, RejectsUnsupportedExtension) {
Tommi6589def2022-02-17 23:36:47 +0100280 EXPECT_CALL(*receiver_.get(), Stop());
281 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200282 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
283 EXPECT_CALL(*sender_.get(), Stop());
284
Markus Handell755c65d2020-06-24 01:06:10 +0200285 std::vector<RtpHeaderExtensionCapability> modified_extensions(
286 {RtpHeaderExtensionCapability("uri3", 1,
287 RtpTransceiverDirection::kSendRecv)});
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100288 EXPECT_THAT(transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handellc17bca72021-01-14 17:08:01 +0100289 Property(&RTCError::type, RTCErrorType::UNSUPPORTED_PARAMETER));
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100290 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell755c65d2020-06-24 01:06:10 +0200291}
292
293TEST_F(RtpTransceiverTestForHeaderExtensions,
294 RejectsStoppedMandatoryExtensions) {
Tommi6589def2022-02-17 23:36:47 +0100295 EXPECT_CALL(*receiver_.get(), Stop());
296 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200297 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
298 EXPECT_CALL(*sender_.get(), Stop());
299
Markus Handell755c65d2020-06-24 01:06:10 +0200300 std::vector<RtpHeaderExtensionCapability> modified_extensions = extensions_;
301 // Attempting to stop the mandatory MID extension.
302 modified_extensions[2].direction = RtpTransceiverDirection::kStopped;
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100303 EXPECT_THAT(transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handell755c65d2020-06-24 01:06:10 +0200304 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100305 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell755c65d2020-06-24 01:06:10 +0200306 modified_extensions = extensions_;
307 // Attempting to stop the mandatory video orientation extension.
308 modified_extensions[3].direction = RtpTransceiverDirection::kStopped;
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100309 EXPECT_THAT(transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handell755c65d2020-06-24 01:06:10 +0200310 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100311 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell0357b3e2020-03-16 13:40:51 +0100312}
313
Markus Handell5932fe12020-12-17 22:19:40 +0100314TEST_F(RtpTransceiverTestForHeaderExtensions,
315 NoNegotiatedHdrExtsWithoutChannel) {
Tommi6589def2022-02-17 23:36:47 +0100316 EXPECT_CALL(*receiver_.get(), Stop());
317 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200318 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
319 EXPECT_CALL(*sender_.get(), Stop());
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100320 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(), ElementsAre());
Markus Handell5932fe12020-12-17 22:19:40 +0100321}
322
323TEST_F(RtpTransceiverTestForHeaderExtensions,
324 NoNegotiatedHdrExtsWithChannelWithoutNegotiation) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100325 const std::string content_name("my_mid");
Tommi6589def2022-02-17 23:36:47 +0100326 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_)).WillRepeatedly(Return());
327 EXPECT_CALL(*receiver_.get(), Stop()).WillRepeatedly(Return());
Tommi99c8a802021-04-27 15:00:00 +0200328 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
329 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
330 EXPECT_CALL(*sender_.get(), Stop());
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000331 auto mock_channel = std::make_unique<cricket::MockChannelInterface>();
332 auto mock_channel_ptr = mock_channel.get();
333 EXPECT_CALL(*mock_channel, SetFirstPacketReceivedCallback(_));
334 EXPECT_CALL(*mock_channel, media_type())
Tommi99c8a802021-04-27 15:00:00 +0200335 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000336 EXPECT_CALL(*mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
337 EXPECT_CALL(*mock_channel, mid()).WillRepeatedly(ReturnRef(content_name));
338 EXPECT_CALL(*mock_channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
339 transceiver_->SetChannel(std::move(mock_channel),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100340 [](const std::string&) { return nullptr; });
341 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(), ElementsAre());
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100342
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000343 EXPECT_CALL(*mock_channel_ptr, SetFirstPacketReceivedCallback(_));
344 ClearChannel();
Markus Handell5932fe12020-12-17 22:19:40 +0100345}
346
347TEST_F(RtpTransceiverTestForHeaderExtensions, ReturnsNegotiatedHdrExts) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100348 const std::string content_name("my_mid");
Tommi6589def2022-02-17 23:36:47 +0100349 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_)).WillRepeatedly(Return());
350 EXPECT_CALL(*receiver_.get(), Stop()).WillRepeatedly(Return());
Tommi99c8a802021-04-27 15:00:00 +0200351 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
352 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
353 EXPECT_CALL(*sender_.get(), Stop());
354
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000355 auto mock_channel = std::make_unique<cricket::MockChannelInterface>();
356 auto mock_channel_ptr = mock_channel.get();
357 EXPECT_CALL(*mock_channel, SetFirstPacketReceivedCallback(_));
358 EXPECT_CALL(*mock_channel, media_type())
Tommi99c8a802021-04-27 15:00:00 +0200359 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000360 EXPECT_CALL(*mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
361 EXPECT_CALL(*mock_channel, mid()).WillRepeatedly(ReturnRef(content_name));
362 EXPECT_CALL(*mock_channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
Tommicc7a3682021-05-04 14:59:38 +0200363
Markus Handell5932fe12020-12-17 22:19:40 +0100364 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
365 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200366 cricket::AudioContentDescription description;
367 description.set_rtp_header_extensions(extensions);
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100368 transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
Tommicc7a3682021-05-04 14:59:38 +0200369
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000370 transceiver_->SetChannel(std::move(mock_channel),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100371 [](const std::string&) { return nullptr; });
372 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
Markus Handell5932fe12020-12-17 22:19:40 +0100373 ElementsAre(RtpHeaderExtensionCapability(
374 "uri1", 1, RtpTransceiverDirection::kSendRecv),
375 RtpHeaderExtensionCapability(
376 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100377
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000378 EXPECT_CALL(*mock_channel_ptr, SetFirstPacketReceivedCallback(_));
379 ClearChannel();
Markus Handell5932fe12020-12-17 22:19:40 +0100380}
381
382TEST_F(RtpTransceiverTestForHeaderExtensions,
383 ReturnsNegotiatedHdrExtsSecondTime) {
Tommi6589def2022-02-17 23:36:47 +0100384 EXPECT_CALL(*receiver_.get(), Stop());
385 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200386 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
387 EXPECT_CALL(*sender_.get(), Stop());
388
Markus Handell5932fe12020-12-17 22:19:40 +0100389 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
390 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200391 cricket::AudioContentDescription description;
392 description.set_rtp_header_extensions(extensions);
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100393 transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
Markus Handell5932fe12020-12-17 22:19:40 +0100394
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100395 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
Tommicc7a3682021-05-04 14:59:38 +0200396 ElementsAre(RtpHeaderExtensionCapability(
397 "uri1", 1, RtpTransceiverDirection::kSendRecv),
398 RtpHeaderExtensionCapability(
399 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
Markus Handell5932fe12020-12-17 22:19:40 +0100400
401 extensions = {webrtc::RtpExtension("uri3", 4),
402 webrtc::RtpExtension("uri5", 6)};
Tommicc7a3682021-05-04 14:59:38 +0200403 description.set_rtp_header_extensions(extensions);
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100404 transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
Tommicc7a3682021-05-04 14:59:38 +0200405
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100406 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
Markus Handell5932fe12020-12-17 22:19:40 +0100407 ElementsAre(RtpHeaderExtensionCapability(
408 "uri3", 4, RtpTransceiverDirection::kSendRecv),
409 RtpHeaderExtensionCapability(
410 "uri5", 6, RtpTransceiverDirection::kSendRecv)));
411}
412
Harald Alvestrand0ac50b92022-05-18 07:51:34 +0000413} // namespace
414
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800415} // namespace webrtc