2014-10-28 22:20:11 +00:00
|
|
|
/*
|
|
|
|
|
* 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.
|
|
|
|
|
*/
|
|
|
|
|
|
2016-04-27 07:22:53 -07:00
|
|
|
#include <memory>
|
|
|
|
|
|
2014-10-28 22:20:11 +00:00
|
|
|
#include "webrtc/base/fakesslidentity.h"
|
|
|
|
|
#include "webrtc/base/gunit.h"
|
2014-12-16 23:01:31 +00:00
|
|
|
#include "webrtc/base/network.h"
|
2015-09-23 11:50:27 -07:00
|
|
|
#include "webrtc/p2p/base/faketransportcontroller.h"
|
2014-10-28 22:20:11 +00:00
|
|
|
|
2016-12-06 16:22:06 -08:00
|
|
|
using cricket::JsepTransport;
|
2014-10-28 22:20:11 +00:00
|
|
|
using cricket::TransportChannel;
|
2017-01-19 04:49:47 -08:00
|
|
|
using cricket::FakeTransportChannel;
|
2014-10-28 22:20:11 +00:00
|
|
|
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";
|
|
|
|
|
|
2016-12-06 16:22:06 -08:00
|
|
|
class JsepTransportTest : public testing::Test, public sigslot::has_slots<> {
|
2014-10-28 22:20:11 +00:00
|
|
|
public:
|
2016-12-06 16:22:06 -08:00
|
|
|
JsepTransportTest()
|
|
|
|
|
: transport_(new JsepTransport("test content name", nullptr)) {}
|
2014-10-28 22:20:11 +00:00
|
|
|
bool SetupChannel() {
|
2017-01-19 04:49:47 -08:00
|
|
|
fake_ice_channel_.reset(new FakeTransportChannel(transport_->mid(), 1));
|
|
|
|
|
fake_dtls_channel_.reset(new FakeTransportChannel(transport_->mid(), 1));
|
|
|
|
|
return transport_->AddChannel(fake_dtls_channel_.get(), 1);
|
2014-10-28 22:20:11 +00:00
|
|
|
}
|
2016-12-06 16:22:06 -08:00
|
|
|
void DestroyChannel() { transport_->RemoveChannel(1); }
|
2014-10-28 22:20:11 +00:00
|
|
|
|
|
|
|
|
protected:
|
2017-01-19 04:49:47 -08:00
|
|
|
std::unique_ptr<FakeTransportChannel> fake_dtls_channel_;
|
|
|
|
|
std::unique_ptr<FakeTransportChannel> fake_ice_channel_;
|
2016-12-06 16:22:06 -08:00
|
|
|
std::unique_ptr<JsepTransport> transport_;
|
2014-10-28 22:20:11 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// This test verifies channels are created with proper ICE
|
2016-12-06 16:22:06 -08:00
|
|
|
// ufrag/password after a transport description is applied.
|
|
|
|
|
TEST_F(JsepTransportTest, TestChannelIceParameters) {
|
2015-09-17 18:54:52 -07:00
|
|
|
cricket::TransportDescription local_desc(kIceUfrag1, kIcePwd1);
|
2016-12-06 16:22:06 -08:00
|
|
|
ASSERT_TRUE(transport_->SetLocalTransportDescription(
|
|
|
|
|
local_desc, cricket::CA_OFFER, NULL));
|
2014-10-28 22:20:11 +00:00
|
|
|
EXPECT_TRUE(SetupChannel());
|
2017-01-19 04:49:47 -08:00
|
|
|
EXPECT_EQ(cricket::ICEMODE_FULL, fake_dtls_channel_->remote_ice_mode());
|
|
|
|
|
EXPECT_EQ(kIceUfrag1, fake_dtls_channel_->ice_ufrag());
|
|
|
|
|
EXPECT_EQ(kIcePwd1, fake_dtls_channel_->ice_pwd());
|
2014-10-28 22:20:11 +00:00
|
|
|
|
2015-09-17 18:54:52 -07:00
|
|
|
cricket::TransportDescription remote_desc(kIceUfrag1, kIcePwd1);
|
2016-12-06 16:22:06 -08:00
|
|
|
ASSERT_TRUE(transport_->SetRemoteTransportDescription(
|
|
|
|
|
remote_desc, cricket::CA_ANSWER, NULL));
|
2017-01-19 04:49:47 -08:00
|
|
|
EXPECT_EQ(cricket::ICEMODE_FULL, fake_dtls_channel_->remote_ice_mode());
|
|
|
|
|
EXPECT_EQ(kIceUfrag1, fake_dtls_channel_->remote_ice_ufrag());
|
|
|
|
|
EXPECT_EQ(kIcePwd1, fake_dtls_channel_->remote_ice_pwd());
|
2014-10-28 22:20:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Verifies that IceCredentialsChanged returns true when either ufrag or pwd
|
|
|
|
|
// changed, and false in other cases.
|
2016-12-06 16:22:06 -08:00
|
|
|
TEST_F(JsepTransportTest, TestIceCredentialsChanged) {
|
2014-10-28 22:20:11 +00:00
|
|
|
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"));
|
|
|
|
|
}
|
|
|
|
|
|
2016-12-10 13:15:33 -08:00
|
|
|
// Tests SetNeedsIceRestartFlag and NeedsIceRestart, ensuring NeedsIceRestart
|
|
|
|
|
// only starts returning "false" once an ICE restart has been initiated.
|
|
|
|
|
TEST_F(JsepTransportTest, NeedsIceRestart) {
|
|
|
|
|
// Do initial offer/answer so there's something to restart.
|
|
|
|
|
cricket::TransportDescription local_desc(kIceUfrag1, kIcePwd1);
|
|
|
|
|
cricket::TransportDescription remote_desc(kIceUfrag1, kIcePwd1);
|
|
|
|
|
ASSERT_TRUE(transport_->SetLocalTransportDescription(
|
|
|
|
|
local_desc, cricket::CA_OFFER, nullptr));
|
|
|
|
|
ASSERT_TRUE(transport_->SetRemoteTransportDescription(
|
|
|
|
|
remote_desc, cricket::CA_ANSWER, nullptr));
|
|
|
|
|
|
|
|
|
|
// Flag initially should be false.
|
|
|
|
|
EXPECT_FALSE(transport_->NeedsIceRestart());
|
|
|
|
|
|
|
|
|
|
// After setting flag, it should be true.
|
|
|
|
|
transport_->SetNeedsIceRestartFlag();
|
|
|
|
|
EXPECT_TRUE(transport_->NeedsIceRestart());
|
|
|
|
|
|
|
|
|
|
// Doing an identical offer/answer shouldn't clear the flag.
|
|
|
|
|
ASSERT_TRUE(transport_->SetLocalTransportDescription(
|
|
|
|
|
local_desc, cricket::CA_OFFER, nullptr));
|
|
|
|
|
ASSERT_TRUE(transport_->SetRemoteTransportDescription(
|
|
|
|
|
remote_desc, cricket::CA_ANSWER, nullptr));
|
|
|
|
|
EXPECT_TRUE(transport_->NeedsIceRestart());
|
|
|
|
|
|
|
|
|
|
// Doing an offer/answer that restarts ICE should clear the flag.
|
|
|
|
|
cricket::TransportDescription ice_restart_local_desc(kIceUfrag2, kIcePwd2);
|
|
|
|
|
cricket::TransportDescription ice_restart_remote_desc(kIceUfrag2, kIcePwd2);
|
|
|
|
|
ASSERT_TRUE(transport_->SetLocalTransportDescription(
|
|
|
|
|
ice_restart_local_desc, cricket::CA_OFFER, nullptr));
|
|
|
|
|
ASSERT_TRUE(transport_->SetRemoteTransportDescription(
|
|
|
|
|
ice_restart_remote_desc, cricket::CA_ANSWER, nullptr));
|
|
|
|
|
EXPECT_FALSE(transport_->NeedsIceRestart());
|
|
|
|
|
}
|
|
|
|
|
|
2016-12-06 16:22:06 -08:00
|
|
|
TEST_F(JsepTransportTest, TestGetStats) {
|
2014-10-28 22:20:11 +00:00
|
|
|
EXPECT_TRUE(SetupChannel());
|
|
|
|
|
cricket::TransportStats stats;
|
|
|
|
|
EXPECT_TRUE(transport_->GetStats(&stats));
|
2017-01-19 04:49:47 -08:00
|
|
|
// Note that this tests the behavior of a FakeTransportChannel.
|
2014-10-28 22:20:11 +00:00
|
|
|
ASSERT_EQ(1U, stats.channel_stats.size());
|
|
|
|
|
EXPECT_EQ(1, stats.channel_stats[0].component);
|
2016-04-11 15:10:52 -07:00
|
|
|
// 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);
|
2014-10-28 22:20:11 +00:00
|
|
|
EXPECT_TRUE(transport_->GetStats(&stats));
|
|
|
|
|
ASSERT_EQ(1U, stats.channel_stats.size());
|
|
|
|
|
EXPECT_EQ(1, stats.channel_stats[0].component);
|
|
|
|
|
}
|
2015-07-08 11:08:35 -07:00
|
|
|
|
2016-04-29 20:20:54 -07:00
|
|
|
// Tests that VerifyCertificateFingerprint only returns true when the
|
|
|
|
|
// certificate matches the fingerprint.
|
2016-12-06 16:22:06 -08:00
|
|
|
TEST_F(JsepTransportTest, TestVerifyCertificateFingerprint) {
|
2016-04-29 20:20:54 -07:00
|
|
|
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 =
|
2016-05-01 14:53:46 -07:00
|
|
|
rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
|
2016-04-29 20:20:54 -07:00
|
|
|
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());
|
2016-05-01 14:53:46 -07:00
|
|
|
std::unique_ptr<rtc::SSLFingerprint> good_fingerprint(
|
2016-04-29 20:20:54 -07:00
|
|
|
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.
|
2016-12-06 16:22:06 -08:00
|
|
|
TEST_F(JsepTransportTest, TestNegotiateRole) {
|
2016-04-29 20:20:54 -07:00
|
|
|
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));
|
|
|
|
|
}
|
|
|
|
|
}
|