2018-11-13 16:26:05 -08:00
|
|
|
/*
|
|
|
|
|
* Copyright 2018 The WebRTC project authors. All Rights Reserved.
|
|
|
|
|
*
|
|
|
|
|
* Use of this source code is governed by a BSD-style license
|
|
|
|
|
* that can be found in the LICENSE file in the root of the source
|
|
|
|
|
* tree. An additional intellectual property rights grant can be found
|
|
|
|
|
* in the file PATENTS. All contributing project authors may
|
|
|
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
|
|
|
*/
|
|
|
|
|
|
2021-07-30 22:30:23 +02:00
|
|
|
// This file contains tests for `RtpTransceiver`.
|
2018-11-13 16:26:05 -08:00
|
|
|
|
2019-01-11 09:11:00 -08:00
|
|
|
#include "pc/rtp_transceiver.h"
|
2018-11-28 16:47:49 +01:00
|
|
|
|
2020-03-16 13:40:51 +01:00
|
|
|
#include <memory>
|
|
|
|
|
|
2022-02-23 13:44:59 +00:00
|
|
|
#include "absl/strings/string_view.h"
|
2020-12-17 22:19:40 +01:00
|
|
|
#include "absl/types/optional.h"
|
|
|
|
|
#include "api/rtp_parameters.h"
|
2020-03-16 13:40:51 +01:00
|
|
|
#include "media/base/fake_media_engine.h"
|
2022-02-23 13:44:59 +00:00
|
|
|
#include "media/base/media_engine.h"
|
2019-01-11 09:11:00 -08:00
|
|
|
#include "pc/test/mock_channel_interface.h"
|
2020-03-16 13:40:51 +01:00
|
|
|
#include "pc/test/mock_rtp_receiver_internal.h"
|
|
|
|
|
#include "pc/test/mock_rtp_sender_internal.h"
|
2022-02-23 13:44:59 +00:00
|
|
|
#include "rtc_base/thread.h"
|
2018-11-13 16:26:05 -08:00
|
|
|
#include "test/gmock.h"
|
2018-11-28 16:47:49 +01:00
|
|
|
#include "test/gtest.h"
|
2018-11-13 16:26:05 -08:00
|
|
|
|
2021-04-27 15:00:00 +02:00
|
|
|
using ::testing::_;
|
2020-03-16 13:40:51 +01:00
|
|
|
using ::testing::ElementsAre;
|
2020-12-17 22:19:40 +01:00
|
|
|
using ::testing::Optional;
|
2020-06-24 01:06:10 +02:00
|
|
|
using ::testing::Property;
|
2018-11-13 16:26:05 -08:00
|
|
|
using ::testing::Return;
|
|
|
|
|
using ::testing::ReturnRef;
|
|
|
|
|
|
|
|
|
|
namespace webrtc {
|
|
|
|
|
|
2022-01-26 10:21:57 +01:00
|
|
|
namespace {
|
|
|
|
|
class ChannelManagerForTest : public cricket::ChannelManager {
|
|
|
|
|
public:
|
|
|
|
|
ChannelManagerForTest()
|
|
|
|
|
: cricket::ChannelManager(std::make_unique<cricket::FakeMediaEngine>(),
|
|
|
|
|
true,
|
|
|
|
|
rtc::Thread::Current(),
|
|
|
|
|
rtc::Thread::Current()) {}
|
|
|
|
|
|
|
|
|
|
MOCK_METHOD(void, DestroyChannel, (cricket::ChannelInterface*), (override));
|
|
|
|
|
};
|
|
|
|
|
} // namespace
|
|
|
|
|
|
2021-07-30 22:30:23 +02:00
|
|
|
// Checks that a channel cannot be set on a stopped `RtpTransceiver`.
|
2018-11-13 16:26:05 -08:00
|
|
|
TEST(RtpTransceiverTest, CannotSetChannelOnStoppedTransceiver) {
|
2022-01-26 10:21:57 +01:00
|
|
|
ChannelManagerForTest cm;
|
2022-01-19 11:36:23 +01:00
|
|
|
const std::string content_name("my_mid");
|
2022-03-18 15:57:15 +01:00
|
|
|
auto transceiver = rtc::make_ref_counted<RtpTransceiver>(
|
|
|
|
|
cricket::MediaType::MEDIA_TYPE_AUDIO, &cm);
|
2018-11-13 16:26:05 -08:00
|
|
|
cricket::MockChannelInterface channel1;
|
|
|
|
|
EXPECT_CALL(channel1, media_type())
|
|
|
|
|
.WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
|
2022-01-24 08:45:26 +01:00
|
|
|
EXPECT_CALL(channel1, mid()).WillRepeatedly(ReturnRef(content_name));
|
2021-04-27 15:00:00 +02:00
|
|
|
EXPECT_CALL(channel1, SetFirstPacketReceivedCallback(_));
|
2022-01-19 11:36:23 +01:00
|
|
|
EXPECT_CALL(channel1, SetRtpTransport(_)).WillRepeatedly(Return(true));
|
2018-11-13 16:26:05 -08:00
|
|
|
|
2022-03-18 15:57:15 +01:00
|
|
|
transceiver->SetChannel(&channel1, [&](const std::string& mid) {
|
2022-01-19 11:36:23 +01:00
|
|
|
EXPECT_EQ(mid, content_name);
|
|
|
|
|
return nullptr;
|
|
|
|
|
});
|
2022-03-18 15:57:15 +01:00
|
|
|
EXPECT_EQ(&channel1, transceiver->channel());
|
2018-11-13 16:26:05 -08:00
|
|
|
|
|
|
|
|
// Stop the transceiver.
|
2022-03-18 15:57:15 +01:00
|
|
|
transceiver->StopInternal();
|
|
|
|
|
EXPECT_EQ(&channel1, transceiver->channel());
|
2018-11-13 16:26:05 -08:00
|
|
|
|
|
|
|
|
cricket::MockChannelInterface channel2;
|
|
|
|
|
EXPECT_CALL(channel2, media_type())
|
|
|
|
|
.WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
|
|
|
|
|
|
|
|
|
|
// Channel can no longer be set, so this call should be a no-op.
|
2022-03-18 15:57:15 +01:00
|
|
|
transceiver->SetChannel(&channel2,
|
|
|
|
|
[](const std::string&) { return nullptr; });
|
|
|
|
|
EXPECT_EQ(&channel1, transceiver->channel());
|
2022-01-26 10:21:57 +01:00
|
|
|
|
|
|
|
|
// Clear the current channel before `transceiver` goes out of scope.
|
|
|
|
|
EXPECT_CALL(channel1, SetFirstPacketReceivedCallback(_));
|
|
|
|
|
EXPECT_CALL(cm, DestroyChannel(&channel1)).WillRepeatedly(testing::Return());
|
2022-04-28 13:31:17 +00:00
|
|
|
transceiver->ClearChannel();
|
2018-11-13 16:26:05 -08:00
|
|
|
}
|
|
|
|
|
|
2021-07-30 22:30:23 +02:00
|
|
|
// Checks that a channel can be unset on a stopped `RtpTransceiver`
|
2018-11-13 16:26:05 -08:00
|
|
|
TEST(RtpTransceiverTest, CanUnsetChannelOnStoppedTransceiver) {
|
2022-01-26 10:21:57 +01:00
|
|
|
ChannelManagerForTest cm;
|
2022-01-19 11:36:23 +01:00
|
|
|
const std::string content_name("my_mid");
|
2022-03-18 15:57:15 +01:00
|
|
|
auto transceiver = rtc::make_ref_counted<RtpTransceiver>(
|
|
|
|
|
cricket::MediaType::MEDIA_TYPE_VIDEO, &cm);
|
2018-11-13 16:26:05 -08:00
|
|
|
cricket::MockChannelInterface channel;
|
|
|
|
|
EXPECT_CALL(channel, media_type())
|
|
|
|
|
.WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_VIDEO));
|
2022-01-24 08:45:26 +01:00
|
|
|
EXPECT_CALL(channel, mid()).WillRepeatedly(ReturnRef(content_name));
|
2021-04-27 15:00:00 +02:00
|
|
|
EXPECT_CALL(channel, SetFirstPacketReceivedCallback(_))
|
|
|
|
|
.WillRepeatedly(testing::Return());
|
2022-01-19 11:36:23 +01:00
|
|
|
EXPECT_CALL(channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
|
2022-01-26 10:21:57 +01:00
|
|
|
EXPECT_CALL(cm, DestroyChannel(&channel)).WillRepeatedly(testing::Return());
|
2018-11-13 16:26:05 -08:00
|
|
|
|
2022-03-18 15:57:15 +01:00
|
|
|
transceiver->SetChannel(&channel, [&](const std::string& mid) {
|
2022-01-19 11:36:23 +01:00
|
|
|
EXPECT_EQ(mid, content_name);
|
|
|
|
|
return nullptr;
|
|
|
|
|
});
|
2022-03-18 15:57:15 +01:00
|
|
|
EXPECT_EQ(&channel, transceiver->channel());
|
2018-11-13 16:26:05 -08:00
|
|
|
|
|
|
|
|
// Stop the transceiver.
|
2022-03-18 15:57:15 +01:00
|
|
|
transceiver->StopInternal();
|
|
|
|
|
EXPECT_EQ(&channel, transceiver->channel());
|
2018-11-13 16:26:05 -08:00
|
|
|
|
2021-07-30 22:30:23 +02:00
|
|
|
// Set the channel to `nullptr`.
|
2022-04-28 13:31:17 +00:00
|
|
|
transceiver->ClearChannel();
|
2022-03-18 15:57:15 +01:00
|
|
|
EXPECT_EQ(nullptr, transceiver->channel());
|
2018-11-13 16:26:05 -08:00
|
|
|
}
|
|
|
|
|
|
2020-08-26 12:17:54 +00:00
|
|
|
class RtpTransceiverUnifiedPlanTest : public ::testing::Test {
|
|
|
|
|
public:
|
|
|
|
|
RtpTransceiverUnifiedPlanTest()
|
2022-03-18 15:57:15 +01:00
|
|
|
: transceiver_(rtc::make_ref_counted<RtpTransceiver>(
|
|
|
|
|
RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
|
|
|
|
|
rtc::Thread::Current(),
|
|
|
|
|
sender_),
|
|
|
|
|
RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
|
|
|
|
|
rtc::Thread::Current(),
|
|
|
|
|
rtc::Thread::Current(),
|
|
|
|
|
receiver_),
|
|
|
|
|
&channel_manager_,
|
|
|
|
|
channel_manager_.GetSupportedAudioRtpHeaderExtensions(),
|
|
|
|
|
/* on_negotiation_needed= */ [] {})) {}
|
2020-08-26 12:17:54 +00:00
|
|
|
|
2021-04-27 15:00:00 +02:00
|
|
|
static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
|
|
|
|
|
auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
|
|
|
|
|
EXPECT_CALL(*receiver.get(), media_type())
|
|
|
|
|
.WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
|
|
|
|
|
return receiver;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
|
|
|
|
|
auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
|
|
|
|
|
EXPECT_CALL(*sender.get(), media_type())
|
|
|
|
|
.WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
|
|
|
|
|
return sender;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
|
|
|
|
|
rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
|
2022-01-26 10:21:57 +01:00
|
|
|
ChannelManagerForTest channel_manager_;
|
2022-03-18 15:57:15 +01:00
|
|
|
rtc::scoped_refptr<RtpTransceiver> transceiver_;
|
2020-08-26 12:17:54 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Basic tests for Stop()
|
|
|
|
|
TEST_F(RtpTransceiverUnifiedPlanTest, StopSetsDirection) {
|
2022-02-17 23:36:47 +01:00
|
|
|
EXPECT_CALL(*receiver_.get(), Stop());
|
|
|
|
|
EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
|
2021-04-27 15:00:00 +02:00
|
|
|
EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
|
|
|
|
|
EXPECT_CALL(*sender_.get(), Stop());
|
|
|
|
|
|
2022-03-18 15:57:15 +01:00
|
|
|
EXPECT_EQ(RtpTransceiverDirection::kInactive, transceiver_->direction());
|
|
|
|
|
EXPECT_FALSE(transceiver_->current_direction());
|
|
|
|
|
transceiver_->StopStandard();
|
|
|
|
|
EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_->direction());
|
|
|
|
|
EXPECT_FALSE(transceiver_->current_direction());
|
|
|
|
|
transceiver_->StopTransceiverProcedure();
|
|
|
|
|
EXPECT_TRUE(transceiver_->current_direction());
|
|
|
|
|
EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_->direction());
|
2020-08-26 12:17:54 +00:00
|
|
|
EXPECT_EQ(RtpTransceiverDirection::kStopped,
|
2022-03-18 15:57:15 +01:00
|
|
|
*transceiver_->current_direction());
|
2020-08-26 12:17:54 +00:00
|
|
|
}
|
|
|
|
|
|
2020-06-24 01:06:10 +02:00
|
|
|
class RtpTransceiverTestForHeaderExtensions : public ::testing::Test {
|
|
|
|
|
public:
|
|
|
|
|
RtpTransceiverTestForHeaderExtensions()
|
2022-01-26 10:21:57 +01:00
|
|
|
: extensions_(
|
2020-06-24 01:06:10 +02:00
|
|
|
{RtpHeaderExtensionCapability("uri1",
|
|
|
|
|
1,
|
|
|
|
|
RtpTransceiverDirection::kSendOnly),
|
|
|
|
|
RtpHeaderExtensionCapability("uri2",
|
|
|
|
|
2,
|
|
|
|
|
RtpTransceiverDirection::kRecvOnly),
|
|
|
|
|
RtpHeaderExtensionCapability(RtpExtension::kMidUri,
|
|
|
|
|
3,
|
|
|
|
|
RtpTransceiverDirection::kSendRecv),
|
|
|
|
|
RtpHeaderExtensionCapability(RtpExtension::kVideoRotationUri,
|
|
|
|
|
4,
|
|
|
|
|
RtpTransceiverDirection::kSendRecv)}),
|
2022-03-18 15:57:15 +01:00
|
|
|
transceiver_(rtc::make_ref_counted<RtpTransceiver>(
|
|
|
|
|
RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
|
|
|
|
|
rtc::Thread::Current(),
|
|
|
|
|
sender_),
|
|
|
|
|
RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
|
|
|
|
|
rtc::Thread::Current(),
|
|
|
|
|
rtc::Thread::Current(),
|
|
|
|
|
receiver_),
|
|
|
|
|
&channel_manager_,
|
|
|
|
|
extensions_,
|
|
|
|
|
/* on_negotiation_needed= */ [] {})) {}
|
2020-06-24 01:06:10 +02:00
|
|
|
|
2021-04-27 15:00:00 +02:00
|
|
|
static rtc::scoped_refptr<MockRtpReceiverInternal> MockReceiver() {
|
|
|
|
|
auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
|
|
|
|
|
EXPECT_CALL(*receiver.get(), media_type())
|
|
|
|
|
.WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
|
|
|
|
|
return receiver;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static rtc::scoped_refptr<MockRtpSenderInternal> MockSender() {
|
|
|
|
|
auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
|
|
|
|
|
EXPECT_CALL(*sender.get(), media_type())
|
|
|
|
|
.WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
|
|
|
|
|
return sender;
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-26 10:21:57 +01:00
|
|
|
void ClearChannel(cricket::MockChannelInterface& mock_channel) {
|
2022-02-17 23:36:47 +01:00
|
|
|
EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
|
2022-01-26 10:21:57 +01:00
|
|
|
EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
|
|
|
|
|
EXPECT_CALL(channel_manager_, DestroyChannel(&mock_channel))
|
|
|
|
|
.WillRepeatedly(testing::Return());
|
2022-04-28 13:31:17 +00:00
|
|
|
transceiver_->ClearChannel();
|
2022-01-26 10:21:57 +01:00
|
|
|
}
|
|
|
|
|
|
2021-04-27 15:00:00 +02:00
|
|
|
rtc::scoped_refptr<MockRtpReceiverInternal> receiver_ = MockReceiver();
|
|
|
|
|
rtc::scoped_refptr<MockRtpSenderInternal> sender_ = MockSender();
|
|
|
|
|
|
2022-01-26 10:21:57 +01:00
|
|
|
ChannelManagerForTest channel_manager_;
|
2020-06-24 01:06:10 +02:00
|
|
|
std::vector<RtpHeaderExtensionCapability> extensions_;
|
2022-03-18 15:57:15 +01:00
|
|
|
rtc::scoped_refptr<RtpTransceiver> transceiver_;
|
2020-06-24 01:06:10 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
TEST_F(RtpTransceiverTestForHeaderExtensions, OffersChannelManagerList) {
|
2022-02-17 23:36:47 +01:00
|
|
|
EXPECT_CALL(*receiver_.get(), Stop());
|
|
|
|
|
EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
|
2021-04-27 15:00:00 +02:00
|
|
|
EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
|
|
|
|
|
EXPECT_CALL(*sender_.get(), Stop());
|
|
|
|
|
|
2022-03-18 15:57:15 +01:00
|
|
|
EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
|
2020-06-24 01:06:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(RtpTransceiverTestForHeaderExtensions, ModifiesDirection) {
|
2022-02-17 23:36:47 +01:00
|
|
|
EXPECT_CALL(*receiver_.get(), Stop());
|
|
|
|
|
EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
|
2021-04-27 15:00:00 +02:00
|
|
|
EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
|
|
|
|
|
EXPECT_CALL(*sender_.get(), Stop());
|
|
|
|
|
|
2020-06-24 01:06:10 +02:00
|
|
|
auto modified_extensions = extensions_;
|
|
|
|
|
modified_extensions[0].direction = RtpTransceiverDirection::kSendOnly;
|
|
|
|
|
EXPECT_TRUE(
|
2022-03-18 15:57:15 +01:00
|
|
|
transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
|
|
|
|
|
EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
|
2020-06-24 01:06:10 +02:00
|
|
|
modified_extensions[0].direction = RtpTransceiverDirection::kRecvOnly;
|
|
|
|
|
EXPECT_TRUE(
|
2022-03-18 15:57:15 +01:00
|
|
|
transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
|
|
|
|
|
EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
|
2020-06-24 01:06:10 +02:00
|
|
|
modified_extensions[0].direction = RtpTransceiverDirection::kSendRecv;
|
|
|
|
|
EXPECT_TRUE(
|
2022-03-18 15:57:15 +01:00
|
|
|
transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
|
|
|
|
|
EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
|
2020-06-24 01:06:10 +02:00
|
|
|
modified_extensions[0].direction = RtpTransceiverDirection::kInactive;
|
|
|
|
|
EXPECT_TRUE(
|
2022-03-18 15:57:15 +01:00
|
|
|
transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
|
|
|
|
|
EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
|
2020-06-24 01:06:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(RtpTransceiverTestForHeaderExtensions, AcceptsStoppedExtension) {
|
2022-02-17 23:36:47 +01:00
|
|
|
EXPECT_CALL(*receiver_.get(), Stop());
|
|
|
|
|
EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
|
2021-04-27 15:00:00 +02:00
|
|
|
EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
|
|
|
|
|
EXPECT_CALL(*sender_.get(), Stop());
|
|
|
|
|
|
2020-06-24 01:06:10 +02:00
|
|
|
auto modified_extensions = extensions_;
|
|
|
|
|
modified_extensions[0].direction = RtpTransceiverDirection::kStopped;
|
|
|
|
|
EXPECT_TRUE(
|
2022-03-18 15:57:15 +01:00
|
|
|
transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions).ok());
|
|
|
|
|
EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), modified_extensions);
|
2020-06-24 01:06:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(RtpTransceiverTestForHeaderExtensions, RejectsUnsupportedExtension) {
|
2022-02-17 23:36:47 +01:00
|
|
|
EXPECT_CALL(*receiver_.get(), Stop());
|
|
|
|
|
EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
|
2021-04-27 15:00:00 +02:00
|
|
|
EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
|
|
|
|
|
EXPECT_CALL(*sender_.get(), Stop());
|
|
|
|
|
|
2020-06-24 01:06:10 +02:00
|
|
|
std::vector<RtpHeaderExtensionCapability> modified_extensions(
|
|
|
|
|
{RtpHeaderExtensionCapability("uri3", 1,
|
|
|
|
|
RtpTransceiverDirection::kSendRecv)});
|
2022-03-18 15:57:15 +01:00
|
|
|
EXPECT_THAT(transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions),
|
2021-01-14 17:08:01 +01:00
|
|
|
Property(&RTCError::type, RTCErrorType::UNSUPPORTED_PARAMETER));
|
2022-03-18 15:57:15 +01:00
|
|
|
EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
|
2020-06-24 01:06:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(RtpTransceiverTestForHeaderExtensions,
|
|
|
|
|
RejectsStoppedMandatoryExtensions) {
|
2022-02-17 23:36:47 +01:00
|
|
|
EXPECT_CALL(*receiver_.get(), Stop());
|
|
|
|
|
EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
|
2021-04-27 15:00:00 +02:00
|
|
|
EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
|
|
|
|
|
EXPECT_CALL(*sender_.get(), Stop());
|
|
|
|
|
|
2020-06-24 01:06:10 +02:00
|
|
|
std::vector<RtpHeaderExtensionCapability> modified_extensions = extensions_;
|
|
|
|
|
// Attempting to stop the mandatory MID extension.
|
|
|
|
|
modified_extensions[2].direction = RtpTransceiverDirection::kStopped;
|
2022-03-18 15:57:15 +01:00
|
|
|
EXPECT_THAT(transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions),
|
2020-06-24 01:06:10 +02:00
|
|
|
Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
|
2022-03-18 15:57:15 +01:00
|
|
|
EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
|
2020-06-24 01:06:10 +02:00
|
|
|
modified_extensions = extensions_;
|
|
|
|
|
// Attempting to stop the mandatory video orientation extension.
|
|
|
|
|
modified_extensions[3].direction = RtpTransceiverDirection::kStopped;
|
2022-03-18 15:57:15 +01:00
|
|
|
EXPECT_THAT(transceiver_->SetOfferedRtpHeaderExtensions(modified_extensions),
|
2020-06-24 01:06:10 +02:00
|
|
|
Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
|
2022-03-18 15:57:15 +01:00
|
|
|
EXPECT_EQ(transceiver_->HeaderExtensionsToOffer(), extensions_);
|
2020-03-16 13:40:51 +01:00
|
|
|
}
|
|
|
|
|
|
2020-12-17 22:19:40 +01:00
|
|
|
TEST_F(RtpTransceiverTestForHeaderExtensions,
|
|
|
|
|
NoNegotiatedHdrExtsWithoutChannel) {
|
2022-02-17 23:36:47 +01:00
|
|
|
EXPECT_CALL(*receiver_.get(), Stop());
|
|
|
|
|
EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
|
2021-04-27 15:00:00 +02:00
|
|
|
EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
|
|
|
|
|
EXPECT_CALL(*sender_.get(), Stop());
|
2022-03-18 15:57:15 +01:00
|
|
|
EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(), ElementsAre());
|
2020-12-17 22:19:40 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(RtpTransceiverTestForHeaderExtensions,
|
|
|
|
|
NoNegotiatedHdrExtsWithChannelWithoutNegotiation) {
|
2022-01-19 11:36:23 +01:00
|
|
|
const std::string content_name("my_mid");
|
2022-02-17 23:36:47 +01:00
|
|
|
EXPECT_CALL(*receiver_.get(), SetMediaChannel(_)).WillRepeatedly(Return());
|
|
|
|
|
EXPECT_CALL(*receiver_.get(), Stop()).WillRepeatedly(Return());
|
2021-04-27 15:00:00 +02:00
|
|
|
EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
|
|
|
|
|
EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
|
|
|
|
|
EXPECT_CALL(*sender_.get(), Stop());
|
2020-12-17 22:19:40 +01:00
|
|
|
cricket::MockChannelInterface mock_channel;
|
2021-04-27 15:00:00 +02:00
|
|
|
EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
|
|
|
|
|
EXPECT_CALL(mock_channel, media_type())
|
|
|
|
|
.WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
|
|
|
|
|
EXPECT_CALL(mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
|
2022-01-24 08:45:26 +01:00
|
|
|
EXPECT_CALL(mock_channel, mid()).WillRepeatedly(ReturnRef(content_name));
|
2022-01-19 11:36:23 +01:00
|
|
|
EXPECT_CALL(mock_channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
|
2022-03-18 15:57:15 +01:00
|
|
|
transceiver_->SetChannel(&mock_channel,
|
|
|
|
|
[](const std::string&) { return nullptr; });
|
|
|
|
|
EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(), ElementsAre());
|
2022-01-26 10:21:57 +01:00
|
|
|
|
|
|
|
|
ClearChannel(mock_channel);
|
2020-12-17 22:19:40 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(RtpTransceiverTestForHeaderExtensions, ReturnsNegotiatedHdrExts) {
|
2022-01-19 11:36:23 +01:00
|
|
|
const std::string content_name("my_mid");
|
2022-02-17 23:36:47 +01:00
|
|
|
EXPECT_CALL(*receiver_.get(), SetMediaChannel(_)).WillRepeatedly(Return());
|
|
|
|
|
EXPECT_CALL(*receiver_.get(), Stop()).WillRepeatedly(Return());
|
2021-04-27 15:00:00 +02:00
|
|
|
EXPECT_CALL(*sender_.get(), SetMediaChannel(_));
|
|
|
|
|
EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
|
|
|
|
|
EXPECT_CALL(*sender_.get(), Stop());
|
|
|
|
|
|
2020-12-17 22:19:40 +01:00
|
|
|
cricket::MockChannelInterface mock_channel;
|
2021-04-27 15:00:00 +02:00
|
|
|
EXPECT_CALL(mock_channel, SetFirstPacketReceivedCallback(_));
|
|
|
|
|
EXPECT_CALL(mock_channel, media_type())
|
|
|
|
|
.WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
|
|
|
|
|
EXPECT_CALL(mock_channel, media_channel()).WillRepeatedly(Return(nullptr));
|
2022-01-24 08:45:26 +01:00
|
|
|
EXPECT_CALL(mock_channel, mid()).WillRepeatedly(ReturnRef(content_name));
|
2022-01-19 11:36:23 +01:00
|
|
|
EXPECT_CALL(mock_channel, SetRtpTransport(_)).WillRepeatedly(Return(true));
|
2021-05-04 14:59:38 +02:00
|
|
|
|
2020-12-17 22:19:40 +01:00
|
|
|
cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
|
|
|
|
|
webrtc::RtpExtension("uri2", 2)};
|
2021-05-04 14:59:38 +02:00
|
|
|
cricket::AudioContentDescription description;
|
|
|
|
|
description.set_rtp_header_extensions(extensions);
|
2022-03-18 15:57:15 +01:00
|
|
|
transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
|
2021-05-04 14:59:38 +02:00
|
|
|
|
2022-03-18 15:57:15 +01:00
|
|
|
transceiver_->SetChannel(&mock_channel,
|
|
|
|
|
[](const std::string&) { return nullptr; });
|
|
|
|
|
EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
|
2020-12-17 22:19:40 +01:00
|
|
|
ElementsAre(RtpHeaderExtensionCapability(
|
|
|
|
|
"uri1", 1, RtpTransceiverDirection::kSendRecv),
|
|
|
|
|
RtpHeaderExtensionCapability(
|
|
|
|
|
"uri2", 2, RtpTransceiverDirection::kSendRecv)));
|
2022-01-26 10:21:57 +01:00
|
|
|
|
|
|
|
|
ClearChannel(mock_channel);
|
2020-12-17 22:19:40 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(RtpTransceiverTestForHeaderExtensions,
|
|
|
|
|
ReturnsNegotiatedHdrExtsSecondTime) {
|
2022-02-17 23:36:47 +01:00
|
|
|
EXPECT_CALL(*receiver_.get(), Stop());
|
|
|
|
|
EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
|
2021-04-27 15:00:00 +02:00
|
|
|
EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
|
|
|
|
|
EXPECT_CALL(*sender_.get(), Stop());
|
|
|
|
|
|
2020-12-17 22:19:40 +01:00
|
|
|
cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
|
|
|
|
|
webrtc::RtpExtension("uri2", 2)};
|
2021-05-04 14:59:38 +02:00
|
|
|
cricket::AudioContentDescription description;
|
|
|
|
|
description.set_rtp_header_extensions(extensions);
|
2022-03-18 15:57:15 +01:00
|
|
|
transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
|
2020-12-17 22:19:40 +01:00
|
|
|
|
2022-03-18 15:57:15 +01:00
|
|
|
EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
|
2021-05-04 14:59:38 +02:00
|
|
|
ElementsAre(RtpHeaderExtensionCapability(
|
|
|
|
|
"uri1", 1, RtpTransceiverDirection::kSendRecv),
|
|
|
|
|
RtpHeaderExtensionCapability(
|
|
|
|
|
"uri2", 2, RtpTransceiverDirection::kSendRecv)));
|
2020-12-17 22:19:40 +01:00
|
|
|
|
|
|
|
|
extensions = {webrtc::RtpExtension("uri3", 4),
|
|
|
|
|
webrtc::RtpExtension("uri5", 6)};
|
2021-05-04 14:59:38 +02:00
|
|
|
description.set_rtp_header_extensions(extensions);
|
2022-03-18 15:57:15 +01:00
|
|
|
transceiver_->OnNegotiationUpdate(SdpType::kAnswer, &description);
|
2021-05-04 14:59:38 +02:00
|
|
|
|
2022-03-18 15:57:15 +01:00
|
|
|
EXPECT_THAT(transceiver_->HeaderExtensionsNegotiated(),
|
2020-12-17 22:19:40 +01:00
|
|
|
ElementsAre(RtpHeaderExtensionCapability(
|
|
|
|
|
"uri3", 4, RtpTransceiverDirection::kSendRecv),
|
|
|
|
|
RtpHeaderExtensionCapability(
|
|
|
|
|
"uri5", 6, RtpTransceiverDirection::kSendRecv)));
|
|
|
|
|
}
|
|
|
|
|
|
2018-11-13 16:26:05 -08:00
|
|
|
} // namespace webrtc
|