| Index: webrtc/p2p/base/turnport_unittest.cc
|
| diff --git a/webrtc/p2p/base/turnport_unittest.cc b/webrtc/p2p/base/turnport_unittest.cc
|
| index 484b152430ecce264eb7c070cc3b8b85433cc957..dcc88bba14f7627130dcd41613b703fb0ee0ffca 100644
|
| --- a/webrtc/p2p/base/turnport_unittest.cc
|
| +++ b/webrtc/p2p/base/turnport_unittest.cc
|
| @@ -385,6 +385,48 @@ class TurnPortTest : public testing::Test,
|
| EXPECT_TRUE(conn2->receiving());
|
| }
|
|
|
| + void TestDestroyTurnConnection() {
|
| + turn_port_->PrepareAddress();
|
| + ASSERT_TRUE_WAIT(turn_ready_, kTimeout);
|
| + // Create a remote UDP port
|
| + CreateUdpPort();
|
| + udp_port_->PrepareAddress();
|
| + ASSERT_TRUE_WAIT(udp_ready_, kTimeout);
|
| +
|
| + // Create connections on both ends.
|
| + Connection* conn1 = udp_port_->CreateConnection(turn_port_->Candidates()[0],
|
| + Port::ORIGIN_MESSAGE);
|
| + Connection* conn2 = turn_port_->CreateConnection(udp_port_->Candidates()[0],
|
| + Port::ORIGIN_MESSAGE);
|
| + ASSERT_TRUE(conn2 != NULL);
|
| + ASSERT_TRUE_WAIT(turn_create_permission_success_, kTimeout);
|
| + // Make sure turn connection can receive.
|
| + conn1->Ping(0);
|
| + EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, conn1->write_state(), kTimeout);
|
| + 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.
|
| + conn2->Destroy();
|
| + conn1->Ping(0);
|
| + EXPECT_TRUE_WAIT(turn_unknown_address_, kTimeout);
|
| +
|
| + // Flush all requests in the invoker to destroy the TurnEntry.
|
| + // Now the turn port cannot receive the ping.
|
| + turn_unknown_address_ = false;
|
| + turn_port_->invoker()->Flush(rtc::Thread::Current());
|
| + conn1->Ping(0);
|
| + rtc::Thread::Current()->ProcessMessages(500);
|
| + EXPECT_FALSE(turn_unknown_address_);
|
| +
|
| + // 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_FALSE(turn_unknown_address_);
|
| + }
|
| +
|
| void TestTurnSendData() {
|
| turn_port_->PrepareAddress();
|
| EXPECT_TRUE_WAIT(turn_ready_, kTimeout);
|
| @@ -694,6 +736,20 @@ TEST_F(TurnPortTest, TestTurnTcpConnection) {
|
| TestTurnConnection();
|
| }
|
|
|
| +// Test that if a connection on a TURN port is destroyed, the TURN port can
|
| +// still receive ping on that connection as if it is from an unknown address.
|
| +// If the connection is created again, it will be used to receive ping.
|
| +TEST_F(TurnPortTest, TestDestroyTurnConnection) {
|
| + CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
|
| + TestDestroyTurnConnection();
|
| +}
|
| +
|
| +// Similar to above, except that this test will use the shared socket.
|
| +TEST_F(TurnPortTest, TestDestroyTurnConnectionUsingSharedSocket) {
|
| + CreateSharedTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
|
| + TestDestroyTurnConnection();
|
| +}
|
| +
|
| // 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) {
|
|
|