1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/media/webrtc/signaling/test/sdp_unittests.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,829 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this file, 1.6 + * You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +#include "timecard.h" 1.9 + 1.10 +#include "CSFLog.h" 1.11 + 1.12 +#include <string> 1.13 + 1.14 +#define GTEST_HAS_RTTI 0 1.15 +#include "gtest/gtest.h" 1.16 +#include "gtest_utils.h" 1.17 + 1.18 +#include "nspr.h" 1.19 +#include "nss.h" 1.20 +#include "ssl.h" 1.21 + 1.22 +#include "nsThreadUtils.h" 1.23 +#include "FakeMediaStreams.h" 1.24 +#include "FakeMediaStreamsImpl.h" 1.25 +#include "PeerConnectionImpl.h" 1.26 +#include "PeerConnectionCtx.h" 1.27 + 1.28 +#include "mtransport_test_utils.h" 1.29 +MtransportTestUtils *test_utils; 1.30 +nsCOMPtr<nsIThread> gThread; 1.31 + 1.32 +extern "C" { 1.33 +#include "sdp.h" 1.34 +#include "sdp_private.h" 1.35 +} 1.36 + 1.37 +namespace test { 1.38 + 1.39 +static bool SetupGlobalThread() { 1.40 + if (!gThread) { 1.41 + nsIThread *thread; 1.42 + 1.43 + nsresult rv = NS_NewNamedThread("pseudo-main",&thread); 1.44 + if (NS_FAILED(rv)) 1.45 + return false; 1.46 + 1.47 + gThread = thread; 1.48 + sipcc::PeerConnectionCtx::InitializeGlobal(gThread, 1.49 + test_utils->sts_target()); 1.50 + } 1.51 + return true; 1.52 +} 1.53 + 1.54 +class SdpTest : public ::testing::Test { 1.55 + public: 1.56 + SdpTest() : sdp_ptr_(nullptr) { 1.57 + sdp_media_e supported_media[] = { 1.58 + SDP_MEDIA_AUDIO, 1.59 + SDP_MEDIA_VIDEO, 1.60 + SDP_MEDIA_APPLICATION, 1.61 + SDP_MEDIA_DATA, 1.62 + SDP_MEDIA_CONTROL, 1.63 + SDP_MEDIA_NAS_RADIUS, 1.64 + SDP_MEDIA_NAS_TACACS, 1.65 + SDP_MEDIA_NAS_DIAMETER, 1.66 + SDP_MEDIA_NAS_L2TP, 1.67 + SDP_MEDIA_NAS_LOGIN, 1.68 + SDP_MEDIA_NAS_NONE, 1.69 + SDP_MEDIA_IMAGE, 1.70 + }; 1.71 + 1.72 + config_p_ = sdp_init_config(); 1.73 + unsigned int i; 1.74 + for (i = 0; i < sizeof(supported_media) / sizeof(sdp_media_e); i++) { 1.75 + sdp_media_supported(config_p_, supported_media[i], true); 1.76 + } 1.77 + sdp_nettype_supported(config_p_, SDP_NT_INTERNET, true); 1.78 + sdp_addrtype_supported(config_p_, SDP_AT_IP4, true); 1.79 + sdp_addrtype_supported(config_p_, SDP_AT_IP6, true); 1.80 + sdp_transport_supported(config_p_, SDP_TRANSPORT_RTPSAVPF, true); 1.81 + sdp_transport_supported(config_p_, SDP_TRANSPORT_UDPTL, true); 1.82 + sdp_require_session_name(config_p_, false); 1.83 + } 1.84 + 1.85 + static void SetUpTestCase() { 1.86 + ASSERT_TRUE(SetupGlobalThread()); 1.87 + } 1.88 + 1.89 + void SetUp() { 1.90 + final_level_ = 0; 1.91 + sdp_ptr_ = nullptr; 1.92 + } 1.93 + 1.94 + static void TearDownTestCase() { 1.95 + gThread = nullptr; 1.96 + } 1.97 + 1.98 + void ResetSdp() { 1.99 + if (!sdp_ptr_) { 1.100 + sdp_free_description(sdp_ptr_); 1.101 + } 1.102 + sdp_ptr_ = sdp_init_description("BogusPeerConnectionId", config_p_); 1.103 + } 1.104 + 1.105 + void ParseSdp(const std::string &sdp_str) { 1.106 + char *bufp = const_cast<char *>(sdp_str.data()); 1.107 + ResetSdp(); 1.108 + ASSERT_EQ(sdp_parse(sdp_ptr_, &bufp, sdp_str.size()), SDP_SUCCESS); 1.109 + } 1.110 + 1.111 + void InitLocalSdp() { 1.112 + ResetSdp(); 1.113 + ASSERT_EQ(sdp_set_version(sdp_ptr_, 0), SDP_SUCCESS); 1.114 + ASSERT_EQ(sdp_set_owner_username(sdp_ptr_, "-"), SDP_SUCCESS); 1.115 + ASSERT_EQ(sdp_set_owner_sessionid(sdp_ptr_, "132954853"), SDP_SUCCESS); 1.116 + ASSERT_EQ(sdp_set_owner_version(sdp_ptr_, "0"), SDP_SUCCESS); 1.117 + ASSERT_EQ(sdp_set_owner_network_type(sdp_ptr_, SDP_NT_INTERNET), 1.118 + SDP_SUCCESS); 1.119 + ASSERT_EQ(sdp_set_owner_address_type(sdp_ptr_, SDP_AT_IP4), SDP_SUCCESS); 1.120 + ASSERT_EQ(sdp_set_owner_address(sdp_ptr_, "198.51.100.7"), SDP_SUCCESS); 1.121 + ASSERT_EQ(sdp_set_session_name(sdp_ptr_, "SDP Unit Test"), SDP_SUCCESS); 1.122 + ASSERT_EQ(sdp_set_time_start(sdp_ptr_, "0"), SDP_SUCCESS); 1.123 + ASSERT_EQ(sdp_set_time_stop(sdp_ptr_, "0"), SDP_SUCCESS); 1.124 + } 1.125 + 1.126 + std::string SerializeSdp() { 1.127 + flex_string fs; 1.128 + flex_string_init(&fs); 1.129 + EXPECT_EQ(sdp_build(sdp_ptr_, &fs), SDP_SUCCESS); 1.130 + std::string body(fs.buffer); 1.131 + flex_string_free(&fs); 1.132 + return body; 1.133 + } 1.134 + 1.135 + // Returns "level" for new media section 1.136 + int AddNewMedia(sdp_media_e type) { 1.137 + final_level_++; 1.138 + EXPECT_EQ(sdp_insert_media_line(sdp_ptr_, final_level_), SDP_SUCCESS); 1.139 + EXPECT_EQ(sdp_set_conn_nettype(sdp_ptr_, final_level_, SDP_NT_INTERNET), 1.140 + SDP_SUCCESS); 1.141 + EXPECT_EQ(sdp_set_conn_addrtype(sdp_ptr_, final_level_, SDP_AT_IP4), 1.142 + SDP_SUCCESS); 1.143 + EXPECT_EQ(sdp_set_conn_address(sdp_ptr_, final_level_, "198.51.100.7"), 1.144 + SDP_SUCCESS); 1.145 + EXPECT_EQ(sdp_set_media_type(sdp_ptr_, final_level_, SDP_MEDIA_VIDEO), 1.146 + SDP_SUCCESS); 1.147 + EXPECT_EQ(sdp_set_media_transport(sdp_ptr_, final_level_, 1.148 + SDP_TRANSPORT_RTPAVP), 1.149 + SDP_SUCCESS); 1.150 + EXPECT_EQ(sdp_set_media_portnum(sdp_ptr_, final_level_, 12345, 0), 1.151 + SDP_SUCCESS); 1.152 + EXPECT_EQ(sdp_add_media_payload_type(sdp_ptr_, final_level_, 120, 1.153 + SDP_PAYLOAD_NUMERIC), 1.154 + SDP_SUCCESS); 1.155 + return final_level_; 1.156 + } 1.157 + 1.158 + u16 AddNewRtcpFbAck(int level, sdp_rtcp_fb_ack_type_e type, 1.159 + u16 payload = SDP_ALL_PAYLOADS) { 1.160 + u16 inst_num = 0; 1.161 + EXPECT_EQ(sdp_add_new_attr(sdp_ptr_, level, 0, SDP_ATTR_RTCP_FB, 1.162 + &inst_num), SDP_SUCCESS); 1.163 + EXPECT_EQ(sdp_attr_set_rtcp_fb_ack(sdp_ptr_, level, payload, inst_num, 1.164 + type), SDP_SUCCESS); 1.165 + return inst_num; 1.166 + } 1.167 + 1.168 + u16 AddNewRtcpFbNack(int level, sdp_rtcp_fb_nack_type_e type, 1.169 + u16 payload = SDP_ALL_PAYLOADS) { 1.170 + u16 inst_num = 0; 1.171 + EXPECT_EQ(sdp_add_new_attr(sdp_ptr_, level, 0, SDP_ATTR_RTCP_FB, 1.172 + &inst_num), SDP_SUCCESS); 1.173 + EXPECT_EQ(sdp_attr_set_rtcp_fb_nack(sdp_ptr_, level, payload, inst_num, 1.174 + type), SDP_SUCCESS); 1.175 + return inst_num; 1.176 + } 1.177 + 1.178 + u16 AddNewRtcpFbTrrInt(int level, u32 interval, 1.179 + u16 payload = SDP_ALL_PAYLOADS) { 1.180 + u16 inst_num = 0; 1.181 + EXPECT_EQ(sdp_add_new_attr(sdp_ptr_, level, 0, SDP_ATTR_RTCP_FB, 1.182 + &inst_num), SDP_SUCCESS); 1.183 + EXPECT_EQ(sdp_attr_set_rtcp_fb_trr_int(sdp_ptr_, level, payload, inst_num, 1.184 + interval), SDP_SUCCESS); 1.185 + return inst_num; 1.186 + } 1.187 + 1.188 + u16 AddNewRtcpFbCcm(int level, sdp_rtcp_fb_ccm_type_e type, 1.189 + u16 payload = SDP_ALL_PAYLOADS) { 1.190 + u16 inst_num = 0; 1.191 + EXPECT_EQ(sdp_add_new_attr(sdp_ptr_, level, 0, SDP_ATTR_RTCP_FB, 1.192 + &inst_num), SDP_SUCCESS); 1.193 + EXPECT_EQ(sdp_attr_set_rtcp_fb_ccm(sdp_ptr_, level, payload, inst_num, 1.194 + type), SDP_SUCCESS); 1.195 + return inst_num; 1.196 + } 1.197 + u16 AddNewExtMap(int level, const char* uri) { 1.198 + u16 inst_num = 0; 1.199 + EXPECT_EQ(sdp_add_new_attr(sdp_ptr_, level, 0, SDP_ATTR_EXTMAP, 1.200 + &inst_num), SDP_SUCCESS); 1.201 + EXPECT_EQ(sdp_attr_set_extmap(sdp_ptr_, level, inst_num, 1.202 + uri, inst_num), SDP_SUCCESS); 1.203 + return inst_num; 1.204 + } 1.205 + 1.206 + u16 AddNewFmtpMaxFs(int level, u32 max_fs) { 1.207 + u16 inst_num = 0; 1.208 + EXPECT_EQ(sdp_add_new_attr(sdp_ptr_, level, 0, SDP_ATTR_FMTP, 1.209 + &inst_num), SDP_SUCCESS); 1.210 + EXPECT_EQ(sdp_attr_set_fmtp_payload_type(sdp_ptr_, level, 0, inst_num, 1.211 + 120), SDP_SUCCESS); 1.212 + EXPECT_EQ(sdp_attr_set_fmtp_max_fs(sdp_ptr_, level, 0, inst_num, max_fs), 1.213 + SDP_SUCCESS); 1.214 + return inst_num; 1.215 + } 1.216 + 1.217 + u16 AddNewFmtpMaxFr(int level, u32 max_fr) { 1.218 + u16 inst_num = 0; 1.219 + EXPECT_EQ(sdp_add_new_attr(sdp_ptr_, level, 0, SDP_ATTR_FMTP, 1.220 + &inst_num), SDP_SUCCESS); 1.221 + EXPECT_EQ(sdp_attr_set_fmtp_payload_type(sdp_ptr_, level, 0, inst_num, 1.222 + 120), SDP_SUCCESS); 1.223 + EXPECT_EQ(sdp_attr_set_fmtp_max_fr(sdp_ptr_, level, 0, inst_num, max_fr), 1.224 + SDP_SUCCESS); 1.225 + return inst_num; 1.226 + } 1.227 + 1.228 + u16 AddNewFmtpMaxFsFr(int level, u32 max_fs, u32 max_fr) { 1.229 + u16 inst_num = 0; 1.230 + EXPECT_EQ(sdp_add_new_attr(sdp_ptr_, level, 0, SDP_ATTR_FMTP, 1.231 + &inst_num), SDP_SUCCESS); 1.232 + EXPECT_EQ(sdp_attr_set_fmtp_payload_type(sdp_ptr_, level, 0, inst_num, 1.233 + 120), SDP_SUCCESS); 1.234 + EXPECT_EQ(sdp_attr_set_fmtp_max_fs(sdp_ptr_, level, 0, inst_num, max_fs), 1.235 + SDP_SUCCESS); 1.236 + EXPECT_EQ(sdp_attr_set_fmtp_max_fr(sdp_ptr_, level, 0, inst_num, max_fr), 1.237 + SDP_SUCCESS); 1.238 + return inst_num; 1.239 + } 1.240 + 1.241 + protected: 1.242 + int final_level_; 1.243 + void *config_p_; 1.244 + sdp_t *sdp_ptr_; 1.245 +}; 1.246 + 1.247 +static const std::string kVideoSdp = 1.248 + "v=0\r\n" 1.249 + "o=- 137331303 2 IN IP4 127.0.0.1\r\n" 1.250 + "s=SIP Call\r\n" 1.251 + "t=0 0\r\n" 1.252 + "m=video 56436 RTP/SAVPF 120\r\n" 1.253 + "c=IN IP4 198.51.100.7\r\n" 1.254 + "a=rtpmap:120 VP8/90000\r\n"; 1.255 + 1.256 +TEST_F(SdpTest, parseRtcpFbAckRpsi) { 1.257 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 ack rpsi\r\n"); 1.258 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 1), 1.259 + SDP_RTCP_FB_ACK_RPSI); 1.260 +} 1.261 + 1.262 +TEST_F(SdpTest, parseRtcpFbAckApp) { 1.263 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 ack app\r\n"); 1.264 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 1), SDP_RTCP_FB_ACK_APP); 1.265 +} 1.266 + 1.267 +TEST_F(SdpTest, parseRtcpFbAckAppFoo) { 1.268 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 ack app foo\r\n"); 1.269 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 1), SDP_RTCP_FB_ACK_APP); 1.270 +} 1.271 + 1.272 +TEST_F(SdpTest, parseRtcpFbAckFooBar) { 1.273 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 ack foo bar\r\n"); 1.274 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 1), 1.275 + SDP_RTCP_FB_ACK_UNKNOWN); 1.276 +} 1.277 + 1.278 +TEST_F(SdpTest, parseRtcpFbAckFooBarBaz) { 1.279 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 ack foo bar baz\r\n"); 1.280 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 1), 1.281 + SDP_RTCP_FB_ACK_UNKNOWN); 1.282 +} 1.283 + 1.284 +TEST_F(SdpTest, parseRtcpFbNack) { 1.285 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 nack\r\n"); 1.286 + ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 1), 1.287 + SDP_RTCP_FB_NACK_BASIC); 1.288 +} 1.289 + 1.290 +TEST_F(SdpTest, parseRtcpFbNackPli) { 1.291 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 nack pli\r\n"); 1.292 +} 1.293 + 1.294 +TEST_F(SdpTest, parseRtcpFbNackSli) { 1.295 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 nack sli\r\n"); 1.296 + ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 1), 1.297 + SDP_RTCP_FB_NACK_SLI); 1.298 +} 1.299 + 1.300 +TEST_F(SdpTest, parseRtcpFbNackRpsi) { 1.301 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 nack rpsi\r\n"); 1.302 + ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 1), 1.303 + SDP_RTCP_FB_NACK_RPSI); 1.304 +} 1.305 + 1.306 +TEST_F(SdpTest, parseRtcpFbNackApp) { 1.307 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 nack app\r\n"); 1.308 + ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 1), 1.309 + SDP_RTCP_FB_NACK_APP); 1.310 +} 1.311 + 1.312 +TEST_F(SdpTest, parseRtcpFbNackAppFoo) { 1.313 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 nack app foo\r\n"); 1.314 + ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 1), 1.315 + SDP_RTCP_FB_NACK_APP); 1.316 +} 1.317 + 1.318 +TEST_F(SdpTest, parseRtcpFbNackAppFooBar) { 1.319 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 nack app foo bar\r\n"); 1.320 + ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 1), 1.321 + SDP_RTCP_FB_NACK_APP); 1.322 +} 1.323 + 1.324 +TEST_F(SdpTest, parseRtcpFbNackFooBarBaz) { 1.325 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 nack foo bar baz\r\n"); 1.326 + ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 1), 1.327 + SDP_RTCP_FB_NACK_UNKNOWN); 1.328 +} 1.329 + 1.330 +TEST_F(SdpTest, parseRtcpFbTrrInt0) { 1.331 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 trr-int 0\r\n"); 1.332 + ASSERT_EQ(sdp_attr_get_rtcp_fb_trr_int(sdp_ptr_, 1, 120, 1), 0U); 1.333 +} 1.334 + 1.335 +TEST_F(SdpTest, parseRtcpFbTrrInt123) { 1.336 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 trr-int 123\r\n"); 1.337 + ASSERT_EQ(sdp_attr_get_rtcp_fb_trr_int(sdp_ptr_, 1, 120, 1), 123U); 1.338 +} 1.339 + 1.340 +TEST_F(SdpTest, parseRtcpFbCcmFir) { 1.341 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 ccm fir\r\n"); 1.342 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 1), SDP_RTCP_FB_CCM_FIR); 1.343 +} 1.344 + 1.345 +TEST_F(SdpTest, parseRtcpFbCcmTmmbr) { 1.346 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 ccm tmmbr\r\n"); 1.347 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 1), 1.348 + SDP_RTCP_FB_CCM_TMMBR); 1.349 +} 1.350 + 1.351 +TEST_F(SdpTest, parseRtcpFbCcmTmmbrSmaxpr) { 1.352 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 ccm tmmbr smaxpr=456\r\n"); 1.353 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 1), 1.354 + SDP_RTCP_FB_CCM_TMMBR); 1.355 +} 1.356 + 1.357 +TEST_F(SdpTest, parseRtcpFbCcmTstr) { 1.358 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 ccm tstr\r\n"); 1.359 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 1), 1.360 + SDP_RTCP_FB_CCM_TSTR); 1.361 +} 1.362 + 1.363 +TEST_F(SdpTest, parseRtcpFbCcmVbcm) { 1.364 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 ccm vbcm 123 456 789\r\n"); 1.365 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 1), 1.366 + SDP_RTCP_FB_CCM_VBCM); 1.367 + // We don't currently parse out VBCM submessage types, since we don't have 1.368 + // any use for them. 1.369 +} 1.370 + 1.371 +TEST_F(SdpTest, parseRtcpFbCcmFoo) { 1.372 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 ccm foo\r\n"); 1.373 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 1), 1.374 + SDP_RTCP_FB_CCM_UNKNOWN); 1.375 +} 1.376 + 1.377 +TEST_F(SdpTest, parseRtcpFbCcmFooBarBaz) { 1.378 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 ccm foo bar baz\r\n"); 1.379 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 1), 1.380 + SDP_RTCP_FB_CCM_UNKNOWN); 1.381 +} 1.382 + 1.383 +TEST_F(SdpTest, parseRtcpFbFoo) { 1.384 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 foo\r\n"); 1.385 +} 1.386 + 1.387 +TEST_F(SdpTest, parseRtcpFbFooBar) { 1.388 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 foo bar\r\n"); 1.389 +} 1.390 + 1.391 +TEST_F(SdpTest, parseRtcpFbFooBarBaz) { 1.392 + ParseSdp(kVideoSdp + "a=rtcp-fb:120 foo bar baz\r\n"); 1.393 +} 1.394 + 1.395 + 1.396 +TEST_F(SdpTest, parseRtcpFbKitchenSink) { 1.397 + ParseSdp(kVideoSdp + 1.398 + "a=rtcp-fb:120 ack rpsi\r\n" 1.399 + "a=rtcp-fb:120 ack app\r\n" 1.400 + "a=rtcp-fb:120 ack app foo\r\n" 1.401 + "a=rtcp-fb:120 ack foo bar\r\n" 1.402 + "a=rtcp-fb:120 ack foo bar baz\r\n" 1.403 + "a=rtcp-fb:120 nack\r\n" 1.404 + "a=rtcp-fb:120 nack pli\r\n" 1.405 + "a=rtcp-fb:120 nack sli\r\n" 1.406 + "a=rtcp-fb:120 nack rpsi\r\n" 1.407 + "a=rtcp-fb:120 nack app\r\n" 1.408 + "a=rtcp-fb:120 nack app foo\r\n" 1.409 + "a=rtcp-fb:120 nack app foo bar\r\n" 1.410 + "a=rtcp-fb:120 nack foo bar baz\r\n" 1.411 + "a=rtcp-fb:120 trr-int 0\r\n" 1.412 + "a=rtcp-fb:120 trr-int 123\r\n" 1.413 + "a=rtcp-fb:120 ccm fir\r\n" 1.414 + "a=rtcp-fb:120 ccm tmmbr\r\n" 1.415 + "a=rtcp-fb:120 ccm tmmbr smaxpr=456\r\n" 1.416 + "a=rtcp-fb:120 ccm tstr\r\n" 1.417 + "a=rtcp-fb:120 ccm vbcm 123 456 789\r\n" 1.418 + "a=rtcp-fb:120 ccm foo\r\n" 1.419 + "a=rtcp-fb:120 ccm foo bar baz\r\n" 1.420 + "a=rtcp-fb:120 foo\r\n" 1.421 + "a=rtcp-fb:120 foo bar\r\n" 1.422 + "a=rtcp-fb:120 foo bar baz\r\n"); 1.423 + 1.424 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 1), SDP_RTCP_FB_ACK_RPSI); 1.425 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 2), SDP_RTCP_FB_ACK_APP); 1.426 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 3), SDP_RTCP_FB_ACK_APP); 1.427 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 4), 1.428 + SDP_RTCP_FB_ACK_UNKNOWN); 1.429 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 5), 1.430 + SDP_RTCP_FB_ACK_UNKNOWN); 1.431 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, 120, 6), 1.432 + SDP_RTCP_FB_ACK_NOT_FOUND); 1.433 + 1.434 + ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 1), 1.435 + SDP_RTCP_FB_NACK_BASIC); 1.436 + ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 2), 1.437 + SDP_RTCP_FB_NACK_PLI); 1.438 + ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 3), 1.439 + SDP_RTCP_FB_NACK_SLI); 1.440 + ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 4), 1.441 + SDP_RTCP_FB_NACK_RPSI); 1.442 + ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 5), 1.443 + SDP_RTCP_FB_NACK_APP); 1.444 + ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 6), 1.445 + SDP_RTCP_FB_NACK_APP); 1.446 + ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 7), 1.447 + SDP_RTCP_FB_NACK_APP); 1.448 + ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 8), 1.449 + SDP_RTCP_FB_NACK_UNKNOWN); 1.450 + ASSERT_EQ(sdp_attr_get_rtcp_fb_nack(sdp_ptr_, 1, 120, 9), 1.451 + SDP_RTCP_FB_NACK_NOT_FOUND); 1.452 + 1.453 + ASSERT_EQ(sdp_attr_get_rtcp_fb_trr_int(sdp_ptr_, 1, 120, 1), 0U); 1.454 + ASSERT_EQ(sdp_attr_get_rtcp_fb_trr_int(sdp_ptr_, 1, 120, 2), 123U); 1.455 + ASSERT_EQ(sdp_attr_get_rtcp_fb_trr_int(sdp_ptr_, 1, 120, 3), 0xFFFFFFFF); 1.456 + 1.457 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 1), SDP_RTCP_FB_CCM_FIR); 1.458 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 2), 1.459 + SDP_RTCP_FB_CCM_TMMBR); 1.460 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 3), 1.461 + SDP_RTCP_FB_CCM_TMMBR); 1.462 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 4), 1.463 + SDP_RTCP_FB_CCM_TSTR); 1.464 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 5), 1.465 + SDP_RTCP_FB_CCM_VBCM); 1.466 + // We don't currently parse out VBCM submessage types, since we don't have 1.467 + // any use for them. 1.468 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 6), 1.469 + SDP_RTCP_FB_CCM_UNKNOWN); 1.470 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 7), 1.471 + SDP_RTCP_FB_CCM_UNKNOWN); 1.472 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ccm(sdp_ptr_, 1, 120, 8), 1.473 + SDP_RTCP_FB_CCM_NOT_FOUND); 1.474 +} 1.475 + 1.476 +TEST_F(SdpTest, addRtcpFbAckRpsi) { 1.477 + InitLocalSdp(); 1.478 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.479 + AddNewRtcpFbAck(level, SDP_RTCP_FB_ACK_RPSI, 120); 1.480 + std::string body = SerializeSdp(); 1.481 + ASSERT_NE(body.find("a=rtcp-fb:120 ack rpsi\r\n"), std::string::npos); 1.482 +} 1.483 + 1.484 +TEST_F(SdpTest, addRtcpFbAckRpsiAllPt) { 1.485 + InitLocalSdp(); 1.486 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.487 + AddNewRtcpFbAck(level, SDP_RTCP_FB_ACK_RPSI); 1.488 + std::string body = SerializeSdp(); 1.489 + ASSERT_NE(body.find("a=rtcp-fb:* ack rpsi\r\n"), std::string::npos); 1.490 +} 1.491 + 1.492 +TEST_F(SdpTest, addRtcpFbAckApp) { 1.493 + InitLocalSdp(); 1.494 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.495 + AddNewRtcpFbAck(level, SDP_RTCP_FB_ACK_APP, 120); 1.496 + std::string body = SerializeSdp(); 1.497 + ASSERT_NE(body.find("a=rtcp-fb:120 ack app\r\n"), std::string::npos); 1.498 +} 1.499 + 1.500 +TEST_F(SdpTest, addRtcpFbAckAppAllPt) { 1.501 + InitLocalSdp(); 1.502 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.503 + AddNewRtcpFbAck(level, SDP_RTCP_FB_ACK_APP); 1.504 + std::string body = SerializeSdp(); 1.505 + ASSERT_NE(body.find("a=rtcp-fb:* ack app\r\n"), std::string::npos); 1.506 +} 1.507 + 1.508 +TEST_F(SdpTest, addRtcpFbNack) { 1.509 + InitLocalSdp(); 1.510 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.511 + AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_BASIC, 120); 1.512 + std::string body = SerializeSdp(); 1.513 + ASSERT_NE(body.find("a=rtcp-fb:120 nack\r\n"), std::string::npos); 1.514 +} 1.515 + 1.516 +TEST_F(SdpTest, addRtcpFbNackAllPt) { 1.517 + InitLocalSdp(); 1.518 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.519 + AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_BASIC); 1.520 + std::string body = SerializeSdp(); 1.521 + ASSERT_NE(body.find("a=rtcp-fb:* nack\r\n"), std::string::npos); 1.522 +} 1.523 + 1.524 +TEST_F(SdpTest, addRtcpFbNackSli) { 1.525 + InitLocalSdp(); 1.526 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.527 + AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_SLI, 120); 1.528 + std::string body = SerializeSdp(); 1.529 + ASSERT_NE(body.find("a=rtcp-fb:120 nack sli\r\n"), std::string::npos); 1.530 +} 1.531 + 1.532 +TEST_F(SdpTest, addRtcpFbNackSliAllPt) { 1.533 + InitLocalSdp(); 1.534 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.535 + AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_SLI); 1.536 + std::string body = SerializeSdp(); 1.537 + ASSERT_NE(body.find("a=rtcp-fb:* nack sli\r\n"), std::string::npos); 1.538 +} 1.539 + 1.540 +TEST_F(SdpTest, addRtcpFbNackPli) { 1.541 + InitLocalSdp(); 1.542 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.543 + AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_PLI, 120); 1.544 + std::string body = SerializeSdp(); 1.545 + ASSERT_NE(body.find("a=rtcp-fb:120 nack pli\r\n"), std::string::npos); 1.546 +} 1.547 + 1.548 +TEST_F(SdpTest, addRtcpFbNackPliAllPt) { 1.549 + InitLocalSdp(); 1.550 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.551 + AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_PLI); 1.552 + std::string body = SerializeSdp(); 1.553 + ASSERT_NE(body.find("a=rtcp-fb:* nack pli\r\n"), std::string::npos); 1.554 +} 1.555 + 1.556 +TEST_F(SdpTest, addRtcpFbNackRpsi) { 1.557 + InitLocalSdp(); 1.558 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.559 + AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_RPSI, 120); 1.560 + std::string body = SerializeSdp(); 1.561 + ASSERT_NE(body.find("a=rtcp-fb:120 nack rpsi\r\n"), std::string::npos); 1.562 +} 1.563 + 1.564 +TEST_F(SdpTest, addRtcpFbNackRpsiAllPt) { 1.565 + InitLocalSdp(); 1.566 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.567 + AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_RPSI); 1.568 + std::string body = SerializeSdp(); 1.569 + ASSERT_NE(body.find("a=rtcp-fb:* nack rpsi\r\n"), std::string::npos); 1.570 +} 1.571 + 1.572 +TEST_F(SdpTest, addRtcpFbNackApp) { 1.573 + InitLocalSdp(); 1.574 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.575 + AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_APP, 120); 1.576 + std::string body = SerializeSdp(); 1.577 + ASSERT_NE(body.find("a=rtcp-fb:120 nack app\r\n"), std::string::npos); 1.578 +} 1.579 + 1.580 +TEST_F(SdpTest, addRtcpFbNackAppAllPt) { 1.581 + InitLocalSdp(); 1.582 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.583 + AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_APP); 1.584 + std::string body = SerializeSdp(); 1.585 + ASSERT_NE(body.find("a=rtcp-fb:* nack app\r\n"), std::string::npos); 1.586 +} 1.587 + 1.588 +TEST_F(SdpTest, addRtcpFbNackRai) { 1.589 + InitLocalSdp(); 1.590 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.591 + AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_RAI, 120); 1.592 + std::string body = SerializeSdp(); 1.593 + ASSERT_NE(body.find("a=rtcp-fb:120 nack rai\r\n"), std::string::npos); 1.594 +} 1.595 + 1.596 +TEST_F(SdpTest, addRtcpFbNackRaiAllPt) { 1.597 + InitLocalSdp(); 1.598 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.599 + AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_RAI); 1.600 + std::string body = SerializeSdp(); 1.601 + ASSERT_NE(body.find("a=rtcp-fb:* nack rai\r\n"), std::string::npos); 1.602 +} 1.603 + 1.604 +TEST_F(SdpTest, addRtcpFbNackTllei) { 1.605 + InitLocalSdp(); 1.606 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.607 + AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_TLLEI, 120); 1.608 + std::string body = SerializeSdp(); 1.609 + ASSERT_NE(body.find("a=rtcp-fb:120 nack tllei\r\n"), std::string::npos); 1.610 +} 1.611 + 1.612 +TEST_F(SdpTest, addRtcpFbNackTlleiAllPt) { 1.613 + InitLocalSdp(); 1.614 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.615 + AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_TLLEI); 1.616 + std::string body = SerializeSdp(); 1.617 + ASSERT_NE(body.find("a=rtcp-fb:* nack tllei\r\n"), std::string::npos); 1.618 +} 1.619 + 1.620 +TEST_F(SdpTest, addRtcpFbNackPslei) { 1.621 + InitLocalSdp(); 1.622 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.623 + AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_PSLEI, 120); 1.624 + std::string body = SerializeSdp(); 1.625 + ASSERT_NE(body.find("a=rtcp-fb:120 nack pslei\r\n"), std::string::npos); 1.626 +} 1.627 + 1.628 +TEST_F(SdpTest, addRtcpFbNackPsleiAllPt) { 1.629 + InitLocalSdp(); 1.630 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.631 + AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_PSLEI); 1.632 + std::string body = SerializeSdp(); 1.633 + ASSERT_NE(body.find("a=rtcp-fb:* nack pslei\r\n"), std::string::npos); 1.634 +} 1.635 + 1.636 +TEST_F(SdpTest, addRtcpFbNackEcn) { 1.637 + InitLocalSdp(); 1.638 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.639 + AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_ECN, 120); 1.640 + std::string body = SerializeSdp(); 1.641 + ASSERT_NE(body.find("a=rtcp-fb:120 nack ecn\r\n"), std::string::npos); 1.642 +} 1.643 + 1.644 +TEST_F(SdpTest, addRtcpFbNackEcnAllPt) { 1.645 + InitLocalSdp(); 1.646 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.647 + AddNewRtcpFbNack(level, SDP_RTCP_FB_NACK_ECN); 1.648 + std::string body = SerializeSdp(); 1.649 + ASSERT_NE(body.find("a=rtcp-fb:* nack ecn\r\n"), std::string::npos); 1.650 +} 1.651 + 1.652 +TEST_F(SdpTest, addRtcpFbTrrInt) { 1.653 + InitLocalSdp(); 1.654 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.655 + AddNewRtcpFbTrrInt(level, 12345, 120); 1.656 + std::string body = SerializeSdp(); 1.657 + ASSERT_NE(body.find("a=rtcp-fb:120 trr-int 12345\r\n"), std::string::npos); 1.658 +} 1.659 + 1.660 +TEST_F(SdpTest, addRtcpFbNackTrrIntAllPt) { 1.661 + InitLocalSdp(); 1.662 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.663 + AddNewRtcpFbTrrInt(level, 0); 1.664 + std::string body = SerializeSdp(); 1.665 + ASSERT_NE(body.find("a=rtcp-fb:* trr-int 0\r\n"), std::string::npos); 1.666 +} 1.667 + 1.668 +TEST_F(SdpTest, addRtcpFbCcmFir) { 1.669 + InitLocalSdp(); 1.670 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.671 + AddNewRtcpFbCcm(level, SDP_RTCP_FB_CCM_FIR, 120); 1.672 + std::string body = SerializeSdp(); 1.673 + ASSERT_NE(body.find("a=rtcp-fb:120 ccm fir\r\n"), std::string::npos); 1.674 +} 1.675 + 1.676 +TEST_F(SdpTest, addRtcpFbCcmFirAllPt) { 1.677 + InitLocalSdp(); 1.678 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.679 + AddNewRtcpFbCcm(level, SDP_RTCP_FB_CCM_FIR); 1.680 + std::string body = SerializeSdp(); 1.681 + ASSERT_NE(body.find("a=rtcp-fb:* ccm fir\r\n"), std::string::npos); 1.682 +} 1.683 + 1.684 +TEST_F(SdpTest, addRtcpFbCcmTmmbr) { 1.685 + InitLocalSdp(); 1.686 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.687 + AddNewRtcpFbCcm(level, SDP_RTCP_FB_CCM_TMMBR, 120); 1.688 + std::string body = SerializeSdp(); 1.689 + ASSERT_NE(body.find("a=rtcp-fb:120 ccm tmmbr\r\n"), std::string::npos); 1.690 +} 1.691 + 1.692 +TEST_F(SdpTest, addRtcpFbCcmTmmbrAllPt) { 1.693 + InitLocalSdp(); 1.694 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.695 + AddNewRtcpFbCcm(level, SDP_RTCP_FB_CCM_TMMBR); 1.696 + std::string body = SerializeSdp(); 1.697 + ASSERT_NE(body.find("a=rtcp-fb:* ccm tmmbr\r\n"), std::string::npos); 1.698 +} 1.699 + 1.700 +TEST_F(SdpTest, addRtcpFbCcmTstr) { 1.701 + InitLocalSdp(); 1.702 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.703 + AddNewRtcpFbCcm(level, SDP_RTCP_FB_CCM_TSTR, 120); 1.704 + std::string body = SerializeSdp(); 1.705 + ASSERT_NE(body.find("a=rtcp-fb:120 ccm tstr\r\n"), std::string::npos); 1.706 +} 1.707 + 1.708 +TEST_F(SdpTest, addRtcpFbCcmTstrAllPt) { 1.709 + InitLocalSdp(); 1.710 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.711 + AddNewRtcpFbCcm(level, SDP_RTCP_FB_CCM_TSTR); 1.712 + std::string body = SerializeSdp(); 1.713 + ASSERT_NE(body.find("a=rtcp-fb:* ccm tstr\r\n"), std::string::npos); 1.714 +} 1.715 + 1.716 +TEST_F(SdpTest, addRtcpFbCcmVbcm) { 1.717 + InitLocalSdp(); 1.718 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.719 + AddNewRtcpFbCcm(level, SDP_RTCP_FB_CCM_VBCM, 120); 1.720 + std::string body = SerializeSdp(); 1.721 + ASSERT_NE(body.find("a=rtcp-fb:120 ccm vbcm\r\n"), std::string::npos); 1.722 +} 1.723 + 1.724 +TEST_F(SdpTest, addRtcpFbCcmVbcmAllPt) { 1.725 + InitLocalSdp(); 1.726 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.727 + AddNewRtcpFbCcm(level, SDP_RTCP_FB_CCM_VBCM); 1.728 + std::string body = SerializeSdp(); 1.729 + ASSERT_NE(body.find("a=rtcp-fb:* ccm vbcm\r\n"), std::string::npos); 1.730 +} 1.731 + 1.732 +TEST_F(SdpTest, parseRtcpFbAllPayloads) { 1.733 + ParseSdp(kVideoSdp + "a=rtcp-fb:* ack rpsi\r\n"); 1.734 + for (int i = 0; i < 128; i++) { 1.735 + ASSERT_EQ(sdp_attr_get_rtcp_fb_ack(sdp_ptr_, 1, i, 1), 1.736 + SDP_RTCP_FB_ACK_RPSI); 1.737 + } 1.738 +} 1.739 +TEST_F(SdpTest, addExtMap) { 1.740 + InitLocalSdp(); 1.741 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.742 + AddNewExtMap(level, SDP_EXTMAP_AUDIO_LEVEL); 1.743 + std::string body = SerializeSdp(); 1.744 + ASSERT_NE(body.find("a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\n"), std::string::npos); 1.745 +} 1.746 + 1.747 +TEST_F(SdpTest, parseExtMap) { 1.748 + ParseSdp(kVideoSdp + 1.749 + "a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\n"); 1.750 + ASSERT_STREQ(sdp_attr_get_extmap_uri(sdp_ptr_, 1, 1), 1.751 + SDP_EXTMAP_AUDIO_LEVEL); 1.752 + ASSERT_EQ(sdp_attr_get_extmap_id(sdp_ptr_, 1, 1), 1.753 + 1); 1.754 + 1.755 +} 1.756 + 1.757 +TEST_F(SdpTest, parseFmtpMaxFs) { 1.758 + u32 val = 0; 1.759 + ParseSdp(kVideoSdp + "a=fmtp:120 max-fs=300;max-fr=30\r\n"); 1.760 + ASSERT_EQ(sdp_attr_get_fmtp_max_fs(sdp_ptr_, 1, 0, 1, &val), SDP_SUCCESS); 1.761 + ASSERT_EQ(val, 300U); 1.762 +} 1.763 +TEST_F(SdpTest, parseFmtpMaxFr) { 1.764 + u32 val = 0; 1.765 + ParseSdp(kVideoSdp + "a=fmtp:120 max-fs=300;max-fr=30\r\n"); 1.766 + ASSERT_EQ(sdp_attr_get_fmtp_max_fr(sdp_ptr_, 1, 0, 1, &val), SDP_SUCCESS); 1.767 + ASSERT_EQ(val, 30U); 1.768 +} 1.769 + 1.770 +TEST_F(SdpTest, addFmtpMaxFs) { 1.771 + InitLocalSdp(); 1.772 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.773 + AddNewFmtpMaxFs(level, 300); 1.774 + std::string body = SerializeSdp(); 1.775 + ASSERT_NE(body.find("a=fmtp:120 max-fs=300\r\n"), std::string::npos); 1.776 +} 1.777 + 1.778 +TEST_F(SdpTest, addFmtpMaxFr) { 1.779 + InitLocalSdp(); 1.780 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.781 + AddNewFmtpMaxFr(level, 30); 1.782 + std::string body = SerializeSdp(); 1.783 + ASSERT_NE(body.find("a=fmtp:120 max-fr=30\r\n"), std::string::npos); 1.784 +} 1.785 + 1.786 +TEST_F(SdpTest, addFmtpMaxFsFr) { 1.787 + InitLocalSdp(); 1.788 + int level = AddNewMedia(SDP_MEDIA_VIDEO); 1.789 + AddNewFmtpMaxFsFr(level, 300, 30); 1.790 + std::string body = SerializeSdp(); 1.791 + ASSERT_NE(body.find("a=fmtp:120 max-fs=300;max-fr=30\r\n"), 1.792 + std::string::npos); 1.793 +} 1.794 + 1.795 +static const std::string kBrokenFmtp = 1.796 + "v=0\r\n" 1.797 + "o=- 137331303 2 IN IP4 127.0.0.1\r\n" 1.798 + "s=SIP Call\r\n" 1.799 + "t=0 0\r\n" 1.800 + "m=video 56436 RTP/SAVPF 120\r\n" 1.801 + "c=IN IP4 198.51.100.7\r\n" 1.802 + "a=rtpmap:120 VP8/90000\r\n" 1.803 + /* Note: the \0 in this string triggered bz://1089207 1.804 + */ 1.805 + "a=fmtp:120 max-fs=300;max\0fr=30"; 1.806 + 1.807 +TEST_F(SdpTest, parseBrokenFmtp) { 1.808 + u32 val = 0; 1.809 + char *buf = const_cast<char *>(kBrokenFmtp.data()); 1.810 + ResetSdp(); 1.811 + /* We need to manually invoke the parser here to be able to specify the length 1.812 + * of the string beyond the \0 in last line of the string. 1.813 + */ 1.814 + ASSERT_EQ(sdp_parse(sdp_ptr_, &buf, 165), SDP_SUCCESS); 1.815 + ASSERT_EQ(sdp_attr_get_fmtp_max_fs(sdp_ptr_, 1, 0, 1, &val), SDP_INVALID_PARAMETER); 1.816 +} 1.817 + 1.818 +} // End namespace test. 1.819 + 1.820 +int main(int argc, char **argv) { 1.821 + test_utils = new MtransportTestUtils(); 1.822 + NSS_NoDB_Init(nullptr); 1.823 + NSS_SetDomesticPolicy(); 1.824 + 1.825 + ::testing::InitGoogleTest(&argc, argv); 1.826 + int result = RUN_ALL_TESTS(); 1.827 + 1.828 + sipcc::PeerConnectionCtx::Destroy(); 1.829 + delete test_utils; 1.830 + 1.831 + return result; 1.832 +}