| Index: webrtc/p2p/base/turnport_unittest.cc
|
| diff --git a/webrtc/p2p/base/turnport_unittest.cc b/webrtc/p2p/base/turnport_unittest.cc
|
| index d6d75aad09e18cc57e246b7124af5228499af434..0e415a28147e4e9a6f9ef73b8fad56bba1f2caf3 100644
|
| --- a/webrtc/p2p/base/turnport_unittest.cc
|
| +++ b/webrtc/p2p/base/turnport_unittest.cc
|
| @@ -195,6 +195,7 @@
|
| const rtc::PacketTime& packet_time) {
|
| udp_packets_.push_back(rtc::Buffer(data, size));
|
| }
|
| + void OnConnectionDestroyed(Connection* conn) { connection_destroyed_ = true; }
|
| void OnSocketReadPacket(rtc::AsyncPacketSocket* socket,
|
| const char* data, size_t size,
|
| const rtc::SocketAddress& remote_addr,
|
| @@ -281,6 +282,9 @@
|
| turn_port_->SignalTurnRefreshResult.connect(
|
| this, &TurnPortTest::OnTurnRefreshResult);
|
| }
|
| + void ConnectConnectionDestroyedSignal(Connection* conn) {
|
| + conn->SignalDestroyed.connect(this, &TurnPortTest::OnConnectionDestroyed);
|
| + }
|
|
|
| void CreateUdpPort() { CreateUdpPort(kLocalAddr2); }
|
|
|
| @@ -305,23 +309,10 @@
|
| ASSERT_TRUE_WAIT(udp_ready_, kTimeout);
|
| }
|
|
|
| - bool CheckConnectionFailedAndPruned(Connection* conn) {
|
| - return conn && !conn->active() && conn->state() == Connection::STATE_FAILED;
|
| - }
|
| -
|
| - // Checks that |turn_port_| has a nonempty set of connections and they are all
|
| - // failed and pruned.
|
| - bool CheckAllConnectionsFailedAndPruned() {
|
| - auto& connections = turn_port_->connections();
|
| - if (connections.empty()) {
|
| - return false;
|
| - }
|
| - for (auto kv : connections) {
|
| - if (!CheckConnectionFailedAndPruned(kv.second)) {
|
| - return false;
|
| - }
|
| - }
|
| - return true;
|
| + bool CheckConnectionDestroyed() {
|
| + turn_port_->FlushRequests(cricket::kAllRequests);
|
| + rtc::Thread::Current()->ProcessMessages(50);
|
| + return connection_destroyed_;
|
| }
|
|
|
| void TestTurnAlternateServer(cricket::ProtocolType protocol_type) {
|
| @@ -533,6 +524,7 @@
|
| bool udp_ready_;
|
| bool test_finish_;
|
| bool turn_refresh_success_ = false;
|
| + bool connection_destroyed_ = false;
|
| std::vector<rtc::Buffer> turn_packets_;
|
| std::vector<rtc::Buffer> udp_packets_;
|
| rtc::PacketOptions options;
|
| @@ -741,7 +733,6 @@
|
| }
|
|
|
| TEST_F(TurnPortTest, TestRefreshRequestGetsErrorResponse) {
|
| - rtc::ScopedFakeClock clock;
|
| CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
|
| PrepareTurnAndUdpPorts();
|
| turn_port_->CreateConnection(udp_port_->Candidates()[0],
|
| @@ -754,14 +745,13 @@
|
| // 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);
|
| + EXPECT_TRUE_WAIT(turn_refresh_success_, kTimeout);
|
| // 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);
|
| + EXPECT_TRUE_WAIT(!turn_refresh_success_, kTimeout);
|
| + EXPECT_TRUE_WAIT(!turn_port_->connected(), kTimeout);
|
| + EXPECT_TRUE_WAIT(turn_port_->connections().empty(), kTimeout);
|
| + EXPECT_FALSE(turn_port_->HasRequests());
|
| }
|
|
|
| // Test that TurnPort will not handle any incoming packets once it has been
|
| @@ -806,20 +796,6 @@
|
| ASSERT_TRUE(conn1 == NULL);
|
| }
|
|
|
| -// 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);
|
| - CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr);
|
| - PrepareTurnAndUdpPorts();
|
| - 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);
|
| -}
|
| -
|
| // Test try-alternate-server feature.
|
| TEST_F(TurnPortTest, TestTurnAlternateServerUDP) {
|
| TestTurnAlternateServer(cricket::PROTO_UDP);
|
| @@ -923,8 +899,9 @@
|
|
|
| Connection* conn = turn_port_->CreateConnection(udp_port_->Candidates()[0],
|
| Port::ORIGIN_MESSAGE);
|
| + ConnectConnectionDestroyedSignal(conn);
|
| ASSERT_TRUE(conn != NULL);
|
| - EXPECT_TRUE_WAIT(turn_create_permission_success_, kTimeout);
|
| + ASSERT_TRUE_WAIT(turn_create_permission_success_, kTimeout);
|
| turn_create_permission_success_ = false;
|
| // A create-permission-request should be pending.
|
| // After the next create-permission-response is received, it will schedule
|
| @@ -932,15 +909,14 @@
|
| cricket::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);
|
| + ASSERT_TRUE_WAIT(turn_create_permission_success_, kTimeout);
|
| // 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);
|
| + EXPECT_TRUE_WAIT(connection_destroyed_, kTimeout);
|
| }
|
|
|
| TEST_F(TurnPortTest, TestChannelBindGetErrorResponse) {
|
| - rtc::ScopedFakeClock clock;
|
| CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
|
| PrepareTurnAndUdpPorts();
|
| Connection* conn1 = turn_port_->CreateConnection(udp_port_->Candidates()[0],
|
| @@ -948,25 +924,18 @@
|
| ASSERT_TRUE(conn1 != nullptr);
|
| Connection* conn2 = udp_port_->CreateConnection(turn_port_->Candidates()[0],
|
| Port::ORIGIN_MESSAGE);
|
| -
|
| ASSERT_TRUE(conn2 != nullptr);
|
| + ConnectConnectionDestroyedSignal(conn1);
|
| conn1->Ping(0);
|
| - EXPECT_TRUE_SIMULATED_WAIT(conn1->writable(), kTimeout, clock);
|
| + ASSERT_TRUE_WAIT(conn1->writable(), kTimeout);
|
| +
|
| + std::string data = "ABC";
|
| + conn1->Send(data.data(), data.length(), options);
|
| bool success =
|
| turn_port_->SetEntryChannelId(udp_port_->Candidates()[0].address(), -1);
|
| ASSERT_TRUE(success);
|
| -
|
| - std::string data = "ABC";
|
| - conn1->Send(data.data(), data.length(), options);
|
| -
|
| - EXPECT_TRUE_SIMULATED_WAIT(CheckConnectionFailedAndPruned(conn1), kTimeout,
|
| - 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);
|
| - EXPECT_TRUE(udp_packets_.empty());
|
| + // Next time when the binding request is sent, it will get an ErrorResponse.
|
| + EXPECT_TRUE_WAIT(CheckConnectionDestroyed(), kTimeout);
|
| }
|
|
|
| // Do a TURN allocation, establish a UDP connection, and send some data.
|
| @@ -1026,32 +995,26 @@
|
| }
|
|
|
| // 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);
|
| +// 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();
|
| - EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kTimeout, clock);
|
| + ASSERT_TRUE_WAIT(turn_ready_, kTimeout);
|
|
|
| CreateUdpPort(SocketAddress("10.0.0.10", 0));
|
| udp_port_->PrepareAddress();
|
| - EXPECT_TRUE_SIMULATED_WAIT(udp_ready_, kTimeout, clock);
|
| + ASSERT_TRUE_WAIT(udp_ready_, kTimeout);
|
| // Create a connection.
|
| TestConnectionWrapper conn(turn_port_->CreateConnection(
|
| udp_port_->Candidates()[0], Port::ORIGIN_MESSAGE));
|
| - EXPECT_TRUE(conn.connection() != nullptr);
|
| -
|
| - // 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);
|
| - // Check that the connection is not deleted asynchronously.
|
| - SIMULATED_WAIT(conn.connection() == nullptr, kTimeout, clock);
|
| - EXPECT_TRUE(conn.connection() != nullptr);
|
| + 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.
|
|
|