/* * Copyright 2020 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. */ #include #include #include "api/rtc_event_log/rtc_event_log_factory.h" #include "api/task_queue/default_task_queue_factory.h" #include "media/base/fake_media_engine.h" #include "p2p/base/fake_port_allocator.h" #include "pc/media_session.h" #include "pc/peer_connection_wrapper.h" #include "rtc_base/gunit.h" #include "rtc_base/strings/string_builder.h" #include "test/gmock.h" namespace webrtc { using ::testing::Combine; using ::testing::ElementsAre; using ::testing::Field; using ::testing::Return; using ::testing::Values; class PeerConnectionHeaderExtensionTest : public ::testing::TestWithParam< std::tuple> { protected: std::unique_ptr CreatePeerConnection( cricket::MediaType media_type, absl::optional semantics, std::vector extensions) { auto voice = std::make_unique(); auto video = std::make_unique(); if (media_type == cricket::MediaType::MEDIA_TYPE_AUDIO) voice->SetRtpHeaderExtensions(extensions); else video->SetRtpHeaderExtensions(extensions); auto media_engine = std::make_unique( std::move(voice), std::move(video)); PeerConnectionFactoryDependencies factory_dependencies; factory_dependencies.network_thread = rtc::Thread::Current(); factory_dependencies.worker_thread = rtc::Thread::Current(); factory_dependencies.signaling_thread = rtc::Thread::Current(); factory_dependencies.task_queue_factory = CreateDefaultTaskQueueFactory(); factory_dependencies.media_engine = std::move(media_engine); factory_dependencies.call_factory = CreateCallFactory(); factory_dependencies.event_log_factory = std::make_unique( factory_dependencies.task_queue_factory.get()); auto pc_factory = CreateModularPeerConnectionFactory(std::move(factory_dependencies)); auto fake_port_allocator = std::make_unique( rtc::Thread::Current(), nullptr); auto observer = std::make_unique(); PeerConnectionInterface::RTCConfiguration config; if (semantics) config.sdp_semantics = *semantics; auto pc = pc_factory->CreatePeerConnection( config, std::move(fake_port_allocator), nullptr, observer.get()); observer->SetPeerConnectionInterface(pc.get()); return std::make_unique(pc_factory, pc, std::move(observer)); } }; TEST_P(PeerConnectionHeaderExtensionTest, TransceiverOffersHeaderExtensions) { cricket::MediaType media_type; SdpSemantics semantics; std::tie(media_type, semantics) = GetParam(); if (semantics != SdpSemantics::kUnifiedPlan) return; std::vector extensions( {RtpHeaderExtensionCapability("uri1", 1, RtpTransceiverDirection::kStopped), RtpHeaderExtensionCapability("uri2", 2, RtpTransceiverDirection::kSendOnly), RtpHeaderExtensionCapability("uri3", 3, RtpTransceiverDirection::kRecvOnly), RtpHeaderExtensionCapability("uri4", 4, RtpTransceiverDirection::kSendRecv)}); std::unique_ptr wrapper = CreatePeerConnection(media_type, semantics, extensions); auto transceiver = wrapper->AddTransceiver(media_type); EXPECT_EQ(transceiver->HeaderExtensionsToOffer(), extensions); } TEST_P(PeerConnectionHeaderExtensionTest, SenderReceiverCapabilitiesReturnNotStoppedExtensions) { cricket::MediaType media_type; SdpSemantics semantics; std::tie(media_type, semantics) = GetParam(); std::unique_ptr wrapper = CreatePeerConnection( media_type, semantics, std::vector( {RtpHeaderExtensionCapability("uri1", 1, RtpTransceiverDirection::kSendRecv), RtpHeaderExtensionCapability("uri2", 2, RtpTransceiverDirection::kStopped), RtpHeaderExtensionCapability("uri3", 3, RtpTransceiverDirection::kRecvOnly)})); EXPECT_THAT(wrapper->pc_factory() ->GetRtpSenderCapabilities(media_type) .header_extensions, ElementsAre(Field(&RtpHeaderExtensionCapability::uri, "uri1"), Field(&RtpHeaderExtensionCapability::uri, "uri3"))); EXPECT_EQ(wrapper->pc_factory() ->GetRtpReceiverCapabilities(media_type) .header_extensions, wrapper->pc_factory() ->GetRtpSenderCapabilities(media_type) .header_extensions); } INSTANTIATE_TEST_SUITE_P( , PeerConnectionHeaderExtensionTest, Combine(Values(SdpSemantics::kPlanB, SdpSemantics::kUnifiedPlan), Values(cricket::MediaType::MEDIA_TYPE_AUDIO, cricket::MediaType::MEDIA_TYPE_VIDEO)), [](const testing::TestParamInfo< PeerConnectionHeaderExtensionTest::ParamType>& info) { cricket::MediaType media_type; SdpSemantics semantics; std::tie(media_type, semantics) = info.param; return (rtc::StringBuilder("With") << (semantics == SdpSemantics::kPlanB ? "PlanB" : "UnifiedPlan") << "And" << (media_type == cricket::MediaType::MEDIA_TYPE_AUDIO ? "Voice" : "Video") << "Engine") .str(); }); } // namespace webrtc