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

Side by Side Diff: talk/app/webrtc/webrtcsession_unittest.cc

Issue 1453813005: Fixing some issues with ICE restart signaling. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fixing typo. Created 5 years, 1 month 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
« no previous file with comments | « talk/app/webrtc/webrtcsession.cc ('k') | talk/app/webrtc/webrtcsessiondescriptionfactory.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * libjingle 2 * libjingle
3 * Copyright 2012 Google Inc. 3 * Copyright 2012 Google Inc.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met: 6 * modification, are permitted provided that the following conditions are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright notice, 8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer. 9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice, 10 * 2. Redistributions in binary form must reproduce the above copyright notice,
(...skipping 803 matching lines...) Expand 10 before | Expand all | Expand 10 after
814 } 814 }
815 if (transport_desc1->ice_pwd != transport_desc2->ice_pwd || 815 if (transport_desc1->ice_pwd != transport_desc2->ice_pwd ||
816 transport_desc1->ice_ufrag != transport_desc2->ice_ufrag) { 816 transport_desc1->ice_ufrag != transport_desc2->ice_ufrag) {
817 EXPECT_FALSE(expect_equal); 817 EXPECT_FALSE(expect_equal);
818 return; 818 return;
819 } 819 }
820 } 820 }
821 EXPECT_TRUE(expect_equal); 821 EXPECT_TRUE(expect_equal);
822 } 822 }
823 823
824 // Compares ufrag/password only for specified media type.
825 void CompareIceUfragAndPassword(const cricket::SessionDescription* desc1,
826 const cricket::SessionDescription* desc2,
827 cricket::MediaType media_type,
828 bool expect_equal) {
829 if (desc1->contents().size() != desc2->contents().size()) {
830 EXPECT_FALSE(expect_equal);
831 return;
832 }
833
834 const cricket::ContentInfo* cinfo =
835 cricket::GetFirstMediaContent(desc1->contents(), media_type);
836 const cricket::TransportDescription* transport_desc1 =
837 desc1->GetTransportDescriptionByName(cinfo->name);
838 const cricket::TransportDescription* transport_desc2 =
839 desc2->GetTransportDescriptionByName(cinfo->name);
840 if (!transport_desc1 || !transport_desc2) {
841 EXPECT_FALSE(expect_equal);
842 return;
843 }
844 if (transport_desc1->ice_pwd != transport_desc2->ice_pwd ||
845 transport_desc1->ice_ufrag != transport_desc2->ice_ufrag) {
846 EXPECT_FALSE(expect_equal);
847 return;
848 }
849 EXPECT_TRUE(expect_equal);
850 }
851
824 void RemoveIceUfragPwdLines(const SessionDescriptionInterface* current_desc, 852 void RemoveIceUfragPwdLines(const SessionDescriptionInterface* current_desc,
825 std::string *sdp) { 853 std::string *sdp) {
826 const cricket::SessionDescription* desc = current_desc->description(); 854 const cricket::SessionDescription* desc = current_desc->description();
827 EXPECT_TRUE(current_desc->ToString(sdp)); 855 EXPECT_TRUE(current_desc->ToString(sdp));
828 856
829 const cricket::ContentInfos& contents = desc->contents(); 857 const cricket::ContentInfos& contents = desc->contents();
830 cricket::ContentInfos::const_iterator it = contents.begin(); 858 cricket::ContentInfos::const_iterator it = contents.begin();
831 // Replace ufrag and pwd lines with empty strings. 859 // Replace ufrag and pwd lines with empty strings.
832 for (; it != contents.end(); ++it) { 860 for (; it != contents.end(); ++it) {
833 const cricket::TransportDescription* transport_desc = 861 const cricket::TransportDescription* transport_desc =
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 std::string mod_pwd = "a=ice-pwd:" + modified_ice_pwd + "\r\n"; 895 std::string mod_pwd = "a=ice-pwd:" + modified_ice_pwd + "\r\n";
868 rtc::replace_substrs(ufrag_line.c_str(), ufrag_line.length(), 896 rtc::replace_substrs(ufrag_line.c_str(), ufrag_line.length(),
869 mod_ufrag.c_str(), mod_ufrag.length(), 897 mod_ufrag.c_str(), mod_ufrag.length(),
870 sdp); 898 sdp);
871 rtc::replace_substrs(pwd_line.c_str(), pwd_line.length(), 899 rtc::replace_substrs(pwd_line.c_str(), pwd_line.length(),
872 mod_pwd.c_str(), mod_pwd.length(), 900 mod_pwd.c_str(), mod_pwd.length(),
873 sdp); 901 sdp);
874 } 902 }
875 } 903 }
876 904
905 // Modifies ufrag/pwd for specified |media_type|, by directly modifying the
906 // description.
907 void ModifyIceUfragPwd(SessionDescriptionInterface* current_desc,
908 cricket::MediaType media_type,
909 const std::string& modified_ice_ufrag,
910 const std::string& modified_ice_pwd) {
911 cricket::SessionDescription* desc = current_desc->description();
912 const cricket::ContentInfo* cinfo =
913 cricket::GetFirstMediaContent(desc->contents(), media_type);
914 // Replace ufrag and pwd with |modified_ice_ufrag| and
915 // |modified_ice_pwd| strings.
916 TransportInfo* transport_info = desc->GetTransportInfoByName(cinfo->name);
917 cricket::TransportDescription* transport_desc =
918 &transport_info->description;
919 transport_desc->ice_ufrag = modified_ice_ufrag;
920 transport_desc->ice_pwd = modified_ice_pwd;
921 }
922
877 // Creates a remote offer and and applies it as a remote description, 923 // Creates a remote offer and and applies it as a remote description,
878 // creates a local answer and applies is as a local description. 924 // creates a local answer and applies is as a local description.
879 // Call SendAudioVideoStreamX() before this function 925 // Call SendAudioVideoStreamX() before this function
880 // to decide which local and remote streams to create. 926 // to decide which local and remote streams to create.
881 void CreateAndSetRemoteOfferAndLocalAnswer() { 927 void CreateAndSetRemoteOfferAndLocalAnswer() {
882 SessionDescriptionInterface* offer = CreateRemoteOffer(); 928 SessionDescriptionInterface* offer = CreateRemoteOffer();
883 SetRemoteDescriptionWithoutError(offer); 929 SetRemoteDescriptionWithoutError(offer);
884 SessionDescriptionInterface* answer = CreateAnswer(NULL); 930 SessionDescriptionInterface* answer = CreateAnswer(NULL);
885 SetLocalDescriptionWithoutError(answer); 931 SetLocalDescriptionWithoutError(answer);
886 } 932 }
(...skipping 2681 matching lines...) Expand 10 before | Expand all | Expand 10 after
3568 // with new ufrag and password is received. 3614 // with new ufrag and password is received.
3569 TEST_F(WebRtcSessionTest, TestCreateAnswerWithNewUfragAndPassword) { 3615 TEST_F(WebRtcSessionTest, TestCreateAnswerWithNewUfragAndPassword) {
3570 Init(); 3616 Init();
3571 cricket::MediaSessionOptions options; 3617 cricket::MediaSessionOptions options;
3572 options.recv_video = true; 3618 options.recv_video = true;
3573 rtc::scoped_ptr<JsepSessionDescription> offer( 3619 rtc::scoped_ptr<JsepSessionDescription> offer(
3574 CreateRemoteOffer(options)); 3620 CreateRemoteOffer(options));
3575 SetRemoteDescriptionWithoutError(offer.release()); 3621 SetRemoteDescriptionWithoutError(offer.release());
3576 3622
3577 SendAudioVideoStream1(); 3623 SendAudioVideoStream1();
3578 rtc::scoped_ptr<SessionDescriptionInterface> answer( 3624 rtc::scoped_ptr<SessionDescriptionInterface> answer(CreateAnswer(nullptr));
3579 CreateAnswer(NULL));
3580 SetLocalDescriptionWithoutError(answer.release()); 3625 SetLocalDescriptionWithoutError(answer.release());
3581 3626
3582 // Receive an offer with new ufrag and password. 3627 // Receive an offer with new ufrag and password.
3583 options.transport_options.ice_restart = true; 3628 options.audio_ice_restart = true;
3629 options.video_ice_restart = true;
3630 options.data_ice_restart = true;
3584 rtc::scoped_ptr<JsepSessionDescription> updated_offer1( 3631 rtc::scoped_ptr<JsepSessionDescription> updated_offer1(
3585 CreateRemoteOffer(options, session_->remote_description())); 3632 CreateRemoteOffer(options, session_->remote_description()));
3586 SetRemoteDescriptionWithoutError(updated_offer1.release()); 3633 SetRemoteDescriptionWithoutError(updated_offer1.release());
3587 3634
3588 rtc::scoped_ptr<SessionDescriptionInterface> updated_answer1( 3635 rtc::scoped_ptr<SessionDescriptionInterface> updated_answer1(
3589 CreateAnswer(NULL)); 3636 CreateAnswer(nullptr));
3590 3637
3591 CompareIceUfragAndPassword(updated_answer1->description(), 3638 CompareIceUfragAndPassword(updated_answer1->description(),
3592 session_->local_description()->description(), 3639 session_->local_description()->description(),
3593 false); 3640 false);
3594 3641
3595 SetLocalDescriptionWithoutError(updated_answer1.release()); 3642 // If we create another answer, it should still have a different
3643 // ufrag/password than the current local description.
3644 rtc::scoped_ptr<SessionDescriptionInterface> updated_answer2(
3645 CreateAnswer(nullptr));
3646
3647 CompareIceUfragAndPassword(updated_answer2->description(),
3648 session_->local_description()->description(),
3649 false);
3650
3651 SetLocalDescriptionWithoutError(updated_answer2.release());
3596 } 3652 }
3597 3653
3598 // This test verifies that an answer contains old ufrag and password if an offer 3654 // This test verifies that an answer contains old ufrag and password if an offer
3599 // with old ufrag and password is received. 3655 // with old ufrag and password is received.
3600 TEST_F(WebRtcSessionTest, TestCreateAnswerWithOldUfragAndPassword) { 3656 TEST_F(WebRtcSessionTest, TestCreateAnswerWithOldUfragAndPassword) {
3601 Init(); 3657 Init();
3602 cricket::MediaSessionOptions options; 3658 cricket::MediaSessionOptions options;
3603 options.recv_video = true; 3659 options.recv_video = true;
3604 rtc::scoped_ptr<JsepSessionDescription> offer( 3660 rtc::scoped_ptr<JsepSessionDescription> offer(
3605 CreateRemoteOffer(options)); 3661 CreateRemoteOffer(options));
3606 SetRemoteDescriptionWithoutError(offer.release()); 3662 SetRemoteDescriptionWithoutError(offer.release());
3607 3663
3608 SendAudioVideoStream1(); 3664 SendAudioVideoStream1();
3609 rtc::scoped_ptr<SessionDescriptionInterface> answer( 3665 rtc::scoped_ptr<SessionDescriptionInterface> answer(
3610 CreateAnswer(NULL)); 3666 CreateAnswer(NULL));
3611 SetLocalDescriptionWithoutError(answer.release()); 3667 SetLocalDescriptionWithoutError(answer.release());
3612 3668
3613 // Receive an offer without changed ufrag or password. 3669 // Receive an offer without changed ufrag or password.
3614 options.transport_options.ice_restart = false;
3615 rtc::scoped_ptr<JsepSessionDescription> updated_offer2( 3670 rtc::scoped_ptr<JsepSessionDescription> updated_offer2(
3616 CreateRemoteOffer(options, session_->remote_description())); 3671 CreateRemoteOffer(options, session_->remote_description()));
3617 SetRemoteDescriptionWithoutError(updated_offer2.release()); 3672 SetRemoteDescriptionWithoutError(updated_offer2.release());
3618 3673
3619 rtc::scoped_ptr<SessionDescriptionInterface> updated_answer2( 3674 rtc::scoped_ptr<SessionDescriptionInterface> updated_answer2(
3620 CreateAnswer(NULL)); 3675 CreateAnswer(NULL));
3621 3676
3622 CompareIceUfragAndPassword(updated_answer2->description(), 3677 CompareIceUfragAndPassword(updated_answer2->description(),
3623 session_->local_description()->description(), 3678 session_->local_description()->description(),
3624 true); 3679 true);
3625 3680
3626 SetLocalDescriptionWithoutError(updated_answer2.release()); 3681 SetLocalDescriptionWithoutError(updated_answer2.release());
3627 } 3682 }
3628 3683
3684 // This test verifies that if an offer does an ICE restart on some, but not all
3685 // m-lines, the answer will change the ufrag/password on the correct m-lines.
3686 TEST_F(WebRtcSessionTest, TestCreateAnswerWithNewAndOldUfragAndPassword) {
3687 Init();
3688 cricket::MediaSessionOptions options;
3689 options.recv_video = true;
3690 options.recv_audio = true;
3691 options.bundle_enabled = false;
3692 rtc::scoped_ptr<JsepSessionDescription> offer(CreateRemoteOffer(options));
3693
3694 ModifyIceUfragPwd(offer.get(), cricket::MEDIA_TYPE_AUDIO, "aaaa",
3695 "aaaaaaaaaaaaaaaaaaaaaa");
3696 ModifyIceUfragPwd(offer.get(), cricket::MEDIA_TYPE_VIDEO, "bbbb",
3697 "bbbbbbbbbbbbbbbbbbbbbb");
3698 SetRemoteDescriptionWithoutError(offer.release());
3699
3700 SendAudioVideoStream1();
3701 rtc::scoped_ptr<SessionDescriptionInterface> answer(CreateAnswer(nullptr));
3702 SetLocalDescriptionWithoutError(answer.release());
3703
3704 // Receive an offer with new ufrag and password, but only on the video line.
3705 rtc::scoped_ptr<JsepSessionDescription> updated_offer(
3706 CreateRemoteOffer(options, session_->remote_description()));
3707 ModifyIceUfragPwd(updated_offer.get(), cricket::MEDIA_TYPE_VIDEO, "cccc",
3708 "cccccccccccccccccccccc");
3709 SetRemoteDescriptionWithoutError(updated_offer.release());
3710
3711 rtc::scoped_ptr<SessionDescriptionInterface> updated_answer(
3712 CreateAnswer(nullptr));
3713
3714 CompareIceUfragAndPassword(updated_answer->description(),
3715 session_->local_description()->description(),
3716 cricket::MEDIA_TYPE_AUDIO, true);
3717
3718 CompareIceUfragAndPassword(updated_answer->description(),
3719 session_->local_description()->description(),
3720 cricket::MEDIA_TYPE_VIDEO, false);
3721
3722 SetLocalDescriptionWithoutError(updated_answer.release());
3723 }
3724
3629 TEST_F(WebRtcSessionTest, TestSessionContentError) { 3725 TEST_F(WebRtcSessionTest, TestSessionContentError) {
3630 Init(); 3726 Init();
3631 SendAudioVideoStream1(); 3727 SendAudioVideoStream1();
3632 SessionDescriptionInterface* offer = CreateOffer(); 3728 SessionDescriptionInterface* offer = CreateOffer();
3633 const std::string session_id_orig = offer->session_id(); 3729 const std::string session_id_orig = offer->session_id();
3634 const std::string session_version_orig = offer->session_version(); 3730 const std::string session_version_orig = offer->session_version();
3635 SetLocalDescriptionWithoutError(offer); 3731 SetLocalDescriptionWithoutError(offer);
3636 3732
3637 video_channel_ = media_engine_->GetVideoChannel(0); 3733 video_channel_ = media_engine_->GetVideoChannel(0);
3638 video_channel_->set_fail_set_send_codecs(true); 3734 video_channel_->set_fail_set_send_codecs(true);
(...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after
4204 } 4300 }
4205 4301
4206 // TODO(bemasc): Add a TestIceStatesBundle with BUNDLE enabled. That test 4302 // TODO(bemasc): Add a TestIceStatesBundle with BUNDLE enabled. That test
4207 // currently fails because upon disconnection and reconnection OnIceComplete is 4303 // currently fails because upon disconnection and reconnection OnIceComplete is
4208 // called more than once without returning to IceGatheringGathering. 4304 // called more than once without returning to IceGatheringGathering.
4209 4305
4210 INSTANTIATE_TEST_CASE_P(WebRtcSessionTests, 4306 INSTANTIATE_TEST_CASE_P(WebRtcSessionTests,
4211 WebRtcSessionTest, 4307 WebRtcSessionTest,
4212 testing::Values(ALREADY_GENERATED, 4308 testing::Values(ALREADY_GENERATED,
4213 DTLS_IDENTITY_STORE)); 4309 DTLS_IDENTITY_STORE));
OLDNEW
« no previous file with comments | « talk/app/webrtc/webrtcsession.cc ('k') | talk/app/webrtc/webrtcsessiondescriptionfactory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698