Index: webrtc/p2p/base/p2ptransportchannel_unittest.cc |
diff --git a/webrtc/p2p/base/p2ptransportchannel_unittest.cc b/webrtc/p2p/base/p2ptransportchannel_unittest.cc |
index 7e65b4baba93d22a4cac78b71b31705229006f04..76da261b12ccba9f59043537789e5dcb0735902d 100644 |
--- a/webrtc/p2p/base/p2ptransportchannel_unittest.cc |
+++ b/webrtc/p2p/base/p2ptransportchannel_unittest.cc |
@@ -2813,7 +2813,7 @@ class P2PTransportChannelPingTest : public testing::Test, |
return GetConnectionTo(ch, ip, port_num); |
} |
- Port* GetPort(P2PTransportChannel* ch) { |
+ Port* GetFirstPort(P2PTransportChannel* ch) { |
if (ch->ports().empty()) { |
return nullptr; |
} |
@@ -2830,11 +2830,13 @@ class P2PTransportChannelPingTest : public testing::Test, |
Connection* GetConnectionTo(P2PTransportChannel* ch, |
const std::string& ip, |
int port_num) { |
- Port* port = GetPort(ch); |
- if (!port) { |
- return nullptr; |
+ for (PortInterface* port : ch->ports()) { |
+ Connection* conn = port->GetConnection(rtc::SocketAddress(ip, port_num)); |
+ if (conn != nullptr) { |
+ return conn; |
+ } |
} |
- return port->GetConnection(rtc::SocketAddress(ip, port_num)); |
+ return nullptr; |
} |
Connection* FindNextPingableConnectionAndPingIt(P2PTransportChannel* ch) { |
@@ -3091,7 +3093,7 @@ TEST_F(P2PTransportChannelPingTest, PingingStartedAsSoonAsPossible) { |
uint32_t prflx_priority = ICE_TYPE_PREFERENCE_PRFLX << 24; |
request.AddAttribute( |
new StunUInt32Attribute(STUN_ATTR_PRIORITY, prflx_priority)); |
- Port* port = GetPort(&ch); |
+ Port* port = GetFirstPort(&ch); |
ASSERT_NE(nullptr, port); |
port->SignalUnknownAddress(port, rtc::SocketAddress("1.1.1.1", 1), PROTO_UDP, |
&request, kIceUfrag[1], false); |
@@ -3260,7 +3262,7 @@ TEST_F(P2PTransportChannelPingTest, ConnectionResurrection) { |
new StunUInt32Attribute(STUN_ATTR_PRIORITY, prflx_priority)); |
EXPECT_NE(prflx_priority, remote_priority); |
- Port* port = GetPort(&ch); |
+ Port* port = GetFirstPort(&ch); |
// conn1 should be resurrected with original priority. |
port->SignalUnknownAddress(port, rtc::SocketAddress("1.1.1.1", 1), PROTO_UDP, |
&request, kIceUfrag[1], false); |
@@ -3399,7 +3401,7 @@ TEST_F(P2PTransportChannelPingTest, TestSelectConnectionFromUnknownAddress) { |
uint32_t prflx_priority = ICE_TYPE_PREFERENCE_PRFLX << 24; |
request.AddAttribute( |
new StunUInt32Attribute(STUN_ATTR_PRIORITY, prflx_priority)); |
- TestUDPPort* port = static_cast<TestUDPPort*>(GetPort(&ch)); |
+ TestUDPPort* port = static_cast<TestUDPPort*>(GetFirstPort(&ch)); |
port->SignalUnknownAddress(port, rtc::SocketAddress("1.1.1.1", 1), PROTO_UDP, |
&request, kIceUfrag[1], false); |
Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); |
@@ -3497,7 +3499,7 @@ TEST_F(P2PTransportChannelPingTest, TestSelectConnectionBasedOnMediaReceived) { |
request.AddAttribute( |
new StunUInt32Attribute(STUN_ATTR_PRIORITY, prflx_priority)); |
request.AddAttribute(new StunByteStringAttribute(STUN_ATTR_USE_CANDIDATE)); |
- Port* port = GetPort(&ch); |
+ Port* port = GetFirstPort(&ch); |
port->SignalUnknownAddress(port, rtc::SocketAddress("3.3.3.3", 3), PROTO_UDP, |
&request, kIceUfrag[1], false); |
Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3); |
@@ -3872,6 +3874,31 @@ TEST_F(P2PTransportChannelPingTest, TestConnectionPrunedAgain) { |
EXPECT_EQ(TransportChannelState::STATE_COMPLETED, ch.GetState()); |
} |
+TEST_F(P2PTransportChannelPingTest, TestPruneConnectionsByNetworkName) { |
+ std::string ipv4_addr("1.1.1.1"); |
+ std::string ipv6_addr("2400:1:2:3:4:5:6:7"); |
+ FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
+ pa.set_ipv6_enabled(true); |
+ pa.set_flags(PORTALLOCATOR_ENABLE_IPV6); |
+ P2PTransportChannel ch("test channel", 1, &pa); |
+ PrepareChannel(&ch); |
+ ch.MaybeStartGathering(); |
+ ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, ipv4_addr, 1, 100)); |
+ ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, ipv6_addr, 1, 100)); |
+ Connection* conn1 = WaitForConnectionTo(&ch, ipv4_addr, 1); |
+ ASSERT_TRUE(conn1 != nullptr); |
+ Connection* conn2 = WaitForConnectionTo(&ch, ipv6_addr, 1); |
+ ASSERT_TRUE(conn2 != nullptr); |
+ conn1->ReceivedPingResponse(LOW_RTT, "id"); |
+ EXPECT_EQ_WAIT(conn1, ch.selected_connection(), kDefaultTimeout); |
+ conn2->ReceivedPingResponse(LOW_RTT, "id"); |
+ // IPv6 connection has higher priority. |
+ EXPECT_EQ_WAIT(conn2, ch.selected_connection(), kDefaultTimeout); |
+ // Since conn1 and conn2 are on networks with the same network name, |
+ // conn1 will be pruned when conn2 becomes writable and receiving. |
+ EXPECT_FALSE(conn1->writable()); |
+} |
+ |
// Test that if all connections in a channel has timed out on writing, they |
// will all be deleted. We use Prune to simulate write_time_out. |
TEST_F(P2PTransportChannelPingTest, TestDeleteConnectionsIfAllWriteTimedout) { |
@@ -4006,12 +4033,12 @@ TEST_F(P2PTransportChannelPingTest, TestPortDestroyedAfterTimeoutAndPruned) { |
} |
EXPECT_EQ(nullptr, GetConnectionTo(&ch, "1.1.1.1", 1)); |
// Port will not be removed because it is not pruned yet. |
- PortInterface* port = GetPort(&ch); |
+ PortInterface* port = GetFirstPort(&ch); |
ASSERT_NE(nullptr, port); |
// If the session prunes all ports, the port will be destroyed. |
ch.allocator_session()->PruneAllPorts(); |
- EXPECT_EQ_SIMULATED_WAIT(nullptr, GetPort(&ch), 1, fake_clock); |
+ EXPECT_EQ_SIMULATED_WAIT(nullptr, GetFirstPort(&ch), 1, fake_clock); |
EXPECT_EQ_SIMULATED_WAIT(nullptr, GetPrunedPort(&ch), 1, fake_clock); |
} |