OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2009 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2009 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 839 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
850 } | 850 } |
851 | 851 |
852 void ConnectSignalNominated(Connection* conn) { | 852 void ConnectSignalNominated(Connection* conn) { |
853 conn->SignalNominated.connect(this, | 853 conn->SignalNominated.connect(this, |
854 &P2PTransportChannelTestBase::OnNominated); | 854 &P2PTransportChannelTestBase::OnNominated); |
855 } | 855 } |
856 | 856 |
857 void OnNominated(Connection* conn) { nominated_ = true; } | 857 void OnNominated(Connection* conn) { nominated_ = true; } |
858 bool nominated() { return nominated_; } | 858 bool nominated() { return nominated_; } |
859 | 859 |
860 Connection* GetTopConnection(P2PTransportChannel* channel) { | |
861 if (channel->connections().empty()) { | |
862 return nullptr; | |
863 } | |
864 return channel->connections().front(); | |
865 } | |
Taylor Brandstetter
2016/08/08 23:01:05
I think these unit tests should move away from acc
honghaiz3
2016/08/11 22:45:53
Done.
| |
866 | |
860 private: | 867 private: |
861 rtc::Thread* main_; | 868 rtc::Thread* main_; |
862 std::unique_ptr<rtc::PhysicalSocketServer> pss_; | 869 std::unique_ptr<rtc::PhysicalSocketServer> pss_; |
863 std::unique_ptr<rtc::VirtualSocketServer> vss_; | 870 std::unique_ptr<rtc::VirtualSocketServer> vss_; |
864 std::unique_ptr<rtc::NATSocketServer> nss_; | 871 std::unique_ptr<rtc::NATSocketServer> nss_; |
865 std::unique_ptr<rtc::FirewallSocketServer> ss_; | 872 std::unique_ptr<rtc::FirewallSocketServer> ss_; |
866 rtc::SocketServerScope ss_scope_; | 873 rtc::SocketServerScope ss_scope_; |
867 std::unique_ptr<TestStunServer> stun_server_; | 874 std::unique_ptr<TestStunServer> stun_server_; |
868 TestTurnServer turn_server_; | 875 TestTurnServer turn_server_; |
869 TestRelayServer relay_server_; | 876 TestRelayServer relay_server_; |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1165 // Emulate no remote credentials coming in. | 1172 // Emulate no remote credentials coming in. |
1166 set_remote_ice_credential_source(FROM_CANDIDATE); | 1173 set_remote_ice_credential_source(FROM_CANDIDATE); |
1167 CreateChannels(1); | 1174 CreateChannels(1); |
1168 // Only have remote credentials come in for ep2, not ep1. | 1175 // Only have remote credentials come in for ep2, not ep1. |
1169 ep2_ch1()->SetRemoteIceCredentials(kIceUfrag[0], kIcePwd[0]); | 1176 ep2_ch1()->SetRemoteIceCredentials(kIceUfrag[0], kIcePwd[0]); |
1170 | 1177 |
1171 // Pause sending ep2's candidates to ep1 until ep1 receives the peer reflexive | 1178 // Pause sending ep2's candidates to ep1 until ep1 receives the peer reflexive |
1172 // candidate. | 1179 // candidate. |
1173 PauseCandidates(1); | 1180 PauseCandidates(1); |
1174 | 1181 |
1175 // The caller should have the selected connection connected to the peer | 1182 // The caller should have the top connection connected to the peer |
1176 // reflexive candidate. | 1183 // reflexive candidate. Note that the top connection is not selected yet as |
1177 const Connection* selected_connection = NULL; | 1184 // it is not ready to send. |
1178 WAIT((selected_connection = ep1_ch1()->selected_connection()) != NULL, 2000); | 1185 const Connection* top_connection = NULL; |
1179 EXPECT_EQ("prflx", | 1186 ASSERT_TRUE_WAIT((top_connection = GetTopConnection(ep1_ch1())) != NULL, |
Taylor Brandstetter
2016/08/08 23:01:05
For example, in this test I think we can do the EX
honghaiz3
2016/08/11 22:45:53
Done.
| |
1180 ep1_ch1()->selected_connection()->remote_candidate().type()); | 1187 2000); |
1188 EXPECT_EQ("prflx", top_connection->remote_candidate().type()); | |
1181 | 1189 |
1182 // Because we don't have a remote pwd, we don't ping yet. | 1190 // Because we don't have a remote pwd, we don't ping yet. |
1183 EXPECT_EQ(kIceUfrag[1], | 1191 EXPECT_EQ(kIceUfrag[1], top_connection->remote_candidate().username()); |
1184 ep1_ch1()->selected_connection()->remote_candidate().username()); | 1192 EXPECT_TRUE(top_connection->remote_candidate().password().empty()); |
1185 EXPECT_EQ("", | |
1186 ep1_ch1()->selected_connection()->remote_candidate().password()); | |
1187 // Because we don't have ICE credentials yet, we don't know the generation. | 1193 // Because we don't have ICE credentials yet, we don't know the generation. |
1188 EXPECT_EQ(0u, | 1194 EXPECT_EQ(0u, top_connection->remote_candidate().generation()); |
1189 ep1_ch1()->selected_connection()->remote_candidate().generation()); | |
1190 EXPECT_TRUE(nullptr == ep1_ch1()->FindNextPingableConnection()); | 1195 EXPECT_TRUE(nullptr == ep1_ch1()->FindNextPingableConnection()); |
1191 | 1196 |
1192 // Add two sets of remote ICE credentials, so that the ones used by the | 1197 // Add two sets of remote ICE credentials, so that the ones used by the |
1193 // candidate will be generation 1 instead of 0. | 1198 // candidate will be generation 1 instead of 0. |
1194 ep1_ch1()->SetRemoteIceCredentials(kIceUfrag[3], kIcePwd[3]); | 1199 ep1_ch1()->SetRemoteIceCredentials(kIceUfrag[3], kIcePwd[3]); |
1195 ep1_ch1()->SetRemoteIceCredentials(kIceUfrag[1], kIcePwd[1]); | 1200 ep1_ch1()->SetRemoteIceCredentials(kIceUfrag[1], kIcePwd[1]); |
1196 // After setting the remote ICE credentials, the password and generation | 1201 // After setting the remote ICE credentials, the password and generation |
1197 // of the peer reflexive candidate should be updated. | 1202 // of the peer reflexive candidate should be updated. |
1198 EXPECT_EQ(kIcePwd[1], | 1203 EXPECT_EQ(kIcePwd[1], top_connection->remote_candidate().password()); |
1199 ep1_ch1()->selected_connection()->remote_candidate().password()); | 1204 EXPECT_EQ(1u, top_connection->remote_candidate().generation()); |
Taylor Brandstetter
2016/08/15 17:55:49
Previously this tested that a prflx candidate's ge
honghaiz3
2016/08/16 17:29:15
It is more natural to test all these (ufrag, pwd,
Taylor Brandstetter
2016/08/16 18:48:31
I don't think we need to peek at the internal stat
honghaiz3
2016/08/16 21:11:36
Done. True if we only need to check the ICE genera
| |
1200 EXPECT_EQ(1u, | |
1201 ep1_ch1()->selected_connection()->remote_candidate().generation()); | |
1202 EXPECT_TRUE(nullptr != ep1_ch1()->FindNextPingableConnection()); | 1205 EXPECT_TRUE(nullptr != ep1_ch1()->FindNextPingableConnection()); |
1203 | 1206 |
1204 ResumeCandidates(1); | 1207 ResumeCandidates(1); |
1205 | 1208 |
1206 WAIT(ep2_ch1()->selected_connection() != NULL, 2000); | 1209 EXPECT_TRUE_WAIT(ep2_ch1()->selected_connection() != NULL, 2000); |
1207 // Verify ep1's selected connection is updated to use the 'local' candidate. | 1210 // Verify ep1's top connection is updated to use the 'local' candidate. |
1208 EXPECT_EQ_WAIT("local", | 1211 EXPECT_EQ_WAIT("local", |
1209 ep1_ch1()->selected_connection()->remote_candidate().type(), | 1212 GetTopConnection(ep1_ch1())->remote_candidate().type(), 2000); |
1210 2000); | 1213 EXPECT_EQ(top_connection, GetTopConnection(ep1_ch1())); |
1211 EXPECT_EQ(selected_connection, ep1_ch1()->selected_connection()); | |
1212 DestroyChannels(); | 1214 DestroyChannels(); |
1213 } | 1215 } |
1214 | 1216 |
1215 // Test that we properly create a connection on a STUN ping from unknown address | 1217 // Test that we properly create a connection on a STUN ping from unknown address |
1216 // when the signaling is slow and the end points are behind NAT. | 1218 // when the signaling is slow and the end points are behind NAT. |
1217 TEST_F(P2PTransportChannelTest, PeerReflexiveCandidateBeforeSignalingWithNAT) { | 1219 TEST_F(P2PTransportChannelTest, PeerReflexiveCandidateBeforeSignalingWithNAT) { |
1218 ConfigureEndpoints(OPEN, NAT_SYMMETRIC, kDefaultPortAllocatorFlags, | 1220 ConfigureEndpoints(OPEN, NAT_SYMMETRIC, kDefaultPortAllocatorFlags, |
1219 kDefaultPortAllocatorFlags); | 1221 kDefaultPortAllocatorFlags); |
1220 // Emulate no remote credentials coming in. | 1222 // Emulate no remote credentials coming in. |
1221 set_remote_ice_credential_source(FROM_CANDIDATE); | 1223 set_remote_ice_credential_source(FROM_CANDIDATE); |
1222 CreateChannels(1); | 1224 CreateChannels(1); |
1223 // Only have remote credentials come in for ep2, not ep1. | 1225 // Only have remote credentials come in for ep2, not ep1. |
1224 ep2_ch1()->SetRemoteIceCredentials(kIceUfrag[0], kIcePwd[0]); | 1226 ep2_ch1()->SetRemoteIceCredentials(kIceUfrag[0], kIcePwd[0]); |
1225 // Pause sending ep2's candidates to ep1 until ep1 receives the peer reflexive | 1227 // Pause sending ep2's candidates to ep1 until ep1 receives the peer reflexive |
1226 // candidate. | 1228 // candidate. |
1227 PauseCandidates(1); | 1229 PauseCandidates(1); |
1228 | 1230 |
1229 // The caller should have the selected connection connected to the peer | 1231 // The caller's top connection should be connected to the peer reflexive |
1230 // reflexive candidate. | 1232 // candidate. |
1231 WAIT(ep1_ch1()->selected_connection() != NULL, 2000); | 1233 Connection* top_connection = nullptr; |
1232 EXPECT_EQ("prflx", | 1234 ASSERT_TRUE_WAIT((top_connection = GetTopConnection(ep1_ch1())) != nullptr, |
1233 ep1_ch1()->selected_connection()->remote_candidate().type()); | 1235 2000); |
1236 EXPECT_EQ("prflx", top_connection->remote_candidate().type()); | |
1234 | 1237 |
1235 // Because we don't have a remote pwd, we don't ping yet. | 1238 // Because we don't have a remote pwd, we don't ping yet. |
1236 EXPECT_EQ(kIceUfrag[1], | 1239 EXPECT_EQ(kIceUfrag[1], top_connection->remote_candidate().username()); |
1237 ep1_ch1()->selected_connection()->remote_candidate().username()); | 1240 EXPECT_EQ("", top_connection->remote_candidate().password()); |
1238 EXPECT_EQ("", | |
1239 ep1_ch1()->selected_connection()->remote_candidate().password()); | |
1240 // Because we don't have ICE credentials yet, we don't know the generation. | 1241 // Because we don't have ICE credentials yet, we don't know the generation. |
1241 EXPECT_EQ(0u, | 1242 EXPECT_EQ(0u, top_connection->remote_candidate().generation()); |
1242 ep1_ch1()->selected_connection()->remote_candidate().generation()); | |
1243 EXPECT_TRUE(nullptr == ep1_ch1()->FindNextPingableConnection()); | 1243 EXPECT_TRUE(nullptr == ep1_ch1()->FindNextPingableConnection()); |
1244 | 1244 |
1245 // Add two sets of remote ICE credentials, so that the ones used by the | 1245 // Add two sets of remote ICE credentials, so that the ones used by the |
1246 // candidate will be generation 1 instead of 0. | 1246 // candidate will be generation 1 instead of 0. |
1247 ep1_ch1()->SetRemoteIceCredentials(kIceUfrag[3], kIcePwd[3]); | 1247 ep1_ch1()->SetRemoteIceCredentials(kIceUfrag[3], kIcePwd[3]); |
1248 ep1_ch1()->SetRemoteIceCredentials(kIceUfrag[1], kIcePwd[1]); | 1248 ep1_ch1()->SetRemoteIceCredentials(kIceUfrag[1], kIcePwd[1]); |
1249 // After setting the remote ICE credentials, the password and generation | 1249 // After setting the remote ICE credentials, the password and generation |
1250 // of the peer reflexive candidate should be updated. | 1250 // of the peer reflexive candidate should be updated. |
1251 EXPECT_EQ(kIcePwd[1], | 1251 EXPECT_EQ(kIcePwd[1], top_connection->remote_candidate().password()); |
1252 ep1_ch1()->selected_connection()->remote_candidate().password()); | 1252 EXPECT_EQ(1u, top_connection->remote_candidate().generation()); |
1253 EXPECT_EQ(1u, | |
1254 ep1_ch1()->selected_connection()->remote_candidate().generation()); | |
1255 | 1253 |
1256 ResumeCandidates(1); | 1254 ResumeCandidates(1); |
1257 | 1255 |
1258 const Connection* selected_connection = NULL; | 1256 const Connection* selected_connection = NULL; |
1259 WAIT((selected_connection = ep2_ch1()->selected_connection()) != NULL, 2000); | 1257 EXPECT_TRUE_WAIT( |
1258 (selected_connection = ep2_ch1()->selected_connection()) != NULL, 2000); | |
1260 | 1259 |
1261 // Wait to verify the connection is not culled. | 1260 // Wait to verify the connection is not culled. |
1262 WAIT(ep1_ch1()->writable(), 2000); | 1261 EXPECT_TRUE_WAIT(ep1_ch1()->writable(), 2000); |
1263 EXPECT_EQ(ep2_ch1()->selected_connection(), selected_connection); | |
1264 EXPECT_EQ("prflx", | 1262 EXPECT_EQ("prflx", |
1265 ep1_ch1()->selected_connection()->remote_candidate().type()); | 1263 ep1_ch1()->selected_connection()->remote_candidate().type()); |
1264 EXPECT_EQ(selected_connection, ep2_ch1()->selected_connection()); | |
1266 DestroyChannels(); | 1265 DestroyChannels(); |
1267 } | 1266 } |
1268 | 1267 |
1269 // Test that we properly create a connection on a STUN ping from unknown address | 1268 // Test that we properly create a connection on a STUN ping from unknown address |
1270 // when the signaling is slow, even if the new candidate is created due to the | 1269 // when the signaling is slow, even if the new candidate is created due to the |
1271 // remote peer doing an ICE restart, pairing this candidate across generations. | 1270 // remote peer doing an ICE restart, pairing this candidate across generations. |
1272 // | 1271 // |
1273 // Previously this wasn't working due to a bug where the peer reflexive | 1272 // Previously this wasn't working due to a bug where the peer reflexive |
1274 // candidate was only updated for the newest generation candidate pairs, and | 1273 // candidate was only updated for the newest generation candidate pairs, and |
1275 // not older-generation candidate pairs created by pairing candidates across | 1274 // not older-generation candidate pairs created by pairing candidates across |
(...skipping 1274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2550 ch->SignalSelectedCandidatePairChanged.connect( | 2549 ch->SignalSelectedCandidatePairChanged.connect( |
2551 this, &P2PTransportChannelPingTest::OnSelectedCandidatePairChanged); | 2550 this, &P2PTransportChannelPingTest::OnSelectedCandidatePairChanged); |
2552 ch->SignalReadyToSend.connect(this, | 2551 ch->SignalReadyToSend.connect(this, |
2553 &P2PTransportChannelPingTest::OnReadyToSend); | 2552 &P2PTransportChannelPingTest::OnReadyToSend); |
2554 ch->SignalStateChanged.connect( | 2553 ch->SignalStateChanged.connect( |
2555 this, &P2PTransportChannelPingTest::OnChannelStateChanged); | 2554 this, &P2PTransportChannelPingTest::OnChannelStateChanged); |
2556 } | 2555 } |
2557 | 2556 |
2558 Connection* WaitForConnectionTo(P2PTransportChannel* ch, | 2557 Connection* WaitForConnectionTo(P2PTransportChannel* ch, |
2559 const std::string& ip, | 2558 const std::string& ip, |
2560 int port_num) { | 2559 int port_num, |
2561 EXPECT_TRUE_WAIT(GetConnectionTo(ch, ip, port_num) != nullptr, 3000); | 2560 rtc::FakeClock* clock = nullptr) { |
2561 if (clock == nullptr) { | |
2562 EXPECT_TRUE_WAIT(GetConnectionTo(ch, ip, port_num) != nullptr, 3000); | |
2563 } else { | |
2564 EXPECT_TRUE_SIMULATED_WAIT(GetConnectionTo(ch, ip, port_num) != nullptr, | |
2565 3000, *clock); | |
2566 } | |
2562 return GetConnectionTo(ch, ip, port_num); | 2567 return GetConnectionTo(ch, ip, port_num); |
2563 } | 2568 } |
2564 | 2569 |
2565 Port* GetPort(P2PTransportChannel* ch) { | 2570 Port* GetPort(P2PTransportChannel* ch) { |
2566 if (ch->ports().empty()) { | 2571 if (ch->ports().empty()) { |
2567 return nullptr; | 2572 return nullptr; |
2568 } | 2573 } |
2569 return static_cast<Port*>(ch->ports()[0]); | 2574 return static_cast<Port*>(ch->ports()[0]); |
2570 } | 2575 } |
2571 | 2576 |
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3036 ch.SetIceConfig(CreateIceConfig(500, GATHER_ONCE)); | 3041 ch.SetIceConfig(CreateIceConfig(500, GATHER_ONCE)); |
3037 EXPECT_EQ(500, ch.receiving_timeout()); | 3042 EXPECT_EQ(500, ch.receiving_timeout()); |
3038 EXPECT_EQ(50, ch.check_receiving_interval()); | 3043 EXPECT_EQ(50, ch.check_receiving_interval()); |
3039 ch.MaybeStartGathering(); | 3044 ch.MaybeStartGathering(); |
3040 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1)); | 3045 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1)); |
3041 Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 3046 Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); |
3042 ASSERT_TRUE(conn1 != nullptr); | 3047 ASSERT_TRUE(conn1 != nullptr); |
3043 | 3048 |
3044 conn1->ReceivedPing(); | 3049 conn1->ReceivedPing(); |
3045 conn1->OnReadPacket("ABC", 3, rtc::CreatePacketTime(0)); | 3050 conn1->OnReadPacket("ABC", 3, rtc::CreatePacketTime(0)); |
3046 EXPECT_TRUE_WAIT(ch.selected_connection() != nullptr, 1000); | |
3047 EXPECT_TRUE_WAIT(ch.receiving(), 1000); | 3051 EXPECT_TRUE_WAIT(ch.receiving(), 1000); |
3048 EXPECT_TRUE_WAIT(!ch.receiving(), 1000); | 3052 EXPECT_TRUE_WAIT(!ch.receiving(), 1000); |
3049 } | 3053 } |
3050 | 3054 |
3051 // The controlled side will select a connection as the "selected connection" | 3055 // The controlled side will select a connection as the "selected connection" |
3052 // based on priority until the controlling side nominates a connection, at which | 3056 // based on priority until the controlling side nominates a connection, at which |
3053 // point the controlled side will select that connection as the | 3057 // point the controlled side will select that connection as the |
3054 // "selected connection". Plus, SignalSelectedCandidatePair will be fired if the | 3058 // "selected connection". Plus, SignalSelectedCandidatePair will be fired if the |
3055 // selected connection changes and SignalReadyToSend will be fired if the new | 3059 // selected connection changes and SignalReadyToSend will be fired if the new |
3056 // selected connection is writable. | 3060 // selected connection is writable. |
3057 TEST_F(P2PTransportChannelPingTest, TestSelectConnectionBeforeNomination) { | 3061 TEST_F(P2PTransportChannelPingTest, TestSelectConnectionBeforeNomination) { |
3058 FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3062 FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
3059 P2PTransportChannel ch("receiving state change", 1, &pa); | 3063 P2PTransportChannel ch("receiving state change", 1, &pa); |
3060 PrepareChannel(&ch); | 3064 PrepareChannel(&ch); |
3061 ch.SetIceRole(ICEROLE_CONTROLLED); | 3065 ch.SetIceRole(ICEROLE_CONTROLLED); |
3062 ch.MaybeStartGathering(); | 3066 ch.MaybeStartGathering(); |
3063 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1)); | 3067 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1)); |
3064 Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 3068 Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); |
3065 ASSERT_TRUE(conn1 != nullptr); | 3069 ASSERT_TRUE(conn1 != nullptr); |
3066 EXPECT_EQ(conn1, ch.selected_connection()); | |
3067 EXPECT_EQ(conn1, last_selected_candidate_pair()); | |
3068 EXPECT_EQ(-1, last_sent_packet_id()); | |
3069 // Channel is not ready to send because it is not writable. | 3070 // Channel is not ready to send because it is not writable. |
3070 EXPECT_FALSE(channel_ready_to_send()); | 3071 EXPECT_FALSE(channel_ready_to_send()); |
3071 | |
3072 int last_packet_id = 0; | 3072 int last_packet_id = 0; |
3073 const char* data = "ABCDEFGH"; | 3073 const char* data = "ABCDEFGH"; |
3074 int len = static_cast<int>(strlen(data)); | 3074 int len = static_cast<int>(strlen(data)); |
3075 EXPECT_EQ(-1, SendData(ch, data, len, ++last_packet_id)); | 3075 EXPECT_EQ(-1, SendData(ch, data, len, ++last_packet_id)); |
3076 EXPECT_EQ(-1, last_sent_packet_id()); | |
3077 | |
3078 // A connection need to be writable before it is selected for transmission. | |
Taylor Brandstetter
2016/08/08 23:01:05
nit: "needs"
honghaiz3
2016/08/11 22:45:53
Done.
| |
3079 conn1->ReceivedPingResponse(LOW_RTT, "id"); | |
3080 EXPECT_EQ_WAIT(conn1, ch.selected_connection(), kDefaultTimeout); | |
3081 EXPECT_EQ(conn1, last_selected_candidate_pair()); | |
3082 EXPECT_EQ(len, SendData(ch, data, len, ++last_packet_id)); | |
3083 | |
3076 // When a higher priority candidate comes in, the new connection is chosen | 3084 // When a higher priority candidate comes in, the new connection is chosen |
3077 // as the selected connection. | 3085 // as the selected connection. |
3078 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 10)); | 3086 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 10)); |
3079 Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 3087 Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); |
3080 ASSERT_TRUE(conn2 != nullptr); | 3088 ASSERT_TRUE(conn2 != nullptr); |
3081 EXPECT_EQ(conn2, ch.selected_connection()); | 3089 conn2->ReceivedPingResponse(LOW_RTT, "id"); |
3090 EXPECT_EQ_WAIT(conn2, ch.selected_connection(), kDefaultTimeout); | |
3082 EXPECT_EQ(conn2, last_selected_candidate_pair()); | 3091 EXPECT_EQ(conn2, last_selected_candidate_pair()); |
3083 EXPECT_EQ(-1, last_sent_packet_id()); | 3092 EXPECT_TRUE(channel_ready_to_send()); |
3084 EXPECT_FALSE(channel_ready_to_send()); | 3093 EXPECT_EQ(last_packet_id, last_sent_packet_id()); |
3085 | 3094 |
3086 // If a stun request with use-candidate attribute arrives, the receiving | 3095 // If a stun request with use-candidate attribute arrives, the receiving |
3087 // connection will be set as the selected connection, even though | 3096 // connection will be set as the selected connection, even though |
3088 // its priority is lower. | 3097 // its priority is lower. |
3089 EXPECT_EQ(-1, SendData(ch, data, len, ++last_packet_id)); | 3098 EXPECT_EQ(len, SendData(ch, data, len, ++last_packet_id)); |
3090 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "3.3.3.3", 3, 1)); | 3099 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "3.3.3.3", 3, 1)); |
3091 Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3); | 3100 Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3); |
3092 ASSERT_TRUE(conn3 != nullptr); | 3101 ASSERT_TRUE(conn3 != nullptr); |
3093 // Because it has a lower priority, the selected connection is still conn2. | 3102 // Because it has a lower priority, the selected connection is still conn2. |
3094 EXPECT_EQ(conn2, ch.selected_connection()); | 3103 EXPECT_EQ(conn2, ch.selected_connection()); |
3095 conn3->ReceivedPingResponse(LOW_RTT, "id"); // Become writable. | 3104 conn3->ReceivedPingResponse(LOW_RTT, "id"); // Become writable. |
3096 // But if it is nominated via use_candidate, it is chosen as the selected | 3105 // But if it is nominated via use_candidate, it is chosen as the selected |
3097 // connection. | 3106 // connection. |
3098 NominateConnection(conn3); | 3107 NominateConnection(conn3); |
3099 EXPECT_EQ(conn3, ch.selected_connection()); | 3108 EXPECT_EQ(conn3, ch.selected_connection()); |
3100 EXPECT_EQ(conn3, last_selected_candidate_pair()); | 3109 EXPECT_EQ(conn3, last_selected_candidate_pair()); |
3101 EXPECT_EQ(-1, last_sent_packet_id()); | 3110 EXPECT_EQ(last_packet_id, last_sent_packet_id()); |
3102 EXPECT_TRUE(channel_ready_to_send()); | 3111 EXPECT_TRUE(channel_ready_to_send()); |
3103 | 3112 |
3104 // Even if another higher priority candidate arrives, it will not be set as | 3113 // Even if another higher priority candidate arrives, it will not be set as |
3105 // the selected connection because the selected connection is nominated by | 3114 // the selected connection because the selected connection is nominated by |
3106 // the controlling side. | 3115 // the controlling side. |
3107 EXPECT_EQ(len, SendData(ch, data, len, ++last_packet_id)); | 3116 EXPECT_EQ(len, SendData(ch, data, len, ++last_packet_id)); |
3108 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "4.4.4.4", 4, 100)); | 3117 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "4.4.4.4", 4, 100)); |
3109 Connection* conn4 = WaitForConnectionTo(&ch, "4.4.4.4", 4); | 3118 Connection* conn4 = WaitForConnectionTo(&ch, "4.4.4.4", 4); |
3110 ASSERT_TRUE(conn4 != nullptr); | 3119 ASSERT_TRUE(conn4 != nullptr); |
3111 EXPECT_EQ(conn3, ch.selected_connection()); | 3120 EXPECT_EQ(conn3, ch.selected_connection()); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3143 new StunByteStringAttribute(STUN_ATTR_USERNAME, kIceUfrag[1])); | 3152 new StunByteStringAttribute(STUN_ATTR_USERNAME, kIceUfrag[1])); |
3144 uint32_t prflx_priority = ICE_TYPE_PREFERENCE_PRFLX << 24; | 3153 uint32_t prflx_priority = ICE_TYPE_PREFERENCE_PRFLX << 24; |
3145 request.AddAttribute( | 3154 request.AddAttribute( |
3146 new StunUInt32Attribute(STUN_ATTR_PRIORITY, prflx_priority)); | 3155 new StunUInt32Attribute(STUN_ATTR_PRIORITY, prflx_priority)); |
3147 TestUDPPort* port = static_cast<TestUDPPort*>(GetPort(&ch)); | 3156 TestUDPPort* port = static_cast<TestUDPPort*>(GetPort(&ch)); |
3148 port->SignalUnknownAddress(port, rtc::SocketAddress("1.1.1.1", 1), PROTO_UDP, | 3157 port->SignalUnknownAddress(port, rtc::SocketAddress("1.1.1.1", 1), PROTO_UDP, |
3149 &request, kIceUfrag[1], false); | 3158 &request, kIceUfrag[1], false); |
3150 Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 3159 Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); |
3151 ASSERT_TRUE(conn1 != nullptr); | 3160 ASSERT_TRUE(conn1 != nullptr); |
3152 EXPECT_TRUE(port->sent_binding_response()); | 3161 EXPECT_TRUE(port->sent_binding_response()); |
3153 EXPECT_EQ(conn1, ch.selected_connection()); | 3162 EXPECT_NE(conn1, ch.selected_connection()); |
3154 conn1->ReceivedPingResponse(LOW_RTT, "id"); | 3163 conn1->ReceivedPingResponse(LOW_RTT, "id"); |
3155 EXPECT_EQ(conn1, ch.selected_connection()); | 3164 EXPECT_EQ_WAIT(conn1, ch.selected_connection(), kDefaultTimeout); |
3156 port->set_sent_binding_response(false); | 3165 port->set_sent_binding_response(false); |
3157 | 3166 |
3158 // Another connection is nominated via use_candidate. | 3167 // Another connection is nominated via use_candidate. |
3159 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 1)); | 3168 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 1)); |
3160 Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 3169 Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); |
3161 ASSERT_TRUE(conn2 != nullptr); | 3170 ASSERT_TRUE(conn2 != nullptr); |
3162 // Because it has a lower priority, the selected connection is still conn1. | 3171 // Because it has a lower priority, the selected connection is still conn1. |
3163 EXPECT_EQ(conn1, ch.selected_connection()); | 3172 EXPECT_EQ(conn1, ch.selected_connection()); |
3164 // When it is nominated via use_candidate and writable, it is chosen as the | 3173 // When it is nominated via use_candidate and writable, it is chosen as the |
3165 // selected connection. | 3174 // selected connection. |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3211 // the "selected connection". | 3220 // the "selected connection". |
3212 TEST_F(P2PTransportChannelPingTest, TestSelectConnectionBasedOnMediaReceived) { | 3221 TEST_F(P2PTransportChannelPingTest, TestSelectConnectionBasedOnMediaReceived) { |
3213 FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3222 FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
3214 P2PTransportChannel ch("receiving state change", 1, &pa); | 3223 P2PTransportChannel ch("receiving state change", 1, &pa); |
3215 PrepareChannel(&ch); | 3224 PrepareChannel(&ch); |
3216 ch.SetIceRole(ICEROLE_CONTROLLED); | 3225 ch.SetIceRole(ICEROLE_CONTROLLED); |
3217 ch.MaybeStartGathering(); | 3226 ch.MaybeStartGathering(); |
3218 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 10)); | 3227 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 10)); |
3219 Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 3228 Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); |
3220 ASSERT_TRUE(conn1 != nullptr); | 3229 ASSERT_TRUE(conn1 != nullptr); |
3221 EXPECT_EQ(conn1, ch.selected_connection()); | 3230 conn1->ReceivedPingResponse(LOW_RTT, "id"); |
3231 EXPECT_EQ_WAIT(conn1, ch.selected_connection(), kDefaultTimeout); | |
3222 | 3232 |
3223 // If a data packet is received on conn2, the selected connection should | 3233 // If a data packet is received on conn2, the selected connection should |
3224 // switch to conn2 because the controlled side must mirror the media path | 3234 // switch to conn2 because the controlled side must mirror the media path |
3225 // chosen by the controlling side. | 3235 // chosen by the controlling side. |
3226 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 1)); | 3236 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 1)); |
3227 Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 3237 Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); |
3228 ASSERT_TRUE(conn2 != nullptr); | 3238 ASSERT_TRUE(conn2 != nullptr); |
3229 conn2->ReceivedPing(); // Start receiving. | 3239 conn2->ReceivedPingResponse(LOW_RTT, "id"); // Become writable and receiving. |
3230 conn2->OnReadPacket("ABC", 3, rtc::CreatePacketTime(0)); | 3240 conn2->OnReadPacket("ABC", 3, rtc::CreatePacketTime(0)); |
3231 EXPECT_EQ(conn2, ch.selected_connection()); | 3241 EXPECT_EQ(conn2, ch.selected_connection()); |
3232 conn2->ReceivedPingResponse(LOW_RTT, "id"); // Become writable. | 3242 conn2->ReceivedPingResponse(LOW_RTT, "id"); // Become writable. |
3233 | 3243 |
3234 // Now another STUN message with an unknown address and use_candidate will | 3244 // Now another STUN message with an unknown address and use_candidate will |
3235 // nominate the selected connection. | 3245 // nominate the selected connection. |
3236 IceMessage request; | 3246 IceMessage request; |
3237 request.SetType(STUN_BINDING_REQUEST); | 3247 request.SetType(STUN_BINDING_REQUEST); |
3238 request.AddAttribute( | 3248 request.AddAttribute( |
3239 new StunByteStringAttribute(STUN_ATTR_USERNAME, kIceUfrag[1])); | 3249 new StunByteStringAttribute(STUN_ATTR_USERNAME, kIceUfrag[1])); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3301 TestControlledAgentNominationTakesHigherPrecedenceThanDataReceiving) { | 3311 TestControlledAgentNominationTakesHigherPrecedenceThanDataReceiving) { |
3302 rtc::ScopedFakeClock clock; | 3312 rtc::ScopedFakeClock clock; |
3303 | 3313 |
3304 FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3314 FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
3305 P2PTransportChannel ch("SwitchSelectedConnection", 1, &pa); | 3315 P2PTransportChannel ch("SwitchSelectedConnection", 1, &pa); |
3306 PrepareChannel(&ch); | 3316 PrepareChannel(&ch); |
3307 ch.SetIceRole(ICEROLE_CONTROLLED); | 3317 ch.SetIceRole(ICEROLE_CONTROLLED); |
3308 ch.MaybeStartGathering(); | 3318 ch.MaybeStartGathering(); |
3309 // The connections have decreasing priority. | 3319 // The connections have decreasing priority. |
3310 Connection* conn1 = | 3320 Connection* conn1 = |
3311 CreateConnectionWithCandidate(ch, clock, "1.1.1.1", 1, 10, false); | 3321 CreateConnectionWithCandidate(ch, clock, "1.1.1.1", 1, 10, true); |
3312 ASSERT_TRUE(conn1 != nullptr); | 3322 ASSERT_TRUE(conn1 != nullptr); |
3313 Connection* conn2 = | 3323 Connection* conn2 = |
3314 CreateConnectionWithCandidate(ch, clock, "2.2.2.2", 2, 9, false); | 3324 CreateConnectionWithCandidate(ch, clock, "2.2.2.2", 2, 9, true); |
3315 ASSERT_TRUE(conn2 != nullptr); | 3325 ASSERT_TRUE(conn2 != nullptr); |
3316 | 3326 |
3317 // conn1 received data; it is the selected connection. | 3327 // conn1 received data; it is the selected connection. |
3318 // Advance the clock to have a non-zero last-data-receiving time. | 3328 // Advance the clock to have a non-zero last-data-receiving time. |
3319 SIMULATED_WAIT(false, 1, clock); | 3329 SIMULATED_WAIT(false, 1, clock); |
3320 conn1->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0)); | 3330 conn1->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0)); |
3321 EXPECT_EQ(1, reset_selected_candidate_pair_switches()); | 3331 EXPECT_EQ(1, reset_selected_candidate_pair_switches()); |
3322 EXPECT_EQ(conn1, last_selected_candidate_pair()); | 3332 EXPECT_EQ(conn1, last_selected_candidate_pair()); |
3323 | 3333 |
3324 // conn2 is nominated; it becomes the selected connection. | 3334 // conn2 is nominated; it becomes the selected connection. |
3325 NominateConnection(conn2); | 3335 NominateConnection(conn2); |
3326 EXPECT_EQ(1, reset_selected_candidate_pair_switches()); | 3336 EXPECT_EQ(1, reset_selected_candidate_pair_switches()); |
3327 EXPECT_EQ(conn2, last_selected_candidate_pair()); | 3337 EXPECT_EQ(conn2, last_selected_candidate_pair()); |
3328 | 3338 |
3339 // conn1 is selected because it has higher priority and also nominated. | |
3329 NominateConnection(conn1); | 3340 NominateConnection(conn1); |
3330 EXPECT_EQ(1, reset_selected_candidate_pair_switches()); | 3341 EXPECT_EQ(1, reset_selected_candidate_pair_switches()); |
3331 EXPECT_EQ(conn1, last_selected_candidate_pair()); | 3342 EXPECT_EQ(conn1, last_selected_candidate_pair()); |
3332 | 3343 |
3333 // conn2 received data more recently; it is selected now because it | |
3334 // received data more recently. | |
3335 SIMULATED_WAIT(false, 1, clock); | |
3336 conn2->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0)); | |
3337 EXPECT_EQ(1, reset_selected_candidate_pair_switches()); | |
3338 EXPECT_EQ(conn2, last_selected_candidate_pair()); | |
Taylor Brandstetter
2016/08/08 23:01:05
Why were these expectations removed?
honghaiz3
2016/08/11 22:45:53
I thought it is kind of redundant with the previou
| |
3339 | |
3340 // Make sure sorting won't reselect candidate pair. | 3344 // Make sure sorting won't reselect candidate pair. |
3341 SIMULATED_WAIT(false, 10, clock); | 3345 SIMULATED_WAIT(false, 10, clock); |
3342 EXPECT_EQ(0, reset_selected_candidate_pair_switches()); | 3346 EXPECT_EQ(0, reset_selected_candidate_pair_switches()); |
3343 } | 3347 } |
3344 | 3348 |
3345 TEST_F(P2PTransportChannelPingTest, | 3349 TEST_F(P2PTransportChannelPingTest, |
3346 TestControlledAgentSelectsConnectionWithHigherNomination) { | 3350 TestControlledAgentSelectsConnectionWithHigherNomination) { |
3347 rtc::ScopedFakeClock clock; | 3351 rtc::ScopedFakeClock clock; |
3348 | 3352 |
3349 FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3353 FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
3350 P2PTransportChannel ch("test", 1, &pa); | 3354 P2PTransportChannel ch("test", 1, &pa); |
3351 PrepareChannel(&ch); | 3355 PrepareChannel(&ch); |
3352 ch.SetIceRole(ICEROLE_CONTROLLED); | 3356 ch.SetIceRole(ICEROLE_CONTROLLED); |
3353 ch.MaybeStartGathering(); | 3357 ch.MaybeStartGathering(); |
3354 // The connections have decreasing priority. | 3358 // The connections have decreasing priority. |
3355 Connection* conn1 = | 3359 Connection* conn1 = |
3356 CreateConnectionWithCandidate(ch, clock, "1.1.1.1", 1, 10, false); | 3360 CreateConnectionWithCandidate(ch, clock, "1.1.1.1", 1, 10, true); |
3357 ASSERT_TRUE(conn1 != nullptr); | 3361 ASSERT_TRUE(conn1 != nullptr); |
3358 Connection* conn2 = | 3362 Connection* conn2 = |
3359 CreateConnectionWithCandidate(ch, clock, "2.2.2.2", 2, 9, false); | 3363 CreateConnectionWithCandidate(ch, clock, "2.2.2.2", 2, 9, true); |
3360 ASSERT_TRUE(conn2 != nullptr); | 3364 ASSERT_TRUE(conn2 != nullptr); |
3361 | 3365 |
3362 // conn1 is the selected connection because it has a higher priority, | 3366 // conn1 is the selected connection because it has a higher priority, |
3363 EXPECT_EQ_SIMULATED_WAIT(conn1, last_selected_candidate_pair(), | 3367 EXPECT_EQ_SIMULATED_WAIT(conn1, last_selected_candidate_pair(), |
3364 kDefaultTimeout, clock); | 3368 kDefaultTimeout, clock); |
3365 reset_selected_candidate_pair_switches(); | 3369 reset_selected_candidate_pair_switches(); |
3366 | 3370 |
3367 // conn2 is nominated; it becomes selected. | 3371 // conn2 is nominated; it becomes selected. |
3368 NominateConnection(conn2); | 3372 NominateConnection(conn2); |
3369 EXPECT_EQ(1, reset_selected_candidate_pair_switches()); | 3373 EXPECT_EQ(1, reset_selected_candidate_pair_switches()); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3412 ch.MaybeStartGathering(); | 3416 ch.MaybeStartGathering(); |
3413 // The connections have decreasing priority. | 3417 // The connections have decreasing priority. |
3414 Connection* conn1 = | 3418 Connection* conn1 = |
3415 CreateConnectionWithCandidate(ch, clock, "1.1.1.1", 1, 10, false); | 3419 CreateConnectionWithCandidate(ch, clock, "1.1.1.1", 1, 10, false); |
3416 ASSERT_TRUE(conn1 != nullptr); | 3420 ASSERT_TRUE(conn1 != nullptr); |
3417 Connection* conn2 = | 3421 Connection* conn2 = |
3418 CreateConnectionWithCandidate(ch, clock, "2.2.2.2", 2, 9, false); | 3422 CreateConnectionWithCandidate(ch, clock, "2.2.2.2", 2, 9, false); |
3419 ASSERT_TRUE(conn2 != nullptr); | 3423 ASSERT_TRUE(conn2 != nullptr); |
3420 | 3424 |
3421 NominateConnection(conn1); | 3425 NominateConnection(conn1); |
3422 EXPECT_EQ(1, reset_selected_candidate_pair_switches()); | 3426 // There is no selected connection because no connection is writable. |
3427 EXPECT_EQ(0, reset_selected_candidate_pair_switches()); | |
3423 | 3428 |
3424 // conn2 becomes writable; it is selected even though it is not nominated. | 3429 // conn2 becomes writable; it is selected even though it is not nominated. |
3425 conn2->ReceivedPingResponse(LOW_RTT, "id"); | 3430 conn2->ReceivedPingResponse(LOW_RTT, "id"); |
3426 | |
3427 EXPECT_EQ_SIMULATED_WAIT(1, reset_selected_candidate_pair_switches(), | 3431 EXPECT_EQ_SIMULATED_WAIT(1, reset_selected_candidate_pair_switches(), |
3428 kDefaultTimeout, clock); | 3432 kDefaultTimeout, clock); |
3429 EXPECT_EQ_SIMULATED_WAIT(conn2, last_selected_candidate_pair(), | 3433 EXPECT_EQ_SIMULATED_WAIT(conn2, last_selected_candidate_pair(), |
3430 kDefaultTimeout, clock); | 3434 kDefaultTimeout, clock); |
3431 | 3435 |
3432 // If conn1 is also writable, it will become selected. | 3436 // If conn1 is also writable, it will become selected. |
3433 conn1->ReceivedPingResponse(LOW_RTT, "id"); | 3437 conn1->ReceivedPingResponse(LOW_RTT, "id"); |
3434 EXPECT_EQ_SIMULATED_WAIT(1, reset_selected_candidate_pair_switches(), | 3438 EXPECT_EQ_SIMULATED_WAIT(1, reset_selected_candidate_pair_switches(), |
3435 kDefaultTimeout, clock); | 3439 kDefaultTimeout, clock); |
3436 EXPECT_EQ_SIMULATED_WAIT(conn1, last_selected_candidate_pair(), | 3440 EXPECT_EQ_SIMULATED_WAIT(conn1, last_selected_candidate_pair(), |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3475 // Verify that a ping with the new ufrag can be received on the new | 3479 // Verify that a ping with the new ufrag can be received on the new |
3476 // connection. | 3480 // connection. |
3477 EXPECT_EQ(0, conn2->last_ping_received()); | 3481 EXPECT_EQ(0, conn2->last_ping_received()); |
3478 ReceivePingOnConnection(conn2, kIceUfrag[2], 1 /* priority */); | 3482 ReceivePingOnConnection(conn2, kIceUfrag[2], 1 /* priority */); |
3479 EXPECT_TRUE(conn2->last_ping_received() > 0); | 3483 EXPECT_TRUE(conn2->last_ping_received() > 0); |
3480 } | 3484 } |
3481 | 3485 |
3482 // When the current selected connection is strong, lower-priority connections | 3486 // When the current selected connection is strong, lower-priority connections |
3483 // will be pruned. Otherwise, lower-priority connections are kept. | 3487 // will be pruned. Otherwise, lower-priority connections are kept. |
3484 TEST_F(P2PTransportChannelPingTest, TestDontPruneWhenWeak) { | 3488 TEST_F(P2PTransportChannelPingTest, TestDontPruneWhenWeak) { |
3489 rtc::ScopedFakeClock clock; | |
3485 FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3490 FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
3486 P2PTransportChannel ch("test channel", 1, &pa); | 3491 P2PTransportChannel ch("test channel", 1, &pa); |
3487 PrepareChannel(&ch); | 3492 PrepareChannel(&ch); |
3488 ch.SetIceRole(ICEROLE_CONTROLLED); | 3493 ch.SetIceRole(ICEROLE_CONTROLLED); |
3489 ch.MaybeStartGathering(); | 3494 ch.MaybeStartGathering(); |
3490 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1)); | 3495 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1)); |
3491 Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 3496 Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); |
3492 ASSERT_TRUE(conn1 != nullptr); | 3497 ASSERT_TRUE(conn1 != nullptr); |
3493 EXPECT_EQ(conn1, ch.selected_connection()); | 3498 EXPECT_EQ(nullptr, ch.selected_connection()); |
3494 conn1->ReceivedPingResponse(LOW_RTT, "id"); // Becomes writable and receiving | 3499 conn1->ReceivedPingResponse(LOW_RTT, "id"); // Becomes writable and receiving |
3495 | 3500 |
3496 // When a higher-priority, nominated candidate comes in, the connections with | 3501 // When a higher-priority, nominated candidate comes in, the connections with |
3497 // lower-priority are pruned. | 3502 // lower-priority are pruned. |
3498 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 10)); | 3503 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 10)); |
3499 Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 3504 Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2, &clock); |
3500 ASSERT_TRUE(conn2 != nullptr); | 3505 ASSERT_TRUE(conn2 != nullptr); |
3501 conn2->ReceivedPingResponse(LOW_RTT, "id"); // Becomes writable and receiving | 3506 conn2->ReceivedPingResponse(LOW_RTT, "id"); // Becomes writable and receiving |
3502 NominateConnection(conn2); | 3507 NominateConnection(conn2); |
3503 EXPECT_TRUE_WAIT(conn1->pruned(), 3000); | 3508 EXPECT_TRUE_SIMULATED_WAIT(conn1->pruned(), 3000, clock); |
3504 | 3509 |
3505 ch.SetIceConfig(CreateIceConfig(500, GATHER_ONCE)); | 3510 ch.SetIceConfig(CreateIceConfig(500, GATHER_ONCE)); |
3506 // Wait until conn2 becomes not receiving. | 3511 // Wait until conn2 becomes not receiving. |
3507 EXPECT_TRUE_WAIT(!conn2->receiving(), 3000); | 3512 EXPECT_TRUE_SIMULATED_WAIT(!conn2->receiving(), 3000, clock); |
3508 | 3513 |
3509 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "3.3.3.3", 3, 1)); | 3514 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "3.3.3.3", 3, 1)); |
3510 Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3); | 3515 Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3, &clock); |
3511 ASSERT_TRUE(conn3 != nullptr); | 3516 ASSERT_TRUE(conn3 != nullptr); |
3512 // The selected connection should still be conn2. Even through conn3 has lower | 3517 // The selected connection should still be conn2. Even through conn3 has lower |
3513 // priority and is not receiving/writable, it is not pruned because the | 3518 // priority and is not receiving/writable, it is not pruned because the |
3514 // selected connection is not receiving. | 3519 // selected connection is not receiving. |
3515 WAIT(conn3->pruned(), 1000); | 3520 SIMULATED_WAIT(conn3->pruned(), 1000, clock); |
3516 EXPECT_FALSE(conn3->pruned()); | 3521 EXPECT_FALSE(conn3->pruned()); |
3517 } | 3522 } |
3518 | 3523 |
3519 TEST_F(P2PTransportChannelPingTest, TestDontPruneHighPriorityConnections) { | 3524 TEST_F(P2PTransportChannelPingTest, TestDontPruneHighPriorityConnections) { |
3520 rtc::ScopedFakeClock clock; | 3525 rtc::ScopedFakeClock clock; |
3521 FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3526 FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
3522 P2PTransportChannel ch("test channel", 1, &pa); | 3527 P2PTransportChannel ch("test channel", 1, &pa); |
3523 PrepareChannel(&ch); | 3528 PrepareChannel(&ch); |
3524 ch.SetIceRole(ICEROLE_CONTROLLED); | 3529 ch.SetIceRole(ICEROLE_CONTROLLED); |
3525 ch.MaybeStartGathering(); | 3530 ch.MaybeStartGathering(); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3558 EXPECT_TRUE_WAIT(conn2->pruned(), 1000); | 3563 EXPECT_TRUE_WAIT(conn2->pruned(), 1000); |
3559 EXPECT_EQ(TransportChannelState::STATE_COMPLETED, ch.GetState()); | 3564 EXPECT_EQ(TransportChannelState::STATE_COMPLETED, ch.GetState()); |
3560 conn1->Prune(); // All connections are pruned. | 3565 conn1->Prune(); // All connections are pruned. |
3561 // Need to wait until the channel state is updated. | 3566 // Need to wait until the channel state is updated. |
3562 EXPECT_EQ_WAIT(TransportChannelState::STATE_FAILED, ch.GetState(), 1000); | 3567 EXPECT_EQ_WAIT(TransportChannelState::STATE_FAILED, ch.GetState(), 1000); |
3563 } | 3568 } |
3564 | 3569 |
3565 // Test that when a low-priority connection is pruned, it is not deleted | 3570 // Test that when a low-priority connection is pruned, it is not deleted |
3566 // right away, and it can become active and be pruned again. | 3571 // right away, and it can become active and be pruned again. |
3567 TEST_F(P2PTransportChannelPingTest, TestConnectionPrunedAgain) { | 3572 TEST_F(P2PTransportChannelPingTest, TestConnectionPrunedAgain) { |
3573 rtc::ScopedFakeClock clock; | |
3568 FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3574 FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
3569 P2PTransportChannel ch("test channel", 1, &pa); | 3575 P2PTransportChannel ch("test channel", 1, &pa); |
3570 PrepareChannel(&ch); | 3576 PrepareChannel(&ch); |
3571 IceConfig config = CreateIceConfig(1000, GATHER_ONCE); | 3577 IceConfig config = CreateIceConfig(1000, GATHER_ONCE); |
3572 config.receiving_switching_delay = rtc::Optional<int>(800); | 3578 config.receiving_switching_delay = rtc::Optional<int>(800); |
3573 ch.SetIceConfig(config); | 3579 ch.SetIceConfig(config); |
3574 ch.MaybeStartGathering(); | 3580 ch.MaybeStartGathering(); |
3575 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 100)); | 3581 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 100)); |
3576 Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 3582 Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1, &clock); |
3577 ASSERT_TRUE(conn1 != nullptr); | 3583 ASSERT_TRUE(conn1 != nullptr); |
3578 EXPECT_EQ(conn1, ch.selected_connection()); | 3584 EXPECT_EQ(nullptr, ch.selected_connection()); |
3579 conn1->ReceivedPingResponse(LOW_RTT, "id"); // Becomes writable and receiving | 3585 conn1->ReceivedPingResponse(LOW_RTT, "id"); // Becomes writable and receiving |
3586 EXPECT_EQ_SIMULATED_WAIT(conn1, ch.selected_connection(), kDefaultTimeout, | |
3587 clock); | |
3580 | 3588 |
3581 // Add a low-priority connection |conn2|, which will be pruned, but it will | 3589 // Add a low-priority connection |conn2|, which will be pruned, but it will |
3582 // not be deleted right away. Once the current selected connection becomes not | 3590 // not be deleted right away. Once the current selected connection becomes not |
3583 // receiving, |conn2| will start to ping and upon receiving the ping response, | 3591 // receiving, |conn2| will start to ping and upon receiving the ping response, |
3584 // it will become the selected connection. | 3592 // it will become the selected connection. |
3585 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 1)); | 3593 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 1)); |
3586 Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 3594 Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2, &clock); |
3587 ASSERT_TRUE(conn2 != nullptr); | 3595 ASSERT_TRUE(conn2 != nullptr); |
3588 EXPECT_TRUE_WAIT(!conn2->active(), 1000); | 3596 EXPECT_TRUE_SIMULATED_WAIT(!conn2->active(), kDefaultTimeout, clock); |
3589 // |conn2| should not send a ping yet. | 3597 // |conn2| should not send a ping yet. |
3590 EXPECT_EQ(Connection::STATE_WAITING, conn2->state()); | 3598 EXPECT_EQ(Connection::STATE_WAITING, conn2->state()); |
3591 EXPECT_EQ(TransportChannelState::STATE_COMPLETED, ch.GetState()); | 3599 EXPECT_EQ(TransportChannelState::STATE_COMPLETED, ch.GetState()); |
3592 // Wait for |conn1| becoming not receiving. | 3600 // Wait for |conn1| becoming not receiving. |
3593 EXPECT_TRUE_WAIT(!conn1->receiving(), 3000); | 3601 EXPECT_TRUE_SIMULATED_WAIT(!conn1->receiving(), 3000, clock); |
3594 // Make sure conn2 is not deleted. | 3602 // Make sure conn2 is not deleted. |
3595 conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 3603 conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2, &clock); |
3596 ASSERT_TRUE(conn2 != nullptr); | 3604 ASSERT_TRUE(conn2 != nullptr); |
3597 EXPECT_EQ_WAIT(Connection::STATE_INPROGRESS, conn2->state(), 1000); | 3605 EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_INPROGRESS, conn2->state(), |
3606 kDefaultTimeout, clock); | |
3598 conn2->ReceivedPingResponse(LOW_RTT, "id"); | 3607 conn2->ReceivedPingResponse(LOW_RTT, "id"); |
3599 EXPECT_EQ_WAIT(conn2, ch.selected_connection(), 1000); | 3608 EXPECT_EQ_SIMULATED_WAIT(conn2, ch.selected_connection(), kDefaultTimeout, |
3609 clock); | |
3600 EXPECT_EQ(TransportChannelState::STATE_CONNECTING, ch.GetState()); | 3610 EXPECT_EQ(TransportChannelState::STATE_CONNECTING, ch.GetState()); |
3601 | 3611 |
3602 // When |conn1| comes back again, |conn2| will be pruned again. | 3612 // When |conn1| comes back again, |conn2| will be pruned again. |
3603 conn1->ReceivedPingResponse(LOW_RTT, "id"); | 3613 conn1->ReceivedPingResponse(LOW_RTT, "id"); |
3604 EXPECT_EQ_WAIT(conn1, ch.selected_connection(), 1000); | 3614 EXPECT_EQ_SIMULATED_WAIT(conn1, ch.selected_connection(), kDefaultTimeout, |
3605 EXPECT_TRUE_WAIT(!conn2->active(), 1000); | 3615 clock); |
3616 EXPECT_TRUE_SIMULATED_WAIT(!conn2->active(), kDefaultTimeout, clock); | |
3606 EXPECT_EQ(TransportChannelState::STATE_COMPLETED, ch.GetState()); | 3617 EXPECT_EQ(TransportChannelState::STATE_COMPLETED, ch.GetState()); |
3607 } | 3618 } |
3608 | 3619 |
3609 // Test that if all connections in a channel has timed out on writing, they | 3620 // Test that if all connections in a channel has timed out on writing, they |
3610 // will all be deleted. We use Prune to simulate write_time_out. | 3621 // will all be deleted. We use Prune to simulate write_time_out. |
3611 TEST_F(P2PTransportChannelPingTest, TestDeleteConnectionsIfAllWriteTimedout) { | 3622 TEST_F(P2PTransportChannelPingTest, TestDeleteConnectionsIfAllWriteTimedout) { |
3612 FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3623 FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
3613 P2PTransportChannel ch("test channel", 1, &pa); | 3624 P2PTransportChannel ch("test channel", 1, &pa); |
3614 PrepareChannel(&ch); | 3625 PrepareChannel(&ch); |
3615 ch.MaybeStartGathering(); | 3626 ch.MaybeStartGathering(); |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3954 | 3965 |
3955 // TCP Relay/Relay is the next. | 3966 // TCP Relay/Relay is the next. |
3956 VerifyNextPingableConnection(RELAY_PORT_TYPE, RELAY_PORT_TYPE, | 3967 VerifyNextPingableConnection(RELAY_PORT_TYPE, RELAY_PORT_TYPE, |
3957 TCP_PROTOCOL_NAME); | 3968 TCP_PROTOCOL_NAME); |
3958 | 3969 |
3959 // Finally, Local/Relay will be pinged. | 3970 // Finally, Local/Relay will be pinged. |
3960 VerifyNextPingableConnection(LOCAL_PORT_TYPE, RELAY_PORT_TYPE); | 3971 VerifyNextPingableConnection(LOCAL_PORT_TYPE, RELAY_PORT_TYPE); |
3961 } | 3972 } |
3962 | 3973 |
3963 } // namespace cricket { | 3974 } // namespace cricket { |
OLD | NEW |