Index: webrtc/p2p/base/p2ptransportchannel_unittest.cc |
diff --git a/webrtc/p2p/base/p2ptransportchannel_unittest.cc b/webrtc/p2p/base/p2ptransportchannel_unittest.cc |
index cbf5e76a7ae23a13376e6f8aa76ad10559978fbe..e4cccf75b9ca8ece3708c232578b137e326b081b 100644 |
--- a/webrtc/p2p/base/p2ptransportchannel_unittest.cc |
+++ b/webrtc/p2p/base/p2ptransportchannel_unittest.cc |
@@ -529,8 +529,7 @@ class P2PTransportChannelTestBase : public testing::Test, |
// Allow a few turns of the crank for the best connections to emerge. |
// This may take up to 2 seconds. |
- if (ep1_ch1()->best_connection() && |
- ep2_ch1()->best_connection()) { |
+ if (ep1_ch1()->selected_connection() && ep2_ch1()->selected_connection()) { |
int64_t converge_start = rtc::TimeMillis(); |
int64_t converge_time; |
int64_t converge_wait = 2000; |
@@ -640,8 +639,8 @@ class P2PTransportChannelTestBase : public testing::Test, |
ep2_ch1()->writable(), |
1000); |
- EXPECT_TRUE(ep1_ch1()->best_connection() && |
- ep2_ch1()->best_connection()); |
+ EXPECT_TRUE(ep1_ch1()->selected_connection() && |
+ ep2_ch1()->selected_connection()); |
TestSendRecv(1); |
} |
@@ -752,13 +751,15 @@ class P2PTransportChannelTestBase : public testing::Test, |
} |
static const cricket::Candidate* LocalCandidate( |
cricket::P2PTransportChannel* ch) { |
- return (ch && ch->best_connection()) ? |
- &ch->best_connection()->local_candidate() : NULL; |
+ return (ch && ch->selected_connection()) |
+ ? &ch->selected_connection()->local_candidate() |
+ : NULL; |
} |
static const cricket::Candidate* RemoteCandidate( |
cricket::P2PTransportChannel* ch) { |
- return (ch && ch->best_connection()) ? |
- &ch->best_connection()->remote_candidate() : NULL; |
+ return (ch && ch->selected_connection()) |
+ ? &ch->selected_connection()->remote_candidate() |
+ : NULL; |
} |
Endpoint* GetEndpoint(cricket::TransportChannel* ch) { |
if (ep1_.HasChannel(ch)) { |
@@ -1116,16 +1117,19 @@ TEST_F(P2PTransportChannelTest, PeerReflexiveCandidateBeforeSignaling) { |
// The caller should have the best connection connected to the peer reflexive |
Taylor Brandstetter
2016/06/21 18:33:26
s/best connection/selected connnection/g
honghaiz3
2016/06/22 08:03:16
Done.
|
// candidate. |
- const cricket::Connection* best_connection = NULL; |
- WAIT((best_connection = ep1_ch1()->best_connection()) != NULL, 2000); |
- EXPECT_EQ("prflx", ep1_ch1()->best_connection()->remote_candidate().type()); |
+ const cricket::Connection* selected_connection = NULL; |
+ WAIT((selected_connection = ep1_ch1()->selected_connection()) != NULL, 2000); |
+ EXPECT_EQ("prflx", |
+ ep1_ch1()->selected_connection()->remote_candidate().type()); |
// Because we don't have a remote pwd, we don't ping yet. |
EXPECT_EQ(kIceUfrag[1], |
- ep1_ch1()->best_connection()->remote_candidate().username()); |
- EXPECT_EQ("", ep1_ch1()->best_connection()->remote_candidate().password()); |
+ ep1_ch1()->selected_connection()->remote_candidate().username()); |
+ EXPECT_EQ("", |
+ ep1_ch1()->selected_connection()->remote_candidate().password()); |
// Because we don't have ICE credentials yet, we don't know the generation. |
- EXPECT_EQ(0u, ep1_ch1()->best_connection()->remote_candidate().generation()); |
+ EXPECT_EQ(0u, |
+ ep1_ch1()->selected_connection()->remote_candidate().generation()); |
EXPECT_TRUE(nullptr == ep1_ch1()->FindNextPingableConnection()); |
// Add two sets of remote ICE credentials, so that the ones used by the |
@@ -1135,19 +1139,19 @@ TEST_F(P2PTransportChannelTest, PeerReflexiveCandidateBeforeSignaling) { |
// After setting the remote ICE credentials, the password and generation |
// of the peer reflexive candidate should be updated. |
EXPECT_EQ(kIcePwd[1], |
- ep1_ch1()->best_connection()->remote_candidate().password()); |
- EXPECT_EQ(1u, ep1_ch1()->best_connection()->remote_candidate().generation()); |
+ ep1_ch1()->selected_connection()->remote_candidate().password()); |
+ EXPECT_EQ(1u, |
+ ep1_ch1()->selected_connection()->remote_candidate().generation()); |
EXPECT_TRUE(nullptr != ep1_ch1()->FindNextPingableConnection()); |
ResumeCandidates(1); |
- WAIT(ep2_ch1()->best_connection() != NULL, 2000); |
+ WAIT(ep2_ch1()->selected_connection() != NULL, 2000); |
// Verify ep1's best connection is updated to use the 'local' candidate. |
- EXPECT_EQ_WAIT( |
- "local", |
- ep1_ch1()->best_connection()->remote_candidate().type(), |
- 2000); |
- EXPECT_EQ(best_connection, ep1_ch1()->best_connection()); |
+ EXPECT_EQ_WAIT("local", |
+ ep1_ch1()->selected_connection()->remote_candidate().type(), |
+ 2000); |
+ EXPECT_EQ(selected_connection, ep1_ch1()->selected_connection()); |
DestroyChannels(); |
} |
@@ -1167,15 +1171,18 @@ TEST_F(P2PTransportChannelTest, PeerReflexiveCandidateBeforeSignalingWithNAT) { |
// The caller should have the best connection connected to the peer reflexive |
// candidate. |
- WAIT(ep1_ch1()->best_connection() != NULL, 2000); |
- EXPECT_EQ("prflx", ep1_ch1()->best_connection()->remote_candidate().type()); |
+ WAIT(ep1_ch1()->selected_connection() != NULL, 2000); |
+ EXPECT_EQ("prflx", |
+ ep1_ch1()->selected_connection()->remote_candidate().type()); |
// Because we don't have a remote pwd, we don't ping yet. |
EXPECT_EQ(kIceUfrag[1], |
- ep1_ch1()->best_connection()->remote_candidate().username()); |
- EXPECT_EQ("", ep1_ch1()->best_connection()->remote_candidate().password()); |
+ ep1_ch1()->selected_connection()->remote_candidate().username()); |
+ EXPECT_EQ("", |
+ ep1_ch1()->selected_connection()->remote_candidate().password()); |
// Because we don't have ICE credentials yet, we don't know the generation. |
- EXPECT_EQ(0u, ep1_ch1()->best_connection()->remote_candidate().generation()); |
+ EXPECT_EQ(0u, |
+ ep1_ch1()->selected_connection()->remote_candidate().generation()); |
EXPECT_TRUE(nullptr == ep1_ch1()->FindNextPingableConnection()); |
// Add two sets of remote ICE credentials, so that the ones used by the |
@@ -1185,18 +1192,20 @@ TEST_F(P2PTransportChannelTest, PeerReflexiveCandidateBeforeSignalingWithNAT) { |
// After setting the remote ICE credentials, the password and generation |
// of the peer reflexive candidate should be updated. |
EXPECT_EQ(kIcePwd[1], |
- ep1_ch1()->best_connection()->remote_candidate().password()); |
- EXPECT_EQ(1u, ep1_ch1()->best_connection()->remote_candidate().generation()); |
+ ep1_ch1()->selected_connection()->remote_candidate().password()); |
+ EXPECT_EQ(1u, |
+ ep1_ch1()->selected_connection()->remote_candidate().generation()); |
ResumeCandidates(1); |
- const cricket::Connection* best_connection = NULL; |
- WAIT((best_connection = ep2_ch1()->best_connection()) != NULL, 2000); |
+ const cricket::Connection* selected_connection = NULL; |
+ WAIT((selected_connection = ep2_ch1()->selected_connection()) != NULL, 2000); |
// Wait to verify the connection is not culled. |
WAIT(ep1_ch1()->writable(), 2000); |
- EXPECT_EQ(ep2_ch1()->best_connection(), best_connection); |
- EXPECT_EQ("prflx", ep1_ch1()->best_connection()->remote_candidate().type()); |
+ EXPECT_EQ(ep2_ch1()->selected_connection(), selected_connection); |
+ EXPECT_EQ("prflx", |
+ ep1_ch1()->selected_connection()->remote_candidate().type()); |
DestroyChannels(); |
} |
@@ -1206,12 +1215,12 @@ TEST_F(P2PTransportChannelTest, RemoteCandidatesWithoutUfragPwd) { |
ConfigureEndpoints(OPEN, OPEN, kDefaultPortAllocatorFlags, |
kDefaultPortAllocatorFlags); |
CreateChannels(1); |
- const cricket::Connection* best_connection = NULL; |
+ const cricket::Connection* selected_connection = NULL; |
// Wait until the callee's connections are created. |
- WAIT((best_connection = ep2_ch1()->best_connection()) != NULL, 1000); |
+ WAIT((selected_connection = ep2_ch1()->selected_connection()) != NULL, 1000); |
// Wait to see if they get culled; they shouldn't. |
- WAIT(ep2_ch1()->best_connection() != best_connection, 1000); |
- EXPECT_TRUE(ep2_ch1()->best_connection() == best_connection); |
+ WAIT(ep2_ch1()->selected_connection() != selected_connection, 1000); |
+ EXPECT_TRUE(ep2_ch1()->selected_connection() == selected_connection); |
DestroyChannels(); |
} |
@@ -1287,10 +1296,10 @@ TEST_F(P2PTransportChannelTest, TestTcpConnectionsFromActiveToPassive) { |
EXPECT_TRUE_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() && |
ep2_ch1()->receiving() && ep2_ch1()->writable(), |
1000); |
- EXPECT_TRUE( |
- ep1_ch1()->best_connection() && ep2_ch1()->best_connection() && |
- LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && |
- RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1])); |
+ EXPECT_TRUE(ep1_ch1()->selected_connection() && |
+ ep2_ch1()->selected_connection() && |
+ LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && |
+ RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1])); |
TestSendRecv(1); |
DestroyChannels(); |
@@ -1340,8 +1349,8 @@ TEST_F(P2PTransportChannelTest, TestIceConfigWillPassDownToPort) { |
ep2_ch1()->writable(), |
1000); |
- EXPECT_TRUE(ep1_ch1()->best_connection() && |
- ep2_ch1()->best_connection()); |
+ EXPECT_TRUE(ep1_ch1()->selected_connection() && |
+ ep2_ch1()->selected_connection()); |
TestSendRecv(1); |
DestroyChannels(); |
@@ -1395,7 +1404,7 @@ TEST_F(P2PTransportChannelTest, TestIPv6Connections) { |
ep2_ch1()->receiving() && ep2_ch1()->writable(), |
1000); |
EXPECT_TRUE( |
- ep1_ch1()->best_connection() && ep2_ch1()->best_connection() && |
+ ep1_ch1()->selected_connection() && ep2_ch1()->selected_connection() && |
LocalCandidate(ep1_ch1())->address().EqualIPs(kIPv6PublicAddrs[0]) && |
RemoteCandidate(ep1_ch1())->address().EqualIPs(kIPv6PublicAddrs[1])); |
@@ -1420,8 +1429,8 @@ TEST_F(P2PTransportChannelTest, TestForceTurn) { |
ep2_ch1()->receiving() && ep2_ch1()->writable(), |
2000); |
- EXPECT_TRUE(ep1_ch1()->best_connection() && |
- ep2_ch1()->best_connection()); |
+ EXPECT_TRUE(ep1_ch1()->selected_connection() && |
+ ep2_ch1()->selected_connection()); |
EXPECT_EQ("relay", RemoteCandidate(ep1_ch1())->type()); |
EXPECT_EQ("relay", LocalCandidate(ep1_ch1())->type()); |
@@ -1497,10 +1506,10 @@ TEST_F(P2PTransportChannelTest, TestUsingPooledSessionBeforeDoneGathering) { |
auto pooled_ports_2 = pooled_session_2->ReadyPorts(); |
EXPECT_NE(pooled_ports_1.end(), |
std::find(pooled_ports_1.begin(), pooled_ports_1.end(), |
- ep1_ch1()->best_connection()->port())); |
+ ep1_ch1()->selected_connection()->port())); |
EXPECT_NE(pooled_ports_2.end(), |
std::find(pooled_ports_2.begin(), pooled_ports_2.end(), |
- ep2_ch1()->best_connection()->port())); |
+ ep2_ch1()->selected_connection()->port())); |
} |
// Test that a connection succeeds when the P2PTransportChannel uses a pooled |
@@ -1540,10 +1549,10 @@ TEST_F(P2PTransportChannelTest, TestUsingPooledSessionAfterDoneGathering) { |
auto pooled_ports_2 = pooled_session_2->ReadyPorts(); |
EXPECT_NE(pooled_ports_1.end(), |
std::find(pooled_ports_1.begin(), pooled_ports_1.end(), |
- ep1_ch1()->best_connection()->port())); |
+ ep1_ch1()->selected_connection()->port())); |
EXPECT_NE(pooled_ports_2.end(), |
std::find(pooled_ports_2.begin(), pooled_ports_2.end(), |
- ep2_ch1()->best_connection()->port())); |
+ ep2_ch1()->selected_connection()->port())); |
} |
// Test what happens when we have 2 users behind the same NAT. This can lead |
@@ -1614,10 +1623,10 @@ TEST_F(P2PTransportChannelMultihomedTest, TestFailoverControlledSide) { |
EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->receiving() && ep1_ch1()->writable() && |
ep2_ch1()->receiving() && ep2_ch1()->writable(), |
1000, 1000); |
- EXPECT_TRUE( |
- ep1_ch1()->best_connection() && ep2_ch1()->best_connection() && |
- LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && |
- RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1])); |
+ EXPECT_TRUE(ep1_ch1()->selected_connection() && |
+ ep2_ch1()->selected_connection() && |
+ LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && |
+ RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1])); |
// Make the receiving timeout shorter for testing. |
cricket::IceConfig config = CreateIceConfig(1000, false); |
@@ -1628,17 +1637,20 @@ TEST_F(P2PTransportChannelMultihomedTest, TestFailoverControlledSide) { |
LOG(LS_INFO) << "Failing over..."; |
fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, kPublicAddrs[1]); |
// The best connections will switch, so keep references to them. |
- const cricket::Connection* best_connection1 = ep1_ch1()->best_connection(); |
- const cricket::Connection* best_connection2 = ep2_ch1()->best_connection(); |
+ const cricket::Connection* selected_connection1 = |
+ ep1_ch1()->selected_connection(); |
+ const cricket::Connection* selected_connection2 = |
+ ep2_ch1()->selected_connection(); |
// We should detect loss of receiving within 1 second or so. |
EXPECT_TRUE_WAIT( |
- !best_connection1->receiving() && !best_connection2->receiving(), 3000); |
+ !selected_connection1->receiving() && !selected_connection2->receiving(), |
+ 3000); |
// We should switch over to use the alternate addr immediately on both sides |
// when we are not receiving. |
- EXPECT_TRUE_WAIT( |
- ep1_ch1()->best_connection()->receiving() && |
- ep2_ch1()->best_connection()->receiving(), 1000); |
+ EXPECT_TRUE_WAIT(ep1_ch1()->selected_connection()->receiving() && |
+ ep2_ch1()->selected_connection()->receiving(), |
+ 1000); |
EXPECT_TRUE(LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0])); |
EXPECT_TRUE( |
RemoteCandidate(ep1_ch1())->address().EqualIPs(kAlternateAddrs[1])); |
@@ -1666,10 +1678,10 @@ TEST_F(P2PTransportChannelMultihomedTest, TestFailoverControllingSide) { |
EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->receiving() && ep1_ch1()->writable() && |
ep2_ch1()->receiving() && ep2_ch1()->writable(), |
1000, 1000); |
- EXPECT_TRUE( |
- ep1_ch1()->best_connection() && ep2_ch1()->best_connection() && |
- LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && |
- RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1])); |
+ EXPECT_TRUE(ep1_ch1()->selected_connection() && |
+ ep2_ch1()->selected_connection() && |
+ LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && |
+ RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1])); |
// Make the receiving timeout shorter for testing. |
cricket::IceConfig config = CreateIceConfig(1000, false); |
@@ -1680,17 +1692,20 @@ TEST_F(P2PTransportChannelMultihomedTest, TestFailoverControllingSide) { |
LOG(LS_INFO) << "Failing over..."; |
fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, kPublicAddrs[0]); |
// The best connections will switch, so keep references to them. |
- const cricket::Connection* best_connection1 = ep1_ch1()->best_connection(); |
- const cricket::Connection* best_connection2 = ep2_ch1()->best_connection(); |
+ const cricket::Connection* selected_connection1 = |
+ ep1_ch1()->selected_connection(); |
+ const cricket::Connection* selected_connection2 = |
+ ep2_ch1()->selected_connection(); |
// We should detect loss of receiving within 1 second or so. |
EXPECT_TRUE_WAIT( |
- !best_connection1->receiving() && !best_connection2->receiving(), 3000); |
+ !selected_connection1->receiving() && !selected_connection2->receiving(), |
+ 3000); |
// We should switch over to use the alternate addr immediately on both sides |
// when we are not receiving. |
- EXPECT_TRUE_WAIT( |
- ep1_ch1()->best_connection()->receiving() && |
- ep2_ch1()->best_connection()->receiving(), 1000); |
+ EXPECT_TRUE_WAIT(ep1_ch1()->selected_connection()->receiving() && |
+ ep2_ch1()->selected_connection()->receiving(), |
+ 1000); |
EXPECT_TRUE( |
LocalCandidate(ep1_ch1())->address().EqualIPs(kAlternateAddrs[0])); |
EXPECT_TRUE(RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1])); |
@@ -1722,11 +1737,11 @@ TEST_F(P2PTransportChannelMultihomedTest, TestPreferWifiToWifiConnection) { |
ep2_ch1()->receiving() && ep2_ch1()->writable(), |
1000, 1000); |
// Need to wait to make sure the connections on both networks are writable. |
- EXPECT_TRUE_WAIT(ep1_ch1()->best_connection() && |
+ EXPECT_TRUE_WAIT(ep1_ch1()->selected_connection() && |
LocalCandidate(ep1_ch1())->address().EqualIPs(wifi[0]) && |
RemoteCandidate(ep1_ch1())->address().EqualIPs(wifi[1]), |
1000); |
- EXPECT_TRUE_WAIT(ep2_ch1()->best_connection() && |
+ EXPECT_TRUE_WAIT(ep2_ch1()->selected_connection() && |
LocalCandidate(ep2_ch1())->address().EqualIPs(wifi[1]) && |
RemoteCandidate(ep2_ch1())->address().EqualIPs(wifi[0]), |
1000); |
@@ -1754,10 +1769,10 @@ TEST_F(P2PTransportChannelMultihomedTest, TestPreferWifiOverCellularNetwork) { |
ep2_ch1()->receiving() && ep2_ch1()->writable(), |
1000, 1000); |
// Need to wait to make sure the connections on both networks are writable. |
- EXPECT_TRUE_WAIT(ep1_ch1()->best_connection() && |
+ EXPECT_TRUE_WAIT(ep1_ch1()->selected_connection() && |
RemoteCandidate(ep1_ch1())->address().EqualIPs(wifi[1]), |
1000); |
- EXPECT_TRUE_WAIT(ep2_ch1()->best_connection() && |
+ EXPECT_TRUE_WAIT(ep2_ch1()->selected_connection() && |
LocalCandidate(ep2_ch1())->address().EqualIPs(wifi[1]), |
1000); |
} |
@@ -1872,7 +1887,7 @@ TEST_F(P2PTransportChannelMultihomedTest, TestDrain) { |
ep2_ch1()->receiving() && ep2_ch1()->writable(), |
1000); |
EXPECT_TRUE( |
- ep1_ch1()->best_connection() && ep2_ch1()->best_connection() && |
+ ep1_ch1()->selected_connection() && ep2_ch1()->selected_connection() && |
LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && |
RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1])); |
@@ -1888,7 +1903,7 @@ TEST_F(P2PTransportChannelMultihomedTest, TestDrain) { |
// We should switch over to use the alternate address after |
// an exchange of pings. |
EXPECT_TRUE_WAIT( |
- ep1_ch1()->best_connection() && ep2_ch1()->best_connection() && |
+ ep1_ch1()->selected_connection() && ep2_ch1()->selected_connection() && |
LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && |
RemoteCandidate(ep1_ch1())->address().EqualIPs(kAlternateAddrs[1]), |
3000); |
@@ -1977,12 +1992,32 @@ class P2PTransportChannelPingTest : public testing::Test, |
return channel.SendPacket(data, len, options, 0); |
} |
+ cricket::Connection* CreateConnectionWithCandidate( |
+ cricket::P2PTransportChannel& channel, |
+ const std::string& ip_addr, |
+ int port, |
+ int priority, |
+ bool writable) { |
+ channel.AddRemoteCandidate(CreateHostCandidate(ip_addr, port, priority)); |
+ cricket::Connection* conn = WaitForConnectionTo(&channel, ip_addr, port); |
+ if (conn && writable) { |
+ conn->ReceivedPingResponse(); // make it writable |
+ } |
+ return conn; |
+ } |
+ |
+ void NominateConnection(cricket::Connection* conn) { |
+ conn->set_nominated(true); |
+ conn->SignalNominated(conn); |
+ } |
+ |
void OnSelectedCandidatePairChanged( |
cricket::TransportChannel* transport_channel, |
cricket::CandidatePairInterface* selected_candidate_pair, |
int last_sent_packet_id) { |
last_selected_candidate_pair_ = selected_candidate_pair; |
last_sent_packet_id_ = last_sent_packet_id; |
+ ++selected_candidate_pair_switches_; |
} |
void ReceivePingOnConnection(cricket::Connection* conn, |
@@ -2018,12 +2053,18 @@ class P2PTransportChannelPingTest : public testing::Test, |
bool channel_ready_to_send() { return channel_ready_to_send_; } |
void reset_channel_ready_to_send() { channel_ready_to_send_ = false; } |
cricket::TransportChannelState channel_state() { return channel_state_; } |
+ int get_and_reset_selected_candidate_pair_switches() { |
+ int switches = selected_candidate_pair_switches_; |
+ selected_candidate_pair_switches_ = 0; |
+ return switches; |
+ } |
private: |
std::unique_ptr<rtc::PhysicalSocketServer> pss_; |
std::unique_ptr<rtc::VirtualSocketServer> vss_; |
rtc::SocketServerScope ss_scope_; |
cricket::CandidatePairInterface* last_selected_candidate_pair_ = nullptr; |
+ int selected_candidate_pair_switches_ = 0; |
int last_sent_packet_id_ = -1; |
bool channel_ready_to_send_ = false; |
cricket::TransportChannelState channel_state_ = cricket::STATE_INIT; |
@@ -2246,7 +2287,7 @@ TEST_F(P2PTransportChannelPingTest, TestReceivingStateChange) { |
conn1->ReceivedPing(); |
conn1->OnReadPacket("ABC", 3, rtc::CreatePacketTime(0)); |
- EXPECT_TRUE_WAIT(ch.best_connection() != nullptr, 1000); |
+ EXPECT_TRUE_WAIT(ch.selected_connection() != nullptr, 1000); |
EXPECT_TRUE_WAIT(ch.receiving(), 1000); |
EXPECT_TRUE_WAIT(!ch.receiving(), 1000); |
} |
@@ -2267,7 +2308,7 @@ TEST_F(P2PTransportChannelPingTest, TestSelectConnectionBeforeNomination) { |
ch.AddRemoteCandidate(CreateHostCandidate("1.1.1.1", 1, 1)); |
cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); |
ASSERT_TRUE(conn1 != nullptr); |
- EXPECT_EQ(conn1, ch.best_connection()); |
+ EXPECT_EQ(conn1, ch.selected_connection()); |
EXPECT_EQ(conn1, last_selected_candidate_pair()); |
EXPECT_EQ(-1, last_sent_packet_id()); |
// Channel is not ready to send because it is not writable. |
@@ -2282,7 +2323,7 @@ TEST_F(P2PTransportChannelPingTest, TestSelectConnectionBeforeNomination) { |
ch.AddRemoteCandidate(CreateHostCandidate("2.2.2.2", 2, 10)); |
cricket::Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); |
ASSERT_TRUE(conn2 != nullptr); |
- EXPECT_EQ(conn2, ch.best_connection()); |
+ EXPECT_EQ(conn2, ch.selected_connection()); |
EXPECT_EQ(conn2, last_selected_candidate_pair()); |
EXPECT_EQ(last_packet_id, last_sent_packet_id()); |
EXPECT_FALSE(channel_ready_to_send()); |
@@ -2295,13 +2336,13 @@ TEST_F(P2PTransportChannelPingTest, TestSelectConnectionBeforeNomination) { |
cricket::Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3); |
ASSERT_TRUE(conn3 != nullptr); |
// Because it has a lower priority, the best connection is still conn2. |
- EXPECT_EQ(conn2, ch.best_connection()); |
+ EXPECT_EQ(conn2, ch.selected_connection()); |
conn3->ReceivedPingResponse(); // Become writable. |
// But if it is nominated via use_candidate, it is chosen as the best |
// connection. |
conn3->set_nominated(true); |
conn3->SignalNominated(conn3); |
- EXPECT_EQ(conn3, ch.best_connection()); |
+ EXPECT_EQ(conn3, ch.selected_connection()); |
EXPECT_EQ(conn3, last_selected_candidate_pair()); |
EXPECT_EQ(last_packet_id, last_sent_packet_id()); |
EXPECT_TRUE(channel_ready_to_send()); |
@@ -2313,17 +2354,17 @@ TEST_F(P2PTransportChannelPingTest, TestSelectConnectionBeforeNomination) { |
ch.AddRemoteCandidate(CreateHostCandidate("4.4.4.4", 4, 100)); |
cricket::Connection* conn4 = WaitForConnectionTo(&ch, "4.4.4.4", 4); |
ASSERT_TRUE(conn4 != nullptr); |
- EXPECT_EQ(conn3, ch.best_connection()); |
+ EXPECT_EQ(conn3, ch.selected_connection()); |
// But if it is nominated via use_candidate and writable, it will be set as |
// the best connection. |
conn4->set_nominated(true); |
conn4->SignalNominated(conn4); |
// Not switched yet because conn4 is not writable. |
- EXPECT_EQ(conn3, ch.best_connection()); |
+ EXPECT_EQ(conn3, ch.selected_connection()); |
reset_channel_ready_to_send(); |
// The best connection switches after conn4 becomes writable. |
conn4->ReceivedPingResponse(); |
- EXPECT_EQ(conn4, ch.best_connection()); |
+ EXPECT_EQ_WAIT(conn4, ch.selected_connection(), kDefaultTimeout); |
EXPECT_EQ(conn4, last_selected_candidate_pair()); |
EXPECT_EQ(last_packet_id, last_sent_packet_id()); |
// SignalReadyToSend is fired again because conn4 is writable. |
@@ -2356,9 +2397,9 @@ TEST_F(P2PTransportChannelPingTest, TestSelectConnectionFromUnknownAddress) { |
cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); |
ASSERT_TRUE(conn1 != nullptr); |
EXPECT_TRUE(port->sent_binding_response()); |
- EXPECT_EQ(conn1, ch.best_connection()); |
+ EXPECT_EQ(conn1, ch.selected_connection()); |
conn1->ReceivedPingResponse(); |
- EXPECT_EQ(conn1, ch.best_connection()); |
+ EXPECT_EQ(conn1, ch.selected_connection()); |
port->set_sent_binding_response(false); |
// Another connection is nominated via use_candidate. |
@@ -2366,13 +2407,13 @@ TEST_F(P2PTransportChannelPingTest, TestSelectConnectionFromUnknownAddress) { |
cricket::Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); |
ASSERT_TRUE(conn2 != nullptr); |
// Because it has a lower priority, the best connection is still conn1. |
- EXPECT_EQ(conn1, ch.best_connection()); |
+ EXPECT_EQ(conn1, ch.selected_connection()); |
// When it is nominated via use_candidate and writable, it is chosen as the |
// best connection. |
conn2->ReceivedPingResponse(); // Become writable. |
conn2->set_nominated(true); |
conn2->SignalNominated(conn2); |
- EXPECT_EQ(conn2, ch.best_connection()); |
+ EXPECT_EQ(conn2, ch.selected_connection()); |
// Another request with unknown address, it will not be set as the best |
// connection because the best connection was nominated by the controlling |
@@ -2383,7 +2424,7 @@ TEST_F(P2PTransportChannelPingTest, TestSelectConnectionFromUnknownAddress) { |
ASSERT_TRUE(conn3 != nullptr); |
EXPECT_TRUE(port->sent_binding_response()); |
conn3->ReceivedPingResponse(); // Become writable. |
- EXPECT_EQ(conn2, ch.best_connection()); |
+ EXPECT_EQ(conn2, ch.selected_connection()); |
port->set_sent_binding_response(false); |
// However if the request contains use_candidate attribute, it will be |
@@ -2396,9 +2437,9 @@ TEST_F(P2PTransportChannelPingTest, TestSelectConnectionFromUnknownAddress) { |
ASSERT_TRUE(conn4 != nullptr); |
EXPECT_TRUE(port->sent_binding_response()); |
// conn4 is not the best connection yet because it is not writable. |
- EXPECT_EQ(conn2, ch.best_connection()); |
+ EXPECT_EQ(conn2, ch.selected_connection()); |
conn4->ReceivedPingResponse(); // Become writable. |
- EXPECT_EQ(conn4, ch.best_connection()); |
+ EXPECT_EQ_WAIT(conn4, ch.selected_connection(), kDefaultTimeout); |
// Test that the request from an unknown address contains a ufrag from an old |
// generation. |
@@ -2427,7 +2468,7 @@ TEST_F(P2PTransportChannelPingTest, TestSelectConnectionBasedOnMediaReceived) { |
ch.AddRemoteCandidate(CreateHostCandidate("1.1.1.1", 1, 10)); |
cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); |
ASSERT_TRUE(conn1 != nullptr); |
- EXPECT_EQ(conn1, ch.best_connection()); |
+ EXPECT_EQ(conn1, ch.selected_connection()); |
// If a data packet is received on conn2, the best connection should |
// switch to conn2 because the controlled side must mirror the media path |
@@ -2436,14 +2477,9 @@ TEST_F(P2PTransportChannelPingTest, TestSelectConnectionBasedOnMediaReceived) { |
cricket::Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); |
ASSERT_TRUE(conn2 != nullptr); |
conn2->ReceivedPing(); // Start receiving. |
- // Do not switch because it is not writable. |
conn2->OnReadPacket("ABC", 3, rtc::CreatePacketTime(0)); |
- EXPECT_EQ(conn1, ch.best_connection()); |
- |
- conn2->ReceivedPingResponse(); // Become writable. |
- // Switch because it is writable. |
- conn2->OnReadPacket("DEF", 3, rtc::CreatePacketTime(0)); |
- EXPECT_EQ(conn2, ch.best_connection()); |
+ EXPECT_EQ(conn2, ch.selected_connection()); |
+ conn2->ReceivedPingResponse(); // Make it writable. |
// Now another STUN message with an unknown address and use_candidate will |
// nominate the best connection. |
@@ -2461,16 +2497,79 @@ TEST_F(P2PTransportChannelPingTest, TestSelectConnectionBasedOnMediaReceived) { |
cricket::PROTO_UDP, &request, kIceUfrag[1], false); |
cricket::Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3); |
ASSERT_TRUE(conn3 != nullptr); |
- EXPECT_EQ(conn2, ch.best_connection()); // Not writable yet. |
+ EXPECT_EQ(conn2, ch.selected_connection()); // Not writable yet. |
conn3->ReceivedPingResponse(); // Become writable. |
- EXPECT_EQ(conn3, ch.best_connection()); |
+ EXPECT_EQ_WAIT(conn3, ch.selected_connection(), kDefaultTimeout); |
// Now another data packet will not switch the best connection because the |
// best connection was nominated by the controlling side. |
conn2->ReceivedPing(); |
conn2->ReceivedPingResponse(); |
conn2->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0)); |
- EXPECT_EQ(conn3, ch.best_connection()); |
+ EXPECT_EQ_WAIT(conn3, ch.selected_connection(), kDefaultTimeout); |
+} |
+ |
+TEST_F(P2PTransportChannelPingTest, TestDonotSwitchConnectionTooFrequently) { |
Taylor Brandstetter
2016/06/21 18:33:26
Rename test to ControlledAgentDoesntSwitchConnecti
honghaiz3
2016/06/22 08:03:16
Done.
|
+ rtc::ScopedFakeClock clock; |
+ |
+ cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
+ cricket::P2PTransportChannel ch("receiving state change", 1, &pa); |
+ PrepareChannel(&ch); |
+ ch.SetIceRole(cricket::ICEROLE_CONTROLLED); |
+ ch.Connect(); |
+ ch.MaybeStartGathering(); |
+ // The connections have decreasing priority. |
+ cricket::Connection* conn1 = |
+ CreateConnectionWithCandidate(ch, "1.1.1.1", 1, 10, true); |
+ ASSERT_TRUE(conn1 != nullptr); |
+ cricket::Connection* conn2 = |
+ CreateConnectionWithCandidate(ch, "2.2.2.2", 2, 9, true); |
+ ASSERT_TRUE(conn2 != nullptr); |
+ cricket::Connection* conn3 = |
+ CreateConnectionWithCandidate(ch, "3.3.3.3", 3, 8, false); |
+ ASSERT_TRUE(conn3 != nullptr); |
+ |
+ // Simulate aggressive nomination on the controlling side. |
+ get_and_reset_selected_candidate_pair_switches(); |
+ NominateConnection(conn2); |
+ EXPECT_EQ(1, get_and_reset_selected_candidate_pair_switches()); |
+ EXPECT_EQ(conn2, last_selected_candidate_pair()); |
+ |
+ // Selected candidate pair will switch because conn1 has higher priority. |
+ NominateConnection(conn1); |
+ EXPECT_EQ(1, get_and_reset_selected_candidate_pair_switches()); |
+ EXPECT_EQ(conn1, last_selected_candidate_pair()); |
+ |
+ // Advance the clock by 1ms so that the last data receiving timestamp of |
+ // conn2 is larger. |
+ SIMULATED_WAIT(false, 1, clock); |
+ // Selected candidate pair won't switch until conn2 receives data and becomes |
+ // writable again because conn2 has lower priority and may have been pruned. |
+ NominateConnection(conn2); |
+ conn2->ReceivedPingResponse(); |
+ EXPECT_EQ(0, get_and_reset_selected_candidate_pair_switches()); |
+ // Will switch if conn2 receives data. |
+ conn2->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0)); |
+ EXPECT_EQ(1, get_and_reset_selected_candidate_pair_switches()); |
+ EXPECT_EQ(conn2, last_selected_candidate_pair()); |
+ |
+ // Advance the clock by 1ms so that the last data receiving timestamp of |
+ // conn3 is larger. |
+ SIMULATED_WAIT(false, 1, clock); |
+ // Selected candidate pair won't switch even if it is nominated and |
+ // received data because it is not writable. |
+ NominateConnection(conn3); |
+ conn3->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0)); |
+ EXPECT_EQ(0, get_and_reset_selected_candidate_pair_switches()); |
+ // It will switch if it becomes writable |
+ conn3->ReceivedPingResponse(); |
+ EXPECT_EQ_SIMULATED_WAIT(1, get_and_reset_selected_candidate_pair_switches(), |
+ kDefaultTimeout, clock); |
+ EXPECT_EQ(conn3, last_selected_candidate_pair()); |
+ |
+ // Make sure sorting won't reselect candidate pair. |
+ SIMULATED_WAIT(false, 10, clock); |
+ EXPECT_EQ(0, get_and_reset_selected_candidate_pair_switches()); |
} |
Taylor Brandstetter
2016/06/21 18:33:26
This test's expectations are good but it's testing
honghaiz3
2016/06/22 08:03:16
I break this into three, making each of them small
|
// Test that if a new remote candidate has the same address and port with |
@@ -2524,7 +2623,7 @@ TEST_F(P2PTransportChannelPingTest, TestDontPruneWhenWeak) { |
ch.AddRemoteCandidate(CreateHostCandidate("1.1.1.1", 1, 1)); |
cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); |
ASSERT_TRUE(conn1 != nullptr); |
- EXPECT_EQ(conn1, ch.best_connection()); |
+ EXPECT_EQ(conn1, ch.selected_connection()); |
conn1->ReceivedPingResponse(); // Becomes writable and receiving |
// When a higher-priority, nominated candidate comes in, the connections with |
@@ -2589,7 +2688,7 @@ TEST_F(P2PTransportChannelPingTest, TestConnectionPrunedAgain) { |
ch.AddRemoteCandidate(CreateHostCandidate("1.1.1.1", 1, 100)); |
cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); |
ASSERT_TRUE(conn1 != nullptr); |
- EXPECT_EQ(conn1, ch.best_connection()); |
+ EXPECT_EQ(conn1, ch.selected_connection()); |
conn1->ReceivedPingResponse(); // Becomes writable and receiving |
// Add a low-priority connection |conn2|, which will be pruned, but it will |
@@ -2610,12 +2709,12 @@ TEST_F(P2PTransportChannelPingTest, TestConnectionPrunedAgain) { |
ASSERT_TRUE(conn2 != nullptr); |
EXPECT_EQ_WAIT(cricket::Connection::STATE_INPROGRESS, conn2->state(), 1000); |
conn2->ReceivedPingResponse(); |
- EXPECT_EQ_WAIT(conn2, ch.best_connection(), 1000); |
+ EXPECT_EQ_WAIT(conn2, ch.selected_connection(), 1000); |
EXPECT_EQ(cricket::TransportChannelState::STATE_CONNECTING, ch.GetState()); |
// When |conn1| comes back again, |conn2| will be pruned again. |
conn1->ReceivedPingResponse(); |
- EXPECT_EQ_WAIT(conn1, ch.best_connection(), 1000); |
+ EXPECT_EQ_WAIT(conn1, ch.selected_connection(), 1000); |
EXPECT_TRUE_WAIT(!conn2->active(), 1000); |
EXPECT_EQ(cricket::TransportChannelState::STATE_COMPLETED, ch.GetState()); |
} |
@@ -2805,7 +2904,7 @@ TEST_F(P2PTransportChannelMostLikelyToWorkFirstTest, |
// Verify that conn3 will be the "best connection" since it is readable and |
// writable. After |MAX_CURRENT_STRONG_INTERVAL|, it should be the next |
// pingable connection. |
- EXPECT_TRUE_WAIT(conn3 == ch.best_connection(), 5000); |
+ EXPECT_TRUE_WAIT(conn3 == ch.selected_connection(), 5000); |
WAIT(false, max_strong_interval + 100); |
conn3->ReceivedPingResponse(); |
ASSERT_TRUE(conn3->writable()); |