Index: webrtc/pc/peerconnection_unittest.cc |
diff --git a/webrtc/pc/peerconnection_unittest.cc b/webrtc/pc/peerconnection_unittest.cc |
index df871356db9e2a021146ed16a77874d84547c26f..f62d30baf4044efdb7bbebd768fe9387dbb49b15 100644 |
--- a/webrtc/pc/peerconnection_unittest.cc |
+++ b/webrtc/pc/peerconnection_unittest.cc |
@@ -517,6 +517,10 @@ class PeerConnectionTestClient : public webrtc::PeerConnectionObserver, |
void RemoveCvoFromReceivedSdp(bool remove) { remove_cvo_ = remove; } |
+ void MakeSpecCompliantMaxBundleOfferFromReceivedSdp(bool real) { |
+ make_spec_compliant_max_bundle_offer_ = real; |
+ } |
+ |
bool can_receive_audio() { |
bool value; |
if (prefer_constraint_apis_) { |
@@ -1049,6 +1053,33 @@ class PeerConnectionTestClient : public webrtc::PeerConnectionObserver, |
} |
std::unique_ptr<SessionDescriptionInterface> desc( |
webrtc::CreateSessionDescription("offer", msg, nullptr)); |
+ |
+ // Do the equivalent of setting the port to 0, adding a=bundle-only, and |
+ // removing a=ice-ufrag, a=ice-pwd, a=fingerprint and a=setup from all but |
+ // the first m= section. |
+ if (make_spec_compliant_max_bundle_offer_) { |
+ bool first = true; |
+ for (cricket::ContentInfo& content : desc->description()->contents()) { |
+ if (first) { |
+ first = false; |
+ continue; |
+ } |
+ content.bundle_only = true; |
+ } |
+ first = true; |
+ for (cricket::TransportInfo& transport : |
+ desc->description()->transport_infos()) { |
+ if (first) { |
+ first = false; |
+ continue; |
+ } |
+ transport.description.ice_ufrag.clear(); |
+ transport.description.ice_pwd.clear(); |
+ transport.description.connection_role = cricket::CONNECTIONROLE_NONE; |
+ transport.description.identity_fingerprint.reset(nullptr); |
+ } |
+ } |
+ |
EXPECT_TRUE(DoSetRemoteDescription(desc.release())); |
// Set the RtpReceiverObserver after receivers are created. |
SetRtpReceiverObservers(); |
@@ -1209,6 +1240,8 @@ class PeerConnectionTestClient : public webrtc::PeerConnectionObserver, |
// |remove_cvo_| is true if extension urn:3gpp:video-orientation should be |
// removed in the received SDP. |
bool remove_cvo_ = false; |
+ // See LocalP2PTestWithSpecCompliantMaxBundleOffer. |
+ bool make_spec_compliant_max_bundle_offer_ = false; |
rtc::scoped_refptr<DataChannelInterface> data_channel_; |
std::unique_ptr<MockDataChannelObserver> data_observer_; |
@@ -1849,6 +1882,19 @@ TEST_F(P2PTestConductor, LocalP2PTestTwoStreams) { |
EXPECT_EQ(2u, receiving_client()->number_of_remote_streams()); |
} |
+// Test that if applying a true "max bundle" offer, which uses ports of 0, |
+// "a=bundle-only", omitting "a=fingerprint", "a=setup", "a=ice-ufrag" and |
+// "a=ice-pwd" for all but the audio "m=" section, negotiation still completes |
+// successfully and media flows. |
+// TODO(deadbeef): Update this test to also omit "a=rtcp-mux", once that works. |
+// TODO(deadbeef): Won't need this test once we start generating actual |
+// standards-compliant SDP. |
+TEST_F(P2PTestConductor, LocalP2PTestWithSpecCompliantMaxBundleOffer) { |
+ ASSERT_TRUE(CreateTestClients()); |
+ receiving_client()->MakeSpecCompliantMaxBundleOfferFromReceivedSdp(true); |
+ LocalP2PTest(); |
+} |
+ |
// Test that we can receive the audio output level from a remote audio track. |
TEST_F(P2PTestConductor, GetAudioOutputLevelStats) { |
ASSERT_TRUE(CreateTestClients()); |