| 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 1178 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1189   // Emulate no remote credentials coming in. | 1189   // Emulate no remote credentials coming in. | 
| 1190   set_remote_ice_credential_source(FROM_CANDIDATE); | 1190   set_remote_ice_credential_source(FROM_CANDIDATE); | 
| 1191   CreateChannels(1); | 1191   CreateChannels(1); | 
| 1192   // Only have remote credentials come in for ep2, not ep1. | 1192   // Only have remote credentials come in for ep2, not ep1. | 
| 1193   ep2_ch1()->SetRemoteIceCredentials(kIceUfrag[0], kIcePwd[0]); | 1193   ep2_ch1()->SetRemoteIceCredentials(kIceUfrag[0], kIcePwd[0]); | 
| 1194 | 1194 | 
| 1195   // Pause sending ep2's candidates to ep1 until ep1 receives the peer reflexive | 1195   // Pause sending ep2's candidates to ep1 until ep1 receives the peer reflexive | 
| 1196   // candidate. | 1196   // candidate. | 
| 1197   PauseCandidates(1); | 1197   PauseCandidates(1); | 
| 1198 | 1198 | 
| 1199   // The caller should have the selected connection connected to the peer | 1199   // Wait until the callee becomes writable to make sure that a ping request is | 
| 1200   // reflexive candidate. | 1200   // received by the caller before his remote ICE credentials are set. | 
| 1201   const Connection* selected_connection = NULL; | 1201   ASSERT_TRUE_WAIT(ep2_ch1()->selected_connection() != nullptr, 3000); | 
| 1202   WAIT((selected_connection = ep1_ch1()->selected_connection()) != NULL, 2000); |  | 
| 1203   EXPECT_EQ("prflx", |  | 
| 1204             ep1_ch1()->selected_connection()->remote_candidate().type()); |  | 
| 1205 |  | 
| 1206   // Because we don't have a remote pwd, we don't ping yet. |  | 
| 1207   EXPECT_EQ(kIceUfrag[1], |  | 
| 1208             ep1_ch1()->selected_connection()->remote_candidate().username()); |  | 
| 1209   EXPECT_EQ("", |  | 
| 1210             ep1_ch1()->selected_connection()->remote_candidate().password()); |  | 
| 1211   // Because we don't have ICE credentials yet, we don't know the generation. |  | 
| 1212   EXPECT_EQ(0u, |  | 
| 1213             ep1_ch1()->selected_connection()->remote_candidate().generation()); |  | 
| 1214   EXPECT_TRUE(nullptr == ep1_ch1()->FindNextPingableConnection()); |  | 
| 1215 |  | 
| 1216   // Add two sets of remote ICE credentials, so that the ones used by the | 1202   // Add two sets of remote ICE credentials, so that the ones used by the | 
| 1217   // candidate will be generation 1 instead of 0. | 1203   // candidate will be generation 1 instead of 0. | 
| 1218   ep1_ch1()->SetRemoteIceCredentials(kIceUfrag[3], kIcePwd[3]); | 1204   ep1_ch1()->SetRemoteIceCredentials(kIceUfrag[3], kIcePwd[3]); | 
| 1219   ep1_ch1()->SetRemoteIceCredentials(kIceUfrag[1], kIcePwd[1]); | 1205   ep1_ch1()->SetRemoteIceCredentials(kIceUfrag[1], kIcePwd[1]); | 
| 1220   // After setting the remote ICE credentials, the password and generation | 1206   // The caller should have the selected connection connected to the peer | 
| 1221   // of the peer reflexive candidate should be updated. | 1207   // reflexive candidate. | 
| 1222   EXPECT_EQ(kIcePwd[1], | 1208   const Connection* selected_connection = nullptr; | 
| 1223             ep1_ch1()->selected_connection()->remote_candidate().password()); | 1209   ASSERT_TRUE_WAIT( | 
| 1224   EXPECT_EQ(1u, | 1210       (selected_connection = ep1_ch1()->selected_connection()) != nullptr, | 
| 1225             ep1_ch1()->selected_connection()->remote_candidate().generation()); | 1211       2000); | 
| 1226   EXPECT_TRUE(nullptr != ep1_ch1()->FindNextPingableConnection()); | 1212   EXPECT_EQ("prflx", selected_connection->remote_candidate().type()); | 
|  | 1213   EXPECT_EQ(kIceUfrag[1], selected_connection->remote_candidate().username()); | 
|  | 1214   EXPECT_EQ(kIcePwd[1], selected_connection->remote_candidate().password()); | 
|  | 1215   EXPECT_EQ(1u, selected_connection->remote_candidate().generation()); | 
| 1227 | 1216 | 
| 1228   ResumeCandidates(1); | 1217   ResumeCandidates(1); | 
| 1229 |  | 
| 1230   WAIT(ep2_ch1()->selected_connection() != NULL, 2000); |  | 
| 1231   // Verify ep1's selected connection is updated to use the 'local' candidate. | 1218   // Verify ep1's selected connection is updated to use the 'local' candidate. | 
| 1232   EXPECT_EQ_WAIT("local", | 1219   EXPECT_EQ_WAIT("local", | 
| 1233                  ep1_ch1()->selected_connection()->remote_candidate().type(), | 1220                  ep1_ch1()->selected_connection()->remote_candidate().type(), | 
| 1234                  2000); | 1221                  2000); | 
| 1235   EXPECT_EQ(selected_connection, ep1_ch1()->selected_connection()); | 1222   EXPECT_EQ(selected_connection, ep1_ch1()->selected_connection()); | 
| 1236   DestroyChannels(); | 1223   DestroyChannels(); | 
| 1237 } | 1224 } | 
| 1238 | 1225 | 
| 1239 // Test that we properly create a connection on a STUN ping from unknown address | 1226 // Test that we properly create a connection on a STUN ping from unknown address | 
| 1240 // when the signaling is slow and the end points are behind NAT. | 1227 // when the signaling is slow and the end points are behind NAT. | 
| 1241 TEST_F(P2PTransportChannelTest, PeerReflexiveCandidateBeforeSignalingWithNAT) { | 1228 TEST_F(P2PTransportChannelTest, PeerReflexiveCandidateBeforeSignalingWithNAT) { | 
| 1242   ConfigureEndpoints(OPEN, NAT_SYMMETRIC, kDefaultPortAllocatorFlags, | 1229   ConfigureEndpoints(OPEN, NAT_SYMMETRIC, kDefaultPortAllocatorFlags, | 
| 1243                      kDefaultPortAllocatorFlags); | 1230                      kDefaultPortAllocatorFlags); | 
| 1244   // Emulate no remote credentials coming in. | 1231   // Emulate no remote credentials coming in. | 
| 1245   set_remote_ice_credential_source(FROM_CANDIDATE); | 1232   set_remote_ice_credential_source(FROM_CANDIDATE); | 
| 1246   CreateChannels(1); | 1233   CreateChannels(1); | 
| 1247   // Only have remote credentials come in for ep2, not ep1. | 1234   // Only have remote credentials come in for ep2, not ep1. | 
| 1248   ep2_ch1()->SetRemoteIceCredentials(kIceUfrag[0], kIcePwd[0]); | 1235   ep2_ch1()->SetRemoteIceCredentials(kIceUfrag[0], kIcePwd[0]); | 
| 1249   // Pause sending ep2's candidates to ep1 until ep1 receives the peer reflexive | 1236   // Pause sending ep2's candidates to ep1 until ep1 receives the peer reflexive | 
| 1250   // candidate. | 1237   // candidate. | 
| 1251   PauseCandidates(1); | 1238   PauseCandidates(1); | 
| 1252 | 1239 | 
| 1253   // The caller should have the selected connection connected to the peer | 1240   // Wait until the callee becomes writable to make sure that a ping request is | 
| 1254   // reflexive candidate. | 1241   // received by the caller before his remote ICE credentials are set. | 
| 1255   WAIT(ep1_ch1()->selected_connection() != NULL, 2000); | 1242   ASSERT_TRUE_WAIT(ep2_ch1()->selected_connection() != nullptr, 3000); | 
| 1256   EXPECT_EQ("prflx", |  | 
| 1257             ep1_ch1()->selected_connection()->remote_candidate().type()); |  | 
| 1258 |  | 
| 1259   // Because we don't have a remote pwd, we don't ping yet. |  | 
| 1260   EXPECT_EQ(kIceUfrag[1], |  | 
| 1261             ep1_ch1()->selected_connection()->remote_candidate().username()); |  | 
| 1262   EXPECT_EQ("", |  | 
| 1263             ep1_ch1()->selected_connection()->remote_candidate().password()); |  | 
| 1264   // Because we don't have ICE credentials yet, we don't know the generation. |  | 
| 1265   EXPECT_EQ(0u, |  | 
| 1266             ep1_ch1()->selected_connection()->remote_candidate().generation()); |  | 
| 1267   EXPECT_TRUE(nullptr == ep1_ch1()->FindNextPingableConnection()); |  | 
| 1268 |  | 
| 1269   // Add two sets of remote ICE credentials, so that the ones used by the | 1243   // Add two sets of remote ICE credentials, so that the ones used by the | 
| 1270   // candidate will be generation 1 instead of 0. | 1244   // candidate will be generation 1 instead of 0. | 
| 1271   ep1_ch1()->SetRemoteIceCredentials(kIceUfrag[3], kIcePwd[3]); | 1245   ep1_ch1()->SetRemoteIceCredentials(kIceUfrag[3], kIcePwd[3]); | 
| 1272   ep1_ch1()->SetRemoteIceCredentials(kIceUfrag[1], kIcePwd[1]); | 1246   ep1_ch1()->SetRemoteIceCredentials(kIceUfrag[1], kIcePwd[1]); | 
| 1273   // After setting the remote ICE credentials, the password and generation | 1247 | 
| 1274   // of the peer reflexive candidate should be updated. | 1248   // The caller's selected connection should be connected to the peer reflexive | 
| 1275   EXPECT_EQ(kIcePwd[1], | 1249   // candidate. | 
| 1276             ep1_ch1()->selected_connection()->remote_candidate().password()); | 1250   const Connection* selected_connection = nullptr; | 
| 1277   EXPECT_EQ(1u, | 1251   ASSERT_TRUE_WAIT( | 
| 1278             ep1_ch1()->selected_connection()->remote_candidate().generation()); | 1252       (selected_connection = ep1_ch1()->selected_connection()) != nullptr, | 
|  | 1253       2000); | 
|  | 1254   EXPECT_EQ("prflx", selected_connection->remote_candidate().type()); | 
|  | 1255   EXPECT_EQ(kIceUfrag[1], selected_connection->remote_candidate().username()); | 
|  | 1256   EXPECT_EQ(kIcePwd[1], selected_connection->remote_candidate().password()); | 
|  | 1257   EXPECT_EQ(1u, selected_connection->remote_candidate().generation()); | 
| 1279 | 1258 | 
| 1280   ResumeCandidates(1); | 1259   ResumeCandidates(1); | 
| 1281 | 1260 | 
| 1282   const Connection* selected_connection = NULL; | 1261   EXPECT_EQ_WAIT("prflx", | 
| 1283   WAIT((selected_connection = ep2_ch1()->selected_connection()) != NULL, 2000); | 1262                  ep1_ch1()->selected_connection()->remote_candidate().type(), | 
| 1284 | 1263                  2000); | 
| 1285   // Wait to verify the connection is not culled. | 1264   EXPECT_EQ(selected_connection, ep1_ch1()->selected_connection()); | 
| 1286   WAIT(ep1_ch1()->writable(), 2000); |  | 
| 1287   EXPECT_EQ(ep2_ch1()->selected_connection(), selected_connection); |  | 
| 1288   EXPECT_EQ("prflx", |  | 
| 1289             ep1_ch1()->selected_connection()->remote_candidate().type()); |  | 
| 1290   DestroyChannels(); | 1265   DestroyChannels(); | 
| 1291 } | 1266 } | 
| 1292 | 1267 | 
| 1293 // 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 | 
| 1294 // 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 | 
| 1295 // remote peer doing an ICE restart, pairing this candidate across generations. | 1270 // remote peer doing an ICE restart, pairing this candidate across generations. | 
| 1296 // | 1271 // | 
| 1297 // 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 | 
| 1298 // candidate was only updated for the newest generation candidate pairs, and | 1273 // candidate was only updated for the newest generation candidate pairs, and | 
| 1299 // 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... | 
| 2574     ch->SignalSelectedCandidatePairChanged.connect( | 2549     ch->SignalSelectedCandidatePairChanged.connect( | 
| 2575         this, &P2PTransportChannelPingTest::OnSelectedCandidatePairChanged); | 2550         this, &P2PTransportChannelPingTest::OnSelectedCandidatePairChanged); | 
| 2576     ch->SignalReadyToSend.connect(this, | 2551     ch->SignalReadyToSend.connect(this, | 
| 2577                                   &P2PTransportChannelPingTest::OnReadyToSend); | 2552                                   &P2PTransportChannelPingTest::OnReadyToSend); | 
| 2578     ch->SignalStateChanged.connect( | 2553     ch->SignalStateChanged.connect( | 
| 2579         this, &P2PTransportChannelPingTest::OnChannelStateChanged); | 2554         this, &P2PTransportChannelPingTest::OnChannelStateChanged); | 
| 2580   } | 2555   } | 
| 2581 | 2556 | 
| 2582   Connection* WaitForConnectionTo(P2PTransportChannel* ch, | 2557   Connection* WaitForConnectionTo(P2PTransportChannel* ch, | 
| 2583                                   const std::string& ip, | 2558                                   const std::string& ip, | 
| 2584                                   int port_num) { | 2559                                   int port_num, | 
| 2585     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     } | 
| 2586     return GetConnectionTo(ch, ip, port_num); | 2567     return GetConnectionTo(ch, ip, port_num); | 
| 2587   } | 2568   } | 
| 2588 | 2569 | 
| 2589   Port* GetPort(P2PTransportChannel* ch) { | 2570   Port* GetPort(P2PTransportChannel* ch) { | 
| 2590     if (ch->ports().empty()) { | 2571     if (ch->ports().empty()) { | 
| 2591       return nullptr; | 2572       return nullptr; | 
| 2592     } | 2573     } | 
| 2593     return static_cast<Port*>(ch->ports()[0]); | 2574     return static_cast<Port*>(ch->ports()[0]); | 
| 2594   } | 2575   } | 
| 2595 | 2576 | 
| (...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3060   ch.SetIceConfig(CreateIceConfig(500, GATHER_ONCE)); | 3041   ch.SetIceConfig(CreateIceConfig(500, GATHER_ONCE)); | 
| 3061   EXPECT_EQ(500, ch.receiving_timeout()); | 3042   EXPECT_EQ(500, ch.receiving_timeout()); | 
| 3062   EXPECT_EQ(50, ch.check_receiving_interval()); | 3043   EXPECT_EQ(50, ch.check_receiving_interval()); | 
| 3063   ch.MaybeStartGathering(); | 3044   ch.MaybeStartGathering(); | 
| 3064   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)); | 
| 3065   Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 3046   Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 
| 3066   ASSERT_TRUE(conn1 != nullptr); | 3047   ASSERT_TRUE(conn1 != nullptr); | 
| 3067 | 3048 | 
| 3068   conn1->ReceivedPing(); | 3049   conn1->ReceivedPing(); | 
| 3069   conn1->OnReadPacket("ABC", 3, rtc::CreatePacketTime(0)); | 3050   conn1->OnReadPacket("ABC", 3, rtc::CreatePacketTime(0)); | 
| 3070   EXPECT_TRUE_WAIT(ch.selected_connection() != nullptr, 1000); |  | 
| 3071   EXPECT_TRUE_WAIT(ch.receiving(), 1000); | 3051   EXPECT_TRUE_WAIT(ch.receiving(), 1000); | 
| 3072   EXPECT_TRUE_WAIT(!ch.receiving(), 1000); | 3052   EXPECT_TRUE_WAIT(!ch.receiving(), 1000); | 
| 3073 } | 3053 } | 
| 3074 | 3054 | 
| 3075 // The controlled side will select a connection as the "selected connection" | 3055 // The controlled side will select a connection as the "selected connection" | 
| 3076 // 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 | 
| 3077 // point the controlled side will select that connection as the | 3057 // point the controlled side will select that connection as the | 
| 3078 // "selected connection". Plus, SignalSelectedCandidatePair will be fired if the | 3058 // "selected connection". Plus, SignalSelectedCandidatePair will be fired if the | 
| 3079 // selected connection changes and SignalReadyToSend will be fired if the new | 3059 // selected connection changes and SignalReadyToSend will be fired if the new | 
| 3080 // selected connection is writable. | 3060 // selected connection is writable. | 
| 3081 TEST_F(P2PTransportChannelPingTest, TestSelectConnectionBeforeNomination) { | 3061 TEST_F(P2PTransportChannelPingTest, TestSelectConnectionBeforeNomination) { | 
| 3082   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3062   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 
| 3083   P2PTransportChannel ch("receiving state change", 1, &pa); | 3063   P2PTransportChannel ch("receiving state change", 1, &pa); | 
| 3084   PrepareChannel(&ch); | 3064   PrepareChannel(&ch); | 
| 3085   ch.SetIceRole(ICEROLE_CONTROLLED); | 3065   ch.SetIceRole(ICEROLE_CONTROLLED); | 
| 3086   ch.MaybeStartGathering(); | 3066   ch.MaybeStartGathering(); | 
| 3087   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)); | 
| 3088   Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 3068   Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 
| 3089   ASSERT_TRUE(conn1 != nullptr); | 3069   ASSERT_TRUE(conn1 != nullptr); | 
| 3090   EXPECT_EQ(conn1, ch.selected_connection()); |  | 
| 3091   EXPECT_EQ(conn1, last_selected_candidate_pair()); |  | 
| 3092   EXPECT_EQ(-1, last_sent_packet_id()); |  | 
| 3093   // Channel is not ready to send because it is not writable. | 3070   // Channel is not ready to send because it is not writable. | 
| 3094   EXPECT_FALSE(channel_ready_to_send()); | 3071   EXPECT_FALSE(channel_ready_to_send()); | 
| 3095 |  | 
| 3096   int last_packet_id = 0; | 3072   int last_packet_id = 0; | 
| 3097   const char* data = "ABCDEFGH"; | 3073   const char* data = "ABCDEFGH"; | 
| 3098   int len = static_cast<int>(strlen(data)); | 3074   int len = static_cast<int>(strlen(data)); | 
| 3099   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 needs to be writable before it is selected for transmission. | 
|  | 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 | 
| 3100   // 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 | 
| 3101   // as the selected connection. | 3085   // as the selected connection. | 
| 3102   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)); | 
| 3103   Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 3087   Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 
| 3104   ASSERT_TRUE(conn2 != nullptr); | 3088   ASSERT_TRUE(conn2 != nullptr); | 
| 3105   EXPECT_EQ(conn2, ch.selected_connection()); | 3089   conn2->ReceivedPingResponse(LOW_RTT, "id"); | 
|  | 3090   EXPECT_EQ_WAIT(conn2, ch.selected_connection(), kDefaultTimeout); | 
| 3106   EXPECT_EQ(conn2, last_selected_candidate_pair()); | 3091   EXPECT_EQ(conn2, last_selected_candidate_pair()); | 
| 3107   EXPECT_EQ(-1, last_sent_packet_id()); | 3092   EXPECT_TRUE(channel_ready_to_send()); | 
| 3108   EXPECT_FALSE(channel_ready_to_send()); | 3093   EXPECT_EQ(last_packet_id, last_sent_packet_id()); | 
| 3109 | 3094 | 
| 3110   // If a stun request with use-candidate attribute arrives, the receiving | 3095   // If a stun request with use-candidate attribute arrives, the receiving | 
| 3111   // connection will be set as the selected connection, even though | 3096   // connection will be set as the selected connection, even though | 
| 3112   // its priority is lower. | 3097   // its priority is lower. | 
| 3113   EXPECT_EQ(-1, SendData(ch, data, len, ++last_packet_id)); | 3098   EXPECT_EQ(len, SendData(ch, data, len, ++last_packet_id)); | 
| 3114   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)); | 
| 3115   Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3); | 3100   Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3); | 
| 3116   ASSERT_TRUE(conn3 != nullptr); | 3101   ASSERT_TRUE(conn3 != nullptr); | 
| 3117   // 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. | 
| 3118   EXPECT_EQ(conn2, ch.selected_connection()); | 3103   EXPECT_EQ(conn2, ch.selected_connection()); | 
| 3119   conn3->ReceivedPingResponse(LOW_RTT, "id");  // Become writable. | 3104   conn3->ReceivedPingResponse(LOW_RTT, "id");  // Become writable. | 
| 3120   // 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 | 
| 3121   // connection. | 3106   // connection. | 
| 3122   NominateConnection(conn3); | 3107   NominateConnection(conn3); | 
| 3123   EXPECT_EQ(conn3, ch.selected_connection()); | 3108   EXPECT_EQ(conn3, ch.selected_connection()); | 
| 3124   EXPECT_EQ(conn3, last_selected_candidate_pair()); | 3109   EXPECT_EQ(conn3, last_selected_candidate_pair()); | 
| 3125   EXPECT_EQ(-1, last_sent_packet_id()); | 3110   EXPECT_EQ(last_packet_id, last_sent_packet_id()); | 
| 3126   EXPECT_TRUE(channel_ready_to_send()); | 3111   EXPECT_TRUE(channel_ready_to_send()); | 
| 3127 | 3112 | 
| 3128   // 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 | 
| 3129   // the selected connection because the selected connection is nominated by | 3114   // the selected connection because the selected connection is nominated by | 
| 3130   // the controlling side. | 3115   // the controlling side. | 
| 3131   EXPECT_EQ(len, SendData(ch, data, len, ++last_packet_id)); | 3116   EXPECT_EQ(len, SendData(ch, data, len, ++last_packet_id)); | 
| 3132   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)); | 
| 3133   Connection* conn4 = WaitForConnectionTo(&ch, "4.4.4.4", 4); | 3118   Connection* conn4 = WaitForConnectionTo(&ch, "4.4.4.4", 4); | 
| 3134   ASSERT_TRUE(conn4 != nullptr); | 3119   ASSERT_TRUE(conn4 != nullptr); | 
| 3135   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... | 
| 3167       new StunByteStringAttribute(STUN_ATTR_USERNAME, kIceUfrag[1])); | 3152       new StunByteStringAttribute(STUN_ATTR_USERNAME, kIceUfrag[1])); | 
| 3168   uint32_t prflx_priority = ICE_TYPE_PREFERENCE_PRFLX << 24; | 3153   uint32_t prflx_priority = ICE_TYPE_PREFERENCE_PRFLX << 24; | 
| 3169   request.AddAttribute( | 3154   request.AddAttribute( | 
| 3170       new StunUInt32Attribute(STUN_ATTR_PRIORITY, prflx_priority)); | 3155       new StunUInt32Attribute(STUN_ATTR_PRIORITY, prflx_priority)); | 
| 3171   TestUDPPort* port = static_cast<TestUDPPort*>(GetPort(&ch)); | 3156   TestUDPPort* port = static_cast<TestUDPPort*>(GetPort(&ch)); | 
| 3172   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, | 
| 3173                              &request, kIceUfrag[1], false); | 3158                              &request, kIceUfrag[1], false); | 
| 3174   Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 3159   Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 
| 3175   ASSERT_TRUE(conn1 != nullptr); | 3160   ASSERT_TRUE(conn1 != nullptr); | 
| 3176   EXPECT_TRUE(port->sent_binding_response()); | 3161   EXPECT_TRUE(port->sent_binding_response()); | 
| 3177   EXPECT_EQ(conn1, ch.selected_connection()); | 3162   EXPECT_NE(conn1, ch.selected_connection()); | 
| 3178   conn1->ReceivedPingResponse(LOW_RTT, "id"); | 3163   conn1->ReceivedPingResponse(LOW_RTT, "id"); | 
| 3179   EXPECT_EQ(conn1, ch.selected_connection()); | 3164   EXPECT_EQ_WAIT(conn1, ch.selected_connection(), kDefaultTimeout); | 
| 3180   port->set_sent_binding_response(false); | 3165   port->set_sent_binding_response(false); | 
| 3181 | 3166 | 
| 3182   // Another connection is nominated via use_candidate. | 3167   // Another connection is nominated via use_candidate. | 
| 3183   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)); | 
| 3184   Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 3169   Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 
| 3185   ASSERT_TRUE(conn2 != nullptr); | 3170   ASSERT_TRUE(conn2 != nullptr); | 
| 3186   // 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. | 
| 3187   EXPECT_EQ(conn1, ch.selected_connection()); | 3172   EXPECT_EQ(conn1, ch.selected_connection()); | 
| 3188   // 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 | 
| 3189   // selected connection. | 3174   // selected connection. | 
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3235 // the "selected connection". | 3220 // the "selected connection". | 
| 3236 TEST_F(P2PTransportChannelPingTest, TestSelectConnectionBasedOnMediaReceived) { | 3221 TEST_F(P2PTransportChannelPingTest, TestSelectConnectionBasedOnMediaReceived) { | 
| 3237   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3222   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 
| 3238   P2PTransportChannel ch("receiving state change", 1, &pa); | 3223   P2PTransportChannel ch("receiving state change", 1, &pa); | 
| 3239   PrepareChannel(&ch); | 3224   PrepareChannel(&ch); | 
| 3240   ch.SetIceRole(ICEROLE_CONTROLLED); | 3225   ch.SetIceRole(ICEROLE_CONTROLLED); | 
| 3241   ch.MaybeStartGathering(); | 3226   ch.MaybeStartGathering(); | 
| 3242   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)); | 
| 3243   Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 3228   Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 
| 3244   ASSERT_TRUE(conn1 != nullptr); | 3229   ASSERT_TRUE(conn1 != nullptr); | 
| 3245   EXPECT_EQ(conn1, ch.selected_connection()); | 3230   conn1->ReceivedPingResponse(LOW_RTT, "id"); | 
|  | 3231   EXPECT_EQ_WAIT(conn1, ch.selected_connection(), kDefaultTimeout); | 
| 3246 | 3232 | 
| 3247   // 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 | 
| 3248   // 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 | 
| 3249   // chosen by the controlling side. | 3235   // chosen by the controlling side. | 
| 3250   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)); | 
| 3251   Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 3237   Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 
| 3252   ASSERT_TRUE(conn2 != nullptr); | 3238   ASSERT_TRUE(conn2 != nullptr); | 
| 3253   conn2->ReceivedPing();  // Start receiving. | 3239   conn2->ReceivedPingResponse(LOW_RTT, "id");  // Become writable and receiving. | 
| 3254   conn2->OnReadPacket("ABC", 3, rtc::CreatePacketTime(0)); | 3240   conn2->OnReadPacket("ABC", 3, rtc::CreatePacketTime(0)); | 
| 3255   EXPECT_EQ(conn2, ch.selected_connection()); | 3241   EXPECT_EQ(conn2, ch.selected_connection()); | 
| 3256   conn2->ReceivedPingResponse(LOW_RTT, "id");  // Become writable. | 3242   conn2->ReceivedPingResponse(LOW_RTT, "id");  // Become writable. | 
| 3257 | 3243 | 
| 3258   // 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 | 
| 3259   // nominate the selected connection. | 3245   // nominate the selected connection. | 
| 3260   IceMessage request; | 3246   IceMessage request; | 
| 3261   request.SetType(STUN_BINDING_REQUEST); | 3247   request.SetType(STUN_BINDING_REQUEST); | 
| 3262   request.AddAttribute( | 3248   request.AddAttribute( | 
| 3263       new StunByteStringAttribute(STUN_ATTR_USERNAME, kIceUfrag[1])); | 3249       new StunByteStringAttribute(STUN_ATTR_USERNAME, kIceUfrag[1])); | 
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3309   SIMULATED_WAIT(false, 1, clock); | 3295   SIMULATED_WAIT(false, 1, clock); | 
| 3310   conn2->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0)); | 3296   conn2->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0)); | 
| 3311   EXPECT_EQ(1, reset_selected_candidate_pair_switches()); | 3297   EXPECT_EQ(1, reset_selected_candidate_pair_switches()); | 
| 3312   EXPECT_EQ(conn2, last_selected_candidate_pair()); | 3298   EXPECT_EQ(conn2, last_selected_candidate_pair()); | 
| 3313 | 3299 | 
| 3314   // conn1 also receives data; it becomes selected due to priority again. | 3300   // conn1 also receives data; it becomes selected due to priority again. | 
| 3315   conn1->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0)); | 3301   conn1->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0)); | 
| 3316   EXPECT_EQ(1, reset_selected_candidate_pair_switches()); | 3302   EXPECT_EQ(1, reset_selected_candidate_pair_switches()); | 
| 3317   EXPECT_EQ(conn1, last_selected_candidate_pair()); | 3303   EXPECT_EQ(conn1, last_selected_candidate_pair()); | 
| 3318 | 3304 | 
|  | 3305   // conn2 received data more recently; it is selected now because it | 
|  | 3306   // received data more recently. | 
|  | 3307   SIMULATED_WAIT(false, 1, clock); | 
|  | 3308   // Need to become writable again because it was pruned. | 
|  | 3309   conn2->ReceivedPingResponse(LOW_RTT, "id"); | 
|  | 3310   conn2->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0)); | 
|  | 3311   EXPECT_EQ(1, reset_selected_candidate_pair_switches()); | 
|  | 3312   EXPECT_EQ(conn2, last_selected_candidate_pair()); | 
|  | 3313 | 
| 3319   // Make sure sorting won't reselect candidate pair. | 3314   // Make sure sorting won't reselect candidate pair. | 
| 3320   SIMULATED_WAIT(false, 10, clock); | 3315   SIMULATED_WAIT(false, 10, clock); | 
| 3321   EXPECT_EQ(0, reset_selected_candidate_pair_switches()); | 3316   EXPECT_EQ(0, reset_selected_candidate_pair_switches()); | 
| 3322 } | 3317 } | 
| 3323 | 3318 | 
| 3324 TEST_F(P2PTransportChannelPingTest, | 3319 TEST_F(P2PTransportChannelPingTest, | 
| 3325        TestControlledAgentNominationTakesHigherPrecedenceThanDataReceiving) { | 3320        TestControlledAgentNominationTakesHigherPrecedenceThanDataReceiving) { | 
| 3326   rtc::ScopedFakeClock clock; | 3321   rtc::ScopedFakeClock clock; | 
| 3327 | 3322 | 
| 3328   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3323   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 
| 3329   P2PTransportChannel ch("SwitchSelectedConnection", 1, &pa); | 3324   P2PTransportChannel ch("SwitchSelectedConnection", 1, &pa); | 
| 3330   PrepareChannel(&ch); | 3325   PrepareChannel(&ch); | 
| 3331   ch.SetIceRole(ICEROLE_CONTROLLED); | 3326   ch.SetIceRole(ICEROLE_CONTROLLED); | 
| 3332   ch.MaybeStartGathering(); | 3327   ch.MaybeStartGathering(); | 
| 3333   // The connections have decreasing priority. | 3328   // The connections have decreasing priority. | 
| 3334   Connection* conn1 = | 3329   Connection* conn1 = | 
| 3335       CreateConnectionWithCandidate(ch, clock, "1.1.1.1", 1, 10, false); | 3330       CreateConnectionWithCandidate(ch, clock, "1.1.1.1", 1, 10, true); | 
| 3336   ASSERT_TRUE(conn1 != nullptr); | 3331   ASSERT_TRUE(conn1 != nullptr); | 
| 3337   Connection* conn2 = | 3332   Connection* conn2 = | 
| 3338       CreateConnectionWithCandidate(ch, clock, "2.2.2.2", 2, 9, false); | 3333       CreateConnectionWithCandidate(ch, clock, "2.2.2.2", 2, 9, true); | 
| 3339   ASSERT_TRUE(conn2 != nullptr); | 3334   ASSERT_TRUE(conn2 != nullptr); | 
| 3340 | 3335 | 
| 3341   // conn1 received data; it is the selected connection. | 3336   // conn1 received data; it is the selected connection. | 
| 3342   // Advance the clock to have a non-zero last-data-receiving time. | 3337   // Advance the clock to have a non-zero last-data-receiving time. | 
| 3343   SIMULATED_WAIT(false, 1, clock); | 3338   SIMULATED_WAIT(false, 1, clock); | 
| 3344   conn1->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0)); | 3339   conn1->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0)); | 
| 3345   EXPECT_EQ(1, reset_selected_candidate_pair_switches()); | 3340   EXPECT_EQ(1, reset_selected_candidate_pair_switches()); | 
| 3346   EXPECT_EQ(conn1, last_selected_candidate_pair()); | 3341   EXPECT_EQ(conn1, last_selected_candidate_pair()); | 
| 3347 | 3342 | 
| 3348   // conn2 is nominated; it becomes the selected connection. | 3343   // conn2 is nominated; it becomes the selected connection. | 
| 3349   NominateConnection(conn2); | 3344   NominateConnection(conn2); | 
| 3350   EXPECT_EQ(1, reset_selected_candidate_pair_switches()); | 3345   EXPECT_EQ(1, reset_selected_candidate_pair_switches()); | 
| 3351   EXPECT_EQ(conn2, last_selected_candidate_pair()); | 3346   EXPECT_EQ(conn2, last_selected_candidate_pair()); | 
| 3352 | 3347 | 
|  | 3348   // conn1 is selected because it has higher priority and also nominated. | 
| 3353   NominateConnection(conn1); | 3349   NominateConnection(conn1); | 
| 3354   EXPECT_EQ(1, reset_selected_candidate_pair_switches()); | 3350   EXPECT_EQ(1, reset_selected_candidate_pair_switches()); | 
| 3355   EXPECT_EQ(conn1, last_selected_candidate_pair()); | 3351   EXPECT_EQ(conn1, last_selected_candidate_pair()); | 
| 3356 | 3352 | 
| 3357   // conn2 received data more recently; it is selected now because it |  | 
| 3358   // received data more recently. |  | 
| 3359   SIMULATED_WAIT(false, 1, clock); |  | 
| 3360   conn2->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0)); |  | 
| 3361   EXPECT_EQ(1, reset_selected_candidate_pair_switches()); |  | 
| 3362   EXPECT_EQ(conn2, last_selected_candidate_pair()); |  | 
| 3363 |  | 
| 3364   // Make sure sorting won't reselect candidate pair. | 3353   // Make sure sorting won't reselect candidate pair. | 
| 3365   SIMULATED_WAIT(false, 10, clock); | 3354   SIMULATED_WAIT(false, 10, clock); | 
| 3366   EXPECT_EQ(0, reset_selected_candidate_pair_switches()); | 3355   EXPECT_EQ(0, reset_selected_candidate_pair_switches()); | 
| 3367 } | 3356 } | 
| 3368 | 3357 | 
| 3369 TEST_F(P2PTransportChannelPingTest, | 3358 TEST_F(P2PTransportChannelPingTest, | 
| 3370        TestControlledAgentSelectsConnectionWithHigherNomination) { | 3359        TestControlledAgentSelectsConnectionWithHigherNomination) { | 
| 3371   rtc::ScopedFakeClock clock; | 3360   rtc::ScopedFakeClock clock; | 
| 3372 | 3361 | 
| 3373   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3362   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 
| 3374   P2PTransportChannel ch("test", 1, &pa); | 3363   P2PTransportChannel ch("test", 1, &pa); | 
| 3375   PrepareChannel(&ch); | 3364   PrepareChannel(&ch); | 
| 3376   ch.SetIceRole(ICEROLE_CONTROLLED); | 3365   ch.SetIceRole(ICEROLE_CONTROLLED); | 
| 3377   ch.MaybeStartGathering(); | 3366   ch.MaybeStartGathering(); | 
| 3378   // The connections have decreasing priority. | 3367   // The connections have decreasing priority. | 
| 3379   Connection* conn1 = | 3368   Connection* conn1 = | 
| 3380       CreateConnectionWithCandidate(ch, clock, "1.1.1.1", 1, 10, false); | 3369       CreateConnectionWithCandidate(ch, clock, "1.1.1.1", 1, 10, true); | 
| 3381   ASSERT_TRUE(conn1 != nullptr); | 3370   ASSERT_TRUE(conn1 != nullptr); | 
| 3382   Connection* conn2 = | 3371   Connection* conn2 = | 
| 3383       CreateConnectionWithCandidate(ch, clock, "2.2.2.2", 2, 9, false); | 3372       CreateConnectionWithCandidate(ch, clock, "2.2.2.2", 2, 9, true); | 
| 3384   ASSERT_TRUE(conn2 != nullptr); | 3373   ASSERT_TRUE(conn2 != nullptr); | 
| 3385 | 3374 | 
| 3386   // conn1 is the selected connection because it has a higher priority, | 3375   // conn1 is the selected connection because it has a higher priority, | 
| 3387   EXPECT_EQ_SIMULATED_WAIT(conn1, last_selected_candidate_pair(), | 3376   EXPECT_EQ_SIMULATED_WAIT(conn1, last_selected_candidate_pair(), | 
| 3388                            kDefaultTimeout, clock); | 3377                            kDefaultTimeout, clock); | 
| 3389   reset_selected_candidate_pair_switches(); | 3378   reset_selected_candidate_pair_switches(); | 
| 3390 | 3379 | 
| 3391   // conn2 is nominated; it becomes selected. | 3380   // conn2 is nominated; it becomes selected. | 
| 3392   NominateConnection(conn2); | 3381   NominateConnection(conn2); | 
| 3393   EXPECT_EQ(1, reset_selected_candidate_pair_switches()); | 3382   EXPECT_EQ(1, reset_selected_candidate_pair_switches()); | 
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3436   ch.MaybeStartGathering(); | 3425   ch.MaybeStartGathering(); | 
| 3437   // The connections have decreasing priority. | 3426   // The connections have decreasing priority. | 
| 3438   Connection* conn1 = | 3427   Connection* conn1 = | 
| 3439       CreateConnectionWithCandidate(ch, clock, "1.1.1.1", 1, 10, false); | 3428       CreateConnectionWithCandidate(ch, clock, "1.1.1.1", 1, 10, false); | 
| 3440   ASSERT_TRUE(conn1 != nullptr); | 3429   ASSERT_TRUE(conn1 != nullptr); | 
| 3441   Connection* conn2 = | 3430   Connection* conn2 = | 
| 3442       CreateConnectionWithCandidate(ch, clock, "2.2.2.2", 2, 9, false); | 3431       CreateConnectionWithCandidate(ch, clock, "2.2.2.2", 2, 9, false); | 
| 3443   ASSERT_TRUE(conn2 != nullptr); | 3432   ASSERT_TRUE(conn2 != nullptr); | 
| 3444 | 3433 | 
| 3445   NominateConnection(conn1); | 3434   NominateConnection(conn1); | 
| 3446   EXPECT_EQ(1, reset_selected_candidate_pair_switches()); | 3435   // There is no selected connection because no connection is writable. | 
|  | 3436   EXPECT_EQ(0, reset_selected_candidate_pair_switches()); | 
| 3447 | 3437 | 
| 3448   // conn2 becomes writable; it is selected even though it is not nominated. | 3438   // conn2 becomes writable; it is selected even though it is not nominated. | 
| 3449   conn2->ReceivedPingResponse(LOW_RTT, "id"); | 3439   conn2->ReceivedPingResponse(LOW_RTT, "id"); | 
| 3450 |  | 
| 3451   EXPECT_EQ_SIMULATED_WAIT(1, reset_selected_candidate_pair_switches(), | 3440   EXPECT_EQ_SIMULATED_WAIT(1, reset_selected_candidate_pair_switches(), | 
| 3452                            kDefaultTimeout, clock); | 3441                            kDefaultTimeout, clock); | 
| 3453   EXPECT_EQ_SIMULATED_WAIT(conn2, last_selected_candidate_pair(), | 3442   EXPECT_EQ_SIMULATED_WAIT(conn2, last_selected_candidate_pair(), | 
| 3454                            kDefaultTimeout, clock); | 3443                            kDefaultTimeout, clock); | 
| 3455 | 3444 | 
| 3456   // If conn1 is also writable, it will become selected. | 3445   // If conn1 is also writable, it will become selected. | 
| 3457   conn1->ReceivedPingResponse(LOW_RTT, "id"); | 3446   conn1->ReceivedPingResponse(LOW_RTT, "id"); | 
| 3458   EXPECT_EQ_SIMULATED_WAIT(1, reset_selected_candidate_pair_switches(), | 3447   EXPECT_EQ_SIMULATED_WAIT(1, reset_selected_candidate_pair_switches(), | 
| 3459                            kDefaultTimeout, clock); | 3448                            kDefaultTimeout, clock); | 
| 3460   EXPECT_EQ_SIMULATED_WAIT(conn1, last_selected_candidate_pair(), | 3449   EXPECT_EQ_SIMULATED_WAIT(conn1, last_selected_candidate_pair(), | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3499   // Verify that a ping with the new ufrag can be received on the new | 3488   // Verify that a ping with the new ufrag can be received on the new | 
| 3500   // connection. | 3489   // connection. | 
| 3501   EXPECT_EQ(0, conn2->last_ping_received()); | 3490   EXPECT_EQ(0, conn2->last_ping_received()); | 
| 3502   ReceivePingOnConnection(conn2, kIceUfrag[2], 1 /* priority */); | 3491   ReceivePingOnConnection(conn2, kIceUfrag[2], 1 /* priority */); | 
| 3503   EXPECT_TRUE(conn2->last_ping_received() > 0); | 3492   EXPECT_TRUE(conn2->last_ping_received() > 0); | 
| 3504 } | 3493 } | 
| 3505 | 3494 | 
| 3506 // When the current selected connection is strong, lower-priority connections | 3495 // When the current selected connection is strong, lower-priority connections | 
| 3507 // will be pruned. Otherwise, lower-priority connections are kept. | 3496 // will be pruned. Otherwise, lower-priority connections are kept. | 
| 3508 TEST_F(P2PTransportChannelPingTest, TestDontPruneWhenWeak) { | 3497 TEST_F(P2PTransportChannelPingTest, TestDontPruneWhenWeak) { | 
|  | 3498   rtc::ScopedFakeClock clock; | 
| 3509   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3499   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 
| 3510   P2PTransportChannel ch("test channel", 1, &pa); | 3500   P2PTransportChannel ch("test channel", 1, &pa); | 
| 3511   PrepareChannel(&ch); | 3501   PrepareChannel(&ch); | 
| 3512   ch.SetIceRole(ICEROLE_CONTROLLED); | 3502   ch.SetIceRole(ICEROLE_CONTROLLED); | 
| 3513   ch.MaybeStartGathering(); | 3503   ch.MaybeStartGathering(); | 
| 3514   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1)); | 3504   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1)); | 
| 3515   Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 3505   Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 
| 3516   ASSERT_TRUE(conn1 != nullptr); | 3506   ASSERT_TRUE(conn1 != nullptr); | 
| 3517   EXPECT_EQ(conn1, ch.selected_connection()); | 3507   EXPECT_EQ(nullptr, ch.selected_connection()); | 
| 3518   conn1->ReceivedPingResponse(LOW_RTT, "id");  // Becomes writable and receiving | 3508   conn1->ReceivedPingResponse(LOW_RTT, "id");  // Becomes writable and receiving | 
| 3519 | 3509 | 
| 3520   // When a higher-priority, nominated candidate comes in, the connections with | 3510   // When a higher-priority, nominated candidate comes in, the connections with | 
| 3521   // lower-priority are pruned. | 3511   // lower-priority are pruned. | 
| 3522   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 10)); | 3512   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 10)); | 
| 3523   Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 3513   Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2, &clock); | 
| 3524   ASSERT_TRUE(conn2 != nullptr); | 3514   ASSERT_TRUE(conn2 != nullptr); | 
| 3525   conn2->ReceivedPingResponse(LOW_RTT, "id");  // Becomes writable and receiving | 3515   conn2->ReceivedPingResponse(LOW_RTT, "id");  // Becomes writable and receiving | 
| 3526   NominateConnection(conn2); | 3516   NominateConnection(conn2); | 
| 3527   EXPECT_TRUE_WAIT(conn1->pruned(), 3000); | 3517   EXPECT_TRUE_SIMULATED_WAIT(conn1->pruned(), 3000, clock); | 
| 3528 | 3518 | 
| 3529   ch.SetIceConfig(CreateIceConfig(500, GATHER_ONCE)); | 3519   ch.SetIceConfig(CreateIceConfig(500, GATHER_ONCE)); | 
| 3530   // Wait until conn2 becomes not receiving. | 3520   // Wait until conn2 becomes not receiving. | 
| 3531   EXPECT_TRUE_WAIT(!conn2->receiving(), 3000); | 3521   EXPECT_TRUE_SIMULATED_WAIT(!conn2->receiving(), 3000, clock); | 
| 3532 | 3522 | 
| 3533   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "3.3.3.3", 3, 1)); | 3523   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "3.3.3.3", 3, 1)); | 
| 3534   Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3); | 3524   Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3, &clock); | 
| 3535   ASSERT_TRUE(conn3 != nullptr); | 3525   ASSERT_TRUE(conn3 != nullptr); | 
| 3536   // The selected connection should still be conn2. Even through conn3 has lower | 3526   // The selected connection should still be conn2. Even through conn3 has lower | 
| 3537   // priority and is not receiving/writable, it is not pruned because the | 3527   // priority and is not receiving/writable, it is not pruned because the | 
| 3538   // selected connection is not receiving. | 3528   // selected connection is not receiving. | 
| 3539   WAIT(conn3->pruned(), 1000); | 3529   SIMULATED_WAIT(conn3->pruned(), 1000, clock); | 
| 3540   EXPECT_FALSE(conn3->pruned()); | 3530   EXPECT_FALSE(conn3->pruned()); | 
| 3541 } | 3531 } | 
| 3542 | 3532 | 
| 3543 TEST_F(P2PTransportChannelPingTest, TestDontPruneHighPriorityConnections) { | 3533 TEST_F(P2PTransportChannelPingTest, TestDontPruneHighPriorityConnections) { | 
| 3544   rtc::ScopedFakeClock clock; | 3534   rtc::ScopedFakeClock clock; | 
| 3545   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3535   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 
| 3546   P2PTransportChannel ch("test channel", 1, &pa); | 3536   P2PTransportChannel ch("test channel", 1, &pa); | 
| 3547   PrepareChannel(&ch); | 3537   PrepareChannel(&ch); | 
| 3548   ch.SetIceRole(ICEROLE_CONTROLLED); | 3538   ch.SetIceRole(ICEROLE_CONTROLLED); | 
| 3549   ch.MaybeStartGathering(); | 3539   ch.MaybeStartGathering(); | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3582   EXPECT_TRUE_WAIT(conn2->pruned(), 1000); | 3572   EXPECT_TRUE_WAIT(conn2->pruned(), 1000); | 
| 3583   EXPECT_EQ(TransportChannelState::STATE_COMPLETED, ch.GetState()); | 3573   EXPECT_EQ(TransportChannelState::STATE_COMPLETED, ch.GetState()); | 
| 3584   conn1->Prune();  // All connections are pruned. | 3574   conn1->Prune();  // All connections are pruned. | 
| 3585   // Need to wait until the channel state is updated. | 3575   // Need to wait until the channel state is updated. | 
| 3586   EXPECT_EQ_WAIT(TransportChannelState::STATE_FAILED, ch.GetState(), 1000); | 3576   EXPECT_EQ_WAIT(TransportChannelState::STATE_FAILED, ch.GetState(), 1000); | 
| 3587 } | 3577 } | 
| 3588 | 3578 | 
| 3589 // Test that when a low-priority connection is pruned, it is not deleted | 3579 // Test that when a low-priority connection is pruned, it is not deleted | 
| 3590 // right away, and it can become active and be pruned again. | 3580 // right away, and it can become active and be pruned again. | 
| 3591 TEST_F(P2PTransportChannelPingTest, TestConnectionPrunedAgain) { | 3581 TEST_F(P2PTransportChannelPingTest, TestConnectionPrunedAgain) { | 
|  | 3582   rtc::ScopedFakeClock clock; | 
| 3592   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3583   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 
| 3593   P2PTransportChannel ch("test channel", 1, &pa); | 3584   P2PTransportChannel ch("test channel", 1, &pa); | 
| 3594   PrepareChannel(&ch); | 3585   PrepareChannel(&ch); | 
| 3595   IceConfig config = CreateIceConfig(1000, GATHER_ONCE); | 3586   IceConfig config = CreateIceConfig(1000, GATHER_ONCE); | 
| 3596   config.receiving_switching_delay = rtc::Optional<int>(800); | 3587   config.receiving_switching_delay = rtc::Optional<int>(800); | 
| 3597   ch.SetIceConfig(config); | 3588   ch.SetIceConfig(config); | 
| 3598   ch.MaybeStartGathering(); | 3589   ch.MaybeStartGathering(); | 
| 3599   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 100)); | 3590   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 100)); | 
| 3600   Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 3591   Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1, &clock); | 
| 3601   ASSERT_TRUE(conn1 != nullptr); | 3592   ASSERT_TRUE(conn1 != nullptr); | 
| 3602   EXPECT_EQ(conn1, ch.selected_connection()); | 3593   EXPECT_EQ(nullptr, ch.selected_connection()); | 
| 3603   conn1->ReceivedPingResponse(LOW_RTT, "id");  // Becomes writable and receiving | 3594   conn1->ReceivedPingResponse(LOW_RTT, "id");  // Becomes writable and receiving | 
|  | 3595   EXPECT_EQ_SIMULATED_WAIT(conn1, ch.selected_connection(), kDefaultTimeout, | 
|  | 3596                            clock); | 
| 3604 | 3597 | 
| 3605   // Add a low-priority connection |conn2|, which will be pruned, but it will | 3598   // Add a low-priority connection |conn2|, which will be pruned, but it will | 
| 3606   // not be deleted right away. Once the current selected connection becomes not | 3599   // not be deleted right away. Once the current selected connection becomes not | 
| 3607   // receiving, |conn2| will start to ping and upon receiving the ping response, | 3600   // receiving, |conn2| will start to ping and upon receiving the ping response, | 
| 3608   // it will become the selected connection. | 3601   // it will become the selected connection. | 
| 3609   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 1)); | 3602   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 1)); | 
| 3610   Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 3603   Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2, &clock); | 
| 3611   ASSERT_TRUE(conn2 != nullptr); | 3604   ASSERT_TRUE(conn2 != nullptr); | 
| 3612   EXPECT_TRUE_WAIT(!conn2->active(), 1000); | 3605   EXPECT_TRUE_SIMULATED_WAIT(!conn2->active(), kDefaultTimeout, clock); | 
| 3613   // |conn2| should not send a ping yet. | 3606   // |conn2| should not send a ping yet. | 
| 3614   EXPECT_EQ(Connection::STATE_WAITING, conn2->state()); | 3607   EXPECT_EQ(Connection::STATE_WAITING, conn2->state()); | 
| 3615   EXPECT_EQ(TransportChannelState::STATE_COMPLETED, ch.GetState()); | 3608   EXPECT_EQ(TransportChannelState::STATE_COMPLETED, ch.GetState()); | 
| 3616   // Wait for |conn1| becoming not receiving. | 3609   // Wait for |conn1| becoming not receiving. | 
| 3617   EXPECT_TRUE_WAIT(!conn1->receiving(), 3000); | 3610   EXPECT_TRUE_SIMULATED_WAIT(!conn1->receiving(), 3000, clock); | 
| 3618   // Make sure conn2 is not deleted. | 3611   // Make sure conn2 is not deleted. | 
| 3619   conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 3612   conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2, &clock); | 
| 3620   ASSERT_TRUE(conn2 != nullptr); | 3613   ASSERT_TRUE(conn2 != nullptr); | 
| 3621   EXPECT_EQ_WAIT(Connection::STATE_INPROGRESS, conn2->state(), 1000); | 3614   EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_INPROGRESS, conn2->state(), | 
|  | 3615                            kDefaultTimeout, clock); | 
| 3622   conn2->ReceivedPingResponse(LOW_RTT, "id"); | 3616   conn2->ReceivedPingResponse(LOW_RTT, "id"); | 
| 3623   EXPECT_EQ_WAIT(conn2, ch.selected_connection(), 1000); | 3617   EXPECT_EQ_SIMULATED_WAIT(conn2, ch.selected_connection(), kDefaultTimeout, | 
|  | 3618                            clock); | 
| 3624   EXPECT_EQ(TransportChannelState::STATE_CONNECTING, ch.GetState()); | 3619   EXPECT_EQ(TransportChannelState::STATE_CONNECTING, ch.GetState()); | 
| 3625 | 3620 | 
| 3626   // When |conn1| comes back again, |conn2| will be pruned again. | 3621   // When |conn1| comes back again, |conn2| will be pruned again. | 
| 3627   conn1->ReceivedPingResponse(LOW_RTT, "id"); | 3622   conn1->ReceivedPingResponse(LOW_RTT, "id"); | 
| 3628   EXPECT_EQ_WAIT(conn1, ch.selected_connection(), 1000); | 3623   EXPECT_EQ_SIMULATED_WAIT(conn1, ch.selected_connection(), kDefaultTimeout, | 
| 3629   EXPECT_TRUE_WAIT(!conn2->active(), 1000); | 3624                            clock); | 
|  | 3625   EXPECT_TRUE_SIMULATED_WAIT(!conn2->active(), kDefaultTimeout, clock); | 
| 3630   EXPECT_EQ(TransportChannelState::STATE_COMPLETED, ch.GetState()); | 3626   EXPECT_EQ(TransportChannelState::STATE_COMPLETED, ch.GetState()); | 
| 3631 } | 3627 } | 
| 3632 | 3628 | 
| 3633 // Test that if all connections in a channel has timed out on writing, they | 3629 // Test that if all connections in a channel has timed out on writing, they | 
| 3634 // will all be deleted. We use Prune to simulate write_time_out. | 3630 // will all be deleted. We use Prune to simulate write_time_out. | 
| 3635 TEST_F(P2PTransportChannelPingTest, TestDeleteConnectionsIfAllWriteTimedout) { | 3631 TEST_F(P2PTransportChannelPingTest, TestDeleteConnectionsIfAllWriteTimedout) { | 
| 3636   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3632   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 
| 3637   P2PTransportChannel ch("test channel", 1, &pa); | 3633   P2PTransportChannel ch("test channel", 1, &pa); | 
| 3638   PrepareChannel(&ch); | 3634   PrepareChannel(&ch); | 
| 3639   ch.MaybeStartGathering(); | 3635   ch.MaybeStartGathering(); | 
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3978 | 3974 | 
| 3979   // TCP Relay/Relay is the next. | 3975   // TCP Relay/Relay is the next. | 
| 3980   VerifyNextPingableConnection(RELAY_PORT_TYPE, RELAY_PORT_TYPE, | 3976   VerifyNextPingableConnection(RELAY_PORT_TYPE, RELAY_PORT_TYPE, | 
| 3981                                TCP_PROTOCOL_NAME); | 3977                                TCP_PROTOCOL_NAME); | 
| 3982 | 3978 | 
| 3983   // Finally, Local/Relay will be pinged. | 3979   // Finally, Local/Relay will be pinged. | 
| 3984   VerifyNextPingableConnection(LOCAL_PORT_TYPE, RELAY_PORT_TYPE); | 3980   VerifyNextPingableConnection(LOCAL_PORT_TYPE, RELAY_PORT_TYPE); | 
| 3985 } | 3981 } | 
| 3986 | 3982 | 
| 3987 }  // namespace cricket { | 3983 }  // namespace cricket { | 
| OLD | NEW | 
|---|