michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: * You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "timecard.h" michael@0: michael@0: #include "CSFLog.h" michael@0: michael@0: #include michael@0: michael@0: #define GTEST_HAS_RTTI 0 michael@0: #include "gtest/gtest.h" michael@0: #include "gtest_utils.h" michael@0: michael@0: #include "nspr.h" michael@0: #include "nss.h" michael@0: #include "ssl.h" michael@0: michael@0: #include "nsThreadUtils.h" michael@0: #include "FakeMediaStreams.h" michael@0: #include "FakeMediaStreamsImpl.h" michael@0: #include "PeerConnectionImpl.h" michael@0: #include "PeerConnectionCtx.h" michael@0: michael@0: #include "mtransport_test_utils.h" michael@0: MtransportTestUtils *test_utils; michael@0: nsCOMPtr gThread; michael@0: michael@0: extern "C" { michael@0: #include "sdp.h" michael@0: #include "sdp_private.h" michael@0: } michael@0: michael@0: namespace test { michael@0: michael@0: static bool SetupGlobalThread() { michael@0: if (!gThread) { michael@0: nsIThread *thread; michael@0: michael@0: nsresult rv = NS_NewNamedThread("pseudo-main",&thread); michael@0: if (NS_FAILED(rv)) michael@0: return false; michael@0: michael@0: gThread = thread; michael@0: sipcc::PeerConnectionCtx::InitializeGlobal(gThread, michael@0: test_utils->sts_target()); michael@0: } michael@0: return true; michael@0: } michael@0: michael@0: class SdpTest : public ::testing::Test { michael@0: public: michael@0: SdpTest() : sdp_ptr_(nullptr) { michael@0: sdp_media_e supported_media[] = { michael@0: SDP_MEDIA_AUDIO, michael@0: SDP_MEDIA_VIDEO, michael@0: SDP_MEDIA_APPLICATION, michael@0: SDP_MEDIA_DATA, michael@0: SDP_MEDIA_CONTROL, michael@0: SDP_MEDIA_NAS_RADIUS, michael@0: SDP_MEDIA_NAS_TACACS, michael@0: SDP_MEDIA_NAS_DIAMETER, michael@0: SDP_MEDIA_NAS_L2TP, michael@0: SDP_MEDIA_NAS_LOGIN, michael@0: SDP_MEDIA_NAS_NONE, michael@0: SDP_MEDIA_IMAGE, michael@0: }; michael@0: michael@0: config_p_ = sdp_init_config(); michael@0: unsigned int i; michael@0: for (i = 0; i < sizeof(supported_media) / sizeof(sdp_media_e); i++) { michael@0: sdp_media_supported(config_p_, supported_media[i], true); michael@0: } michael@0: sdp_nettype_supported(config_p_, SDP_NT_INTERNET, true); michael@0: sdp_addrtype_supported(config_p_, SDP_AT_IP4, true); michael@0: sdp_addrtype_supported(config_p_, SDP_AT_IP6, true); michael@0: sdp_transport_supported(config_p_, SDP_TRANSPORT_RTPSAVPF, true); michael@0: sdp_transport_supported(config_p_, SDP_TRANSPORT_UDPTL, true); michael@0: sdp_require_session_name(config_p_, false); michael@0: } michael@0: michael@0: static void SetUpTestCase() { michael@0: ASSERT_TRUE(SetupGlobalThread()); michael@0: } michael@0: michael@0: void SetUp() { michael@0: final_level_ = 0; michael@0: sdp_ptr_ = nullptr; michael@0: } michael@0: michael@0: static void TearDownTestCase() { michael@0: gThread = nullptr; michael@0: } michael@0: michael@0: void ResetSdp() { michael@0: if (!sdp_ptr_) { michael@0: sdp_free_description(sdp_ptr_); michael@0: } michael@0: sdp_ptr_ = sdp_init_description("BogusPeerConnectionId", config_p_); michael@0: } michael@0: michael@0: void ParseSdp(const std::string &sdp_str) { michael@0: char *bufp = const_cast(sdp_str.data()); michael@0: ResetSdp(); michael@0: ASSERT_EQ(sdp_parse(sdp_ptr_, &bufp, sdp_str.size()), SDP_SUCCESS); michael@0: } michael@0: michael@0: void InitLocalSdp() { michael@0: ResetSdp(); michael@0: ASSERT_EQ(sdp_set_version(sdp_ptr_, 0), SDP_SUCCESS); michael@0: ASSERT_EQ(sdp_set_owner_username(sdp_ptr_, "-"), SDP_SUCCESS); michael@0: ASSERT_EQ(sdp_set_owner_sessionid(sdp_ptr_, "132954853"), SDP_SUCCESS); michael@0: ASSERT_EQ(sdp_set_owner_version(sdp_ptr_, "0"), SDP_SUCCESS); michael@0: ASSERT_EQ(sdp_set_owner_network_type(sdp_ptr_, SDP_NT_INTERNET), michael@0: SDP_SUCCESS); michael@0: ASSERT_EQ(sdp_set_owner_address_type(sdp_ptr_, SDP_AT_IP4), SDP_SUCCESS); michael@0: ASSERT_EQ(sdp_set_owner_address(sdp_ptr_, "198.51.100.7"), SDP_SUCCESS); michael@0: ASSERT_EQ(sdp_set_session_name(sdp_ptr_, "SDP Unit Test"), SDP_SUCCESS); michael@0: ASSERT_EQ(sdp_set_time_start(sdp_ptr_, "0"), SDP_SUCCESS); michael@0: ASSERT_EQ(sdp_set_time_stop(sdp_ptr_, "0"), SDP_SUCCESS); michael@0: } michael@0: michael@0: std::string SerializeSdp() { michael@0: flex_string fs; michael@0: flex_string_init(&fs); michael@0: EXPECT_EQ(sdp_build(sdp_ptr_, &fs), SDP_SUCCESS); michael@0: std::string body(fs.buffer); michael@0: flex_string_free(&fs); michael@0: return body; michael@0: } michael@0: michael@0: // Returns "level" for new media section michael@0: int AddNewMedia(sdp_media_e type) { michael@0: final_level_++; michael@0: EXPECT_EQ(sdp_insert_media_line(sdp_ptr_, final_level_), SDP_SUCCESS); michael@0: EXPECT_EQ(sdp_set_conn_nettype(sdp_ptr_, final_level_, SDP_NT_INTERNET), michael@0: SDP_SUCCESS); michael@0: EXPECT_EQ(sdp_set_conn_addrtype(sdp_ptr_, final_level_, SDP_AT_IP4), michael@0: SDP_SUCCESS); michael@0: EXPECT_EQ(sdp_set_conn_address(sdp_ptr_, final_level_, "198.51.100.7"), michael@0: SDP_SUCCESS); michael@0: EXPECT_EQ(sdp_set_media_type(sdp_ptr_, final_level_, SDP_MEDIA_VIDEO), michael@0: SDP_SUCCESS); michael@0: EXPECT_EQ(sdp_set_media_transport(sdp_ptr_, final_level_, michael@0: SDP_TRANSPORT_RTPAVP), michael@0: SDP_SUCCESS); michael@0: EXPECT_EQ(sdp_set_media_portnum(sdp_ptr_, final_level_, 12345, 0), michael@0: SDP_SUCCESS); michael@0: EXPECT_EQ(sdp_add_media_payload_type(sdp_ptr_, final_level_, 120, michael@0: SDP_PAYLOAD_NUMERIC), michael@0: SDP_SUCCESS); michael@0: return final_level_; michael@0: } michael@0: michael@0: u16 AddNewRtcpFbAck(int level, sdp_rtcp_fb_ack_type_e type, michael@0: u16 payload = SDP_ALL_PAYLOADS) { michael@0: u16 inst_num = 0; michael@0: EXPECT_EQ(sdp_add_new_attr(sdp_ptr_, level, 0, SDP_ATTR_RTCP_FB, michael@0: &inst_num), SDP_SUCCESS); michael@0: EXPECT_EQ(sdp_attr_set_rtcp_fb_ack(sdp_ptr_, level, payload, inst_num, michael@0: type), SDP_SUCCESS); michael@0: return inst_num; michael@0: } michael@0: michael@0: u16 AddNewRtcpFbNack(int level, sdp_rtcp_fb_nack_type_e type, michael@0: u16 payload = SDP_ALL_PAYLOADS) { michael@0: u16 inst_num = 0; michael@0: EXPECT_EQ(sdp_add_new_attr(sdp_ptr_, level, 0, SDP_ATTR_RTCP_FB, michael@0: &inst_num), SDP_SUCCESS); michael@0: EXPECT_EQ(sdp_attr_set_rtcp_fb_nack(sdp_ptr_, level, payload, inst_num, michael@0: type), SDP_SUCCESS); michael@0: return inst_num; michael@0: } michael@0: michael@0: u16 AddNewRtcpFbTrrInt(int level, u32 interval, michael@0: u16 payload = SDP_ALL_PAYLOADS) { michael@0: u16 inst_num = 0; michael@0: EXPECT_EQ(sdp_add_new_attr(sdp_ptr_, level, 0, SDP_ATTR_RTCP_FB, michael@0: &inst_num), SDP_SUCCESS); michael@0: EXPECT_EQ(sdp_attr_set_rtcp_fb_trr_int(sdp_ptr_, level, payload, inst_num, michael@0: interval), SDP_SUCCESS); michael@0: return inst_num; michael@0: } michael@0: michael@0: u16 AddNewRtcpFbCcm(int level, sdp_rtcp_fb_ccm_type_e type, michael@0: u16 payload = SDP_ALL_PAYLOADS) { michael@0: u16 inst_num = 0; michael@0: EXPECT_EQ(sdp_add_new_attr(sdp_ptr_, level, 0, SDP_ATTR_RTCP_FB, michael@0: &inst_num), SDP_SUCCESS); michael@0: EXPECT_EQ(sdp_attr_set_rtcp_fb_ccm(sdp_ptr_, level, payload, inst_num, michael@0: type), SDP_SUCCESS); michael@0: return inst_num; michael@0: } michael@0: u16 AddNewExtMap(int level, const char* uri) { michael@0: u16 inst_num = 0; michael@0: EXPECT_EQ(sdp_add_new_attr(sdp_ptr_, level, 0, SDP_ATTR_EXTMAP, michael@0: &inst_num), SDP_SUCCESS); michael@0: EXPECT_EQ(sdp_attr_set_extmap(sdp_ptr_, level, inst_num, michael@0: uri, inst_num), SDP_SUCCESS); michael@0: return inst_num; michael@0: } michael@0: michael@0: u16 AddNewFmtpMaxFs(int level, u32 max_fs) { michael@0: u16 inst_num = 0; michael@0: EXPECT_EQ(sdp_add_new_attr(sdp_ptr_, level, 0, SDP_ATTR_FMTP, michael@0: &inst_num), SDP_SUCCESS); michael@0: EXPECT_EQ(sdp_attr_set_fmtp_payload_type(sdp_ptr_, level, 0, inst_num, michael@0: 120), SDP_SUCCESS); michael@0: EXPECT_EQ(sdp_attr_set_fmtp_max_fs(sdp_ptr_, level, 0, inst_num, max_fs), michael@0: SDP_SUCCESS); michael@0: return inst_num; michael@0: } michael@0: michael@0: u16 AddNewFmtpMaxFr(int level, u32 max_fr) { michael@0: u16 inst_num = 0; michael@0: EXPECT_EQ(sdp_add_new_attr(sdp_ptr_, level, 0, SDP_ATTR_FMTP, michael@0: &inst_num), SDP_SUCCESS); michael@0: EXPECT_EQ(sdp_attr_set_fmtp_payload_type(sdp_ptr_, level, 0, inst_num, michael@0: 120), SDP_SUCCESS); michael@0: EXPECT_EQ(sdp_attr_set_fmtp_max_fr(sdp_ptr_, level, 0, inst_num, max_fr), michael@0: SDP_SUCCESS); michael@0: return inst_num; michael@0: } michael@0: michael@0: u16 AddNewFmtpMaxFsFr(int level, u32 max_fs, u32 max_fr) { michael@0: u16 inst_num = 0; michael@0: EXPECT_EQ(sdp_add_new_attr(sdp_ptr_, level, 0, SDP_ATTR_FMTP, michael@0: &inst_num), SDP_SUCCESS); michael@0: EXPECT_EQ(sdp_attr_set_fmtp_payload_type(sdp_ptr_, level, 0, inst_num, michael@0: 120), SDP_SUCCESS); michael@0: EXPECT_EQ(sdp_attr_set_fmtp_max_fs(sdp_ptr_, level, 0, inst_num, max_fs), michael@0: SDP_SUCCESS); michael@0: EXPECT_EQ(sdp_attr_set_fmtp_max_fr(sdp_ptr_, level, 0, inst_num, max_fr), michael@0: SDP_SUCCESS); michael@0: return inst_num; michael@0: } michael@0: michael@0: protected: michael@0: int final_level_; michael@0: void *config_p_; michael@0: sdp_t *sdp_ptr_; michael@0: }; michael@0: michael@0: static const std::string kVideoSdp = michael@0: "v=0\r\n" michael@0: "o=- 137331303 2 IN IP4 127.0.0.1\r\n" michael@0: "s=SIP Call\r\n" michael@0: "t=0 0\r\n" michael@0: "m=video 56436 RTP/SAVPF 120\r\n" michael@0: "c=IN IP4 198.51.100.7\r\n" michael@0: "a=rtpmap:120 VP8/90000\r\n"; michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbAckRpsi) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 ack rpsi\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 1), michael@0: SDP_RTCP_FB_ACK_RPSI); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbAckApp) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 ack app\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 1), SDP_RTCP_FB_ACK_APP); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbAckAppFoo) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 ack app foo\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 1), SDP_RTCP_FB_ACK_APP); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbAckFooBar) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 ack foo bar\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 1), michael@0: SDP_RTCP_FB_ACK_UNKNOWN); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbAckFooBarBaz) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 ack foo bar baz\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 1), michael@0: SDP_RTCP_FB_ACK_UNKNOWN); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbNack) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 nack\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 1), michael@0: SDP_RTCP_FB_NACK_BASIC); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbNackPli) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 nack pli\r\n"); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbNackSli) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 nack sli\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 1), michael@0: SDP_RTCP_FB_NACK_SLI); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbNackRpsi) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 nack rpsi\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 1), michael@0: SDP_RTCP_FB_NACK_RPSI); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbNackApp) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 nack app\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 1), michael@0: SDP_RTCP_FB_NACK_APP); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbNackAppFoo) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 nack app foo\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 1), michael@0: SDP_RTCP_FB_NACK_APP); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbNackAppFooBar) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 nack app foo bar\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 1), michael@0: SDP_RTCP_FB_NACK_APP); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbNackFooBarBaz) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 nack foo bar baz\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 1), michael@0: SDP_RTCP_FB_NACK_UNKNOWN); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbTrrInt0) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 trr-int 0\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_trr_int(sdp_ptr_, 1, 120, 1), 0U); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbTrrInt123) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 trr-int 123\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_trr_int(sdp_ptr_, 1, 120, 1), 123U); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbCcmFir) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 ccm fir\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 1), SDP_RTCP_FB_CCM_FIR); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbCcmTmmbr) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 ccm tmmbr\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 1), michael@0: SDP_RTCP_FB_CCM_TMMBR); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbCcmTmmbrSmaxpr) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 ccm tmmbr smaxpr=456\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 1), michael@0: SDP_RTCP_FB_CCM_TMMBR); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbCcmTstr) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 ccm tstr\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 1), michael@0: SDP_RTCP_FB_CCM_TSTR); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbCcmVbcm) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 ccm vbcm 123 456 789\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 1), michael@0: SDP_RTCP_FB_CCM_VBCM); michael@0: // We don't currently parse out VBCM submessage types, since we don't have michael@0: // any use for them. michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbCcmFoo) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 ccm foo\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 1), michael@0: SDP_RTCP_FB_CCM_UNKNOWN); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbCcmFooBarBaz) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 ccm foo bar baz\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 1), michael@0: SDP_RTCP_FB_CCM_UNKNOWN); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbFoo) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 foo\r\n"); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbFooBar) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 foo bar\r\n"); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbFooBarBaz) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:120 foo bar baz\r\n"); michael@0: } michael@0: michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbKitchenSink) { michael@0: ParseSdp(kVideoSdp + michael@0: "a=rtcp-fb:120 ack rpsi\r\n" michael@0: "a=rtcp-fb:120 ack app\r\n" michael@0: "a=rtcp-fb:120 ack app foo\r\n" michael@0: "a=rtcp-fb:120 ack foo bar\r\n" michael@0: "a=rtcp-fb:120 ack foo bar baz\r\n" michael@0: "a=rtcp-fb:120 nack\r\n" michael@0: "a=rtcp-fb:120 nack pli\r\n" michael@0: "a=rtcp-fb:120 nack sli\r\n" michael@0: "a=rtcp-fb:120 nack rpsi\r\n" michael@0: "a=rtcp-fb:120 nack app\r\n" michael@0: "a=rtcp-fb:120 nack app foo\r\n" michael@0: "a=rtcp-fb:120 nack app foo bar\r\n" michael@0: "a=rtcp-fb:120 nack foo bar baz\r\n" michael@0: "a=rtcp-fb:120 trr-int 0\r\n" michael@0: "a=rtcp-fb:120 trr-int 123\r\n" michael@0: "a=rtcp-fb:120 ccm fir\r\n" michael@0: "a=rtcp-fb:120 ccm tmmbr\r\n" michael@0: "a=rtcp-fb:120 ccm tmmbr smaxpr=456\r\n" michael@0: "a=rtcp-fb:120 ccm tstr\r\n" michael@0: "a=rtcp-fb:120 ccm vbcm 123 456 789\r\n" michael@0: "a=rtcp-fb:120 ccm foo\r\n" michael@0: "a=rtcp-fb:120 ccm foo bar baz\r\n" michael@0: "a=rtcp-fb:120 foo\r\n" michael@0: "a=rtcp-fb:120 foo bar\r\n" michael@0: "a=rtcp-fb:120 foo bar baz\r\n"); michael@0: michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 1), SDP_RTCP_FB_ACK_RPSI); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 2), SDP_RTCP_FB_ACK_APP); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 3), SDP_RTCP_FB_ACK_APP); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 4), michael@0: SDP_RTCP_FB_ACK_UNKNOWN); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 5), michael@0: SDP_RTCP_FB_ACK_UNKNOWN); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 6), michael@0: SDP_RTCP_FB_ACK_NOT_FOUND); michael@0: michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 1), michael@0: SDP_RTCP_FB_NACK_BASIC); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 2), michael@0: SDP_RTCP_FB_NACK_PLI); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 3), michael@0: SDP_RTCP_FB_NACK_SLI); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 4), michael@0: SDP_RTCP_FB_NACK_RPSI); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 5), michael@0: SDP_RTCP_FB_NACK_APP); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 6), michael@0: SDP_RTCP_FB_NACK_APP); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 7), michael@0: SDP_RTCP_FB_NACK_APP); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 8), michael@0: SDP_RTCP_FB_NACK_UNKNOWN); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 9), michael@0: SDP_RTCP_FB_NACK_NOT_FOUND); michael@0: michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_trr_int(sdp_ptr_, 1, 120, 1), 0U); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_trr_int(sdp_ptr_, 1, 120, 2), 123U); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_trr_int(sdp_ptr_, 1, 120, 3), 0xFFFFFFFF); michael@0: michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 1), SDP_RTCP_FB_CCM_FIR); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 2), michael@0: SDP_RTCP_FB_CCM_TMMBR); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 3), michael@0: SDP_RTCP_FB_CCM_TMMBR); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 4), michael@0: SDP_RTCP_FB_CCM_TSTR); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 5), michael@0: SDP_RTCP_FB_CCM_VBCM); michael@0: // We don't currently parse out VBCM submessage types, since we don't have michael@0: // any use for them. michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 6), michael@0: SDP_RTCP_FB_CCM_UNKNOWN); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 7), michael@0: SDP_RTCP_FB_CCM_UNKNOWN); michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 8), michael@0: SDP_RTCP_FB_CCM_NOT_FOUND); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbAckRpsi) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbAck(level, SDP_RTCP_FB_ACK_RPSI, 120); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:120 ack rpsi\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbAckRpsiAllPt) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbAck(level, SDP_RTCP_FB_ACK_RPSI); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:* ack rpsi\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbAckApp) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbAck(level, SDP_RTCP_FB_ACK_APP, 120); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:120 ack app\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbAckAppAllPt) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbAck(level, SDP_RTCP_FB_ACK_APP); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:* ack app\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbNack) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_BASIC, 120); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:120 nack\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbNackAllPt) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_BASIC); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:* nack\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbNackSli) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_SLI, 120); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:120 nack sli\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbNackSliAllPt) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_SLI); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:* nack sli\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbNackPli) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_PLI, 120); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:120 nack pli\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbNackPliAllPt) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_PLI); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:* nack pli\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbNackRpsi) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_RPSI, 120); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:120 nack rpsi\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbNackRpsiAllPt) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_RPSI); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:* nack rpsi\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbNackApp) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_APP, 120); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:120 nack app\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbNackAppAllPt) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_APP); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:* nack app\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbNackRai) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_RAI, 120); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:120 nack rai\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbNackRaiAllPt) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_RAI); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:* nack rai\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbNackTllei) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_TLLEI, 120); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:120 nack tllei\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbNackTlleiAllPt) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_TLLEI); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:* nack tllei\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbNackPslei) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_PSLEI, 120); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:120 nack pslei\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbNackPsleiAllPt) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_PSLEI); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:* nack pslei\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbNackEcn) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_ECN, 120); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:120 nack ecn\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbNackEcnAllPt) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_ECN); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:* nack ecn\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbTrrInt) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbTrrInt(level, 12345, 120); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:120 trr-int 12345\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbNackTrrIntAllPt) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbTrrInt(level, 0); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:* trr-int 0\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbCcmFir) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbCcm(level, SDP_RTCP_FB_CCM_FIR, 120); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:120 ccm fir\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbCcmFirAllPt) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbCcm(level, SDP_RTCP_FB_CCM_FIR); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:* ccm fir\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbCcmTmmbr) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbCcm(level, SDP_RTCP_FB_CCM_TMMBR, 120); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:120 ccm tmmbr\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbCcmTmmbrAllPt) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbCcm(level, SDP_RTCP_FB_CCM_TMMBR); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:* ccm tmmbr\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbCcmTstr) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbCcm(level, SDP_RTCP_FB_CCM_TSTR, 120); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:120 ccm tstr\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbCcmTstrAllPt) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbCcm(level, SDP_RTCP_FB_CCM_TSTR); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:* ccm tstr\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbCcmVbcm) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbCcm(level, SDP_RTCP_FB_CCM_VBCM, 120); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:120 ccm vbcm\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addRtcpFbCcmVbcmAllPt) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewRtcpFbCcm(level, SDP_RTCP_FB_CCM_VBCM); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=rtcp-fb:* ccm vbcm\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseRtcpFbAllPayloads) { michael@0: ParseSdp(kVideoSdp + "a=rtcp-fb:* ack rpsi\r\n"); michael@0: for (int i = 0; i < 128; i++) { michael@0: ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, i, 1), michael@0: SDP_RTCP_FB_ACK_RPSI); michael@0: } michael@0: } michael@0: TEST_F(SdpTest, addExtMap) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewExtMap(level, SDP_EXTMAP_AUDIO_LEVEL); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseExtMap) { michael@0: ParseSdp(kVideoSdp + michael@0: "a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\n"); michael@0: ASSERT_STREQ(sdp_attr_get_extmap_uri(sdp_ptr_, 1, 1), michael@0: SDP_EXTMAP_AUDIO_LEVEL); michael@0: ASSERT_EQ(sdp_attr_get_extmap_id(sdp_ptr_, 1, 1), michael@0: 1); michael@0: michael@0: } michael@0: michael@0: TEST_F(SdpTest, parseFmtpMaxFs) { michael@0: u32 val = 0; michael@0: ParseSdp(kVideoSdp + "a=fmtp:120 max-fs=300;max-fr=30\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_fmtp_max_fs(sdp_ptr_, 1, 0, 1, &val), SDP_SUCCESS); michael@0: ASSERT_EQ(val, 300U); michael@0: } michael@0: TEST_F(SdpTest, parseFmtpMaxFr) { michael@0: u32 val = 0; michael@0: ParseSdp(kVideoSdp + "a=fmtp:120 max-fs=300;max-fr=30\r\n"); michael@0: ASSERT_EQ(sdp_attr_get_fmtp_max_fr(sdp_ptr_, 1, 0, 1, &val), SDP_SUCCESS); michael@0: ASSERT_EQ(val, 30U); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addFmtpMaxFs) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewFmtpMaxFs(level, 300); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=fmtp:120 max-fs=300\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addFmtpMaxFr) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewFmtpMaxFr(level, 30); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=fmtp:120 max-fr=30\r\n"), std::string::npos); michael@0: } michael@0: michael@0: TEST_F(SdpTest, addFmtpMaxFsFr) { michael@0: InitLocalSdp(); michael@0: int level = AddNewMedia(SDP_MEDIA_VIDEO); michael@0: AddNewFmtpMaxFsFr(level, 300, 30); michael@0: std::string body = SerializeSdp(); michael@0: ASSERT_NE(body.find("a=fmtp:120 max-fs=300;max-fr=30\r\n"), michael@0: std::string::npos); michael@0: } michael@0: michael@0: static const std::string kBrokenFmtp = michael@0: "v=0\r\n" michael@0: "o=- 137331303 2 IN IP4 127.0.0.1\r\n" michael@0: "s=SIP Call\r\n" michael@0: "t=0 0\r\n" michael@0: "m=video 56436 RTP/SAVPF 120\r\n" michael@0: "c=IN IP4 198.51.100.7\r\n" michael@0: "a=rtpmap:120 VP8/90000\r\n" michael@0: /* Note: the \0 in this string triggered bz://1089207 michael@0: */ michael@0: "a=fmtp:120 max-fs=300;max\0fr=30"; michael@0: michael@0: TEST_F(SdpTest, parseBrokenFmtp) { michael@0: u32 val = 0; michael@0: char *buf = const_cast(kBrokenFmtp.data()); michael@0: ResetSdp(); michael@0: /* We need to manually invoke the parser here to be able to specify the length michael@0: * of the string beyond the \0 in last line of the string. michael@0: */ michael@0: ASSERT_EQ(sdp_parse(sdp_ptr_, &buf, 165), SDP_SUCCESS); michael@0: ASSERT_EQ(sdp_attr_get_fmtp_max_fs(sdp_ptr_, 1, 0, 1, &val), SDP_INVALID_PARAMETER); michael@0: } michael@0: michael@0: } // End namespace test. michael@0: michael@0: int main(int argc, char **argv) { michael@0: test_utils = new MtransportTestUtils(); michael@0: NSS_NoDB_Init(nullptr); michael@0: NSS_SetDomesticPolicy(); michael@0: michael@0: ::testing::InitGoogleTest(&argc, argv); michael@0: int result = RUN_ALL_TESTS(); michael@0: michael@0: sipcc::PeerConnectionCtx::Destroy(); michael@0: delete test_utils; michael@0: michael@0: return result; michael@0: }