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 1682 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1693 // an exchange of pings. | 1693 // an exchange of pings. |
1694 EXPECT_TRUE_WAIT( | 1694 EXPECT_TRUE_WAIT( |
1695 ep1_ch1()->best_connection() && ep2_ch1()->best_connection() && | 1695 ep1_ch1()->best_connection() && ep2_ch1()->best_connection() && |
1696 LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && | 1696 LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && |
1697 RemoteCandidate(ep1_ch1())->address().EqualIPs(kAlternateAddrs[1]), | 1697 RemoteCandidate(ep1_ch1())->address().EqualIPs(kAlternateAddrs[1]), |
1698 3000); | 1698 3000); |
1699 | 1699 |
1700 DestroyChannels(); | 1700 DestroyChannels(); |
1701 } | 1701 } |
1702 | 1702 |
1703 class P2PTransportChannelPingOrderTest : public testing::Test, | 1703 // A collection of tests which tests a single P2PTransportChannel by sending |
1704 public sigslot::has_slots<> { | 1704 // pings. |
| 1705 class P2PTransportChannelPingTest : public testing::Test, |
| 1706 public sigslot::has_slots<> { |
1705 public: | 1707 public: |
1706 P2PTransportChannelPingOrderTest() : | 1708 P2PTransportChannelPingTest() |
1707 pss_(new rtc::PhysicalSocketServer), | 1709 : pss_(new rtc::PhysicalSocketServer), |
1708 vss_(new rtc::VirtualSocketServer(pss_.get())), | 1710 vss_(new rtc::VirtualSocketServer(pss_.get())), |
1709 ss_scope_(vss_.get()) { | 1711 ss_scope_(vss_.get()) {} |
1710 } | |
1711 | 1712 |
1712 protected: | 1713 protected: |
1713 void PrepareChannel(cricket::P2PTransportChannel* ch) { | 1714 void PrepareChannel(cricket::P2PTransportChannel* ch) { |
1714 ch->SignalRequestSignaling.connect( | 1715 ch->SignalRequestSignaling.connect( |
1715 this, &P2PTransportChannelPingOrderTest::OnChannelRequestSignaling); | 1716 this, &P2PTransportChannelPingTest::OnChannelRequestSignaling); |
1716 ch->SetIceProtocolType(cricket::ICEPROTO_RFC5245); | 1717 ch->SetIceProtocolType(cricket::ICEPROTO_RFC5245); |
1717 ch->SetIceRole(cricket::ICEROLE_CONTROLLING); | 1718 ch->SetIceRole(cricket::ICEROLE_CONTROLLING); |
1718 ch->SetIceCredentials(kIceUfrag[0], kIcePwd[0]); | 1719 ch->SetIceCredentials(kIceUfrag[0], kIcePwd[0]); |
1719 ch->SetRemoteIceCredentials(kIceUfrag[1], kIcePwd[1]); | 1720 ch->SetRemoteIceCredentials(kIceUfrag[1], kIcePwd[1]); |
1720 } | 1721 } |
1721 | 1722 |
1722 void OnChannelRequestSignaling(cricket::TransportChannelImpl* channel) { | 1723 void OnChannelRequestSignaling(cricket::TransportChannelImpl* channel) { |
1723 channel->OnSignalingReady(); | 1724 channel->OnSignalingReady(); |
1724 } | 1725 } |
1725 | 1726 |
1726 cricket::Candidate CreateCandidate(const std::string& ip, | 1727 cricket::Candidate CreateCandidate(const std::string& ip, |
1727 int port, | 1728 int port, |
1728 int priority) { | 1729 int priority) { |
1729 cricket::Candidate c; | 1730 cricket::Candidate c; |
1730 c.set_address(rtc::SocketAddress(ip, port)); | 1731 c.set_address(rtc::SocketAddress(ip, port)); |
1731 c.set_component(1); | 1732 c.set_component(1); |
1732 c.set_protocol(cricket::UDP_PROTOCOL_NAME); | 1733 c.set_protocol(cricket::UDP_PROTOCOL_NAME); |
1733 c.set_priority(priority); | 1734 c.set_priority(priority); |
1734 return c; | 1735 return c; |
1735 } | 1736 } |
1736 | 1737 |
1737 cricket::Connection* WaitForConnectionTo(cricket::P2PTransportChannel* ch, | 1738 cricket::Connection* WaitForConnectionTo(cricket::P2PTransportChannel* ch, |
1738 const std::string& ip, | 1739 const std::string& ip, |
1739 int port_num) { | 1740 int port_num) { |
1740 EXPECT_TRUE_WAIT(GetConnectionTo(ch, ip, port_num) != nullptr, 3000); | 1741 EXPECT_TRUE_WAIT(GetConnectionTo(ch, ip, port_num) != nullptr, 3000); |
1741 return GetConnectionTo(ch, ip, port_num); | 1742 return GetConnectionTo(ch, ip, port_num); |
1742 } | 1743 } |
1743 | 1744 |
| 1745 cricket::Port* GetPort(cricket::P2PTransportChannel* ch) { |
| 1746 if (ch->ports().empty()) { |
| 1747 return nullptr; |
| 1748 } |
| 1749 return static_cast<cricket::Port*>(ch->ports()[0]); |
| 1750 } |
| 1751 |
1744 cricket::Connection* GetConnectionTo(cricket::P2PTransportChannel* ch, | 1752 cricket::Connection* GetConnectionTo(cricket::P2PTransportChannel* ch, |
1745 const std::string& ip, | 1753 const std::string& ip, |
1746 int port_num) { | 1754 int port_num) { |
1747 if (ch->ports().empty()) { | 1755 cricket::Port* port = GetPort(ch); |
1748 return nullptr; | |
1749 } | |
1750 cricket::Port* port = static_cast<cricket::Port*>(ch->ports()[0]); | |
1751 if (!port) { | 1756 if (!port) { |
1752 return nullptr; | 1757 return nullptr; |
1753 } | 1758 } |
1754 return port->GetConnection(rtc::SocketAddress(ip, port_num)); | 1759 return port->GetConnection(rtc::SocketAddress(ip, port_num)); |
1755 } | 1760 } |
1756 | 1761 |
1757 private: | 1762 private: |
1758 rtc::scoped_ptr<rtc::PhysicalSocketServer> pss_; | 1763 rtc::scoped_ptr<rtc::PhysicalSocketServer> pss_; |
1759 rtc::scoped_ptr<rtc::VirtualSocketServer> vss_; | 1764 rtc::scoped_ptr<rtc::VirtualSocketServer> vss_; |
1760 rtc::SocketServerScope ss_scope_; | 1765 rtc::SocketServerScope ss_scope_; |
1761 }; | 1766 }; |
1762 | 1767 |
1763 TEST_F(P2PTransportChannelPingOrderTest, TestTriggeredChecks) { | 1768 TEST_F(P2PTransportChannelPingTest, TestTriggeredChecks) { |
1764 cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 1769 cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
1765 cricket::P2PTransportChannel ch("trigger checks", 1, nullptr, &pa); | 1770 cricket::P2PTransportChannel ch("trigger checks", 1, nullptr, &pa); |
1766 PrepareChannel(&ch); | 1771 PrepareChannel(&ch); |
1767 ch.Connect(); | 1772 ch.Connect(); |
1768 ch.OnCandidate(CreateCandidate("1.1.1.1", 1, 1)); | 1773 ch.OnCandidate(CreateCandidate("1.1.1.1", 1, 1)); |
1769 ch.OnCandidate(CreateCandidate("2.2.2.2", 2, 2)); | 1774 ch.OnCandidate(CreateCandidate("2.2.2.2", 2, 2)); |
1770 | 1775 |
1771 cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 1776 cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); |
1772 cricket::Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 1777 cricket::Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); |
1773 ASSERT_TRUE(conn1 != nullptr); | 1778 ASSERT_TRUE(conn1 != nullptr); |
1774 ASSERT_TRUE(conn2 != nullptr); | 1779 ASSERT_TRUE(conn2 != nullptr); |
1775 | 1780 |
1776 // Before a triggered check, the first connection to ping is the | 1781 // Before a triggered check, the first connection to ping is the |
1777 // highest priority one. | 1782 // highest priority one. |
1778 EXPECT_EQ(conn2, ch.FindNextPingableConnection()); | 1783 EXPECT_EQ(conn2, ch.FindNextPingableConnection()); |
1779 | 1784 |
1780 // Receiving a ping causes a triggered check which should make conn1 | 1785 // Receiving a ping causes a triggered check which should make conn1 |
1781 // be pinged first instead of conn2, even though conn2 has a higher | 1786 // be pinged first instead of conn2, even though conn2 has a higher |
1782 // priority. | 1787 // priority. |
1783 conn1->ReceivedPing(); | 1788 conn1->ReceivedPing(); |
1784 EXPECT_EQ(conn1, ch.FindNextPingableConnection()); | 1789 EXPECT_EQ(conn1, ch.FindNextPingableConnection()); |
1785 } | 1790 } |
1786 | 1791 |
1787 TEST_F(P2PTransportChannelPingOrderTest, TestNoTriggeredChecksWhenWritable) { | 1792 TEST_F(P2PTransportChannelPingTest, TestNoTriggeredChecksWhenWritable) { |
1788 cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 1793 cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
1789 cricket::P2PTransportChannel ch("trigger checks", 1, nullptr, &pa); | 1794 cricket::P2PTransportChannel ch("trigger checks", 1, nullptr, &pa); |
1790 PrepareChannel(&ch); | 1795 PrepareChannel(&ch); |
1791 ch.Connect(); | 1796 ch.Connect(); |
1792 ch.OnCandidate(CreateCandidate("1.1.1.1", 1, 1)); | 1797 ch.OnCandidate(CreateCandidate("1.1.1.1", 1, 1)); |
1793 ch.OnCandidate(CreateCandidate("2.2.2.2", 2, 2)); | 1798 ch.OnCandidate(CreateCandidate("2.2.2.2", 2, 2)); |
1794 | 1799 |
1795 cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 1800 cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); |
1796 cricket::Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 1801 cricket::Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); |
1797 ASSERT_TRUE(conn1 != nullptr); | 1802 ASSERT_TRUE(conn1 != nullptr); |
1798 ASSERT_TRUE(conn2 != nullptr); | 1803 ASSERT_TRUE(conn2 != nullptr); |
1799 | 1804 |
1800 EXPECT_EQ(conn2, ch.FindNextPingableConnection()); | 1805 EXPECT_EQ(conn2, ch.FindNextPingableConnection()); |
1801 conn1->ReceivedPingResponse(); | 1806 conn1->ReceivedPingResponse(); |
1802 ASSERT_TRUE(conn1->writable()); | 1807 ASSERT_TRUE(conn1->writable()); |
1803 conn1->ReceivedPing(); | 1808 conn1->ReceivedPing(); |
1804 | 1809 |
1805 // Ping received, but the connection is already writable, so no | 1810 // Ping received, but the connection is already writable, so no |
1806 // "triggered check" and conn2 is pinged before conn1 because it has | 1811 // "triggered check" and conn2 is pinged before conn1 because it has |
1807 // a higher priority. | 1812 // a higher priority. |
1808 EXPECT_EQ(conn2, ch.FindNextPingableConnection()); | 1813 EXPECT_EQ(conn2, ch.FindNextPingableConnection()); |
1809 } | 1814 } |
| 1815 |
| 1816 TEST_F(P2PTransportChannelPingTest, ConnectionResurrection) { |
| 1817 cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
| 1818 cricket::P2PTransportChannel ch("connection resurrection", 1, nullptr, &pa); |
| 1819 PrepareChannel(&ch); |
| 1820 ch.Connect(); |
| 1821 |
| 1822 // Create conn1 and keep track of original candidate priority. |
| 1823 ch.OnCandidate(CreateCandidate("1.1.1.1", 1, 1)); |
| 1824 cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); |
| 1825 ASSERT_TRUE(conn1 != nullptr); |
| 1826 uint32 remote_priority = conn1->remote_candidate().priority(); |
| 1827 |
| 1828 // Create a higher priority candidate and make the connection |
| 1829 // readable/writable. This will prune conn1. |
| 1830 ch.OnCandidate(CreateCandidate("2.2.2.2", 2, 2)); |
| 1831 cricket::Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); |
| 1832 ASSERT_TRUE(conn2 != nullptr); |
| 1833 conn2->ReceivedPing(); |
| 1834 conn2->ReceivedPingResponse(); |
| 1835 |
| 1836 // Wait for conn1 being destroyed. |
| 1837 EXPECT_TRUE_WAIT(GetConnectionTo(&ch, "1.1.1.1", 1) == nullptr, 3000); |
| 1838 cricket::Port* port = GetPort(&ch); |
| 1839 |
| 1840 // Create a minimal STUN message with prflx priority. |
| 1841 cricket::IceMessage request; |
| 1842 request.SetType(cricket::STUN_BINDING_REQUEST); |
| 1843 request.AddAttribute(new cricket::StunByteStringAttribute( |
| 1844 cricket::STUN_ATTR_USERNAME, kIceUfrag[1])); |
| 1845 uint32 prflx_priority = cricket::ICE_TYPE_PREFERENCE_PRFLX << 24; |
| 1846 request.AddAttribute(new cricket::StunUInt32Attribute( |
| 1847 cricket::STUN_ATTR_PRIORITY, prflx_priority)); |
| 1848 EXPECT_NE(prflx_priority, remote_priority); |
| 1849 |
| 1850 // conn1 should be resurrected with original priority. |
| 1851 port->SignalUnknownAddress(port, rtc::SocketAddress("1.1.1.1", 1), |
| 1852 cricket::PROTO_UDP, &request, kIceUfrag[1], false); |
| 1853 conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); |
| 1854 ASSERT_TRUE(conn1 != nullptr); |
| 1855 EXPECT_EQ(conn1->remote_candidate().priority(), remote_priority); |
| 1856 |
| 1857 // conn3, a real prflx connection, should have prflx priority. |
| 1858 port->SignalUnknownAddress(port, rtc::SocketAddress("3.3.3.3", 1), |
| 1859 cricket::PROTO_UDP, &request, kIceUfrag[1], false); |
| 1860 cricket::Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 1); |
| 1861 ASSERT_TRUE(conn3 != nullptr); |
| 1862 EXPECT_EQ(conn3->remote_candidate().priority(), prflx_priority); |
| 1863 } |
OLD | NEW |