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 2479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2490 return GetConnectionTo(ch, ip, port_num); | 2490 return GetConnectionTo(ch, ip, port_num); |
2491 } | 2491 } |
2492 | 2492 |
2493 Port* GetPort(P2PTransportChannel* ch) { | 2493 Port* GetPort(P2PTransportChannel* ch) { |
2494 if (ch->ports().empty()) { | 2494 if (ch->ports().empty()) { |
2495 return nullptr; | 2495 return nullptr; |
2496 } | 2496 } |
2497 return static_cast<Port*>(ch->ports()[0]); | 2497 return static_cast<Port*>(ch->ports()[0]); |
2498 } | 2498 } |
2499 | 2499 |
| 2500 Port* GetPrunedPort(P2PTransportChannel* ch) { |
| 2501 if (ch->pruned_ports().empty()) { |
| 2502 return nullptr; |
| 2503 } |
| 2504 return static_cast<Port*>(ch->pruned_ports()[0]); |
| 2505 } |
| 2506 |
2500 Connection* GetConnectionTo(P2PTransportChannel* ch, | 2507 Connection* GetConnectionTo(P2PTransportChannel* ch, |
2501 const std::string& ip, | 2508 const std::string& ip, |
2502 int port_num) { | 2509 int port_num) { |
2503 Port* port = GetPort(ch); | 2510 Port* port = GetPort(ch); |
2504 if (!port) { | 2511 if (!port) { |
2505 return nullptr; | 2512 return nullptr; |
2506 } | 2513 } |
2507 return port->GetConnection(rtc::SocketAddress(ip, port_num)); | 2514 return port->GetConnection(rtc::SocketAddress(ip, port_num)); |
2508 } | 2515 } |
2509 | 2516 |
(...skipping 1062 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3572 | 3579 |
3573 // Do an ICE restart, change the role, and expect the old port to have its | 3580 // Do an ICE restart, change the role, and expect the old port to have its |
3574 // role updated. | 3581 // role updated. |
3575 ch.SetIceCredentials(kIceUfrag[1], kIcePwd[1]); | 3582 ch.SetIceCredentials(kIceUfrag[1], kIcePwd[1]); |
3576 ch.MaybeStartGathering(); | 3583 ch.MaybeStartGathering(); |
3577 ch.SetIceRole(ICEROLE_CONTROLLED); | 3584 ch.SetIceRole(ICEROLE_CONTROLLED); |
3578 EXPECT_EQ(ICEROLE_CONTROLLED, conn->port()->GetIceRole()); | 3585 EXPECT_EQ(ICEROLE_CONTROLLED, conn->port()->GetIceRole()); |
3579 } | 3586 } |
3580 | 3587 |
3581 // Test that after some amount of time without receiving data, the connection | 3588 // Test that after some amount of time without receiving data, the connection |
3582 // and port are destroyed. | 3589 // will be destroyed. The port will only be destroyed after it is marked as |
3583 TEST_F(P2PTransportChannelPingTest, TestPortDestroyedAfterTimeout) { | 3590 // "pruned." |
| 3591 TEST_F(P2PTransportChannelPingTest, TestPortDestroyedAfterTimeoutAndPruned) { |
3584 rtc::ScopedFakeClock fake_clock; | 3592 rtc::ScopedFakeClock fake_clock; |
3585 | 3593 |
3586 FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3594 FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
3587 P2PTransportChannel ch("test channel", ICE_CANDIDATE_COMPONENT_DEFAULT, &pa); | 3595 P2PTransportChannel ch("test channel", ICE_CANDIDATE_COMPONENT_DEFAULT, &pa); |
3588 PrepareChannel(&ch); | 3596 PrepareChannel(&ch); |
3589 // Only a controlled channel should expect its ports to be destroyed. | |
3590 ch.SetIceRole(ICEROLE_CONTROLLED); | 3597 ch.SetIceRole(ICEROLE_CONTROLLED); |
3591 ch.MaybeStartGathering(); | 3598 ch.MaybeStartGathering(); |
3592 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1)); | 3599 ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1)); |
3593 | 3600 |
3594 Connection* conn = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 3601 Connection* conn = WaitForConnectionTo(&ch, "1.1.1.1", 1); |
3595 ASSERT_TRUE(conn != nullptr); | 3602 ASSERT_TRUE(conn != nullptr); |
3596 | 3603 |
3597 // Simulate 2 minutes going by. This should be enough time for the port to | 3604 // Simulate 2 minutes going by. This should be enough time for the port to |
3598 // time out. | 3605 // time out. |
3599 for (int second = 0; second < 120; ++second) { | 3606 for (int second = 0; second < 120; ++second) { |
3600 fake_clock.AdvanceTime(rtc::TimeDelta::FromSeconds(1)); | 3607 fake_clock.AdvanceTime(rtc::TimeDelta::FromSeconds(1)); |
3601 } | 3608 } |
3602 EXPECT_EQ(nullptr, GetConnectionTo(&ch, "1.1.1.1", 1)); | 3609 EXPECT_EQ(nullptr, GetConnectionTo(&ch, "1.1.1.1", 1)); |
3603 EXPECT_EQ(nullptr, GetPort(&ch)); | 3610 // Port will not be removed because it is not pruned yet. |
| 3611 PortInterface* port = GetPort(&ch); |
| 3612 ASSERT_NE(nullptr, port); |
| 3613 |
| 3614 // If the session prunes all ports, the port will be destroyed. |
| 3615 ch.allocator_session()->PruneAllPorts(); |
| 3616 EXPECT_EQ_SIMULATED_WAIT(nullptr, GetPort(&ch), 1, fake_clock); |
| 3617 EXPECT_EQ_SIMULATED_WAIT(nullptr, GetPrunedPort(&ch), 1, fake_clock); |
3604 } | 3618 } |
3605 | 3619 |
3606 class P2PTransportChannelMostLikelyToWorkFirstTest | 3620 class P2PTransportChannelMostLikelyToWorkFirstTest |
3607 : public P2PTransportChannelPingTest { | 3621 : public P2PTransportChannelPingTest { |
3608 public: | 3622 public: |
3609 P2PTransportChannelMostLikelyToWorkFirstTest() | 3623 P2PTransportChannelMostLikelyToWorkFirstTest() |
3610 : turn_server_(rtc::Thread::Current(), kTurnUdpIntAddr, kTurnUdpExtAddr) { | 3624 : turn_server_(rtc::Thread::Current(), kTurnUdpIntAddr, kTurnUdpExtAddr) { |
3611 network_manager_.AddInterface(kPublicAddrs[0]); | 3625 network_manager_.AddInterface(kPublicAddrs[0]); |
3612 allocator_.reset(new BasicPortAllocator( | 3626 allocator_.reset(new BasicPortAllocator( |
3613 &network_manager_, ServerAddresses(), rtc::SocketAddress(), | 3627 &network_manager_, ServerAddresses(), rtc::SocketAddress(), |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3808 | 3822 |
3809 // TCP Relay/Relay is the next. | 3823 // TCP Relay/Relay is the next. |
3810 VerifyNextPingableConnection(RELAY_PORT_TYPE, RELAY_PORT_TYPE, | 3824 VerifyNextPingableConnection(RELAY_PORT_TYPE, RELAY_PORT_TYPE, |
3811 TCP_PROTOCOL_NAME); | 3825 TCP_PROTOCOL_NAME); |
3812 | 3826 |
3813 // Finally, Local/Relay will be pinged. | 3827 // Finally, Local/Relay will be pinged. |
3814 VerifyNextPingableConnection(LOCAL_PORT_TYPE, RELAY_PORT_TYPE); | 3828 VerifyNextPingableConnection(LOCAL_PORT_TYPE, RELAY_PORT_TYPE); |
3815 } | 3829 } |
3816 | 3830 |
3817 } // namespace cricket { | 3831 } // namespace cricket { |
OLD | NEW |