Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(140)

Side by Side Diff: webrtc/p2p/base/p2ptransportchannel_unittest.cc

Issue 1172483002: Connection resurrected with incorrect candidate type. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/p2p/base/p2ptransportchannel.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 }
OLDNEW
« no previous file with comments | « webrtc/p2p/base/p2ptransportchannel.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698