blob: 7961747b646270a741106130d93ec67f643a6610 [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"
Harald Alvestrandc3fa7c32022-05-22 10:57:01 +000020#include "api/peer_connection_interface.h"
Markus Handell5932fe12020-12-17 22:19:40 +010021#include "api/rtp_parameters.h"
Markus Handell0357b3e2020-03-16 13:40:51 +010022#include "media/base/fake_media_engine.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000023#include "media/base/media_engine.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()
Harald Alvestrandc3fa7c32022-05-22 10:57:01 +000045 : dependencies_(MakeDependencies()),
46 context_(ConnectionContext::Create(&dependencies_)) {}
Harald Alvestrand0ac50b92022-05-18 07:51:34 +000047
48 protected:
Harald Alvestrandc3fa7c32022-05-22 10:57:01 +000049 cricket::MediaEngineInterface* media_engine() {
50 return context_->media_engine();
51 }
52 ConnectionContext* context() { return context_.get(); }
Harald Alvestrand0ac50b92022-05-18 07:51:34 +000053
54 private:
Niels Möller83830f32022-05-20 09:12:57 +020055 rtc::AutoThread main_thread_;
Harald Alvestrandc3fa7c32022-05-22 10:57:01 +000056
57 static PeerConnectionFactoryDependencies MakeDependencies() {
58 PeerConnectionFactoryDependencies d;
59 d.network_thread = rtc::Thread::Current();
60 d.worker_thread = rtc::Thread::Current();
61 d.signaling_thread = rtc::Thread::Current();
62 d.media_engine = std::make_unique<cricket::FakeMediaEngine>();
63 return d;
64 }
65
66 PeerConnectionFactoryDependencies dependencies_;
67 rtc::scoped_refptr<ConnectionContext> context_;
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010068};
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010069
Artem Titov880fa812021-07-30 22:30:23 +020070// Checks that a channel cannot be set on a stopped `RtpTransceiver`.
Harald Alvestrand0ac50b92022-05-18 07:51:34 +000071TEST_F(RtpTransceiverTest, CannotSetChannelOnStoppedTransceiver) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010072 const std::string content_name("my_mid");
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010073 auto transceiver = rtc::make_ref_counted<RtpTransceiver>(
Harald Alvestrandc3fa7c32022-05-22 10:57:01 +000074 cricket::MediaType::MEDIA_TYPE_AUDIO, context());
Harald Alvestrand3af79d12022-04-29 15:04:58 +000075 auto channel1 = std::make_unique<cricket::MockChannelInterface>();
76 EXPECT_CALL(*channel1, media_type())
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080077 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
Harald Alvestrand3af79d12022-04-29 15:04:58 +000078 EXPECT_CALL(*channel1, mid()).WillRepeatedly(ReturnRef(content_name));
79 EXPECT_CALL(*channel1, SetFirstPacketReceivedCallback(_));
80 EXPECT_CALL(*channel1, SetRtpTransport(_)).WillRepeatedly(Return(true));
81 auto channel1_ptr = channel1.get();
82 transceiver->SetChannel(std::move(channel1), [&](const std::string& mid) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010083 EXPECT_EQ(mid, content_name);
84 return nullptr;
85 });
Harald Alvestrand3af79d12022-04-29 15:04:58 +000086 EXPECT_EQ(channel1_ptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080087
88 // Stop the transceiver.
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010089 transceiver->StopInternal();
Harald Alvestrand3af79d12022-04-29 15:04:58 +000090 EXPECT_EQ(channel1_ptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080091
Harald Alvestrand3af79d12022-04-29 15:04:58 +000092 auto channel2 = std::make_unique<cricket::MockChannelInterface>();
93 EXPECT_CALL(*channel2, media_type())
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080094 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
95
Harald Alvestranddaee8702022-04-29 11:42:55 +000096 // Clear the current channel - required to allow SetChannel()
Harald Alvestrand3af79d12022-04-29 15:04:58 +000097 EXPECT_CALL(*channel1_ptr, SetFirstPacketReceivedCallback(_));
Harald Alvestranddaee8702022-04-29 11:42:55 +000098 transceiver->ClearChannel();
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080099 // Channel can no longer be set, so this call should be a no-op.
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000100 transceiver->SetChannel(std::move(channel2),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100101 [](const std::string&) { return nullptr; });
Harald Alvestranddaee8702022-04-29 11:42:55 +0000102 EXPECT_EQ(nullptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800103}
104
Artem Titov880fa812021-07-30 22:30:23 +0200105// Checks that a channel can be unset on a stopped `RtpTransceiver`
Harald Alvestrand0ac50b92022-05-18 07:51:34 +0000106TEST_F(RtpTransceiverTest, CanUnsetChannelOnStoppedTransceiver) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100107 const std::string content_name("my_mid");
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100108 auto transceiver = rtc::make_ref_counted<RtpTransceiver>(
Harald Alvestrandc3fa7c32022-05-22 10:57:01 +0000109 cricket::MediaType::MEDIA_TYPE_VIDEO, context());
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000110 auto channel = std::make_unique<cricket::MockChannelInterface>();
111 EXPECT_CALL(*channel, media_type())
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800112 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_VIDEO));
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000113 EXPECT_CALL(*channel, mid()).WillRepeatedly(ReturnRef(content_name));
114 EXPECT_CALL(*channel, SetFirstPacketReceivedCallback(_))
Tommi99c8a802021-04-27 15:00:00 +0200115 .WillRepeatedly(testing::Return());
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000116 EXPECT_CALL(*channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800117
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000118 auto channel_ptr = channel.get();
119 transceiver->SetChannel(std::move(channel), [&](const std::string& mid) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100120 EXPECT_EQ(mid, content_name);
121 return nullptr;
122 });
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000123 EXPECT_EQ(channel_ptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800124
125 // Stop the transceiver.
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100126 transceiver->StopInternal();
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000127 EXPECT_EQ(channel_ptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800128
Artem Titov880fa812021-07-30 22:30:23 +0200129 // Set the channel to `nullptr`.
Harald Alvestrand19ebabc2022-04-28 13:31:17 +0000130 transceiver->ClearChannel();
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100131 EXPECT_EQ(nullptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800132}
133
Harald Alvestrand0ac50b92022-05-18 07:51:34 +0000134class RtpTransceiverUnifiedPlanTest : public RtpTransceiverTest {
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000135 public:
136 RtpTransceiverUnifiedPlanTest()
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100137 : transceiver_(rtc::make_ref_counted<RtpTransceiver>(
138 RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
139 rtc::Thread::Current(),
140 sender_),
141 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
142 rtc::Thread::Current(),
143 rtc::Thread::Current(),
144 receiver_),
Harald Alvestrandc3fa7c32022-05-22 10:57:01 +0000145 context(),
146 media_engine()->voice().GetRtpHeaderExtensions(),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100147 /* on_negotiation_needed= */ [] {})) {}
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000148
Tommi99c8a802021-04-27 15:00:00 +0200149 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
150 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
151 EXPECT_CALL(*receiver.get(), media_type())
152 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
153 return receiver;
154 }
155
156 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
157 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
158 EXPECT_CALL(*sender.get(), media_type())
159 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
160 return sender;
161 }
162
Niels Möller83830f32022-05-20 09:12:57 +0200163 rtc::AutoThread main_thread_;
Tommi99c8a802021-04-27 15:00:00 +0200164 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
165 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100166 rtc::scoped_refptr<RtpTransceiver> transceiver_;
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000167};
168
169// Basic tests for Stop()
170TEST_F(RtpTransceiverUnifiedPlanTest, StopSetsDirection) {
Tommi6589def2022-02-17 23:36:47 +0100171 EXPECT_CALL(*receiver_.get(), Stop());
172 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200173 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
174 EXPECT_CALL(*sender_.get(), Stop());
175
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100176 EXPECT_EQ(RtpTransceiverDirection::kInactive, transceiver_->direction());
177 EXPECT_FALSE(transceiver_->current_direction());
178 transceiver_->StopStandard();
179 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_->direction());
180 EXPECT_FALSE(transceiver_->current_direction());
181 transceiver_->StopTransceiverProcedure();
182 EXPECT_TRUE(transceiver_->current_direction());
183 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_->direction());
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000184 EXPECT_EQ(RtpTransceiverDirection::kStopped,
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100185 *transceiver_->current_direction());
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000186}
187
Harald Alvestrand0ac50b92022-05-18 07:51:34 +0000188class RtpTransceiverTestForHeaderExtensions : public RtpTransceiverTest {
Markus Handell755c65d2020-06-24 01:06:10 +0200189 public:
190 RtpTransceiverTestForHeaderExtensions()
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100191 : extensions_(
Markus Handell755c65d2020-06-24 01:06:10 +0200192 {RtpHeaderExtensionCapability("uri1",
193 1,
194 RtpTransceiverDirection::kSendOnly),
195 RtpHeaderExtensionCapability("uri2",
196 2,
197 RtpTransceiverDirection::kRecvOnly),
198 RtpHeaderExtensionCapability(RtpExtension::kMidUri,
199 3,
200 RtpTransceiverDirection::kSendRecv),
201 RtpHeaderExtensionCapability(RtpExtension::kVideoRotationUri,
202 4,
203 RtpTransceiverDirection::kSendRecv)}),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100204 transceiver_(rtc::make_ref_counted<RtpTransceiver>(
205 RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
206 rtc::Thread::Current(),
207 sender_),
208 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
209 rtc::Thread::Current(),
210 rtc::Thread::Current(),
211 receiver_),
Harald Alvestrandc3fa7c32022-05-22 10:57:01 +0000212 context(),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100213 extensions_,
214 /* on_negotiation_needed= */ [] {})) {}
Markus Handell755c65d2020-06-24 01:06:10 +0200215
Tommi99c8a802021-04-27 15:00:00 +0200216 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
217 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
218 EXPECT_CALL(*receiver.get(), media_type())
219 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
220 return receiver;
221 }
222
223 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
224 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
225 EXPECT_CALL(*sender.get(), media_type())
226 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
227 return sender;
228 }
229
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000230 void ClearChannel() {
Tommi6589def2022-02-17 23:36:47 +0100231 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
Harald Alvestrand19ebabc2022-04-28 13:31:17 +0000232 transceiver_->ClearChannel();
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100233 }
234
Niels Möller83830f32022-05-20 09:12:57 +0200235 rtc::AutoThread main_thread_;
Tommi99c8a802021-04-27 15:00:00 +0200236 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
237 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
238
Markus Handell755c65d2020-06-24 01:06:10 +0200239 std::vector<RtpHeaderExtensionCapability> extensions_;
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100240 rtc::scoped_refptr<RtpTransceiver> transceiver_;
Markus Handell755c65d2020-06-24 01:06:10 +0200241};
242
243TEST_F(RtpTransceiverTestForHeaderExtensions, OffersChannelManagerList) {
Tommi6589def2022-02-17 23:36:47 +0100244 EXPECT_CALL(*receiver_.get(), Stop());
245 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200246 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
247 EXPECT_CALL(*sender_.get(), Stop());
248
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100249 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell755c65d2020-06-24 01:06:10 +0200250}
251
252TEST_F(RtpTransceiverTestForHeaderExtensions, ModifiesDirection) {
Tommi6589def2022-02-17 23:36:47 +0100253 EXPECT_CALL(*receiver_.get(), Stop());
254 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200255 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
256 EXPECT_CALL(*sender_.get(), Stop());
257
Markus Handell755c65d2020-06-24 01:06:10 +0200258 auto modified_extensions = extensions_;
259 modified_extensions[0].direction = RtpTransceiverDirection::kSendOnly;
260 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100261 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
262 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200263 modified_extensions[0].direction = RtpTransceiverDirection::kRecvOnly;
264 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100265 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
266 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200267 modified_extensions[0].direction = RtpTransceiverDirection::kSendRecv;
268 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100269 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
270 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200271 modified_extensions[0].direction = RtpTransceiverDirection::kInactive;
272 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100273 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
274 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200275}
276
277TEST_F(RtpTransceiverTestForHeaderExtensions, AcceptsStoppedExtension) {
Tommi6589def2022-02-17 23:36:47 +0100278 EXPECT_CALL(*receiver_.get(), Stop());
279 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200280 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
281 EXPECT_CALL(*sender_.get(), Stop());
282
Markus Handell755c65d2020-06-24 01:06:10 +0200283 auto modified_extensions = extensions_;
284 modified_extensions[0].direction = RtpTransceiverDirection::kStopped;
285 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100286 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
287 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200288}
289
290TEST_F(RtpTransceiverTestForHeaderExtensions, RejectsUnsupportedExtension) {
Tommi6589def2022-02-17 23:36:47 +0100291 EXPECT_CALL(*receiver_.get(), Stop());
292 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200293 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
294 EXPECT_CALL(*sender_.get(), Stop());
295
Markus Handell755c65d2020-06-24 01:06:10 +0200296 std::vector<RtpHeaderExtensionCapability> modified_extensions(
297 {RtpHeaderExtensionCapability("uri3", 1,
298 RtpTransceiverDirection::kSendRecv)});
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100299 EXPECT_THAT(transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handellc17bca72021-01-14 17:08:01 +0100300 Property(&RTCError::type, RTCErrorType::UNSUPPORTED_PARAMETER));
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100301 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell755c65d2020-06-24 01:06:10 +0200302}
303
304TEST_F(RtpTransceiverTestForHeaderExtensions,
305 RejectsStoppedMandatoryExtensions) {
Tommi6589def2022-02-17 23:36:47 +0100306 EXPECT_CALL(*receiver_.get(), Stop());
307 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200308 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
309 EXPECT_CALL(*sender_.get(), Stop());
310
Markus Handell755c65d2020-06-24 01:06:10 +0200311 std::vector<RtpHeaderExtensionCapability> modified_extensions = extensions_;
312 // Attempting to stop the mandatory MID extension.
313 modified_extensions[2].direction = RtpTransceiverDirection::kStopped;
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100314 EXPECT_THAT(transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handell755c65d2020-06-24 01:06:10 +0200315 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100316 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell755c65d2020-06-24 01:06:10 +0200317 modified_extensions = extensions_;
318 // Attempting to stop the mandatory video orientation extension.
319 modified_extensions[3].direction = RtpTransceiverDirection::kStopped;
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100320 EXPECT_THAT(transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handell755c65d2020-06-24 01:06:10 +0200321 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100322 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell0357b3e2020-03-16 13:40:51 +0100323}
324
Markus Handell5932fe12020-12-17 22:19:40 +0100325TEST_F(RtpTransceiverTestForHeaderExtensions,
326 NoNegotiatedHdrExtsWithoutChannel) {
Tommi6589def2022-02-17 23:36:47 +0100327 EXPECT_CALL(*receiver_.get(), Stop());
328 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200329 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
330 EXPECT_CALL(*sender_.get(), Stop());
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100331 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(), ElementsAre());
Markus Handell5932fe12020-12-17 22:19:40 +0100332}
333
334TEST_F(RtpTransceiverTestForHeaderExtensions,
335 NoNegotiatedHdrExtsWithChannelWithoutNegotiation) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100336 const std::string content_name("my_mid");
Tommi6589def2022-02-17 23:36:47 +0100337 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_)).WillRepeatedly(Return());
338 EXPECT_CALL(*receiver_.get(), Stop()).WillRepeatedly(Return());
Tommi99c8a802021-04-27 15:00:00 +0200339 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
340 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
341 EXPECT_CALL(*sender_.get(), Stop());
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000342 auto mock_channel = std::make_unique<cricket::MockChannelInterface>();
343 auto mock_channel_ptr = mock_channel.get();
344 EXPECT_CALL(*mock_channel, SetFirstPacketReceivedCallback(_));
345 EXPECT_CALL(*mock_channel, media_type())
Tommi99c8a802021-04-27 15:00:00 +0200346 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000347 EXPECT_CALL(*mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
348 EXPECT_CALL(*mock_channel, mid()).WillRepeatedly(ReturnRef(content_name));
349 EXPECT_CALL(*mock_channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
350 transceiver_->SetChannel(std::move(mock_channel),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100351 [](const std::string&) { return nullptr; });
352 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(), ElementsAre());
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100353
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000354 EXPECT_CALL(*mock_channel_ptr, SetFirstPacketReceivedCallback(_));
355 ClearChannel();
Markus Handell5932fe12020-12-17 22:19:40 +0100356}
357
358TEST_F(RtpTransceiverTestForHeaderExtensions, ReturnsNegotiatedHdrExts) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100359 const std::string content_name("my_mid");
Tommi6589def2022-02-17 23:36:47 +0100360 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_)).WillRepeatedly(Return());
361 EXPECT_CALL(*receiver_.get(), Stop()).WillRepeatedly(Return());
Tommi99c8a802021-04-27 15:00:00 +0200362 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
363 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
364 EXPECT_CALL(*sender_.get(), Stop());
365
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000366 auto mock_channel = std::make_unique<cricket::MockChannelInterface>();
367 auto mock_channel_ptr = mock_channel.get();
368 EXPECT_CALL(*mock_channel, SetFirstPacketReceivedCallback(_));
369 EXPECT_CALL(*mock_channel, media_type())
Tommi99c8a802021-04-27 15:00:00 +0200370 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000371 EXPECT_CALL(*mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
372 EXPECT_CALL(*mock_channel, mid()).WillRepeatedly(ReturnRef(content_name));
373 EXPECT_CALL(*mock_channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
Tommicc7a3682021-05-04 14:59:38 +0200374
Markus Handell5932fe12020-12-17 22:19:40 +0100375 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
376 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200377 cricket::AudioContentDescription description;
378 description.set_rtp_header_extensions(extensions);
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100379 transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
Tommicc7a3682021-05-04 14:59:38 +0200380
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000381 transceiver_->SetChannel(std::move(mock_channel),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100382 [](const std::string&) { return nullptr; });
383 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
Markus Handell5932fe12020-12-17 22:19:40 +0100384 ElementsAre(RtpHeaderExtensionCapability(
385 "uri1", 1, RtpTransceiverDirection::kSendRecv),
386 RtpHeaderExtensionCapability(
387 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100388
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000389 EXPECT_CALL(*mock_channel_ptr, SetFirstPacketReceivedCallback(_));
390 ClearChannel();
Markus Handell5932fe12020-12-17 22:19:40 +0100391}
392
393TEST_F(RtpTransceiverTestForHeaderExtensions,
394 ReturnsNegotiatedHdrExtsSecondTime) {
Tommi6589def2022-02-17 23:36:47 +0100395 EXPECT_CALL(*receiver_.get(), Stop());
396 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200397 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
398 EXPECT_CALL(*sender_.get(), Stop());
399
Markus Handell5932fe12020-12-17 22:19:40 +0100400 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
401 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200402 cricket::AudioContentDescription description;
403 description.set_rtp_header_extensions(extensions);
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100404 transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
Markus Handell5932fe12020-12-17 22:19:40 +0100405
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100406 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
Tommicc7a3682021-05-04 14:59:38 +0200407 ElementsAre(RtpHeaderExtensionCapability(
408 "uri1", 1, RtpTransceiverDirection::kSendRecv),
409 RtpHeaderExtensionCapability(
410 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
Markus Handell5932fe12020-12-17 22:19:40 +0100411
412 extensions = {webrtc::RtpExtension("uri3", 4),
413 webrtc::RtpExtension("uri5", 6)};
Tommicc7a3682021-05-04 14:59:38 +0200414 description.set_rtp_header_extensions(extensions);
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100415 transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
Tommicc7a3682021-05-04 14:59:38 +0200416
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100417 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
Markus Handell5932fe12020-12-17 22:19:40 +0100418 ElementsAre(RtpHeaderExtensionCapability(
419 "uri3", 4, RtpTransceiverDirection::kSendRecv),
420 RtpHeaderExtensionCapability(
421 "uri5", 6, RtpTransceiverDirection::kSendRecv)));
422}
423
Harald Alvestrand0ac50b92022-05-18 07:51:34 +0000424} // namespace
425
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800426} // namespace webrtc