Index: webrtc/p2p/base/transport_unittest.cc |
diff --git a/webrtc/p2p/base/transport_unittest.cc b/webrtc/p2p/base/transport_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d119e833672ae3fed1d6a6957e98951ff2e14fdc |
--- /dev/null |
+++ b/webrtc/p2p/base/transport_unittest.cc |
@@ -0,0 +1,423 @@ |
+/* |
+ * Copyright 2011 The WebRTC Project Authors. All rights reserved. |
+ * |
+ * Use of this source code is governed by a BSD-style license |
+ * that can be found in the LICENSE file in the root of the source |
+ * tree. An additional intellectual property rights grant can be found |
+ * in the file PATENTS. All contributing project authors may |
+ * be found in the AUTHORS file in the root of the source tree. |
+ */ |
+ |
+#include <memory> |
+ |
+#include "webrtc/base/fakesslidentity.h" |
+#include "webrtc/base/gunit.h" |
+#include "webrtc/base/network.h" |
+#include "webrtc/p2p/base/faketransportcontroller.h" |
+#include "webrtc/p2p/base/p2ptransport.h" |
+ |
+using cricket::Transport; |
+using cricket::FakeTransport; |
+using cricket::TransportChannel; |
+using cricket::FakeTransportChannel; |
+using cricket::IceRole; |
+using cricket::TransportDescription; |
+using rtc::SocketAddress; |
+ |
+static const char kIceUfrag1[] = "TESTICEUFRAG0001"; |
+static const char kIcePwd1[] = "TESTICEPWD00000000000001"; |
+ |
+static const char kIceUfrag2[] = "TESTICEUFRAG0002"; |
+static const char kIcePwd2[] = "TESTICEPWD00000000000002"; |
+ |
+class TransportTest : public testing::Test, |
+ public sigslot::has_slots<> { |
+ public: |
+ TransportTest() |
+ : transport_(new FakeTransport("test content name")), channel_(NULL) {} |
+ ~TransportTest() { |
+ transport_->DestroyAllChannels(); |
+ } |
+ bool SetupChannel() { |
+ channel_ = CreateChannel(1); |
+ return (channel_ != NULL); |
+ } |
+ FakeTransportChannel* CreateChannel(int component) { |
+ return static_cast<FakeTransportChannel*>( |
+ transport_->CreateChannel(component)); |
+ } |
+ void DestroyChannel() { |
+ transport_->DestroyChannel(1); |
+ channel_ = NULL; |
+ } |
+ |
+ protected: |
+ std::unique_ptr<FakeTransport> transport_; |
+ FakeTransportChannel* channel_; |
+}; |
+ |
+// This test verifies channels are created with proper ICE |
+// role, tiebreaker and remote ice mode and credentials after offer and |
+// answer negotiations. |
+TEST_F(TransportTest, TestChannelIceParameters) { |
+ transport_->SetIceRole(cricket::ICEROLE_CONTROLLING); |
+ transport_->SetIceTiebreaker(99U); |
+ cricket::TransportDescription local_desc(kIceUfrag1, kIcePwd1); |
+ ASSERT_TRUE(transport_->SetLocalTransportDescription(local_desc, |
+ cricket::CA_OFFER, |
+ NULL)); |
+ EXPECT_EQ(cricket::ICEROLE_CONTROLLING, transport_->ice_role()); |
+ EXPECT_TRUE(SetupChannel()); |
+ EXPECT_EQ(cricket::ICEROLE_CONTROLLING, channel_->GetIceRole()); |
+ EXPECT_EQ(cricket::ICEMODE_FULL, channel_->remote_ice_mode()); |
+ EXPECT_EQ(kIceUfrag1, channel_->ice_ufrag()); |
+ EXPECT_EQ(kIcePwd1, channel_->ice_pwd()); |
+ |
+ cricket::TransportDescription remote_desc(kIceUfrag1, kIcePwd1); |
+ ASSERT_TRUE(transport_->SetRemoteTransportDescription(remote_desc, |
+ cricket::CA_ANSWER, |
+ NULL)); |
+ EXPECT_EQ(cricket::ICEROLE_CONTROLLING, channel_->GetIceRole()); |
+ EXPECT_EQ(99U, channel_->IceTiebreaker()); |
+ EXPECT_EQ(cricket::ICEMODE_FULL, channel_->remote_ice_mode()); |
+ // Changing the transport role from CONTROLLING to CONTROLLED. |
+ transport_->SetIceRole(cricket::ICEROLE_CONTROLLED); |
+ EXPECT_EQ(cricket::ICEROLE_CONTROLLED, channel_->GetIceRole()); |
+ EXPECT_EQ(cricket::ICEMODE_FULL, channel_->remote_ice_mode()); |
+ EXPECT_EQ(kIceUfrag1, channel_->remote_ice_ufrag()); |
+ EXPECT_EQ(kIcePwd1, channel_->remote_ice_pwd()); |
+} |
+ |
+// Verifies that IceCredentialsChanged returns true when either ufrag or pwd |
+// changed, and false in other cases. |
+TEST_F(TransportTest, TestIceCredentialsChanged) { |
+ EXPECT_TRUE(cricket::IceCredentialsChanged("u1", "p1", "u2", "p2")); |
+ EXPECT_TRUE(cricket::IceCredentialsChanged("u1", "p1", "u2", "p1")); |
+ EXPECT_TRUE(cricket::IceCredentialsChanged("u1", "p1", "u1", "p2")); |
+ EXPECT_FALSE(cricket::IceCredentialsChanged("u1", "p1", "u1", "p1")); |
+} |
+ |
+// This test verifies that the callee's ICE role remains the same when the |
+// callee triggers an ICE restart. |
+// |
+// RFC5245 currently says that the role *should* change on an ICE restart, |
+// but this rule was intended for an ICE restart that occurs when an endpoint |
+// is changing to ICE lite (which we already handle). See discussion here: |
+// https://mailarchive.ietf.org/arch/msg/ice/C0_QRCTNcwtvUF12y28jQicPR10 |
+TEST_F(TransportTest, TestIceControlledToControllingOnIceRestart) { |
+ EXPECT_TRUE(SetupChannel()); |
+ transport_->SetIceRole(cricket::ICEROLE_CONTROLLED); |
+ |
+ cricket::TransportDescription desc(kIceUfrag1, kIcePwd1); |
+ ASSERT_TRUE(transport_->SetRemoteTransportDescription(desc, |
+ cricket::CA_OFFER, |
+ NULL)); |
+ ASSERT_TRUE(transport_->SetLocalTransportDescription(desc, |
+ cricket::CA_ANSWER, |
+ NULL)); |
+ EXPECT_EQ(cricket::ICEROLE_CONTROLLED, transport_->ice_role()); |
+ |
+ cricket::TransportDescription new_local_desc(kIceUfrag2, kIcePwd2); |
+ ASSERT_TRUE(transport_->SetLocalTransportDescription(new_local_desc, |
+ cricket::CA_OFFER, |
+ NULL)); |
+ EXPECT_EQ(cricket::ICEROLE_CONTROLLED, transport_->ice_role()); |
+ EXPECT_EQ(cricket::ICEROLE_CONTROLLED, channel_->GetIceRole()); |
+} |
+ |
+// This test verifies that the caller's ICE role remains the same when the |
+// callee triggers an ICE restart. |
+// |
+// RFC5245 currently says that the role *should* change on an ICE restart, |
+// but this rule was intended for an ICE restart that occurs when an endpoint |
+// is changing to ICE lite (which we already handle). See discussion here: |
+// https://mailarchive.ietf.org/arch/msg/ice/C0_QRCTNcwtvUF12y28jQicPR10 |
+TEST_F(TransportTest, TestIceControllingToControlledOnIceRestart) { |
+ EXPECT_TRUE(SetupChannel()); |
+ transport_->SetIceRole(cricket::ICEROLE_CONTROLLING); |
+ |
+ cricket::TransportDescription desc(kIceUfrag1, kIcePwd1); |
+ ASSERT_TRUE(transport_->SetLocalTransportDescription(desc, |
+ cricket::CA_OFFER, |
+ NULL)); |
+ ASSERT_TRUE(transport_->SetRemoteTransportDescription(desc, |
+ cricket::CA_ANSWER, |
+ NULL)); |
+ EXPECT_EQ(cricket::ICEROLE_CONTROLLING, transport_->ice_role()); |
+ |
+ cricket::TransportDescription new_local_desc(kIceUfrag2, kIcePwd2); |
+ ASSERT_TRUE(transport_->SetLocalTransportDescription(new_local_desc, |
+ cricket::CA_ANSWER, |
+ NULL)); |
+ EXPECT_EQ(cricket::ICEROLE_CONTROLLING, transport_->ice_role()); |
+ EXPECT_EQ(cricket::ICEROLE_CONTROLLING, channel_->GetIceRole()); |
+} |
+ |
+// This test verifies that the caller's ICE role is still controlling after the |
+// callee triggers ICE restart if the callee's ICE mode is LITE. |
+TEST_F(TransportTest, TestIceControllingOnIceRestartIfRemoteIsIceLite) { |
+ EXPECT_TRUE(SetupChannel()); |
+ transport_->SetIceRole(cricket::ICEROLE_CONTROLLING); |
+ |
+ cricket::TransportDescription desc(kIceUfrag1, kIcePwd1); |
+ ASSERT_TRUE(transport_->SetLocalTransportDescription(desc, |
+ cricket::CA_OFFER, |
+ NULL)); |
+ |
+ cricket::TransportDescription remote_desc( |
+ std::vector<std::string>(), kIceUfrag1, kIcePwd1, cricket::ICEMODE_LITE, |
+ cricket::CONNECTIONROLE_NONE, NULL); |
+ ASSERT_TRUE(transport_->SetRemoteTransportDescription(remote_desc, |
+ cricket::CA_ANSWER, |
+ NULL)); |
+ |
+ EXPECT_EQ(cricket::ICEROLE_CONTROLLING, transport_->ice_role()); |
+ |
+ cricket::TransportDescription new_local_desc(kIceUfrag2, kIcePwd2); |
+ ASSERT_TRUE(transport_->SetLocalTransportDescription(new_local_desc, |
+ cricket::CA_ANSWER, |
+ NULL)); |
+ EXPECT_EQ(cricket::ICEROLE_CONTROLLING, transport_->ice_role()); |
+ EXPECT_EQ(cricket::ICEROLE_CONTROLLING, channel_->GetIceRole()); |
+} |
+ |
+// Tests channel role is reversed after receiving ice-lite from remote. |
+TEST_F(TransportTest, TestSetRemoteIceLiteInOffer) { |
+ transport_->SetIceRole(cricket::ICEROLE_CONTROLLED); |
+ cricket::TransportDescription remote_desc( |
+ std::vector<std::string>(), kIceUfrag1, kIcePwd1, cricket::ICEMODE_LITE, |
+ cricket::CONNECTIONROLE_ACTPASS, NULL); |
+ ASSERT_TRUE(transport_->SetRemoteTransportDescription(remote_desc, |
+ cricket::CA_OFFER, |
+ NULL)); |
+ cricket::TransportDescription local_desc(kIceUfrag1, kIcePwd1); |
+ ASSERT_TRUE(transport_->SetLocalTransportDescription(local_desc, |
+ cricket::CA_ANSWER, |
+ NULL)); |
+ EXPECT_EQ(cricket::ICEROLE_CONTROLLING, transport_->ice_role()); |
+ EXPECT_TRUE(SetupChannel()); |
+ EXPECT_EQ(cricket::ICEROLE_CONTROLLING, channel_->GetIceRole()); |
+ EXPECT_EQ(cricket::ICEMODE_LITE, channel_->remote_ice_mode()); |
+} |
+ |
+// Tests ice-lite in remote answer. |
+TEST_F(TransportTest, TestSetRemoteIceLiteInAnswer) { |
+ transport_->SetIceRole(cricket::ICEROLE_CONTROLLING); |
+ cricket::TransportDescription local_desc(kIceUfrag1, kIcePwd1); |
+ ASSERT_TRUE(transport_->SetLocalTransportDescription(local_desc, |
+ cricket::CA_OFFER, |
+ NULL)); |
+ EXPECT_EQ(cricket::ICEROLE_CONTROLLING, transport_->ice_role()); |
+ EXPECT_TRUE(SetupChannel()); |
+ EXPECT_EQ(cricket::ICEROLE_CONTROLLING, channel_->GetIceRole()); |
+ // Channels will be created in ICEFULL_MODE. |
+ EXPECT_EQ(cricket::ICEMODE_FULL, channel_->remote_ice_mode()); |
+ cricket::TransportDescription remote_desc( |
+ std::vector<std::string>(), kIceUfrag1, kIcePwd1, cricket::ICEMODE_LITE, |
+ cricket::CONNECTIONROLE_NONE, NULL); |
+ ASSERT_TRUE(transport_->SetRemoteTransportDescription(remote_desc, |
+ cricket::CA_ANSWER, |
+ NULL)); |
+ EXPECT_EQ(cricket::ICEROLE_CONTROLLING, channel_->GetIceRole()); |
+ // After receiving remote description with ICEMODE_LITE, channel should |
+ // have mode set to ICEMODE_LITE. |
+ EXPECT_EQ(cricket::ICEMODE_LITE, channel_->remote_ice_mode()); |
+} |
+ |
+TEST_F(TransportTest, TestGetStats) { |
+ EXPECT_TRUE(SetupChannel()); |
+ cricket::TransportStats stats; |
+ EXPECT_TRUE(transport_->GetStats(&stats)); |
+ // Note that this tests the behavior of a FakeTransportChannel. |
+ ASSERT_EQ(1U, stats.channel_stats.size()); |
+ EXPECT_EQ(1, stats.channel_stats[0].component); |
+ // Set local transport description for FakeTransport before connecting. |
+ TransportDescription faketransport_desc( |
+ std::vector<std::string>(), |
+ rtc::CreateRandomString(cricket::ICE_UFRAG_LENGTH), |
+ rtc::CreateRandomString(cricket::ICE_PWD_LENGTH), cricket::ICEMODE_FULL, |
+ cricket::CONNECTIONROLE_NONE, nullptr); |
+ transport_->SetLocalTransportDescription(faketransport_desc, |
+ cricket::CA_OFFER, nullptr); |
+ EXPECT_TRUE(transport_->GetStats(&stats)); |
+ ASSERT_EQ(1U, stats.channel_stats.size()); |
+ EXPECT_EQ(1, stats.channel_stats[0].component); |
+} |
+ |
+// Tests that VerifyCertificateFingerprint only returns true when the |
+// certificate matches the fingerprint. |
+TEST_F(TransportTest, TestVerifyCertificateFingerprint) { |
+ std::string error_desc; |
+ EXPECT_FALSE( |
+ transport_->VerifyCertificateFingerprint(nullptr, nullptr, &error_desc)); |
+ rtc::KeyType key_types[] = {rtc::KT_RSA, rtc::KT_ECDSA}; |
+ |
+ for (auto& key_type : key_types) { |
+ rtc::scoped_refptr<rtc::RTCCertificate> certificate = |
+ rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>( |
+ rtc::SSLIdentity::Generate("testing", key_type))); |
+ ASSERT_NE(nullptr, certificate); |
+ |
+ std::string digest_algorithm; |
+ ASSERT_TRUE(certificate->ssl_certificate().GetSignatureDigestAlgorithm( |
+ &digest_algorithm)); |
+ ASSERT_FALSE(digest_algorithm.empty()); |
+ std::unique_ptr<rtc::SSLFingerprint> good_fingerprint( |
+ rtc::SSLFingerprint::Create(digest_algorithm, certificate->identity())); |
+ ASSERT_NE(nullptr, good_fingerprint); |
+ |
+ EXPECT_TRUE(transport_->VerifyCertificateFingerprint( |
+ certificate.get(), good_fingerprint.get(), &error_desc)); |
+ EXPECT_FALSE(transport_->VerifyCertificateFingerprint( |
+ certificate.get(), nullptr, &error_desc)); |
+ EXPECT_FALSE(transport_->VerifyCertificateFingerprint( |
+ nullptr, good_fingerprint.get(), &error_desc)); |
+ |
+ rtc::SSLFingerprint bad_fingerprint = *good_fingerprint; |
+ bad_fingerprint.digest.AppendData("0", 1); |
+ EXPECT_FALSE(transport_->VerifyCertificateFingerprint( |
+ certificate.get(), &bad_fingerprint, &error_desc)); |
+ } |
+} |
+ |
+// Tests that NegotiateRole sets the SSL role correctly. |
+TEST_F(TransportTest, TestNegotiateRole) { |
+ TransportDescription local_desc(kIceUfrag1, kIcePwd1); |
+ TransportDescription remote_desc(kIceUfrag2, kIcePwd2); |
+ |
+ struct NegotiateRoleParams { |
+ cricket::ConnectionRole local_role; |
+ cricket::ConnectionRole remote_role; |
+ cricket::ContentAction local_action; |
+ cricket::ContentAction remote_action; |
+ }; |
+ |
+ rtc::SSLRole ssl_role; |
+ std::string error_desc; |
+ |
+ // Parameters which set the SSL role to SSL_CLIENT. |
+ NegotiateRoleParams valid_client_params[] = { |
+ {cricket::CONNECTIONROLE_ACTIVE, cricket::CONNECTIONROLE_ACTPASS, |
+ cricket::CA_ANSWER, cricket::CA_OFFER}, |
+ {cricket::CONNECTIONROLE_ACTIVE, cricket::CONNECTIONROLE_ACTPASS, |
+ cricket::CA_PRANSWER, cricket::CA_OFFER}, |
+ {cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_PASSIVE, |
+ cricket::CA_OFFER, cricket::CA_ANSWER}, |
+ {cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_PASSIVE, |
+ cricket::CA_OFFER, cricket::CA_PRANSWER}}; |
+ |
+ for (auto& param : valid_client_params) { |
+ local_desc.connection_role = param.local_role; |
+ remote_desc.connection_role = param.remote_role; |
+ |
+ ASSERT_TRUE(transport_->SetRemoteTransportDescription( |
+ remote_desc, param.remote_action, nullptr)); |
+ ASSERT_TRUE(transport_->SetLocalTransportDescription( |
+ local_desc, param.local_action, nullptr)); |
+ EXPECT_TRUE( |
+ transport_->NegotiateRole(param.local_action, &ssl_role, &error_desc)); |
+ EXPECT_EQ(rtc::SSL_CLIENT, ssl_role); |
+ } |
+ |
+ // Parameters which set the SSL role to SSL_SERVER. |
+ NegotiateRoleParams valid_server_params[] = { |
+ {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_ACTPASS, |
+ cricket::CA_ANSWER, cricket::CA_OFFER}, |
+ {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_ACTPASS, |
+ cricket::CA_PRANSWER, cricket::CA_OFFER}, |
+ {cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_ACTIVE, |
+ cricket::CA_OFFER, cricket::CA_ANSWER}, |
+ {cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_ACTIVE, |
+ cricket::CA_OFFER, cricket::CA_PRANSWER}}; |
+ |
+ for (auto& param : valid_server_params) { |
+ local_desc.connection_role = param.local_role; |
+ remote_desc.connection_role = param.remote_role; |
+ |
+ ASSERT_TRUE(transport_->SetRemoteTransportDescription( |
+ remote_desc, param.remote_action, nullptr)); |
+ ASSERT_TRUE(transport_->SetLocalTransportDescription( |
+ local_desc, param.local_action, nullptr)); |
+ EXPECT_TRUE( |
+ transport_->NegotiateRole(param.local_action, &ssl_role, &error_desc)); |
+ EXPECT_EQ(rtc::SSL_SERVER, ssl_role); |
+ } |
+ |
+ // Invalid parameters due to both peers having a duplicate role. |
+ NegotiateRoleParams duplicate_params[] = { |
+ {cricket::CONNECTIONROLE_ACTIVE, cricket::CONNECTIONROLE_ACTIVE, |
+ cricket::CA_ANSWER, cricket::CA_OFFER}, |
+ {cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_ACTPASS, |
+ cricket::CA_ANSWER, cricket::CA_OFFER}, |
+ {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_PASSIVE, |
+ cricket::CA_ANSWER, cricket::CA_OFFER}, |
+ {cricket::CONNECTIONROLE_ACTIVE, cricket::CONNECTIONROLE_ACTIVE, |
+ cricket::CA_PRANSWER, cricket::CA_OFFER}, |
+ {cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_ACTPASS, |
+ cricket::CA_PRANSWER, cricket::CA_OFFER}, |
+ {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_PASSIVE, |
+ cricket::CA_PRANSWER, cricket::CA_OFFER}, |
+ {cricket::CONNECTIONROLE_ACTIVE, cricket::CONNECTIONROLE_ACTIVE, |
+ cricket::CA_OFFER, cricket::CA_ANSWER}, |
+ {cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_ACTPASS, |
+ cricket::CA_OFFER, cricket::CA_ANSWER}, |
+ {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_PASSIVE, |
+ cricket::CA_OFFER, cricket::CA_ANSWER}, |
+ {cricket::CONNECTIONROLE_ACTIVE, cricket::CONNECTIONROLE_ACTIVE, |
+ cricket::CA_OFFER, cricket::CA_PRANSWER}, |
+ {cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_ACTPASS, |
+ cricket::CA_OFFER, cricket::CA_PRANSWER}, |
+ {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_PASSIVE, |
+ cricket::CA_OFFER, cricket::CA_PRANSWER}}; |
+ |
+ for (auto& param : duplicate_params) { |
+ local_desc.connection_role = param.local_role; |
+ remote_desc.connection_role = param.remote_role; |
+ |
+ ASSERT_TRUE(transport_->SetRemoteTransportDescription( |
+ remote_desc, param.remote_action, nullptr)); |
+ ASSERT_TRUE(transport_->SetLocalTransportDescription( |
+ local_desc, param.local_action, nullptr)); |
+ EXPECT_FALSE( |
+ transport_->NegotiateRole(param.local_action, &ssl_role, &error_desc)); |
+ } |
+ |
+ // Invalid parameters due to the offerer not using ACTPASS. |
+ NegotiateRoleParams offerer_without_actpass_params[] = { |
+ {cricket::CONNECTIONROLE_ACTIVE, cricket::CONNECTIONROLE_PASSIVE, |
+ cricket::CA_ANSWER, cricket::CA_OFFER}, |
+ {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_ACTIVE, |
+ cricket::CA_ANSWER, cricket::CA_OFFER}, |
+ {cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_PASSIVE, |
+ cricket::CA_ANSWER, cricket::CA_OFFER}, |
+ {cricket::CONNECTIONROLE_ACTIVE, cricket::CONNECTIONROLE_PASSIVE, |
+ cricket::CA_PRANSWER, cricket::CA_OFFER}, |
+ {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_ACTIVE, |
+ cricket::CA_PRANSWER, cricket::CA_OFFER}, |
+ {cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_PASSIVE, |
+ cricket::CA_PRANSWER, cricket::CA_OFFER}, |
+ {cricket::CONNECTIONROLE_ACTIVE, cricket::CONNECTIONROLE_PASSIVE, |
+ cricket::CA_OFFER, cricket::CA_ANSWER}, |
+ {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_ACTIVE, |
+ cricket::CA_OFFER, cricket::CA_ANSWER}, |
+ {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_ACTPASS, |
+ cricket::CA_OFFER, cricket::CA_ANSWER}, |
+ {cricket::CONNECTIONROLE_ACTIVE, cricket::CONNECTIONROLE_PASSIVE, |
+ cricket::CA_OFFER, cricket::CA_PRANSWER}, |
+ {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_ACTIVE, |
+ cricket::CA_OFFER, cricket::CA_PRANSWER}, |
+ {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_ACTPASS, |
+ cricket::CA_OFFER, cricket::CA_PRANSWER}}; |
+ |
+ for (auto& param : offerer_without_actpass_params) { |
+ local_desc.connection_role = param.local_role; |
+ remote_desc.connection_role = param.remote_role; |
+ |
+ ASSERT_TRUE(transport_->SetRemoteTransportDescription( |
+ remote_desc, param.remote_action, nullptr)); |
+ ASSERT_TRUE(transport_->SetLocalTransportDescription( |
+ local_desc, param.local_action, nullptr)); |
+ EXPECT_FALSE( |
+ transport_->NegotiateRole(param.local_action, &ssl_role, &error_desc)); |
+ } |
+} |