Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(180)

Side by Side Diff: webrtc/api/webrtcsdp_unittest.cc

Issue 2562183002: Implement parsing/serialization of a=bundle-only. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2011 The WebRTC project authors. All Rights Reserved. 2 * Copyright 2011 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 "a=rtcp:9 IN IP4 0.0.0.0\r\n" 324 "a=rtcp:9 IN IP4 0.0.0.0\r\n"
325 "a=ice-ufrag:ufrag_video\r\na=ice-pwd:pwd_video\r\n" 325 "a=ice-ufrag:ufrag_video\r\na=ice-pwd:pwd_video\r\n"
326 "a=mid:video_content_name\r\n" 326 "a=mid:video_content_name\r\n"
327 "a=sendrecv\r\n" 327 "a=sendrecv\r\n"
328 "a=rtpmap:120 VP8/90000\r\n" 328 "a=rtpmap:120 VP8/90000\r\n"
329 "a=ssrc:2 cname:stream_1_cname\r\n" 329 "a=ssrc:2 cname:stream_1_cname\r\n"
330 "a=ssrc:2 msid:local_stream video_track_id_1\r\n" 330 "a=ssrc:2 msid:local_stream video_track_id_1\r\n"
331 "a=ssrc:2 mslabel:local_stream\r\n" 331 "a=ssrc:2 mslabel:local_stream\r\n"
332 "a=ssrc:2 label:video_track_id_1\r\n"; 332 "a=ssrc:2 label:video_track_id_1\r\n";
333 333
334 // Reference sdp string using bundle-only.
335 static const char kBundleOnlySdpFullString[] =
336 "v=0\r\n"
337 "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
338 "s=-\r\n"
339 "t=0 0\r\n"
340 "a=group:BUNDLE audio_content_name video_content_name\r\n"
341 "a=msid-semantic: WMS local_stream_1\r\n"
342 "m=audio 2345 RTP/SAVPF 111 103 104\r\n"
343 "c=IN IP4 74.125.127.126\r\n"
344 "a=rtcp:2347 IN IP4 74.125.127.126\r\n"
345 "a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host "
346 "generation 2\r\n"
347 "a=candidate:a0+B/1 2 udp 2130706432 192.168.1.5 1235 typ host "
348 "generation 2\r\n"
349 "a=candidate:a0+B/2 1 udp 2130706432 ::1 1238 typ host "
350 "generation 2\r\n"
351 "a=candidate:a0+B/2 2 udp 2130706432 ::1 1239 typ host "
352 "generation 2\r\n"
353 "a=candidate:a0+B/3 1 udp 2130706432 74.125.127.126 2345 typ srflx "
354 "raddr 192.168.1.5 rport 2346 "
355 "generation 2\r\n"
356 "a=candidate:a0+B/3 2 udp 2130706432 74.125.127.126 2347 typ srflx "
357 "raddr 192.168.1.5 rport 2348 "
358 "generation 2\r\n"
359 "a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n"
360 "a=mid:audio_content_name\r\n"
361 "a=sendrecv\r\n"
362 "a=rtcp-mux\r\n"
363 "a=rtcp-rsize\r\n"
364 "a=crypto:1 AES_CM_128_HMAC_SHA1_32 "
365 "inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 "
366 "dummy_session_params\r\n"
367 "a=rtpmap:111 opus/48000/2\r\n"
368 "a=rtpmap:103 ISAC/16000\r\n"
369 "a=rtpmap:104 ISAC/32000\r\n"
370 "a=ssrc:1 cname:stream_1_cname\r\n"
371 "a=ssrc:1 msid:local_stream_1 audio_track_id_1\r\n"
372 "a=ssrc:1 mslabel:local_stream_1\r\n"
373 "a=ssrc:1 label:audio_track_id_1\r\n"
374 "m=video 0 RTP/SAVPF 120\r\n"
375 "c=IN IP4 0.0.0.0\r\n"
376 "a=rtcp:9 IN IP4 0.0.0.0\r\n"
377 "a=bundle-only\r\n"
378 "a=mid:video_content_name\r\n"
379 "a=sendrecv\r\n"
380 "a=crypto:1 AES_CM_128_HMAC_SHA1_80 "
381 "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32\r\n"
382 "a=rtpmap:120 VP8/90000\r\n"
383 "a=ssrc-group:FEC 2 3\r\n"
384 "a=ssrc:2 cname:stream_1_cname\r\n"
385 "a=ssrc:2 msid:local_stream_1 video_track_id_1\r\n"
386 "a=ssrc:2 mslabel:local_stream_1\r\n"
387 "a=ssrc:2 label:video_track_id_1\r\n"
388 "a=ssrc:3 cname:stream_1_cname\r\n"
389 "a=ssrc:3 msid:local_stream_1 video_track_id_1\r\n"
390 "a=ssrc:3 mslabel:local_stream_1\r\n"
391 "a=ssrc:3 label:video_track_id_1\r\n";
pthatcher1 2017/01/03 17:31:01 We should probably add a test for broken SDP from
392
334 // Plan B SDP reference string, with 2 streams, 2 audio tracks and 3 video 393 // Plan B SDP reference string, with 2 streams, 2 audio tracks and 3 video
335 // tracks. 394 // tracks.
336 static const char kPlanBSdpFullString[] = 395 static const char kPlanBSdpFullString[] =
337 "v=0\r\n" 396 "v=0\r\n"
338 "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n" 397 "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
339 "s=-\r\n" 398 "s=-\r\n"
340 "t=0 0\r\n" 399 "t=0 0\r\n"
341 "a=msid-semantic: WMS local_stream_1 local_stream_2\r\n" 400 "a=msid-semantic: WMS local_stream_1 local_stream_2\r\n"
342 "m=audio 2345 RTP/SAVPF 111 103 104\r\n" 401 "m=audio 2345 RTP/SAVPF 111 103 104\r\n"
343 "c=IN IP4 74.125.127.126\r\n" 402 "c=IN IP4 74.125.127.126\r\n"
(...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after
934 bool is_video = (i > 5); 993 bool is_video = (i > 5);
935 mline_id = is_video ? "video_content_name" : "audio_content_name"; 994 mline_id = is_video ? "video_content_name" : "audio_content_name";
936 mline_index = is_video ? 1 : 0; 995 mline_index = is_video ? 1 : 0;
937 JsepIceCandidate jice(mline_id, 996 JsepIceCandidate jice(mline_id,
938 mline_index, 997 mline_index,
939 candidates_.at(i)); 998 candidates_.at(i));
940 jdesc_.AddCandidate(&jice); 999 jdesc_.AddCandidate(&jice);
941 } 1000 }
942 } 1001 }
943 1002
1003 // Turns the existing reference description into a description using
1004 // a=bundle-only. This means no transport attributes and a 0 port value on
1005 // the m= sections not associated with the BUNDLE-tag.
1006 void MakeBundleOnlyDescription() {
1007 // Remove video candidates. JsepSessionDescription doesn't make it
1008 // simple.
1009 const IceCandidateCollection* video_candidates_collection =
1010 jdesc_.candidates(1);
1011 ASSERT_NE(nullptr, video_candidates_collection);
1012 std::vector<cricket::Candidate> video_candidates;
1013 for (size_t i = 0; i < video_candidates_collection->count(); ++i) {
1014 cricket::Candidate c = video_candidates_collection->at(i)->candidate();
1015 c.set_transport_name("video_content_name");
1016 video_candidates.push_back(c);
1017 }
1018 jdesc_.RemoveCandidates(video_candidates);
1019
1020 // And the rest of the transport attributes.
1021 desc_.transport_infos()[1].description.ice_ufrag.clear();
1022 desc_.transport_infos()[1].description.ice_pwd.clear();
1023 desc_.transport_infos()[1].description.connection_role =
1024 cricket::CONNECTIONROLE_NONE;
1025
1026 // Set bundle-only flag.
1027 desc_.contents()[1].bundle_only = true;
1028
1029 // Add BUNDLE group.
1030 ContentGroup group(cricket::GROUP_TYPE_BUNDLE);
1031 group.AddContentName(kAudioContentName);
1032 group.AddContentName(kVideoContentName);
1033 desc_.AddGroup(group);
1034
1035 ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
1036 jdesc_.session_version()));
1037 }
1038
944 // Turns the existing reference description into a plan B description, 1039 // Turns the existing reference description into a plan B description,
945 // with 2 audio tracks and 3 video tracks. 1040 // with 2 audio tracks and 3 video tracks.
946 void MakePlanBDescription() { 1041 void MakePlanBDescription() {
947 audio_desc_ = static_cast<AudioContentDescription*>(audio_desc_->Copy()); 1042 audio_desc_ = static_cast<AudioContentDescription*>(audio_desc_->Copy());
948 video_desc_ = static_cast<VideoContentDescription*>(video_desc_->Copy()); 1043 video_desc_ = static_cast<VideoContentDescription*>(video_desc_->Copy());
949 1044
950 StreamParams audio_track_2; 1045 StreamParams audio_track_2;
951 audio_track_2.id = kAudioTrackId2; 1046 audio_track_2.id = kAudioTrackId2;
952 audio_track_2.cname = kStream2Cname; 1047 audio_track_2.cname = kStream2Cname;
953 audio_track_2.sync_label = kStreamLabel2; 1048 audio_track_2.sync_label = kStreamLabel2;
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
1118 void CompareSessionDescription(const SessionDescription& desc1, 1213 void CompareSessionDescription(const SessionDescription& desc1,
1119 const SessionDescription& desc2) { 1214 const SessionDescription& desc2) {
1120 // Compare content descriptions. 1215 // Compare content descriptions.
1121 if (desc1.contents().size() != desc2.contents().size()) { 1216 if (desc1.contents().size() != desc2.contents().size()) {
1122 ADD_FAILURE(); 1217 ADD_FAILURE();
1123 return; 1218 return;
1124 } 1219 }
1125 for (size_t i = 0 ; i < desc1.contents().size(); ++i) { 1220 for (size_t i = 0 ; i < desc1.contents().size(); ++i) {
1126 const cricket::ContentInfo& c1 = desc1.contents().at(i); 1221 const cricket::ContentInfo& c1 = desc1.contents().at(i);
1127 const cricket::ContentInfo& c2 = desc2.contents().at(i); 1222 const cricket::ContentInfo& c2 = desc2.contents().at(i);
1128 // content name 1223 // ContentInfo properties.
1129 EXPECT_EQ(c1.name, c2.name); 1224 EXPECT_EQ(c1.name, c2.name);
1130 // content type 1225 EXPECT_EQ(c1.type, c2.type);
1131 // Note, ASSERT will return from the function, but will not stop the test. 1226 EXPECT_EQ(c1.rejected, c2.rejected);
1132 ASSERT_EQ(c1.type, c2.type); 1227 EXPECT_EQ(c1.bundle_only, c2.bundle_only);
1133 1228
1134 ASSERT_EQ(IsAudioContent(&c1), IsAudioContent(&c2)); 1229 ASSERT_EQ(IsAudioContent(&c1), IsAudioContent(&c2));
1135 if (IsAudioContent(&c1)) { 1230 if (IsAudioContent(&c1)) {
1136 const AudioContentDescription* acd1 = 1231 const AudioContentDescription* acd1 =
1137 static_cast<const AudioContentDescription*>(c1.description); 1232 static_cast<const AudioContentDescription*>(c1.description);
1138 const AudioContentDescription* acd2 = 1233 const AudioContentDescription* acd2 =
1139 static_cast<const AudioContentDescription*>(c2.description); 1234 static_cast<const AudioContentDescription*>(c2.description);
1140 CompareMediaContentDescription<AudioContentDescription>(acd1, acd2); 1235 CompareMediaContentDescription<AudioContentDescription>(acd1, acd2);
1141 } 1236 }
1142 1237
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1220 const JsepSessionDescription& desc1, 1315 const JsepSessionDescription& desc1,
1221 const JsepSessionDescription& desc2) { 1316 const JsepSessionDescription& desc2) {
1222 EXPECT_EQ(desc1.session_id(), desc2.session_id()); 1317 EXPECT_EQ(desc1.session_id(), desc2.session_id());
1223 EXPECT_EQ(desc1.session_version(), desc2.session_version()); 1318 EXPECT_EQ(desc1.session_version(), desc2.session_version());
1224 CompareSessionDescription(*desc1.description(), *desc2.description()); 1319 CompareSessionDescription(*desc1.description(), *desc2.description());
1225 if (desc1.number_of_mediasections() != desc2.number_of_mediasections()) 1320 if (desc1.number_of_mediasections() != desc2.number_of_mediasections())
1226 return false; 1321 return false;
1227 for (size_t i = 0; i < desc1.number_of_mediasections(); ++i) { 1322 for (size_t i = 0; i < desc1.number_of_mediasections(); ++i) {
1228 const IceCandidateCollection* cc1 = desc1.candidates(i); 1323 const IceCandidateCollection* cc1 = desc1.candidates(i);
1229 const IceCandidateCollection* cc2 = desc2.candidates(i); 1324 const IceCandidateCollection* cc2 = desc2.candidates(i);
1230 if (cc1->count() != cc2->count()) 1325 if (cc1->count() != cc2->count()) {
1326 ADD_FAILURE();
1231 return false; 1327 return false;
1328 }
1232 for (size_t j = 0; j < cc1->count(); ++j) { 1329 for (size_t j = 0; j < cc1->count(); ++j) {
1233 const IceCandidateInterface* c1 = cc1->at(j); 1330 const IceCandidateInterface* c1 = cc1->at(j);
1234 const IceCandidateInterface* c2 = cc2->at(j); 1331 const IceCandidateInterface* c2 = cc2->at(j);
1235 EXPECT_EQ(c1->sdp_mid(), c2->sdp_mid()); 1332 EXPECT_EQ(c1->sdp_mid(), c2->sdp_mid());
1236 EXPECT_EQ(c1->sdp_mline_index(), c2->sdp_mline_index()); 1333 EXPECT_EQ(c1->sdp_mline_index(), c2->sdp_mline_index());
1237 EXPECT_TRUE(c1->candidate().IsEquivalent(c2->candidate())); 1334 EXPECT_TRUE(c1->candidate().IsEquivalent(c2->candidate()));
1238 } 1335 }
1239 } 1336 }
1240 return true; 1337 return true;
1241 } 1338 }
(...skipping 1890 matching lines...) Expand 10 before | Expand all | Expand 10 after
3132 static_cast<const cricket::MediaContentDescription*>( 3229 static_cast<const cricket::MediaContentDescription*>(
3133 desc->contents()[i].description); 3230 desc->contents()[i].description);
3134 EXPECT_EQ(media_types[media_content_in_sdp[i]], mdesc->type()); 3231 EXPECT_EQ(media_types[media_content_in_sdp[i]], mdesc->type());
3135 } 3232 }
3136 3233
3137 std::string serialized_sdp = webrtc::SdpSerialize(jdesc, false); 3234 std::string serialized_sdp = webrtc::SdpSerialize(jdesc, false);
3138 EXPECT_EQ(sdp_string, serialized_sdp); 3235 EXPECT_EQ(sdp_string, serialized_sdp);
3139 } 3236 }
3140 } 3237 }
3141 3238
3239 TEST_F(WebRtcSdpTest, DeserializeBundleOnlyAttribute) {
3240 MakeBundleOnlyDescription();
3241 JsepSessionDescription deserialized_description(kDummyString);
3242 EXPECT_TRUE(
3243 SdpDeserialize(kBundleOnlySdpFullString, &deserialized_description));
3244 EXPECT_TRUE(CompareSessionDescription(jdesc_, deserialized_description));
3245 }
3246
3247 // "a=bundle-only" should only be used in combination with a 0 port on the m=
3248 // line. We should fail to parse anything else.
3249 TEST_F(WebRtcSdpTest, FailToDeserializeBundleOnlyWithNonzeroPort) {
3250 std::string bad_sdp = kBundleOnlySdpFullString;
3251 Replace("m=video 0", "m=video 9", &bad_sdp);
3252 ExpectParseFailure(bad_sdp, "a=bundle-only");
3253 }
3254
3255 TEST_F(WebRtcSdpTest, SerializeBundleOnlyAttribute) {
3256 MakeBundleOnlyDescription();
3257 TestSerialize(jdesc_, false);
3258 }
3259
3142 TEST_F(WebRtcSdpTest, DeserializePlanBSessionDescription) { 3260 TEST_F(WebRtcSdpTest, DeserializePlanBSessionDescription) {
3143 MakePlanBDescription(); 3261 MakePlanBDescription();
3144 3262
3145 JsepSessionDescription deserialized_description(kDummyString); 3263 JsepSessionDescription deserialized_description(kDummyString);
3146 EXPECT_TRUE(SdpDeserialize(kPlanBSdpFullString, &deserialized_description)); 3264 EXPECT_TRUE(SdpDeserialize(kPlanBSdpFullString, &deserialized_description));
3147 3265
3148 EXPECT_TRUE(CompareSessionDescription(jdesc_, deserialized_description)); 3266 EXPECT_TRUE(CompareSessionDescription(jdesc_, deserialized_description));
3149 } 3267 }
3150 3268
3151 TEST_F(WebRtcSdpTest, SerializePlanBSessionDescription) { 3269 TEST_F(WebRtcSdpTest, SerializePlanBSessionDescription) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
3194 "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n" 3312 "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
3195 "s=-\r\n" 3313 "s=-\r\n"
3196 "t=0 0\r\n" 3314 "t=0 0\r\n"
3197 "m=video 9 UDP/DTLS/SCTP 120\r\n" 3315 "m=video 9 UDP/DTLS/SCTP 120\r\n"
3198 "a=sctp-port 5000\r\n" 3316 "a=sctp-port 5000\r\n"
3199 "a=fmtp:108 foo=10\r\n"; 3317 "a=fmtp:108 foo=10\r\n";
3200 3318
3201 ExpectParseFailure(std::string(kSdpWithSctpPortInVideoDescription), 3319 ExpectParseFailure(std::string(kSdpWithSctpPortInVideoDescription),
3202 "sctp-port"); 3320 "sctp-port");
3203 } 3321 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698