Index: webrtc/p2p/base/turnport_unittest.cc |
diff --git a/webrtc/p2p/base/turnport_unittest.cc b/webrtc/p2p/base/turnport_unittest.cc |
index 077ca4d7f1f35ccd6382213f9fdb6b4bc2feb1ec..ef678b5d73c54d9ff5838269fc91e4f0e53a3fb2 100644 |
--- a/webrtc/p2p/base/turnport_unittest.cc |
+++ b/webrtc/p2p/base/turnport_unittest.cc |
@@ -23,6 +23,7 @@ |
#include "webrtc/base/asynctcpsocket.h" |
#include "webrtc/base/buffer.h" |
#include "webrtc/base/dscp.h" |
+#include "webrtc/base/fakeclock.h" |
#include "webrtc/base/firewallsocketserver.h" |
#include "webrtc/base/gunit.h" |
#include "webrtc/base/helpers.h" |
@@ -34,11 +35,6 @@ |
#include "webrtc/base/virtualsocketserver.h" |
using rtc::SocketAddress; |
-using cricket::Connection; |
-using cricket::Port; |
-using cricket::PortInterface; |
-using cricket::TurnPort; |
-using cricket::UDPPort; |
static const SocketAddress kLocalAddr1("11.11.11.11", 0); |
static const SocketAddress kLocalAddr2("22.22.22.22", 0); |
@@ -69,7 +65,15 @@ static const char kIcePwd2[] = "TESTICEPWD00000000000002"; |
static const char kTurnUsername[] = "test"; |
static const char kTurnPassword[] = "test"; |
static const char kTestOrigin[] = "http://example.com"; |
-static const unsigned int kTimeout = 1000; |
+// This test configures the virtual socket server to simulate delay so that we |
+// can verify operations take no more than the expected number of round trips. |
+static constexpr unsigned int kSimulatedRtt = 50; |
+// Connection destruction may happen asynchronously, but it should only |
+// take one simulated clock tick. |
+static constexpr unsigned int kConnectionDestructionDelay = 1; |
+// This used to be 1 second, but that's not always enough for getaddrinfo(). |
+// See: https://bugs.chromium.org/p/webrtc/issues/detail?id=5191 |
+static constexpr unsigned int kResolverTimeout = 10000; |
static const cricket::ProtocolAddress kTurnUdpProtoAddr( |
kTurnUdpIntAddr, cricket::PROTO_UDP); |
@@ -95,10 +99,17 @@ static int GetFDCount() { |
} |
#endif |
+namespace cricket { |
+ |
class TurnPortTestVirtualSocketServer : public rtc::VirtualSocketServer { |
public: |
explicit TurnPortTestVirtualSocketServer(SocketServer* ss) |
- : VirtualSocketServer(ss) {} |
+ : VirtualSocketServer(ss) { |
+ // This configures the virtual socket server to always add a simulated |
+ // delay of exactly half of kSimulatedRtt. |
+ set_delay_mean(kSimulatedRtt / 2); |
+ UpdateDelayDistribution(); |
+ } |
using rtc::VirtualSocketServer::LookupBinding; |
}; |
@@ -121,6 +132,8 @@ class TestConnectionWrapper : public sigslot::has_slots<> { |
Connection* connection_; |
}; |
+// Note: This test uses a fake clock with a simulated network round trip |
+// (between local port and TURN server) of kSimulatedRtt. |
class TurnPortTest : public testing::Test, |
public sigslot::has_slots<>, |
public rtc::MessageHandler { |
@@ -139,6 +152,10 @@ class TurnPortTest : public testing::Test, |
turn_create_permission_success_(false), |
udp_ready_(false), |
test_finish_(false) { |
+ // Some code uses "last received time == 0" to represent "nothing received |
+ // so far", so we need to start the fake clock at a nonzero time... |
+ // TODO(deadbeef): Fix this. |
+ fake_clock_.AdvanceTime(rtc::TimeDelta::FromSeconds(1)); |
network_.AddIP(rtc::IPAddress(INADDR_ANY)); |
} |
@@ -169,9 +186,11 @@ class TurnPortTest : public testing::Test, |
void OnTurnPortError(Port* port) { |
turn_error_ = true; |
} |
- void OnTurnUnknownAddress(PortInterface* port, const SocketAddress& addr, |
- cricket::ProtocolType proto, |
- cricket::IceMessage* msg, const std::string& rf, |
+ void OnTurnUnknownAddress(PortInterface* port, |
+ const SocketAddress& addr, |
+ ProtocolType proto, |
+ IceMessage* msg, |
+ const std::string& rf, |
bool /*port_muxed*/) { |
turn_unknown_address_ = true; |
} |
@@ -212,21 +231,21 @@ class TurnPortTest : public testing::Test, |
void CreateTurnPort(const std::string& username, |
const std::string& password, |
- const cricket::ProtocolAddress& server_address) { |
+ const ProtocolAddress& server_address) { |
CreateTurnPort(kLocalAddr1, username, password, server_address); |
} |
void CreateTurnPort(const rtc::SocketAddress& local_address, |
const std::string& username, |
const std::string& password, |
- const cricket::ProtocolAddress& server_address) { |
- cricket::RelayCredentials credentials(username, password); |
+ const ProtocolAddress& server_address) { |
+ RelayCredentials credentials(username, password); |
turn_port_.reset(TurnPort::Create(main_, &socket_factory_, &network_, |
local_address.ipaddr(), 0, 0, |
kIceUfrag1, kIcePwd1, |
server_address, credentials, 0, |
std::string())); |
// This TURN port will be the controlling. |
- turn_port_->SetIceRole(cricket::ICEROLE_CONTROLLING); |
+ turn_port_->SetIceRole(ICEROLE_CONTROLLING); |
ConnectSignals(); |
} |
@@ -235,23 +254,23 @@ class TurnPortTest : public testing::Test, |
void CreateTurnPortWithOrigin(const rtc::SocketAddress& local_address, |
const std::string& username, |
const std::string& password, |
- const cricket::ProtocolAddress& server_address, |
+ const ProtocolAddress& server_address, |
const std::string& origin) { |
- cricket::RelayCredentials credentials(username, password); |
+ RelayCredentials credentials(username, password); |
turn_port_.reset(TurnPort::Create(main_, &socket_factory_, &network_, |
local_address.ipaddr(), 0, 0, |
kIceUfrag1, kIcePwd1, |
server_address, credentials, 0, |
origin)); |
// This TURN port will be the controlling. |
- turn_port_->SetIceRole(cricket::ICEROLE_CONTROLLING); |
+ turn_port_->SetIceRole(ICEROLE_CONTROLLING); |
ConnectSignals(); |
} |
void CreateSharedTurnPort(const std::string& username, |
const std::string& password, |
- const cricket::ProtocolAddress& server_address) { |
- ASSERT(server_address.proto == cricket::PROTO_UDP); |
+ const ProtocolAddress& server_address) { |
+ ASSERT(server_address.proto == PROTO_UDP); |
if (!socket_) { |
socket_.reset(socket_factory_.CreateUdpSocket( |
@@ -261,12 +280,12 @@ class TurnPortTest : public testing::Test, |
this, &TurnPortTest::OnSocketReadPacket); |
} |
- cricket::RelayCredentials credentials(username, password); |
- turn_port_.reset(cricket::TurnPort::Create( |
- main_, &socket_factory_, &network_, socket_.get(), |
- kIceUfrag1, kIcePwd1, server_address, credentials, 0, std::string())); |
+ RelayCredentials credentials(username, password); |
+ turn_port_.reset(TurnPort::Create( |
+ main_, &socket_factory_, &network_, socket_.get(), kIceUfrag1, kIcePwd1, |
+ server_address, credentials, 0, std::string())); |
// This TURN port will be the controlling. |
- turn_port_->SetIceRole(cricket::ICEROLE_CONTROLLING); |
+ turn_port_->SetIceRole(ICEROLE_CONTROLLING); |
ConnectSignals(); |
} |
@@ -290,20 +309,25 @@ class TurnPortTest : public testing::Test, |
address.ipaddr(), 0, 0, kIceUfrag2, |
kIcePwd2, std::string(), false)); |
// UDP port will be controlled. |
- udp_port_->SetIceRole(cricket::ICEROLE_CONTROLLED); |
+ udp_port_->SetIceRole(ICEROLE_CONTROLLED); |
udp_port_->SignalPortComplete.connect( |
this, &TurnPortTest::OnUdpPortComplete); |
} |
- void PrepareTurnAndUdpPorts() { |
+ void PrepareTurnAndUdpPorts(ProtocolType protocol_type) { |
// turn_port_ should have been created. |
ASSERT_TRUE(turn_port_ != nullptr); |
turn_port_->PrepareAddress(); |
- ASSERT_TRUE_WAIT(turn_ready_, kTimeout); |
+ // Two round trips are required to allocate a TURN candidate. |
+ // Plus, an extra round trip is needed for TCP. |
+ ASSERT_TRUE_SIMULATED_WAIT( |
+ turn_ready_, |
+ protocol_type == PROTO_TCP ? kSimulatedRtt * 3 : kSimulatedRtt * 2, |
+ fake_clock_); |
CreateUdpPort(); |
udp_port_->PrepareAddress(); |
- ASSERT_TRUE_WAIT(udp_ready_, kTimeout); |
+ ASSERT_TRUE_SIMULATED_WAIT(udp_ready_, kSimulatedRtt, fake_clock_); |
} |
bool CheckConnectionFailedAndPruned(Connection* conn) { |
@@ -325,23 +349,27 @@ class TurnPortTest : public testing::Test, |
return true; |
} |
- void TestTurnAlternateServer(cricket::ProtocolType protocol_type) { |
+ void TestTurnAlternateServer(ProtocolType protocol_type) { |
std::vector<rtc::SocketAddress> redirect_addresses; |
redirect_addresses.push_back(kTurnAlternateIntAddr); |
- cricket::TestTurnRedirector redirector(redirect_addresses); |
+ TestTurnRedirector redirector(redirect_addresses); |
turn_server_.AddInternalSocket(kTurnIntAddr, protocol_type); |
turn_server_.AddInternalSocket(kTurnAlternateIntAddr, protocol_type); |
turn_server_.set_redirect_hook(&redirector); |
CreateTurnPort(kTurnUsername, kTurnPassword, |
- cricket::ProtocolAddress(kTurnIntAddr, protocol_type)); |
+ ProtocolAddress(kTurnIntAddr, protocol_type)); |
// Retrieve the address before we run the state machine. |
const SocketAddress old_addr = turn_port_->server_address().address; |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_ready_, kTimeout * 100); |
+ // Extra round trip due to "use alternate server" error response. |
+ EXPECT_TRUE_SIMULATED_WAIT( |
+ turn_ready_, |
+ (protocol_type == PROTO_TCP ? kSimulatedRtt * 4 : kSimulatedRtt * 3), |
+ fake_clock_); |
// Retrieve the address again, the turn port's address should be |
// changed. |
const SocketAddress new_addr = turn_port_->server_address().address; |
@@ -352,34 +380,38 @@ class TurnPortTest : public testing::Test, |
EXPECT_NE(0, turn_port_->Candidates()[0].address().port()); |
} |
- void TestTurnAlternateServerV4toV6(cricket::ProtocolType protocol_type) { |
+ void TestTurnAlternateServerV4toV6(ProtocolType protocol_type) { |
std::vector<rtc::SocketAddress> redirect_addresses; |
redirect_addresses.push_back(kTurnIPv6IntAddr); |
- cricket::TestTurnRedirector redirector(redirect_addresses); |
+ TestTurnRedirector redirector(redirect_addresses); |
turn_server_.AddInternalSocket(kTurnIntAddr, protocol_type); |
turn_server_.set_redirect_hook(&redirector); |
CreateTurnPort(kTurnUsername, kTurnPassword, |
- cricket::ProtocolAddress(kTurnIntAddr, protocol_type)); |
+ ProtocolAddress(kTurnIntAddr, protocol_type)); |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_error_, kTimeout); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_error_, kSimulatedRtt * 2, fake_clock_); |
} |
- void TestTurnAlternateServerPingPong(cricket::ProtocolType protocol_type) { |
+ void TestTurnAlternateServerPingPong(ProtocolType protocol_type) { |
std::vector<rtc::SocketAddress> redirect_addresses; |
redirect_addresses.push_back(kTurnAlternateIntAddr); |
redirect_addresses.push_back(kTurnIntAddr); |
- cricket::TestTurnRedirector redirector(redirect_addresses); |
+ TestTurnRedirector redirector(redirect_addresses); |
turn_server_.AddInternalSocket(kTurnIntAddr, protocol_type); |
turn_server_.AddInternalSocket(kTurnAlternateIntAddr, protocol_type); |
turn_server_.set_redirect_hook(&redirector); |
CreateTurnPort(kTurnUsername, kTurnPassword, |
- cricket::ProtocolAddress(kTurnIntAddr, protocol_type)); |
+ ProtocolAddress(kTurnIntAddr, protocol_type)); |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_error_, kTimeout); |
+ // Extra round trip due to "use alternate server" error response. |
+ EXPECT_TRUE_SIMULATED_WAIT( |
+ turn_error_, |
+ (protocol_type == PROTO_TCP ? kSimulatedRtt * 4 : kSimulatedRtt * 3), |
+ fake_clock_); |
ASSERT_EQ(0U, turn_port_->Candidates().size()); |
rtc::SocketAddress address; |
// Verify that we have exhausted all alternate servers instead of |
@@ -387,35 +419,38 @@ class TurnPortTest : public testing::Test, |
EXPECT_FALSE(redirector.ShouldRedirect(address, &address)); |
} |
- void TestTurnAlternateServerDetectRepetition( |
- cricket::ProtocolType protocol_type) { |
+ void TestTurnAlternateServerDetectRepetition(ProtocolType protocol_type) { |
std::vector<rtc::SocketAddress> redirect_addresses; |
redirect_addresses.push_back(kTurnAlternateIntAddr); |
redirect_addresses.push_back(kTurnAlternateIntAddr); |
- cricket::TestTurnRedirector redirector(redirect_addresses); |
+ TestTurnRedirector redirector(redirect_addresses); |
turn_server_.AddInternalSocket(kTurnIntAddr, protocol_type); |
turn_server_.AddInternalSocket(kTurnAlternateIntAddr, protocol_type); |
turn_server_.set_redirect_hook(&redirector); |
CreateTurnPort(kTurnUsername, kTurnPassword, |
- cricket::ProtocolAddress(kTurnIntAddr, protocol_type)); |
+ ProtocolAddress(kTurnIntAddr, protocol_type)); |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_error_, kTimeout); |
+ // Extra round trip due to "use alternate server" error response. |
+ EXPECT_TRUE_SIMULATED_WAIT( |
+ turn_error_, |
+ (protocol_type == PROTO_TCP ? kSimulatedRtt * 4 : kSimulatedRtt * 3), |
+ fake_clock_); |
ASSERT_EQ(0U, turn_port_->Candidates().size()); |
} |
- void TestTurnConnection() { |
+ void TestTurnConnection(ProtocolType protocol_type) { |
// Create ports and prepare addresses. |
- PrepareTurnAndUdpPorts(); |
+ PrepareTurnAndUdpPorts(protocol_type); |
// Send ping from UDP to TURN. |
Connection* conn1 = udp_port_->CreateConnection( |
turn_port_->Candidates()[0], Port::ORIGIN_MESSAGE); |
ASSERT_TRUE(conn1 != NULL); |
conn1->Ping(0); |
- WAIT(!turn_unknown_address_, kTimeout); |
+ SIMULATED_WAIT(!turn_unknown_address_, kSimulatedRtt * 2, fake_clock_); |
EXPECT_FALSE(turn_unknown_address_); |
EXPECT_FALSE(conn1->receiving()); |
EXPECT_EQ(Connection::STATE_WRITE_INIT, conn1->write_state()); |
@@ -424,22 +459,26 @@ class TurnPortTest : public testing::Test, |
Connection* conn2 = turn_port_->CreateConnection( |
udp_port_->Candidates()[0], Port::ORIGIN_MESSAGE); |
ASSERT_TRUE(conn2 != NULL); |
- ASSERT_TRUE_WAIT(turn_create_permission_success_, kTimeout); |
+ ASSERT_TRUE_SIMULATED_WAIT(turn_create_permission_success_, kSimulatedRtt, |
+ fake_clock_); |
conn2->Ping(0); |
- EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, conn2->write_state(), kTimeout); |
+ // Two hops from TURN port to UDP port through TURN server, thus two RTTs. |
+ EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, conn2->write_state(), |
+ kSimulatedRtt * 2, fake_clock_); |
EXPECT_TRUE(conn1->receiving()); |
EXPECT_TRUE(conn2->receiving()); |
EXPECT_EQ(Connection::STATE_WRITE_INIT, conn1->write_state()); |
// Send another ping from UDP to TURN. |
conn1->Ping(0); |
- EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, conn1->write_state(), kTimeout); |
+ EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, conn1->write_state(), |
+ kSimulatedRtt * 2, fake_clock_); |
EXPECT_TRUE(conn2->receiving()); |
} |
void TestDestroyTurnConnection() { |
- PrepareTurnAndUdpPorts(); |
+ PrepareTurnAndUdpPorts(PROTO_UDP); |
// Create connections on both ends. |
Connection* conn1 = udp_port_->CreateConnection(turn_port_->Candidates()[0], |
@@ -447,34 +486,39 @@ class TurnPortTest : public testing::Test, |
Connection* conn2 = turn_port_->CreateConnection(udp_port_->Candidates()[0], |
Port::ORIGIN_MESSAGE); |
ASSERT_TRUE(conn2 != NULL); |
- ASSERT_TRUE_WAIT(turn_create_permission_success_, kTimeout); |
+ ASSERT_TRUE_SIMULATED_WAIT(turn_create_permission_success_, kSimulatedRtt, |
+ fake_clock_); |
// Make sure turn connection can receive. |
conn1->Ping(0); |
- EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, conn1->write_state(), kTimeout); |
+ EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, conn1->write_state(), |
+ kSimulatedRtt * 2, fake_clock_); |
EXPECT_FALSE(turn_unknown_address_); |
- // Destroy the connection on the turn port. The TurnEntry is still |
- // there. So the turn port gets ping from unknown address if it is pinged. |
+ // Destroy the connection on the TURN port. The TurnEntry still exists, so |
+ // the TURN port should still process a ping from an unknown address. |
conn2->Destroy(); |
conn1->Ping(0); |
- EXPECT_TRUE_WAIT(turn_unknown_address_, kTimeout); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_unknown_address_, kSimulatedRtt, |
+ fake_clock_); |
// Flush all requests in the invoker to destroy the TurnEntry. |
- // However, the TURN port should still signal the unknown address. |
+ // Expect that it still processes an incoming ping and signals the |
+ // unknown address. |
turn_unknown_address_ = false; |
turn_port_->invoker()->Flush(rtc::Thread::Current()); |
conn1->Ping(0); |
- EXPECT_TRUE_WAIT(turn_unknown_address_, kTimeout); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_unknown_address_, kSimulatedRtt, |
+ fake_clock_); |
// If the connection is created again, it will start to receive pings. |
conn2 = turn_port_->CreateConnection(udp_port_->Candidates()[0], |
Port::ORIGIN_MESSAGE); |
conn1->Ping(0); |
- EXPECT_TRUE_WAIT(conn2->receiving(), kTimeout); |
+ EXPECT_TRUE_SIMULATED_WAIT(conn2->receiving(), kSimulatedRtt, fake_clock_); |
} |
- void TestTurnSendData() { |
- PrepareTurnAndUdpPorts(); |
+ void TestTurnSendData(ProtocolType protocol_type) { |
+ PrepareTurnAndUdpPorts(protocol_type); |
// Create connections and send pings. |
Connection* conn1 = turn_port_->CreateConnection( |
@@ -488,9 +532,11 @@ class TurnPortTest : public testing::Test, |
conn2->SignalReadPacket.connect(static_cast<TurnPortTest*>(this), |
&TurnPortTest::OnUdpReadPacket); |
conn1->Ping(0); |
- EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, conn1->write_state(), kTimeout); |
+ EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, conn1->write_state(), |
+ kSimulatedRtt * 2, fake_clock_); |
conn2->Ping(0); |
- EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, conn2->write_state(), kTimeout); |
+ EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, conn2->write_state(), |
+ kSimulatedRtt * 2, fake_clock_); |
// Send some data. |
size_t num_packets = 256; |
@@ -501,12 +547,12 @@ class TurnPortTest : public testing::Test, |
} |
conn1->Send(buf, i + 1, options); |
conn2->Send(buf, i + 1, options); |
- main_->ProcessMessages(0); |
+ SIMULATED_WAIT(false, kSimulatedRtt, fake_clock_); |
} |
// Check the data. |
- ASSERT_EQ_WAIT(num_packets, turn_packets_.size(), kTimeout); |
- ASSERT_EQ_WAIT(num_packets, udp_packets_.size(), kTimeout); |
+ ASSERT_EQ(num_packets, turn_packets_.size()); |
+ ASSERT_EQ(num_packets, udp_packets_.size()); |
for (size_t i = 0; i < num_packets; ++i) { |
EXPECT_EQ(i + 1, turn_packets_[i].size()); |
EXPECT_EQ(i + 1, udp_packets_[i].size()); |
@@ -515,6 +561,7 @@ class TurnPortTest : public testing::Test, |
} |
protected: |
+ rtc::ScopedFakeClock fake_clock_; |
rtc::Thread* main_; |
std::unique_ptr<rtc::PhysicalSocketServer> pss_; |
std::unique_ptr<TurnPortTestVirtualSocketServer> ss_; |
@@ -522,7 +569,7 @@ class TurnPortTest : public testing::Test, |
rtc::Network network_; |
rtc::BasicPacketSocketFactory socket_factory_; |
std::unique_ptr<rtc::AsyncPacketSocket> socket_; |
- cricket::TestTurnServer turn_server_; |
+ TestTurnServer turn_server_; |
std::unique_ptr<TurnPort> turn_port_; |
std::unique_ptr<UDPPort> udp_port_; |
bool turn_ready_; |
@@ -542,7 +589,7 @@ TEST_F(TurnPortTest, TestTurnAllocate) { |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
EXPECT_EQ(0, turn_port_->SetOption(rtc::Socket::OPT_SNDBUF, 10*1024)); |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_ready_, kTimeout); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_); |
ASSERT_EQ(1U, turn_port_->Candidates().size()); |
EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), |
turn_port_->Candidates()[0].address().ipaddr()); |
@@ -551,11 +598,11 @@ TEST_F(TurnPortTest, TestTurnAllocate) { |
// Testing a normal UDP allocation using TCP connection. |
TEST_F(TurnPortTest, TestTurnTcpAllocate) { |
- turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); |
+ turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
EXPECT_EQ(0, turn_port_->SetOption(rtc::Socket::OPT_SNDBUF, 10*1024)); |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_ready_, kTimeout); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 3, fake_clock_); |
ASSERT_EQ(1U, turn_port_->Candidates().size()); |
EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), |
turn_port_->Candidates()[0].address().ipaddr()); |
@@ -566,12 +613,12 @@ TEST_F(TurnPortTest, TestTurnTcpAllocate) { |
// instead the address that TurnPort originally bound to. The candidate pair |
// impacted by this behavior should still be used. |
TEST_F(TurnPortTest, TestTurnTcpAllocationWhenProxyChangesAddressToLocalHost) { |
- turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); |
+ turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
EXPECT_EQ(0, turn_port_->SetOption(rtc::Socket::OPT_SNDBUF, 10 * 1024)); |
turn_port_->PrepareAddress(); |
ConnectSignalAddressReadyToSetLocalhostAsAltenertativeLocalAddress(); |
- EXPECT_TRUE_WAIT(turn_ready_, kTimeout); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 3, fake_clock_); |
ASSERT_EQ(1U, turn_port_->Candidates().size()); |
EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), |
turn_port_->Candidates()[0].address().ipaddr()); |
@@ -580,13 +627,13 @@ TEST_F(TurnPortTest, TestTurnTcpAllocationWhenProxyChangesAddressToLocalHost) { |
// Testing turn port will attempt to create TCP socket on address resolution |
// failure. |
-TEST_F(TurnPortTest, DISABLED_TestTurnTcpOnAddressResolveFailure) { |
- turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); |
- CreateTurnPort(kTurnUsername, kTurnPassword, cricket::ProtocolAddress( |
- rtc::SocketAddress("www.webrtc-blah-blah.com", 3478), |
- cricket::PROTO_TCP)); |
+TEST_F(TurnPortTest, TestTurnTcpOnAddressResolveFailure) { |
+ turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
+ CreateTurnPort(kTurnUsername, kTurnPassword, |
+ ProtocolAddress(rtc::SocketAddress("www.google.invalid", 3478), |
+ PROTO_TCP)); |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_error_, kTimeout); |
+ EXPECT_TRUE_WAIT(turn_error_, kResolverTimeout); |
// As VSS doesn't provide a DNS resolution, name resolve will fail. TurnPort |
// will proceed in creating a TCP socket which will fail as there is no |
// server on the above domain and error will be set to SOCKET_ERROR. |
@@ -595,12 +642,12 @@ TEST_F(TurnPortTest, DISABLED_TestTurnTcpOnAddressResolveFailure) { |
// In case of UDP on address resolve failure, TurnPort will not create socket |
// and return allocate failure. |
-TEST_F(TurnPortTest, DISABLED_TestTurnUdpOnAddressResolveFailure) { |
- CreateTurnPort(kTurnUsername, kTurnPassword, cricket::ProtocolAddress( |
- rtc::SocketAddress("www.webrtc-blah-blah.com", 3478), |
- cricket::PROTO_UDP)); |
+TEST_F(TurnPortTest, TestTurnUdpOnAddressResolveFailure) { |
+ CreateTurnPort(kTurnUsername, kTurnPassword, |
+ ProtocolAddress(rtc::SocketAddress("www.google.invalid", 3478), |
+ PROTO_UDP)); |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_error_, kTimeout); |
+ EXPECT_TRUE_WAIT(turn_error_, kResolverTimeout); |
// Error from turn port will not be socket error. |
EXPECT_NE(SOCKET_ERROR, turn_port_->error()); |
} |
@@ -609,7 +656,7 @@ TEST_F(TurnPortTest, DISABLED_TestTurnUdpOnAddressResolveFailure) { |
TEST_F(TurnPortTest, TestTurnAllocateBadPassword) { |
CreateTurnPort(kTurnUsername, "bad", kTurnUdpProtoAddr); |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_error_, kTimeout); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_error_, kSimulatedRtt * 2, fake_clock_); |
ASSERT_EQ(0U, turn_port_->Candidates().size()); |
} |
@@ -619,13 +666,13 @@ TEST_F(TurnPortTest, TestTurnAllocateNonceResetAfterAllocateMismatch) { |
// Do a normal allocation first. |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_ready_, kTimeout); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_); |
rtc::SocketAddress first_addr(turn_port_->socket()->GetLocalAddress()); |
// Destroy the turnport while keeping the drop probability to 1 to |
// suppress the release of the allocation at the server. |
ss_->set_drop_probability(1.0); |
turn_port_.reset(); |
- rtc::Thread::Current()->ProcessMessages(0); |
+ SIMULATED_WAIT(false, kSimulatedRtt, fake_clock_); |
ss_->set_drop_probability(0.0); |
// Force the socket server to assign the same port. |
@@ -642,7 +689,10 @@ TEST_F(TurnPortTest, TestTurnAllocateNonceResetAfterAllocateMismatch) { |
turn_server_.server()->SetTimestampForNextNonce(ts_before); |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_ready_, kTimeout); |
+ // Four round trips; first we'll get "stale nonce", then |
+ // "allocate mismatch", then "stale nonce" again, then finally it will |
+ // succeed. |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 4, fake_clock_); |
EXPECT_NE(first_nonce, turn_port_->nonce()); |
} |
@@ -652,7 +702,7 @@ TEST_F(TurnPortTest, TestTurnAllocateMismatch) { |
// Do a normal allocation first. |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_ready_, kTimeout); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_); |
rtc::SocketAddress first_addr(turn_port_->socket()->GetLocalAddress()); |
// Clear connected_ flag on turnport to suppress the release of |
@@ -669,7 +719,10 @@ TEST_F(TurnPortTest, TestTurnAllocateMismatch) { |
// Verifies that the new port has the same address. |
EXPECT_EQ(first_addr, turn_port_->socket()->GetLocalAddress()); |
- EXPECT_TRUE_WAIT(turn_ready_, kTimeout); |
+ // Four round trips; first we'll get "stale nonce", then |
+ // "allocate mismatch", then "stale nonce" again, then finally it will |
+ // succeed. |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 4, fake_clock_); |
// Verifies that the new port has a different address now. |
EXPECT_NE(first_addr, turn_port_->socket()->GetLocalAddress()); |
@@ -688,7 +741,7 @@ TEST_F(TurnPortTest, TestSharedSocketAllocateMismatch) { |
// Do a normal allocation first. |
CreateSharedTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_ready_, kTimeout); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_); |
rtc::SocketAddress first_addr(turn_port_->socket()->GetLocalAddress()); |
// Clear connected_ flag on turnport to suppress the release of |
@@ -703,7 +756,8 @@ TEST_F(TurnPortTest, TestSharedSocketAllocateMismatch) { |
EXPECT_TRUE(turn_port_->SharedSocket()); |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_ready_, kTimeout); |
+ // Extra 2 round trips due to allocate mismatch. |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 4, fake_clock_); |
// Verifies that the new port has a different address now. |
EXPECT_NE(first_addr, turn_port_->socket()->GetLocalAddress()); |
@@ -711,12 +765,12 @@ TEST_F(TurnPortTest, TestSharedSocketAllocateMismatch) { |
} |
TEST_F(TurnPortTest, TestTurnTcpAllocateMismatch) { |
- turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); |
+ turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
// Do a normal allocation first. |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_ready_, kTimeout); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 3, fake_clock_); |
rtc::SocketAddress first_addr(turn_port_->socket()->GetLocalAddress()); |
// Clear connected_ flag on turnport to suppress the release of |
@@ -733,41 +787,41 @@ TEST_F(TurnPortTest, TestTurnTcpAllocateMismatch) { |
// Verifies that the new port has the same address. |
EXPECT_EQ(first_addr, turn_port_->socket()->GetLocalAddress()); |
- EXPECT_TRUE_WAIT(turn_ready_, kTimeout); |
+ // Extra 2 round trips due to allocate mismatch. |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 5, fake_clock_); |
// Verifies that the new port has a different address now. |
EXPECT_NE(first_addr, turn_port_->socket()->GetLocalAddress()); |
} |
TEST_F(TurnPortTest, TestRefreshRequestGetsErrorResponse) { |
- rtc::ScopedFakeClock clock; |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
- PrepareTurnAndUdpPorts(); |
+ PrepareTurnAndUdpPorts(PROTO_UDP); |
turn_port_->CreateConnection(udp_port_->Candidates()[0], |
Port::ORIGIN_MESSAGE); |
// Set bad credentials. |
- cricket::RelayCredentials bad_credentials("bad_user", "bad_pwd"); |
+ RelayCredentials bad_credentials("bad_user", "bad_pwd"); |
turn_port_->set_credentials(bad_credentials); |
turn_refresh_success_ = false; |
// This sends out the first RefreshRequest with correct credentials. |
// When this succeeds, it will schedule a new RefreshRequest with the bad |
// credential. |
- turn_port_->FlushRequests(cricket::TURN_REFRESH_REQUEST); |
- EXPECT_TRUE_SIMULATED_WAIT(turn_refresh_success_, kTimeout, clock); |
+ turn_port_->FlushRequests(TURN_REFRESH_REQUEST); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_refresh_success_, kSimulatedRtt, fake_clock_); |
// Flush it again, it will receive a bad response. |
- turn_port_->FlushRequests(cricket::TURN_REFRESH_REQUEST); |
- EXPECT_TRUE_SIMULATED_WAIT(!turn_refresh_success_, kTimeout, clock); |
- EXPECT_TRUE_SIMULATED_WAIT(!turn_port_->connected(), kTimeout, clock); |
- EXPECT_TRUE_SIMULATED_WAIT(CheckAllConnectionsFailedAndPruned(), kTimeout, |
- clock); |
- EXPECT_TRUE_SIMULATED_WAIT(!turn_port_->HasRequests(), kTimeout, clock); |
+ turn_port_->FlushRequests(TURN_REFRESH_REQUEST); |
+ EXPECT_TRUE_SIMULATED_WAIT(!turn_refresh_success_, kSimulatedRtt, |
+ fake_clock_); |
+ EXPECT_FALSE(turn_port_->connected()); |
+ EXPECT_TRUE(CheckAllConnectionsFailedAndPruned()); |
+ EXPECT_FALSE(turn_port_->HasRequests()); |
} |
// Test that TurnPort will not handle any incoming packets once it has been |
// closed. |
TEST_F(TurnPortTest, TestStopProcessingPacketsAfterClosed) { |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
- PrepareTurnAndUdpPorts(); |
+ PrepareTurnAndUdpPorts(PROTO_UDP); |
Connection* conn1 = turn_port_->CreateConnection(udp_port_->Candidates()[0], |
Port::ORIGIN_MESSAGE); |
Connection* conn2 = udp_port_->CreateConnection(turn_port_->Candidates()[0], |
@@ -776,13 +830,14 @@ TEST_F(TurnPortTest, TestStopProcessingPacketsAfterClosed) { |
ASSERT_TRUE(conn2 != NULL); |
// Make sure conn2 is writable. |
conn2->Ping(0); |
- EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, conn2->write_state(), kTimeout); |
+ EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, conn2->write_state(), |
+ kSimulatedRtt * 2, fake_clock_); |
turn_port_->Close(); |
- rtc::Thread::Current()->ProcessMessages(0); |
+ SIMULATED_WAIT(false, kSimulatedRtt, fake_clock_); |
turn_unknown_address_ = false; |
conn2->Ping(0); |
- rtc::Thread::Current()->ProcessMessages(500); |
+ SIMULATED_WAIT(false, kSimulatedRtt, fake_clock_); |
// Since the turn port does not handle packets any more, it should not |
// SignalUnknownAddress. |
EXPECT_FALSE(turn_unknown_address_); |
@@ -790,9 +845,9 @@ TEST_F(TurnPortTest, TestStopProcessingPacketsAfterClosed) { |
// Test that CreateConnection will return null if port becomes disconnected. |
TEST_F(TurnPortTest, TestCreateConnectionWhenSocketClosed) { |
- turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); |
+ turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
- PrepareTurnAndUdpPorts(); |
+ PrepareTurnAndUdpPorts(PROTO_TCP); |
// Create a connection. |
Connection* conn1 = turn_port_->CreateConnection(udp_port_->Candidates()[0], |
Port::ORIGIN_MESSAGE); |
@@ -808,52 +863,53 @@ TEST_F(TurnPortTest, TestCreateConnectionWhenSocketClosed) { |
// Tests that when a TCP socket is closed, the respective TURN connection will |
// be destroyed. |
TEST_F(TurnPortTest, TestSocketCloseWillDestroyConnection) { |
- turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); |
+ turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
- PrepareTurnAndUdpPorts(); |
+ PrepareTurnAndUdpPorts(PROTO_TCP); |
Connection* conn = turn_port_->CreateConnection(udp_port_->Candidates()[0], |
Port::ORIGIN_MESSAGE); |
EXPECT_NE(nullptr, conn); |
EXPECT_TRUE(!turn_port_->connections().empty()); |
turn_port_->socket()->SignalClose(turn_port_->socket(), 1); |
- EXPECT_TRUE_WAIT(turn_port_->connections().empty(), kTimeout); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_port_->connections().empty(), |
+ kConnectionDestructionDelay, fake_clock_); |
} |
// Test try-alternate-server feature. |
TEST_F(TurnPortTest, TestTurnAlternateServerUDP) { |
- TestTurnAlternateServer(cricket::PROTO_UDP); |
+ TestTurnAlternateServer(PROTO_UDP); |
} |
TEST_F(TurnPortTest, TestTurnAlternateServerTCP) { |
- TestTurnAlternateServer(cricket::PROTO_TCP); |
+ TestTurnAlternateServer(PROTO_TCP); |
} |
// Test that we fail when we redirect to an address different from |
// current IP family. |
TEST_F(TurnPortTest, TestTurnAlternateServerV4toV6UDP) { |
- TestTurnAlternateServerV4toV6(cricket::PROTO_UDP); |
+ TestTurnAlternateServerV4toV6(PROTO_UDP); |
} |
TEST_F(TurnPortTest, TestTurnAlternateServerV4toV6TCP) { |
- TestTurnAlternateServerV4toV6(cricket::PROTO_TCP); |
+ TestTurnAlternateServerV4toV6(PROTO_TCP); |
} |
// Test try-alternate-server catches the case of pingpong. |
TEST_F(TurnPortTest, TestTurnAlternateServerPingPongUDP) { |
- TestTurnAlternateServerPingPong(cricket::PROTO_UDP); |
+ TestTurnAlternateServerPingPong(PROTO_UDP); |
} |
TEST_F(TurnPortTest, TestTurnAlternateServerPingPongTCP) { |
- TestTurnAlternateServerPingPong(cricket::PROTO_TCP); |
+ TestTurnAlternateServerPingPong(PROTO_TCP); |
} |
// Test try-alternate-server catch the case of repeated server. |
TEST_F(TurnPortTest, TestTurnAlternateServerDetectRepetitionUDP) { |
- TestTurnAlternateServerDetectRepetition(cricket::PROTO_UDP); |
+ TestTurnAlternateServerDetectRepetition(PROTO_UDP); |
} |
TEST_F(TurnPortTest, TestTurnAlternateServerDetectRepetitionTCP) { |
- TestTurnAlternateServerDetectRepetition(cricket::PROTO_TCP); |
+ TestTurnAlternateServerDetectRepetition(PROTO_TCP); |
} |
// Do a TURN allocation and try to send a packet to it from the outside. |
@@ -862,20 +918,20 @@ TEST_F(TurnPortTest, TestTurnAlternateServerDetectRepetitionTCP) { |
// outside. It should now work as well. |
TEST_F(TurnPortTest, TestTurnConnection) { |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
- TestTurnConnection(); |
+ TestTurnConnection(PROTO_UDP); |
} |
// Similar to above, except that this test will use the shared socket. |
TEST_F(TurnPortTest, TestTurnConnectionUsingSharedSocket) { |
CreateSharedTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
- TestTurnConnection(); |
+ TestTurnConnection(PROTO_UDP); |
} |
// Test that we can establish a TCP connection with TURN server. |
TEST_F(TurnPortTest, TestTurnTcpConnection) { |
- turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); |
+ turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
- TestTurnConnection(); |
+ TestTurnConnection(PROTO_TCP); |
} |
// Test that if a connection on a TURN port is destroyed, the TURN port can |
@@ -895,12 +951,11 @@ TEST_F(TurnPortTest, TestDestroyTurnConnectionUsingSharedSocket) { |
// Test that we fail to create a connection when we want to use TLS over TCP. |
// This test should be removed once we have TLS support. |
TEST_F(TurnPortTest, TestTurnTlsTcpConnectionFails) { |
- cricket::ProtocolAddress secure_addr(kTurnTcpProtoAddr.address, |
- kTurnTcpProtoAddr.proto, |
- true); |
+ ProtocolAddress secure_addr(kTurnTcpProtoAddr.address, |
+ kTurnTcpProtoAddr.proto, true); |
CreateTurnPort(kTurnUsername, kTurnPassword, secure_addr); |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_error_, kTimeout); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_error_, kSimulatedRtt * 2, fake_clock_); |
ASSERT_EQ(0U, turn_port_->Candidates().size()); |
} |
@@ -910,7 +965,7 @@ TEST_F(TurnPortTest, TestTurnTlsTcpConnectionFails) { |
TEST_F(TurnPortTest, TestTurnConnectionUsingOTUNonce) { |
turn_server_.set_enable_otu_nonce(true); |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
- TestTurnConnection(); |
+ TestTurnConnection(PROTO_UDP); |
} |
// Test that CreatePermissionRequest will be scheduled after the success |
@@ -918,30 +973,32 @@ TEST_F(TurnPortTest, TestTurnConnectionUsingOTUNonce) { |
// ErrorResponse if the ufrag and pwd are incorrect. |
TEST_F(TurnPortTest, TestRefreshCreatePermissionRequest) { |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
- PrepareTurnAndUdpPorts(); |
+ PrepareTurnAndUdpPorts(PROTO_UDP); |
Connection* conn = turn_port_->CreateConnection(udp_port_->Candidates()[0], |
Port::ORIGIN_MESSAGE); |
ASSERT_TRUE(conn != NULL); |
- EXPECT_TRUE_WAIT(turn_create_permission_success_, kTimeout); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_create_permission_success_, kSimulatedRtt, |
+ fake_clock_); |
turn_create_permission_success_ = false; |
// A create-permission-request should be pending. |
// After the next create-permission-response is received, it will schedule |
// another request with bad_ufrag and bad_pwd. |
- cricket::RelayCredentials bad_credentials("bad_user", "bad_pwd"); |
+ RelayCredentials bad_credentials("bad_user", "bad_pwd"); |
turn_port_->set_credentials(bad_credentials); |
- turn_port_->FlushRequests(cricket::kAllRequests); |
- EXPECT_TRUE_WAIT(turn_create_permission_success_, kTimeout); |
+ turn_port_->FlushRequests(kAllRequests); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_create_permission_success_, kSimulatedRtt, |
+ fake_clock_); |
// Flush the requests again; the create-permission-request will fail. |
- turn_port_->FlushRequests(cricket::kAllRequests); |
- EXPECT_TRUE_WAIT(!turn_create_permission_success_, kTimeout); |
- EXPECT_TRUE_WAIT(CheckConnectionFailedAndPruned(conn), kTimeout); |
+ turn_port_->FlushRequests(kAllRequests); |
+ EXPECT_TRUE_SIMULATED_WAIT(!turn_create_permission_success_, kSimulatedRtt, |
+ fake_clock_); |
+ EXPECT_TRUE(CheckConnectionFailedAndPruned(conn)); |
} |
TEST_F(TurnPortTest, TestChannelBindGetErrorResponse) { |
- rtc::ScopedFakeClock clock; |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
- PrepareTurnAndUdpPorts(); |
+ PrepareTurnAndUdpPorts(PROTO_UDP); |
Connection* conn1 = turn_port_->CreateConnection(udp_port_->Candidates()[0], |
Port::ORIGIN_MESSAGE); |
ASSERT_TRUE(conn1 != nullptr); |
@@ -950,21 +1007,23 @@ TEST_F(TurnPortTest, TestChannelBindGetErrorResponse) { |
ASSERT_TRUE(conn2 != nullptr); |
conn1->Ping(0); |
- EXPECT_TRUE_SIMULATED_WAIT(conn1->writable(), kTimeout, clock); |
- bool success = |
- turn_port_->SetEntryChannelId(udp_port_->Candidates()[0].address(), -1); |
- ASSERT_TRUE(success); |
+ EXPECT_TRUE_SIMULATED_WAIT(conn1->writable(), kSimulatedRtt * 2, fake_clock_); |
+ // TODO(deadbeef): SetEntryChannelId should not be a public method. |
+ // Instead we should set an option on the fake TURN server to force it to |
+ // send a channel bind errors. |
+ ASSERT_TRUE( |
+ turn_port_->SetEntryChannelId(udp_port_->Candidates()[0].address(), -1)); |
std::string data = "ABC"; |
conn1->Send(data.data(), data.length(), options); |
- EXPECT_TRUE_SIMULATED_WAIT(CheckConnectionFailedAndPruned(conn1), kTimeout, |
- clock); |
+ EXPECT_TRUE_SIMULATED_WAIT(CheckConnectionFailedAndPruned(conn1), |
+ kSimulatedRtt, fake_clock_); |
// Verify that no packet can be sent after a bind request error. |
conn2->SignalReadPacket.connect(static_cast<TurnPortTest*>(this), |
&TurnPortTest::OnUdpReadPacket); |
conn1->Send(data.data(), data.length(), options); |
- SIMULATED_WAIT(!udp_packets_.empty(), kTimeout, clock); |
+ SIMULATED_WAIT(!udp_packets_.empty(), kSimulatedRtt, fake_clock_); |
EXPECT_TRUE(udp_packets_.empty()); |
} |
@@ -972,29 +1031,27 @@ TEST_F(TurnPortTest, TestChannelBindGetErrorResponse) { |
TEST_F(TurnPortTest, TestTurnSendDataTurnUdpToUdp) { |
// Create ports and prepare addresses. |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
- TestTurnSendData(); |
- EXPECT_EQ(cricket::UDP_PROTOCOL_NAME, |
- turn_port_->Candidates()[0].relay_protocol()); |
+ TestTurnSendData(PROTO_UDP); |
+ EXPECT_EQ(UDP_PROTOCOL_NAME, turn_port_->Candidates()[0].relay_protocol()); |
} |
// Do a TURN allocation, establish a TCP connection, and send some data. |
TEST_F(TurnPortTest, TestTurnSendDataTurnTcpToUdp) { |
- turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); |
+ turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
// Create ports and prepare addresses. |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
- TestTurnSendData(); |
- EXPECT_EQ(cricket::TCP_PROTOCOL_NAME, |
- turn_port_->Candidates()[0].relay_protocol()); |
+ TestTurnSendData(PROTO_TCP); |
+ EXPECT_EQ(TCP_PROTOCOL_NAME, turn_port_->Candidates()[0].relay_protocol()); |
} |
// Test TURN fails to make a connection from IPv6 address to a server which has |
// IPv4 address. |
TEST_F(TurnPortTest, TestTurnLocalIPv6AddressServerIPv4) { |
- turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, cricket::PROTO_UDP); |
+ turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, PROTO_UDP); |
CreateTurnPort(kLocalIPv6Addr, kTurnUsername, kTurnPassword, |
kTurnUdpProtoAddr); |
turn_port_->PrepareAddress(); |
- ASSERT_TRUE_WAIT(turn_error_, kTimeout); |
+ ASSERT_TRUE_SIMULATED_WAIT(turn_error_, kSimulatedRtt, fake_clock_); |
EXPECT_TRUE(turn_port_->Candidates().empty()); |
} |
@@ -1002,11 +1059,11 @@ TEST_F(TurnPortTest, TestTurnLocalIPv6AddressServerIPv4) { |
// IPv6 intenal address. But in this test external address is a IPv4 address, |
// hence allocated address will be a IPv4 address. |
TEST_F(TurnPortTest, TestTurnLocalIPv6AddressServerIPv6ExtenalIPv4) { |
- turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, cricket::PROTO_UDP); |
+ turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, PROTO_UDP); |
CreateTurnPort(kLocalIPv6Addr, kTurnUsername, kTurnPassword, |
kTurnUdpIPv6ProtoAddr); |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_ready_, kTimeout); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_); |
ASSERT_EQ(1U, turn_port_->Candidates().size()); |
EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), |
turn_port_->Candidates()[0].address().ipaddr()); |
@@ -1018,18 +1075,17 @@ TEST_F(TurnPortTest, TestTurnLocalIPv6AddressServerIPv6ExtenalIPv4) { |
// its local candidate will still be an IPv4 address and it can only create |
// connections with IPv4 remote candidates. |
TEST_F(TurnPortTest, TestCandidateAddressFamilyMatch) { |
- turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, cricket::PROTO_UDP); |
+ turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, PROTO_UDP); |
CreateTurnPort(kLocalIPv6Addr, kTurnUsername, kTurnPassword, |
kTurnUdpIPv6ProtoAddr); |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_ready_, kTimeout); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_); |
ASSERT_EQ(1U, turn_port_->Candidates().size()); |
// Create an IPv4 candidate. It will match the TURN candidate. |
- cricket::Candidate remote_candidate(cricket::ICE_CANDIDATE_COMPONENT_RTP, |
- "udp", kLocalAddr2, 0, "", "", "local", 0, |
- kCandidateFoundation); |
+ Candidate remote_candidate(ICE_CANDIDATE_COMPONENT_RTP, "udp", kLocalAddr2, 0, |
+ "", "", "local", 0, kCandidateFoundation); |
remote_candidate.set_address(kLocalAddr2); |
Connection* conn = |
turn_port_->CreateConnection(remote_candidate, Port::ORIGIN_MESSAGE); |
@@ -1046,7 +1102,7 @@ TEST_F(TurnPortTest, TestOriginHeader) { |
CreateTurnPortWithOrigin(kLocalAddr1, kTurnUsername, kTurnPassword, |
kTurnUdpProtoAddr, kTestOrigin); |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_ready_, kTimeout); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_); |
ASSERT_GT(turn_server_.server()->allocations().size(), 0U); |
SocketAddress local_address = turn_port_->GetLocalAddress(); |
ASSERT_TRUE(turn_server_.FindAllocation(local_address) != NULL); |
@@ -1055,18 +1111,16 @@ TEST_F(TurnPortTest, TestOriginHeader) { |
// Test that a CreatePermission failure will result in the connection being |
// pruned and failed. |
-TEST_F(TurnPortTest, TestConnectionFaildAndPrunedOnCreatePermissionFailure) { |
- rtc::ScopedFakeClock clock; |
- SIMULATED_WAIT(false, 101, clock); |
- turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); |
+TEST_F(TurnPortTest, TestConnectionFailedAndPrunedOnCreatePermissionFailure) { |
+ turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
turn_server_.server()->set_reject_private_addresses(true); |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kTimeout, clock); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 3, fake_clock_); |
CreateUdpPort(SocketAddress("10.0.0.10", 0)); |
udp_port_->PrepareAddress(); |
- EXPECT_TRUE_SIMULATED_WAIT(udp_ready_, kTimeout, clock); |
+ EXPECT_TRUE_SIMULATED_WAIT(udp_ready_, kSimulatedRtt, fake_clock_); |
// Create a connection. |
TestConnectionWrapper conn(turn_port_->CreateConnection( |
udp_port_->Candidates()[0], Port::ORIGIN_MESSAGE)); |
@@ -1075,57 +1129,60 @@ TEST_F(TurnPortTest, TestConnectionFaildAndPrunedOnCreatePermissionFailure) { |
// Asynchronously, CreatePermission request should be sent and fail, which |
// will make the connection pruned and failed. |
EXPECT_TRUE_SIMULATED_WAIT(CheckConnectionFailedAndPruned(conn.connection()), |
- kTimeout, clock); |
- EXPECT_TRUE_SIMULATED_WAIT(!turn_create_permission_success_, kTimeout, clock); |
+ kSimulatedRtt, fake_clock_); |
+ EXPECT_TRUE_SIMULATED_WAIT(!turn_create_permission_success_, kSimulatedRtt, |
+ fake_clock_); |
// Check that the connection is not deleted asynchronously. |
- SIMULATED_WAIT(conn.connection() == nullptr, kTimeout, clock); |
- EXPECT_TRUE(conn.connection() != nullptr); |
+ SIMULATED_WAIT(conn.connection() == nullptr, kConnectionDestructionDelay, |
+ fake_clock_); |
+ EXPECT_NE(nullptr, conn.connection()); |
} |
// Test that a TURN allocation is released when the port is closed. |
TEST_F(TurnPortTest, TestTurnReleaseAllocation) { |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_ready_, kTimeout); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_); |
ASSERT_GT(turn_server_.server()->allocations().size(), 0U); |
turn_port_.reset(); |
- EXPECT_EQ_WAIT(0U, turn_server_.server()->allocations().size(), kTimeout); |
+ EXPECT_EQ_SIMULATED_WAIT(0U, turn_server_.server()->allocations().size(), |
+ kSimulatedRtt, fake_clock_); |
} |
// Test that a TURN TCP allocation is released when the port is closed. |
-TEST_F(TurnPortTest, DISABLED_TestTurnTCPReleaseAllocation) { |
- turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); |
+TEST_F(TurnPortTest, TestTurnTCPReleaseAllocation) { |
+ turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
turn_port_->PrepareAddress(); |
- EXPECT_TRUE_WAIT(turn_ready_, kTimeout); |
+ EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 3, fake_clock_); |
ASSERT_GT(turn_server_.server()->allocations().size(), 0U); |
turn_port_.reset(); |
- EXPECT_EQ_WAIT(0U, turn_server_.server()->allocations().size(), kTimeout); |
+ EXPECT_EQ_SIMULATED_WAIT(0U, turn_server_.server()->allocations().size(), |
+ kSimulatedRtt, fake_clock_); |
} |
// This test verifies any FD's are not leaked after TurnPort is destroyed. |
// https://code.google.com/p/webrtc/issues/detail?id=2651 |
#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) |
-// 1 second is not always enough for getaddrinfo(). |
-// See: https://bugs.chromium.org/p/webrtc/issues/detail?id=5191 |
-static const unsigned int kResolverTimeout = 10000; |
TEST_F(TurnPortTest, TestResolverShutdown) { |
- turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, cricket::PROTO_UDP); |
+ turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, PROTO_UDP); |
int last_fd_count = GetFDCount(); |
// Need to supply unresolved address to kick off resolver. |
CreateTurnPort(kLocalIPv6Addr, kTurnUsername, kTurnPassword, |
- cricket::ProtocolAddress(rtc::SocketAddress( |
- "www.google.invalid", 3478), cricket::PROTO_UDP)); |
+ ProtocolAddress(rtc::SocketAddress("www.google.invalid", 3478), |
+ PROTO_UDP)); |
turn_port_->PrepareAddress(); |
ASSERT_TRUE_WAIT(turn_error_, kResolverTimeout); |
EXPECT_TRUE(turn_port_->Candidates().empty()); |
turn_port_.reset(); |
rtc::Thread::Current()->Post(RTC_FROM_HERE, this, MSG_TESTFINISH); |
// Waiting for above message to be processed. |
- ASSERT_TRUE_WAIT(test_finish_, kTimeout); |
+ ASSERT_TRUE_SIMULATED_WAIT(test_finish_, 1, fake_clock_); |
EXPECT_EQ(last_fd_count, GetFDCount()); |
} |
#endif |
+ |
+} // namespace cricket |