blob: e5c77331780ff32e3031c0ad37120bba57a5772f [file] [log] [blame]
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001/*
2 * Copyright 2018 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Artem Titov880fa812021-07-30 22:30:23 +020011// This file contains tests for `RtpTransceiver`.
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080012
Steve Anton10542f22019-01-11 09:11:00 -080013#include "pc/rtp_transceiver.h"
Yves Gerey3e707812018-11-28 16:47:49 +010014
Markus Handell0357b3e2020-03-16 13:40:51 +010015#include <memory>
16
Harald Alvestrandc24a2182022-02-23 13:44:59 +000017#include "absl/strings/string_view.h"
Markus Handell5932fe12020-12-17 22:19:40 +010018#include "absl/types/optional.h"
19#include "api/rtp_parameters.h"
Markus Handell0357b3e2020-03-16 13:40:51 +010020#include "media/base/fake_media_engine.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000021#include "media/base/media_engine.h"
Steve Anton10542f22019-01-11 09:11:00 -080022#include "pc/test/mock_channel_interface.h"
Markus Handell0357b3e2020-03-16 13:40:51 +010023#include "pc/test/mock_rtp_receiver_internal.h"
24#include "pc/test/mock_rtp_sender_internal.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000025#include "rtc_base/thread.h"
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080026#include "test/gmock.h"
Yves Gerey3e707812018-11-28 16:47:49 +010027#include "test/gtest.h"
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080028
Tommi99c8a802021-04-27 15:00:00 +020029using ::testing::_;
Markus Handell0357b3e2020-03-16 13:40:51 +010030using ::testing::ElementsAre;
Markus Handell5932fe12020-12-17 22:19:40 +010031using ::testing::Optional;
Markus Handell755c65d2020-06-24 01:06:10 +020032using ::testing::Property;
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080033using ::testing::Return;
34using ::testing::ReturnRef;
35
36namespace webrtc {
37
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010038namespace {
39class ChannelManagerForTest : public cricket::ChannelManager {
40 public:
41 ChannelManagerForTest()
42 : cricket::ChannelManager(std::make_unique<cricket::FakeMediaEngine>(),
43 true,
44 rtc::Thread::Current(),
45 rtc::Thread::Current()) {}
46
47 MOCK_METHOD(void, DestroyChannel, (cricket::ChannelInterface*), (override));
48};
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 Gunnarsson16de2162022-01-26 10:21:57 +010055 RtpTransceiver transceiver(cricket::MediaType::MEDIA_TYPE_AUDIO, &cm);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080056 cricket::MockChannelInterface channel1;
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080057 EXPECT_CALL(channel1, media_type())
58 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
Tomas Gunnarsson5411b172022-01-24 08:45:26 +010059 EXPECT_CALL(channel1, mid()).WillRepeatedly(ReturnRef(content_name));
Tommi99c8a802021-04-27 15:00:00 +020060 EXPECT_CALL(channel1, SetFirstPacketReceivedCallback(_));
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010061 EXPECT_CALL(channel1, SetRtpTransport(_)).WillRepeatedly(Return(true));
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080062
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010063 transceiver.SetChannel(&channel1, [&](const std::string& mid) {
64 EXPECT_EQ(mid, content_name);
65 return nullptr;
66 });
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080067 EXPECT_EQ(&channel1, transceiver.channel());
68
69 // Stop the transceiver.
Harald Alvestrand6060df52020-08-11 09:54:02 +020070 transceiver.StopInternal();
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080071 EXPECT_EQ(&channel1, transceiver.channel());
72
73 cricket::MockChannelInterface channel2;
74 EXPECT_CALL(channel2, media_type())
75 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
76
77 // Channel can no longer be set, so this call should be a no-op.
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010078 transceiver.SetChannel(&channel2, [](const std::string&) { return nullptr; });
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080079 EXPECT_EQ(&channel1, transceiver.channel());
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010080
81 // Clear the current channel before `transceiver` goes out of scope.
82 EXPECT_CALL(channel1, SetFirstPacketReceivedCallback(_));
83 EXPECT_CALL(cm, DestroyChannel(&channel1)).WillRepeatedly(testing::Return());
84 transceiver.SetChannel(nullptr, nullptr);
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 Gunnarsson16de2162022-01-26 10:21:57 +010091 RtpTransceiver transceiver(cricket::MediaType::MEDIA_TYPE_VIDEO, &cm);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080092 cricket::MockChannelInterface channel;
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080093 EXPECT_CALL(channel, media_type())
94 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_VIDEO));
Tomas Gunnarsson5411b172022-01-24 08:45:26 +010095 EXPECT_CALL(channel, mid()).WillRepeatedly(ReturnRef(content_name));
Tommi99c8a802021-04-27 15:00:00 +020096 EXPECT_CALL(channel, SetFirstPacketReceivedCallback(_))
97 .WillRepeatedly(testing::Return());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +010098 EXPECT_CALL(channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
Tomas Gunnarsson16de2162022-01-26 10:21:57 +010099 EXPECT_CALL(cm, DestroyChannel(&channel)).WillRepeatedly(testing::Return());
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800100
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100101 transceiver.SetChannel(&channel, [&](const std::string& mid) {
102 EXPECT_EQ(mid, content_name);
103 return nullptr;
104 });
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800105 EXPECT_EQ(&channel, transceiver.channel());
106
107 // Stop the transceiver.
Harald Alvestrand6060df52020-08-11 09:54:02 +0200108 transceiver.StopInternal();
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800109 EXPECT_EQ(&channel, transceiver.channel());
110
Artem Titov880fa812021-07-30 22:30:23 +0200111 // Set the channel to `nullptr`.
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100112 transceiver.SetChannel(nullptr, nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800113 EXPECT_EQ(nullptr, transceiver.channel());
114}
115
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000116class RtpTransceiverUnifiedPlanTest : public ::testing::Test {
117 public:
118 RtpTransceiverUnifiedPlanTest()
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100119 : transceiver_(RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000120 rtc::Thread::Current(),
Tommi99c8a802021-04-27 15:00:00 +0200121 sender_),
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000122 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
123 rtc::Thread::Current(),
Tommi4ccdf932021-05-17 14:50:10 +0200124 rtc::Thread::Current(),
Tommi99c8a802021-04-27 15:00:00 +0200125 receiver_),
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100126 &channel_manager_,
127 channel_manager_.GetSupportedAudioRtpHeaderExtensions(),
Harald Alvestrand280054f2020-11-10 13:12:53 +0000128 /* on_negotiation_needed= */ [] {}) {}
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000129
Tommi99c8a802021-04-27 15:00:00 +0200130 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
131 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
132 EXPECT_CALL(*receiver.get(), media_type())
133 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
134 return receiver;
135 }
136
137 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
138 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
139 EXPECT_CALL(*sender.get(), media_type())
140 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
141 return sender;
142 }
143
144 rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
145 rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100146 ChannelManagerForTest channel_manager_;
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000147 RtpTransceiver transceiver_;
148};
149
150// Basic tests for Stop()
151TEST_F(RtpTransceiverUnifiedPlanTest, StopSetsDirection) {
Tommi6589def2022-02-17 23:36:47 +0100152 EXPECT_CALL(*receiver_.get(), Stop());
153 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200154 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
155 EXPECT_CALL(*sender_.get(), Stop());
156
Harald Alvestrandc75c4282020-08-26 12:17:54 +0000157 EXPECT_EQ(RtpTransceiverDirection::kInactive, transceiver_.direction());
158 EXPECT_FALSE(transceiver_.current_direction());
159 transceiver_.StopStandard();
160 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_.direction());
161 EXPECT_FALSE(transceiver_.current_direction());
162 transceiver_.StopTransceiverProcedure();
163 EXPECT_TRUE(transceiver_.current_direction());
164 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_.direction());
165 EXPECT_EQ(RtpTransceiverDirection::kStopped,
166 *transceiver_.current_direction());
167}
168
Markus Handell755c65d2020-06-24 01:06:10 +0200169class RtpTransceiverTestForHeaderExtensions : public ::testing::Test {
170 public:
171 RtpTransceiverTestForHeaderExtensions()
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100172 : extensions_(
Markus Handell755c65d2020-06-24 01:06:10 +0200173 {RtpHeaderExtensionCapability("uri1",
174 1,
175 RtpTransceiverDirection::kSendOnly),
176 RtpHeaderExtensionCapability("uri2",
177 2,
178 RtpTransceiverDirection::kRecvOnly),
179 RtpHeaderExtensionCapability(RtpExtension::kMidUri,
180 3,
181 RtpTransceiverDirection::kSendRecv),
182 RtpHeaderExtensionCapability(RtpExtension::kVideoRotationUri,
183 4,
184 RtpTransceiverDirection::kSendRecv)}),
185 transceiver_(RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
186 rtc::Thread::Current(),
Tommi99c8a802021-04-27 15:00:00 +0200187 sender_),
Markus Handell755c65d2020-06-24 01:06:10 +0200188 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
189 rtc::Thread::Current(),
Tommi4ccdf932021-05-17 14:50:10 +0200190 rtc::Thread::Current(),
Tommi99c8a802021-04-27 15:00:00 +0200191 receiver_),
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100192 &channel_manager_,
Harald Alvestrand280054f2020-11-10 13:12:53 +0000193 extensions_,
194 /* on_negotiation_needed= */ [] {}) {}
Markus Handell755c65d2020-06-24 01:06:10 +0200195
Tommi99c8a802021-04-27 15:00:00 +0200196 static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
197 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
198 EXPECT_CALL(*receiver.get(), media_type())
199 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
200 return receiver;
201 }
202
203 static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
204 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
205 EXPECT_CALL(*sender.get(), media_type())
206 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
207 return sender;
208 }
209
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100210 void ClearChannel(cricket::MockChannelInterface& mock_channel) {
Tommi6589def2022-02-17 23:36:47 +0100211 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100212 EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
213 EXPECT_CALL(channel_manager_, DestroyChannel(&mock_channel))
214 .WillRepeatedly(testing::Return());
215 transceiver_.SetChannel(nullptr, nullptr);
216 }
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_;
223 RtpTransceiver transceiver_;
224};
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
Markus Handell755c65d2020-06-24 01:06:10 +0200232 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
233}
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(
244 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
245 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
246 modified_extensions[0].direction = RtpTransceiverDirection::kRecvOnly;
247 EXPECT_TRUE(
248 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
249 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
250 modified_extensions[0].direction = RtpTransceiverDirection::kSendRecv;
251 EXPECT_TRUE(
252 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
253 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
254 modified_extensions[0].direction = RtpTransceiverDirection::kInactive;
255 EXPECT_TRUE(
256 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
257 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
258}
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(
269 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
270 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
271}
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)});
282 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
Markus Handellc17bca72021-01-14 17:08:01 +0100283 Property(&RTCError::type, RTCErrorType::UNSUPPORTED_PARAMETER));
Markus Handell755c65d2020-06-24 01:06:10 +0200284 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
285}
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;
297 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
298 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
299 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
300 modified_extensions = extensions_;
301 // Attempting to stop the mandatory video orientation extension.
302 modified_extensions[3].direction = RtpTransceiverDirection::kStopped;
303 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
304 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
305 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());
Markus Handell5932fe12020-12-17 22:19:40 +0100314 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(), ElementsAre());
315}
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());
Markus Handell5932fe12020-12-17 22:19:40 +0100325 cricket::MockChannelInterface mock_channel;
Tommi99c8a802021-04-27 15:00:00 +0200326 EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
327 EXPECT_CALL(mock_channel, media_type())
328 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
329 EXPECT_CALL(mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
Tomas Gunnarsson5411b172022-01-24 08:45:26 +0100330 EXPECT_CALL(mock_channel, mid()).WillRepeatedly(ReturnRef(content_name));
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100331 EXPECT_CALL(mock_channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
332 transceiver_.SetChannel(&mock_channel,
333 [](const std::string&) { return nullptr; });
Markus Handell5932fe12020-12-17 22:19:40 +0100334 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(), ElementsAre());
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100335
336 ClearChannel(mock_channel);
Markus Handell5932fe12020-12-17 22:19:40 +0100337}
338
339TEST_F(RtpTransceiverTestForHeaderExtensions, ReturnsNegotiatedHdrExts) {
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100340 const std::string content_name("my_mid");
Tommi6589def2022-02-17 23:36:47 +0100341 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_)).WillRepeatedly(Return());
342 EXPECT_CALL(*receiver_.get(), Stop()).WillRepeatedly(Return());
Tommi99c8a802021-04-27 15:00:00 +0200343 EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
344 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
345 EXPECT_CALL(*sender_.get(), Stop());
346
Markus Handell5932fe12020-12-17 22:19:40 +0100347 cricket::MockChannelInterface mock_channel;
Tommi99c8a802021-04-27 15:00:00 +0200348 EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
349 EXPECT_CALL(mock_channel, media_type())
350 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
351 EXPECT_CALL(mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
Tomas Gunnarsson5411b172022-01-24 08:45:26 +0100352 EXPECT_CALL(mock_channel, mid()).WillRepeatedly(ReturnRef(content_name));
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100353 EXPECT_CALL(mock_channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
Tommicc7a3682021-05-04 14:59:38 +0200354
Markus Handell5932fe12020-12-17 22:19:40 +0100355 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
356 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200357 cricket::AudioContentDescription description;
358 description.set_rtp_header_extensions(extensions);
359 transceiver_.OnNegotiationUpdate(SdpType::kAnswer, &description);
360
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100361 transceiver_.SetChannel(&mock_channel,
362 [](const std::string&) { return nullptr; });
Markus Handell5932fe12020-12-17 22:19:40 +0100363 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(),
364 ElementsAre(RtpHeaderExtensionCapability(
365 "uri1", 1, RtpTransceiverDirection::kSendRecv),
366 RtpHeaderExtensionCapability(
367 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
Tomas Gunnarsson16de2162022-01-26 10:21:57 +0100368
369 ClearChannel(mock_channel);
Markus Handell5932fe12020-12-17 22:19:40 +0100370}
371
372TEST_F(RtpTransceiverTestForHeaderExtensions,
373 ReturnsNegotiatedHdrExtsSecondTime) {
Tommi6589def2022-02-17 23:36:47 +0100374 EXPECT_CALL(*receiver_.get(), Stop());
375 EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
Tommi99c8a802021-04-27 15:00:00 +0200376 EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
377 EXPECT_CALL(*sender_.get(), Stop());
378
Markus Handell5932fe12020-12-17 22:19:40 +0100379 cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
380 webrtc::RtpExtension("uri2", 2)};
Tommicc7a3682021-05-04 14:59:38 +0200381 cricket::AudioContentDescription description;
382 description.set_rtp_header_extensions(extensions);
383 transceiver_.OnNegotiationUpdate(SdpType::kAnswer, &description);
Markus Handell5932fe12020-12-17 22:19:40 +0100384
Tommicc7a3682021-05-04 14:59:38 +0200385 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(),
386 ElementsAre(RtpHeaderExtensionCapability(
387 "uri1", 1, RtpTransceiverDirection::kSendRecv),
388 RtpHeaderExtensionCapability(
389 "uri2", 2, RtpTransceiverDirection::kSendRecv)));
Markus Handell5932fe12020-12-17 22:19:40 +0100390
391 extensions = {webrtc::RtpExtension("uri3", 4),
392 webrtc::RtpExtension("uri5", 6)};
Tommicc7a3682021-05-04 14:59:38 +0200393 description.set_rtp_header_extensions(extensions);
394 transceiver_.OnNegotiationUpdate(SdpType::kAnswer, &description);
395
Markus Handell5932fe12020-12-17 22:19:40 +0100396 EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(),
397 ElementsAre(RtpHeaderExtensionCapability(
398 "uri3", 4, RtpTransceiverDirection::kSendRecv),
399 RtpHeaderExtensionCapability(
400 "uri5", 6, RtpTransceiverDirection::kSendRecv)));
401}
402
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800403} // namespace webrtc