blob: 3c4b2c93e40fc6cee25fc102cb4f7e5b9fb7f671 [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 {
41class ChannelManagerForTest : public cricket::ChannelManager {
42 public:
43 ChannelManagerForTest()
44 : cricket::ChannelManager(std::make_unique<cricket::FakeMediaEngine>(),
45 true,
46 rtc::Thread::Current(),
47 rtc::Thread::Current()) {}
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010048};
49} // namespace
50
Artem Titov880fa812021-07-30 22:30:23 +020051// Checks that a channel cannot be set on a stopped `RtpTransceiver`.
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080052TEST(RtpTransceiverTest, CannotSetChannelOnStoppedTransceiver) {
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010053 ChannelManagerForTest cm;
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010054 const std::string content_name("my_mid");
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010055 auto transceiver = rtc::make_ref_counted<RtpTransceiver>(
56 cricket::MediaType::MEDIA_TYPE_AUDIO, &cm);
Harald Alvestrand3af79d12022-04-29 15:04:58 +000057 auto channel1 = std::make_unique<cricket::MockChannelInterface>();
58 EXPECT_CALL(*channel1, media_type())
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080059 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
Harald Alvestrand3af79d12022-04-29 15:04:58 +000060 EXPECT_CALL(*channel1, mid()).WillRepeatedly(ReturnRef(content_name));
61 EXPECT_CALL(*channel1, SetFirstPacketReceivedCallback(_));
62 EXPECT_CALL(*channel1, SetRtpTransport(_)).WillRepeatedly(Return(true));
63 auto channel1_ptr = channel1.get();
64 transceiver->SetChannel(std::move(channel1), [&](const std::string& mid) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010065 EXPECT_EQ(mid, content_name);
66 return nullptr;
67 });
Harald Alvestrand3af79d12022-04-29 15:04:58 +000068 EXPECT_EQ(channel1_ptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080069
70 // Stop the transceiver.
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010071 transceiver->StopInternal();
Harald Alvestrand3af79d12022-04-29 15:04:58 +000072 EXPECT_EQ(channel1_ptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080073
Harald Alvestrand3af79d12022-04-29 15:04:58 +000074 auto channel2 = std::make_unique<cricket::MockChannelInterface>();
75 EXPECT_CALL(*channel2, media_type())
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080076 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
77
Harald Alvestranddaee8702022-04-29 11:42:55 +000078 // Clear the current channel - required to allow SetChannel()
Harald Alvestrand3af79d12022-04-29 15:04:58 +000079 EXPECT_CALL(*channel1_ptr, SetFirstPacketReceivedCallback(_));
Harald Alvestranddaee8702022-04-29 11:42:55 +000080 transceiver->ClearChannel();
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080081 // Channel can no longer be set, so this call should be a no-op.
Harald Alvestrand3af79d12022-04-29 15:04:58 +000082 transceiver->SetChannel(std::move(channel2),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010083 [](const std::string&) { return nullptr; });
Harald Alvestranddaee8702022-04-29 11:42:55 +000084 EXPECT_EQ(nullptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080085}
86
Artem Titov880fa812021-07-30 22:30:23 +020087// Checks that a channel can be unset on a stopped `RtpTransceiver`
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080088TEST(RtpTransceiverTest, CanUnsetChannelOnStoppedTransceiver) {
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010089 ChannelManagerForTest cm;
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010090 const std::string content_name("my_mid");
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +010091 auto transceiver = rtc::make_ref_counted<RtpTransceiver>(
92 cricket::MediaType::MEDIA_TYPE_VIDEO, &cm);
Harald Alvestrand3af79d12022-04-29 15:04:58 +000093 auto channel = std::make_unique<cricket::MockChannelInterface>();
94 EXPECT_CALL(*channel, media_type())
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080095 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_VIDEO));
Harald Alvestrand3af79d12022-04-29 15:04:58 +000096 EXPECT_CALL(*channel, mid()).WillRepeatedly(ReturnRef(content_name));
97 EXPECT_CALL(*channel, SetFirstPacketReceivedCallback(_))
Tommi99c8a802021-04-27 15:00:00 +020098 .WillRepeatedly(testing::Return());
Harald Alvestrand3af79d12022-04-29 15:04:58 +000099 EXPECT_CALL(*channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800100
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000101 auto channel_ptr = channel.get();
102 transceiver->SetChannel(std::move(channel), [&](const std::string& mid) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100103 EXPECT_EQ(mid, content_name);
104 return nullptr;
105 });
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000106 EXPECT_EQ(channel_ptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800107
108 // Stop the transceiver.
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100109 transceiver->StopInternal();
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000110 EXPECT_EQ(channel_ptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800111
Artem Titov880fa812021-07-30 22:30:23 +0200112 // Set the channel to `nullptr`.
Harald Alvestrand19ebabc2022-04-28 13:31:17 +0000113 transceiver->ClearChannel();
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100114 EXPECT_EQ(nullptr, transceiver->channel());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800115}
116
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000117class RtpTransceiverUnifiedPlanTest : public ::testing::Test {
118 public:
119 RtpTransceiverUnifiedPlanTest()
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100120 : transceiver_(rtc::make_ref_counted<RtpTransceiver>(
121 RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
122 rtc::Thread::Current(),
123 sender_),
124 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
125 rtc::Thread::Current(),
126 rtc::Thread::Current(),
127 receiver_),
128 &channel_manager_,
Harald Alvestrand35f4b4c2022-05-16 10:36:43 +0000129 channel_manager_.media_engine()->voice().GetRtpHeaderExtensions(),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100130 /* on_negotiation_needed= */ [] {})) {}
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000131
Tommi99c8a802021-04-27 15:00:00 +0200132 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
133 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
134 EXPECT_CALL(*receiver.get(), media_type())
135 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
136 return receiver;
137 }
138
139 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
140 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
141 EXPECT_CALL(*sender.get(), media_type())
142 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
143 return sender;
144 }
145
146 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
147 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100148 ChannelManagerForTest channel_manager_;
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100149 rtc::scoped_refptr<RtpTransceiver> transceiver_;
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000150};
151
152// Basic tests for Stop()
153TEST_F(RtpTransceiverUnifiedPlanTest, StopSetsDirection) {
Tommi6589def2022-02-17 23:36:47 +0100154 EXPECT_CALL(*receiver_.get(), Stop());
155 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200156 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
157 EXPECT_CALL(*sender_.get(), Stop());
158
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100159 EXPECT_EQ(RtpTransceiverDirection::kInactive, transceiver_->direction());
160 EXPECT_FALSE(transceiver_->current_direction());
161 transceiver_->StopStandard();
162 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_->direction());
163 EXPECT_FALSE(transceiver_->current_direction());
164 transceiver_->StopTransceiverProcedure();
165 EXPECT_TRUE(transceiver_->current_direction());
166 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_->direction());
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000167 EXPECT_EQ(RtpTransceiverDirection::kStopped,
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100168 *transceiver_->current_direction());
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000169}
170
Markus Handell755c65d2020-06-24 01:06:10 +0200171class RtpTransceiverTestForHeaderExtensions : public ::testing::Test {
172 public:
173 RtpTransceiverTestForHeaderExtensions()
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100174 : extensions_(
Markus Handell755c65d2020-06-24 01:06:10 +0200175 {RtpHeaderExtensionCapability("uri1",
176 1,
177 RtpTransceiverDirection::kSendOnly),
178 RtpHeaderExtensionCapability("uri2",
179 2,
180 RtpTransceiverDirection::kRecvOnly),
181 RtpHeaderExtensionCapability(RtpExtension::kMidUri,
182 3,
183 RtpTransceiverDirection::kSendRecv),
184 RtpHeaderExtensionCapability(RtpExtension::kVideoRotationUri,
185 4,
186 RtpTransceiverDirection::kSendRecv)}),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100187 transceiver_(rtc::make_ref_counted<RtpTransceiver>(
188 RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
189 rtc::Thread::Current(),
190 sender_),
191 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
192 rtc::Thread::Current(),
193 rtc::Thread::Current(),
194 receiver_),
195 &channel_manager_,
196 extensions_,
197 /* on_negotiation_needed= */ [] {})) {}
Markus Handell755c65d2020-06-24 01:06:10 +0200198
Tommi99c8a802021-04-27 15:00:00 +0200199 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
200 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
201 EXPECT_CALL(*receiver.get(), media_type())
202 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
203 return receiver;
204 }
205
206 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
207 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
208 EXPECT_CALL(*sender.get(), media_type())
209 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
210 return sender;
211 }
212
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000213 void ClearChannel() {
Tommi6589def2022-02-17 23:36:47 +0100214 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
Harald Alvestrand19ebabc2022-04-28 13:31:17 +0000215 transceiver_->ClearChannel();
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100216 }
217
Tommi99c8a802021-04-27 15:00:00 +0200218 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
219 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
220
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100221 ChannelManagerForTest channel_manager_;
Markus Handell755c65d2020-06-24 01:06:10 +0200222 std::vector<RtpHeaderExtensionCapability> extensions_;
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100223 rtc::scoped_refptr<RtpTransceiver> transceiver_;
Markus Handell755c65d2020-06-24 01:06:10 +0200224};
225
226TEST_F(RtpTransceiverTestForHeaderExtensions, OffersChannelManagerList) {
Tommi6589def2022-02-17 23:36:47 +0100227 EXPECT_CALL(*receiver_.get(), Stop());
228 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200229 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
230 EXPECT_CALL(*sender_.get(), Stop());
231
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100232 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell755c65d2020-06-24 01:06:10 +0200233}
234
235TEST_F(RtpTransceiverTestForHeaderExtensions, ModifiesDirection) {
Tommi6589def2022-02-17 23:36:47 +0100236 EXPECT_CALL(*receiver_.get(), Stop());
237 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200238 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
239 EXPECT_CALL(*sender_.get(), Stop());
240
Markus Handell755c65d2020-06-24 01:06:10 +0200241 auto modified_extensions = extensions_;
242 modified_extensions[0].direction = RtpTransceiverDirection::kSendOnly;
243 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100244 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
245 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200246 modified_extensions[0].direction = RtpTransceiverDirection::kRecvOnly;
247 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100248 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
249 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200250 modified_extensions[0].direction = RtpTransceiverDirection::kSendRecv;
251 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100252 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
253 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200254 modified_extensions[0].direction = RtpTransceiverDirection::kInactive;
255 EXPECT_TRUE(
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100256 transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
257 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
Markus Handell755c65d2020-06-24 01:06:10 +0200258}
259
260TEST_F(RtpTransceiverTestForHeaderExtensions, AcceptsStoppedExtension) {
Tommi6589def2022-02-17 23:36:47 +0100261 EXPECT_CALL(*receiver_.get(), Stop());
262 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200263 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
264 EXPECT_CALL(*sender_.get(), Stop());
265
Markus Handell755c65d2020-06-24 01:06:10 +0200266 auto modified_extensions = extensions_;
267 modified_extensions[0].direction = RtpTransceiverDirection::kStopped;
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}
272
273TEST_F(RtpTransceiverTestForHeaderExtensions, RejectsUnsupportedExtension) {
Tommi6589def2022-02-17 23:36:47 +0100274 EXPECT_CALL(*receiver_.get(), Stop());
275 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200276 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
277 EXPECT_CALL(*sender_.get(), Stop());
278
Markus Handell755c65d2020-06-24 01:06:10 +0200279 std::vector<RtpHeaderExtensionCapability> modified_extensions(
280 {RtpHeaderExtensionCapability("uri3", 1,
281 RtpTransceiverDirection::kSendRecv)});
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100282 EXPECT_THAT(transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handellc17bca72021-01-14 17:08:01 +0100283 Property(&RTCError::type, RTCErrorType::UNSUPPORTED_PARAMETER));
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100284 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell755c65d2020-06-24 01:06:10 +0200285}
286
287TEST_F(RtpTransceiverTestForHeaderExtensions,
288 RejectsStoppedMandatoryExtensions) {
Tommi6589def2022-02-17 23:36:47 +0100289 EXPECT_CALL(*receiver_.get(), Stop());
290 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200291 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
292 EXPECT_CALL(*sender_.get(), Stop());
293
Markus Handell755c65d2020-06-24 01:06:10 +0200294 std::vector<RtpHeaderExtensionCapability> modified_extensions = extensions_;
295 // Attempting to stop the mandatory MID extension.
296 modified_extensions[2].direction = RtpTransceiverDirection::kStopped;
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100297 EXPECT_THAT(transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handell755c65d2020-06-24 01:06:10 +0200298 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100299 EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
Markus Handell755c65d2020-06-24 01:06:10 +0200300 modified_extensions = extensions_;
301 // Attempting to stop the mandatory video orientation extension.
302 modified_extensions[3].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 Handell0357b3e2020-03-16 13:40:51 +0100306}
307
Markus Handell5932fe12020-12-17 22:19:40 +0100308TEST_F(RtpTransceiverTestForHeaderExtensions,
309 NoNegotiatedHdrExtsWithoutChannel) {
Tommi6589def2022-02-17 23:36:47 +0100310 EXPECT_CALL(*receiver_.get(), Stop());
311 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200312 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
313 EXPECT_CALL(*sender_.get(), Stop());
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100314 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(), ElementsAre());
Markus Handell5932fe12020-12-17 22:19:40 +0100315}
316
317TEST_F(RtpTransceiverTestForHeaderExtensions,
318 NoNegotiatedHdrExtsWithChannelWithoutNegotiation) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100319 const std::string content_name("my_mid");
Tommi6589def2022-02-17 23:36:47 +0100320 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_)).WillRepeatedly(Return());
321 EXPECT_CALL(*receiver_.get(), Stop()).WillRepeatedly(Return());
Tommi99c8a802021-04-27 15:00:00 +0200322 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
323 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
324 EXPECT_CALL(*sender_.get(), Stop());
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000325 auto mock_channel = std::make_unique<cricket::MockChannelInterface>();
326 auto mock_channel_ptr = mock_channel.get();
327 EXPECT_CALL(*mock_channel, SetFirstPacketReceivedCallback(_));
328 EXPECT_CALL(*mock_channel, media_type())
Tommi99c8a802021-04-27 15:00:00 +0200329 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000330 EXPECT_CALL(*mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
331 EXPECT_CALL(*mock_channel, mid()).WillRepeatedly(ReturnRef(content_name));
332 EXPECT_CALL(*mock_channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
333 transceiver_->SetChannel(std::move(mock_channel),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100334 [](const std::string&) { return nullptr; });
335 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(), ElementsAre());
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100336
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000337 EXPECT_CALL(*mock_channel_ptr, SetFirstPacketReceivedCallback(_));
338 ClearChannel();
Markus Handell5932fe12020-12-17 22:19:40 +0100339}
340
341TEST_F(RtpTransceiverTestForHeaderExtensions, ReturnsNegotiatedHdrExts) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100342 const std::string content_name("my_mid");
Tommi6589def2022-02-17 23:36:47 +0100343 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_)).WillRepeatedly(Return());
344 EXPECT_CALL(*receiver_.get(), Stop()).WillRepeatedly(Return());
Tommi99c8a802021-04-27 15:00:00 +0200345 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
346 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
347 EXPECT_CALL(*sender_.get(), Stop());
348
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000349 auto mock_channel = std::make_unique<cricket::MockChannelInterface>();
350 auto mock_channel_ptr = mock_channel.get();
351 EXPECT_CALL(*mock_channel, SetFirstPacketReceivedCallback(_));
352 EXPECT_CALL(*mock_channel, media_type())
Tommi99c8a802021-04-27 15:00:00 +0200353 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000354 EXPECT_CALL(*mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
355 EXPECT_CALL(*mock_channel, mid()).WillRepeatedly(ReturnRef(content_name));
356 EXPECT_CALL(*mock_channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
Tommicc7a3682021-05-04 14:59:38 +0200357
Markus Handell5932fe12020-12-17 22:19:40 +0100358 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
359 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200360 cricket::AudioContentDescription description;
361 description.set_rtp_header_extensions(extensions);
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100362 transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
Tommicc7a3682021-05-04 14:59:38 +0200363
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000364 transceiver_->SetChannel(std::move(mock_channel),
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100365 [](const std::string&) { return nullptr; });
366 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
Markus Handell5932fe12020-12-17 22:19:40 +0100367 ElementsAre(RtpHeaderExtensionCapability(
368 "uri1", 1, RtpTransceiverDirection::kSendRecv),
369 RtpHeaderExtensionCapability(
370 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100371
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000372 EXPECT_CALL(*mock_channel_ptr, SetFirstPacketReceivedCallback(_));
373 ClearChannel();
Markus Handell5932fe12020-12-17 22:19:40 +0100374}
375
376TEST_F(RtpTransceiverTestForHeaderExtensions,
377 ReturnsNegotiatedHdrExtsSecondTime) {
Tommi6589def2022-02-17 23:36:47 +0100378 EXPECT_CALL(*receiver_.get(), Stop());
379 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200380 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
381 EXPECT_CALL(*sender_.get(), Stop());
382
Markus Handell5932fe12020-12-17 22:19:40 +0100383 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
384 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200385 cricket::AudioContentDescription description;
386 description.set_rtp_header_extensions(extensions);
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100387 transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
Markus Handell5932fe12020-12-17 22:19:40 +0100388
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100389 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
Tommicc7a3682021-05-04 14:59:38 +0200390 ElementsAre(RtpHeaderExtensionCapability(
391 "uri1", 1, RtpTransceiverDirection::kSendRecv),
392 RtpHeaderExtensionCapability(
393 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
Markus Handell5932fe12020-12-17 22:19:40 +0100394
395 extensions = {webrtc::RtpExtension("uri3", 4),
396 webrtc::RtpExtension("uri5", 6)};
Tommicc7a3682021-05-04 14:59:38 +0200397 description.set_rtp_header_extensions(extensions);
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100398 transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
Tommicc7a3682021-05-04 14:59:38 +0200399
Tomas Gunnarsson0d5ce622022-03-18 15:57:15 +0100400 EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
Markus Handell5932fe12020-12-17 22:19:40 +0100401 ElementsAre(RtpHeaderExtensionCapability(
402 "uri3", 4, RtpTransceiverDirection::kSendRecv),
403 RtpHeaderExtensionCapability(
404 "uri5", 6, RtpTransceiverDirection::kSendRecv)));
405}
406
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800407} // namespace webrtc