Index: webrtc/p2p/base/turnport_unittest.cc |
diff --git a/webrtc/p2p/base/turnport_unittest.cc b/webrtc/p2p/base/turnport_unittest.cc |
index 724485ddde05b70fac6a1fc06331b74c4d058f7c..abf60692ad1faddf560cda3c950e4e12205031dd 100644 |
--- a/webrtc/p2p/base/turnport_unittest.cc |
+++ b/webrtc/p2p/base/turnport_unittest.cc |
@@ -100,6 +100,24 @@ class TurnPortTestVirtualSocketServer : public rtc::VirtualSocketServer { |
using rtc::VirtualSocketServer::LookupBinding; |
}; |
+class TestConnectionWrapper : public sigslot::has_slots<> { |
+ public: |
+ TestConnectionWrapper(Connection* conn) : connection_(conn) { |
+ conn->SignalDestroyed.connect( |
+ this, &TestConnectionWrapper::OnConnectionDestroyed); |
+ } |
+ |
+ Connection* connection() { return connection_; } |
+ |
+ private: |
+ void OnConnectionDestroyed(Connection* conn) { |
+ ASSERT_TRUE(conn == connection_); |
+ connection_ = nullptr; |
+ } |
+ |
+ Connection* connection_; |
+}; |
+ |
class TurnPortTest : public testing::Test, |
public sigslot::has_slots<>, |
public rtc::MessageHandler { |
@@ -256,11 +274,13 @@ class TurnPortTest : public testing::Test, |
turn_port_->SignalCreatePermissionResult.connect(this, |
&TurnPortTest::OnTurnCreatePermissionResult); |
} |
- void CreateUdpPort() { |
+ |
+ void CreateUdpPort() { CreateUdpPort(kLocalAddr2); } |
+ |
+ void CreateUdpPort(const SocketAddress& address) { |
udp_port_.reset(UDPPort::Create(main_, &socket_factory_, &network_, |
- kLocalAddr2.ipaddr(), 0, 0, |
- kIceUfrag2, kIcePwd2, |
- std::string(), false)); |
+ address.ipaddr(), 0, 0, kIceUfrag2, |
+ kIcePwd2, std::string(), false)); |
// UDP port will be controlled. |
udp_port_->SetIceRole(cricket::ICEROLE_CONTROLLED); |
udp_port_->SignalPortComplete.connect( |
@@ -771,6 +791,29 @@ TEST_F(TurnPortTest, TestOriginHeader) { |
EXPECT_EQ(kTestOrigin, turn_server_.FindAllocation(local_address)->origin()); |
} |
+// Test that a CreatePermission failure will result in the connection being |
+// destroyed. |
+TEST_F(TurnPortTest, TestConnectionDestroyedOnCreatePermissionFailure) { |
+ turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); |
+ turn_server_.server()->set_reject_private_addresses(true); |
+ CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
+ turn_port_->PrepareAddress(); |
+ ASSERT_TRUE_WAIT(turn_ready_, kTimeout); |
+ |
+ CreateUdpPort(SocketAddress("10.0.0.10", 0)); |
+ udp_port_->PrepareAddress(); |
+ ASSERT_TRUE_WAIT(udp_ready_, kTimeout); |
+ // Create a connection. |
+ TestConnectionWrapper conn(turn_port_->CreateConnection( |
+ udp_port_->Candidates()[0], Port::ORIGIN_MESSAGE)); |
+ ASSERT_TRUE(conn.connection() != nullptr); |
+ |
+ // Asynchronously, CreatePermission request should be sent and fail, closing |
+ // the connection. |
+ EXPECT_TRUE_WAIT(conn.connection() == nullptr, kTimeout); |
+ EXPECT_FALSE(turn_create_permission_success_); |
+} |
+ |
// Test that a TURN allocation is released when the port is closed. |
TEST_F(TurnPortTest, TestTurnReleaseAllocation) { |
CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |