| /* |
| * 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. |
| */ |
| #include "pc/session_description.h" |
| |
| #include "absl/memory/memory.h" |
| #include "test/gtest.h" |
| |
| namespace cricket { |
| |
| TEST(MediaContentDescriptionTest, ExtmapAllowMixedDefaultValue) { |
| VideoContentDescription video_desc; |
| EXPECT_EQ(MediaContentDescription::kNo, video_desc.extmap_allow_mixed_enum()); |
| } |
| |
| TEST(MediaContentDescriptionTest, SetExtmapAllowMixed) { |
| VideoContentDescription video_desc; |
| video_desc.set_extmap_allow_mixed_enum(MediaContentDescription::kNo); |
| EXPECT_EQ(MediaContentDescription::kNo, video_desc.extmap_allow_mixed_enum()); |
| video_desc.set_extmap_allow_mixed_enum(MediaContentDescription::kMedia); |
| EXPECT_EQ(MediaContentDescription::kMedia, |
| video_desc.extmap_allow_mixed_enum()); |
| video_desc.set_extmap_allow_mixed_enum(MediaContentDescription::kSession); |
| EXPECT_EQ(MediaContentDescription::kSession, |
| video_desc.extmap_allow_mixed_enum()); |
| |
| // Not allowed to downgrade from kSession to kMedia. |
| video_desc.set_extmap_allow_mixed_enum(MediaContentDescription::kMedia); |
| EXPECT_EQ(MediaContentDescription::kSession, |
| video_desc.extmap_allow_mixed_enum()); |
| |
| // Always okay to set not supported. |
| video_desc.set_extmap_allow_mixed_enum(MediaContentDescription::kNo); |
| EXPECT_EQ(MediaContentDescription::kNo, video_desc.extmap_allow_mixed_enum()); |
| video_desc.set_extmap_allow_mixed_enum(MediaContentDescription::kMedia); |
| EXPECT_EQ(MediaContentDescription::kMedia, |
| video_desc.extmap_allow_mixed_enum()); |
| video_desc.set_extmap_allow_mixed_enum(MediaContentDescription::kNo); |
| EXPECT_EQ(MediaContentDescription::kNo, video_desc.extmap_allow_mixed_enum()); |
| } |
| |
| TEST(MediaContentDescriptionTest, MixedOneTwoByteHeaderSupported) { |
| VideoContentDescription video_desc; |
| video_desc.set_extmap_allow_mixed_enum(MediaContentDescription::kNo); |
| EXPECT_FALSE(video_desc.extmap_allow_mixed()); |
| video_desc.set_extmap_allow_mixed_enum(MediaContentDescription::kMedia); |
| EXPECT_TRUE(video_desc.extmap_allow_mixed()); |
| video_desc.set_extmap_allow_mixed_enum(MediaContentDescription::kSession); |
| EXPECT_TRUE(video_desc.extmap_allow_mixed()); |
| } |
| |
| TEST(SessionDescriptionTest, SetExtmapAllowMixed) { |
| SessionDescription session_desc; |
| session_desc.set_extmap_allow_mixed(true); |
| EXPECT_TRUE(session_desc.extmap_allow_mixed()); |
| session_desc.set_extmap_allow_mixed(false); |
| EXPECT_FALSE(session_desc.extmap_allow_mixed()); |
| } |
| |
| TEST(SessionDescriptionTest, SetExtmapAllowMixedPropagatesToMediaLevel) { |
| SessionDescription session_desc; |
| MediaContentDescription* video_desc = new VideoContentDescription(); |
| session_desc.AddContent("video", MediaProtocolType::kRtp, video_desc); |
| |
| // Setting true on session level propagates to media level. |
| session_desc.set_extmap_allow_mixed(true); |
| EXPECT_EQ(MediaContentDescription::kSession, |
| video_desc->extmap_allow_mixed_enum()); |
| |
| // Don't downgrade from session level to media level |
| video_desc->set_extmap_allow_mixed_enum(MediaContentDescription::kMedia); |
| EXPECT_EQ(MediaContentDescription::kSession, |
| video_desc->extmap_allow_mixed_enum()); |
| |
| // Setting false on session level propagates to media level if the current |
| // state is kSession. |
| session_desc.set_extmap_allow_mixed(false); |
| EXPECT_EQ(MediaContentDescription::kNo, |
| video_desc->extmap_allow_mixed_enum()); |
| |
| // Now possible to set at media level. |
| video_desc->set_extmap_allow_mixed_enum(MediaContentDescription::kMedia); |
| EXPECT_EQ(MediaContentDescription::kMedia, |
| video_desc->extmap_allow_mixed_enum()); |
| |
| // Setting false on session level does not override on media level if current |
| // state is kMedia. |
| session_desc.set_extmap_allow_mixed(false); |
| EXPECT_EQ(MediaContentDescription::kMedia, |
| video_desc->extmap_allow_mixed_enum()); |
| |
| // Setting true on session level overrides setting on media level. |
| session_desc.set_extmap_allow_mixed(true); |
| EXPECT_EQ(MediaContentDescription::kSession, |
| video_desc->extmap_allow_mixed_enum()); |
| } |
| |
| TEST(SessionDescriptionTest, AddContentTransfersExtmapAllowMixedSetting) { |
| SessionDescription session_desc; |
| session_desc.set_extmap_allow_mixed(false); |
| MediaContentDescription* audio_desc = new AudioContentDescription(); |
| audio_desc->set_extmap_allow_mixed_enum(MediaContentDescription::kMedia); |
| |
| // If session setting is false, media level setting is preserved when new |
| // content is added. |
| session_desc.AddContent("audio", MediaProtocolType::kRtp, audio_desc); |
| EXPECT_EQ(MediaContentDescription::kMedia, |
| audio_desc->extmap_allow_mixed_enum()); |
| |
| // If session setting is true, it's transferred to media level when new |
| // content is added. |
| session_desc.set_extmap_allow_mixed(true); |
| MediaContentDescription* video_desc = new VideoContentDescription(); |
| session_desc.AddContent("video", MediaProtocolType::kRtp, video_desc); |
| EXPECT_EQ(MediaContentDescription::kSession, |
| video_desc->extmap_allow_mixed_enum()); |
| |
| // Session level setting overrides media level when new content is added. |
| MediaContentDescription* data_desc = new RtpDataContentDescription; |
| data_desc->set_extmap_allow_mixed_enum(MediaContentDescription::kMedia); |
| session_desc.AddContent("data", MediaProtocolType::kRtp, data_desc); |
| EXPECT_EQ(MediaContentDescription::kSession, |
| data_desc->extmap_allow_mixed_enum()); |
| } |
| |
| TEST(SessionDescriptionTest, DataContentDescriptionCanAddStream) { |
| auto description = absl::make_unique<DataContentDescription>(); |
| // Adding a stream without setting protocol first should work. |
| description->AddLegacyStream(1234); |
| EXPECT_EQ(1UL, description->streams().size()); |
| } |
| |
| TEST(SessionDescriptionTest, DataContentDescriptionCopyWorks) { |
| auto description = absl::make_unique<RtpDataContentDescription>(); |
| auto shim_description = description->as_data(); |
| auto shim_copy = shim_description->Copy(); |
| delete shim_copy; |
| } |
| |
| TEST(SessionDescriptionTest, DataContentDescriptionCodecsCallableOnNull) { |
| auto shim_description = absl::make_unique<DataContentDescription>(); |
| auto codec_list = shim_description->codecs(); |
| EXPECT_EQ(0UL, codec_list.size()); |
| } |
| |
| TEST(SessionDescriptionTest, DataContentDescriptionSctpConferenceMode) { |
| auto description = absl::make_unique<SctpDataContentDescription>(); |
| auto shim_description = description->as_data(); |
| EXPECT_FALSE(shim_description->conference_mode()); |
| shim_description->set_conference_mode(true); |
| EXPECT_TRUE(shim_description->conference_mode()); |
| } |
| |
| TEST(SessionDescriptionTest, DataContentDesriptionInSessionIsUnwrapped) { |
| auto description = absl::make_unique<DataContentDescription>(); |
| // Create a DTLS object behind the shim. |
| description->set_protocol(kMediaProtocolUdpDtlsSctp); |
| SessionDescription session; |
| session.AddContent("name", MediaProtocolType::kSctp, description.release()); |
| ContentInfo* content = &(session.contents()[0]); |
| ASSERT_TRUE(content); |
| ASSERT_TRUE(content->media_description()->type() == MEDIA_TYPE_DATA); |
| ASSERT_TRUE(content->media_description()->as_sctp()); |
| } |
| |
| TEST(SessionDescriptionTest, |
| DataContentDescriptionInfoSurvivesInstantiationAsSctp) { |
| auto description = absl::make_unique<DataContentDescription>(); |
| description->set_rtcp_mux(true); |
| description->set_protocol(kMediaProtocolUdpDtlsSctp); |
| EXPECT_TRUE(description->rtcp_mux()); |
| } |
| |
| TEST(SessionDescriptionTest, |
| DataContentDescriptionStreamInfoSurvivesInstantiationAsRtp) { |
| auto description = absl::make_unique<DataContentDescription>(); |
| StreamParams stream; |
| description->AddLegacyStream(1234); |
| EXPECT_EQ(1UL, description->streams().size()); |
| description->set_protocol(kMediaProtocolDtlsSavpf); |
| EXPECT_EQ(1UL, description->streams().size()); |
| } |
| |
| } // namespace cricket |