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

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
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 1703 matching lines...) Expand 10 before | Expand all | Expand 10 after
1714 // an exchange of pings. 1714 // an exchange of pings.
1715 EXPECT_TRUE_WAIT( 1715 EXPECT_TRUE_WAIT(
1716 ep1_ch1()->best_connection() && ep2_ch1()->best_connection() && 1716 ep1_ch1()->best_connection() && ep2_ch1()->best_connection() &&
1717 LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && 1717 LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) &&
1718 RemoteCandidate(ep1_ch1())->address().EqualIPs(kAlternateAddrs[1]), 1718 RemoteCandidate(ep1_ch1())->address().EqualIPs(kAlternateAddrs[1]),
1719 3000); 1719 3000);
1720 1720
1721 DestroyChannels(); 1721 DestroyChannels();
1722 } 1722 }
1723 1723
1724 class P2PTransportChannelPingOrderTest : public testing::Test, 1724 class P2PTransportChannelSingleEndpointTest : public testing::Test,
pthatcher1 2015/06/09 23:58:03 Let's just call it P2PTransportChannelTest
guoweis_webrtc 2015/06/10 18:12:41 P2PTransportChannelTest exists already.
1725 public sigslot::has_slots<> { 1725 public sigslot::has_slots<> {
1726 public: 1726 public:
1727 P2PTransportChannelPingOrderTest() : 1727 P2PTransportChannelSingleEndpointTest()
1728 pss_(new rtc::PhysicalSocketServer), 1728 : pss_(new rtc::PhysicalSocketServer),
1729 vss_(new rtc::VirtualSocketServer(pss_.get())), 1729 vss_(new rtc::VirtualSocketServer(pss_.get())),
1730 ss_scope_(vss_.get()) { 1730 ss_scope_(vss_.get()) {}
1731 }
1732 1731
1733 protected: 1732 protected:
1734 void PrepareChannel(cricket::P2PTransportChannel* ch) { 1733 void PrepareChannel(cricket::P2PTransportChannel* ch) {
1735 ch->SignalRequestSignaling.connect( 1734 ch->SignalRequestSignaling.connect(
1736 this, &P2PTransportChannelPingOrderTest::OnChannelRequestSignaling); 1735 this,
1736 &P2PTransportChannelSingleEndpointTest::OnChannelRequestSignaling);
1737 ch->SetIceProtocolType(cricket::ICEPROTO_RFC5245); 1737 ch->SetIceProtocolType(cricket::ICEPROTO_RFC5245);
1738 ch->SetIceRole(cricket::ICEROLE_CONTROLLING); 1738 ch->SetIceRole(cricket::ICEROLE_CONTROLLING);
1739 ch->SetIceCredentials(kIceUfrag[0], kIcePwd[0]); 1739 ch->SetIceCredentials(kIceUfrag[0], kIcePwd[0]);
1740 ch->SetRemoteIceCredentials(kIceUfrag[1], kIcePwd[1]); 1740 ch->SetRemoteIceCredentials(kIceUfrag[1], kIcePwd[1]);
1741 } 1741 }
1742 1742
1743 void OnChannelRequestSignaling(cricket::TransportChannelImpl* channel) { 1743 void OnChannelRequestSignaling(cricket::TransportChannelImpl* channel) {
1744 channel->OnSignalingReady(); 1744 channel->OnSignalingReady();
1745 } 1745 }
1746 1746
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1779 EXPECT_TRUE_WAIT(conn->last_ping_sent() > 0, 3000); 1779 EXPECT_TRUE_WAIT(conn->last_ping_sent() > 0, 3000);
1780 return conn->last_ping_sent(); 1780 return conn->last_ping_sent();
1781 } 1781 }
1782 1782
1783 private: 1783 private:
1784 rtc::scoped_ptr<rtc::PhysicalSocketServer> pss_; 1784 rtc::scoped_ptr<rtc::PhysicalSocketServer> pss_;
1785 rtc::scoped_ptr<rtc::VirtualSocketServer> vss_; 1785 rtc::scoped_ptr<rtc::VirtualSocketServer> vss_;
1786 rtc::SocketServerScope ss_scope_; 1786 rtc::SocketServerScope ss_scope_;
1787 }; 1787 };
1788 1788
1789 TEST_F(P2PTransportChannelPingOrderTest, TestTriggeredChecks) { 1789 TEST_F(P2PTransportChannelSingleEndpointTest, TestTriggeredChecks) {
1790 cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr); 1790 cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr);
1791 cricket::P2PTransportChannel ch("trigger checks", 1, nullptr, &pa); 1791 cricket::P2PTransportChannel ch("trigger checks", 1, nullptr, &pa);
1792 PrepareChannel(&ch); 1792 PrepareChannel(&ch);
1793 ch.Connect(); 1793 ch.Connect();
1794 ch.OnCandidate(CreateCandidate("1.1.1.1", 1, 1)); 1794 ch.OnCandidate(CreateCandidate("1.1.1.1", 1, 1));
1795 ch.OnCandidate(CreateCandidate("2.2.2.2", 2, 2)); 1795 ch.OnCandidate(CreateCandidate("2.2.2.2", 2, 2));
1796 1796
1797 cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); 1797 cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
1798 cricket::Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); 1798 cricket::Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2);
1799 ASSERT_TRUE(conn1 != nullptr); 1799 ASSERT_TRUE(conn1 != nullptr);
1800 ASSERT_TRUE(conn2 != nullptr); 1800 ASSERT_TRUE(conn2 != nullptr);
1801 1801
1802 // Receiving a ping causes a "triggered check" which should make conn1 1802 // Receiving a ping causes a "triggered check" which should make conn1
1803 // be pinged first instead of conn2, even though conn2 has a higher priority. 1803 // be pinged first instead of conn2, even though conn2 has a higher priority.
1804 conn1->ReceivedPing(); 1804 conn1->ReceivedPing();
1805 uint32 ping1 = WaitForFirstPing(conn1); 1805 uint32 ping1 = WaitForFirstPing(conn1);
1806 uint32 ping2 = WaitForFirstPing(conn2); 1806 uint32 ping2 = WaitForFirstPing(conn2);
1807 EXPECT_LT(ping1, ping2); 1807 EXPECT_LT(ping1, ping2);
1808 } 1808 }
1809 1809
1810 TEST_F(P2PTransportChannelPingOrderTest, 1810 TEST_F(P2PTransportChannelSingleEndpointTest,
1811 TestNoTriggeredChecksWithoutIncomingPing) { 1811 TestNoTriggeredChecksWithoutIncomingPing) {
1812 cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr); 1812 cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr);
1813 cricket::P2PTransportChannel ch("trigger checks", 1, nullptr, &pa); 1813 cricket::P2PTransportChannel ch("trigger checks", 1, nullptr, &pa);
1814 PrepareChannel(&ch); 1814 PrepareChannel(&ch);
1815 ch.Connect(); 1815 ch.Connect();
1816 ch.OnCandidate(CreateCandidate("1.1.1.1", 1, 1)); 1816 ch.OnCandidate(CreateCandidate("1.1.1.1", 1, 1));
1817 ch.OnCandidate(CreateCandidate("2.2.2.2", 2, 2)); 1817 ch.OnCandidate(CreateCandidate("2.2.2.2", 2, 2));
1818 1818
1819 cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); 1819 cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
1820 cricket::Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); 1820 cricket::Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2);
1821 ASSERT_TRUE(conn1 != nullptr); 1821 ASSERT_TRUE(conn1 != nullptr);
1822 ASSERT_TRUE(conn2 != nullptr); 1822 ASSERT_TRUE(conn2 != nullptr);
1823 1823
1824 // No ping received, so no "triggered check" so conn2 is pinged 1824 // No ping received, so no "triggered check" so conn2 is pinged
1825 // before conn1 because it has a higher priority. 1825 // before conn1 because it has a higher priority.
1826 uint32 ping2 = WaitForFirstPing(conn2); 1826 uint32 ping2 = WaitForFirstPing(conn2);
1827 uint32 ping1 = WaitForFirstPing(conn1); 1827 uint32 ping1 = WaitForFirstPing(conn1);
1828 EXPECT_LT(ping2, ping1); 1828 EXPECT_LT(ping2, ping1);
1829 } 1829 }
1830 1830
1831 TEST_F(P2PTransportChannelPingOrderTest, TestNoTriggeredChecksWhenWritable) { 1831 TEST_F(P2PTransportChannelSingleEndpointTest,
1832 TestNoTriggeredChecksWhenWritable) {
1832 cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr); 1833 cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr);
1833 cricket::P2PTransportChannel ch("trigger checks", 1, nullptr, &pa); 1834 cricket::P2PTransportChannel ch("trigger checks", 1, nullptr, &pa);
1834 PrepareChannel(&ch); 1835 PrepareChannel(&ch);
1835 ch.Connect(); 1836 ch.Connect();
1836 ch.OnCandidate(CreateCandidate("1.1.1.1", 1, 1)); 1837 ch.OnCandidate(CreateCandidate("1.1.1.1", 1, 1));
1837 ch.OnCandidate(CreateCandidate("2.2.2.2", 2, 2)); 1838 ch.OnCandidate(CreateCandidate("2.2.2.2", 2, 2));
1838 1839
1839 cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); 1840 cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
1840 cricket::Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); 1841 cricket::Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2);
1841 ASSERT_TRUE(conn1 != nullptr); 1842 ASSERT_TRUE(conn1 != nullptr);
(...skipping 12 matching lines...) Expand all
1854 if ((ping1 - before_pings) < 900) { 1855 if ((ping1 - before_pings) < 900) {
1855 // If ping2 takes longer than 900ms to send, then there's a chance 1856 // If ping2 takes longer than 900ms to send, then there's a chance
1856 // that ping1 will go out before ping2 because of the pings that 1857 // that ping1 will go out before ping2 because of the pings that
1857 // keep a connection writable, which come before triggered checks. 1858 // keep a connection writable, which come before triggered checks.
1858 // This would only happen if the tests are running very, very 1859 // This would only happen if the tests are running very, very
1859 // slowly. But to avoid the tests being flaky on very slow bots, 1860 // slowly. But to avoid the tests being flaky on very slow bots,
1860 // we add the check. 1861 // we add the check.
1861 EXPECT_LT(ping2, ping1); 1862 EXPECT_LT(ping2, ping1);
1862 } 1863 }
1863 } 1864 }
1865
1866 TEST_F(P2PTransportChannelSingleEndpointTest, ConnectionResurrection) {
1867 cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr);
1868 cricket::P2PTransportChannel ch("connection resurrection", 1, nullptr, &pa);
1869 PrepareChannel(&ch);
1870 ch.Connect();
1871
1872 // Create conn1 and keep track of original candidate priority.
1873 ch.OnCandidate(CreateCandidate("1.1.1.1", 1, 1));
1874 cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
1875 ASSERT_TRUE(conn1 != nullptr);
1876 uint32 remote_priority = conn1->remote_candidate().priority();
1877
1878 // Create a higher priority candidate and make the connection
1879 // readable/writable. This will prune conn1.
1880 ch.OnCandidate(CreateCandidate("2.2.2.2", 2, 2));
1881 cricket::Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2);
1882 ASSERT_TRUE(conn2 != nullptr);
1883 conn2->ReceivedPing();
1884 conn2->ReceivedPingResponse();
1885
1886 // Wait for conn1 being destroyed.
1887 EXPECT_TRUE_WAIT(GetConnectionTo(&ch, "1.1.1.1", 1) == nullptr, 3000);
1888 cricket::Port* port = static_cast<cricket::Port*>(ch.ports()[0]);
pthatcher1 2015/06/09 23:58:03 Can you make this its own function?
guoweis_webrtc 2015/06/10 18:12:41 Done.
1889
1890 // Create a minimal STUN message with prflx priority.
1891 cricket::IceMessage request;
1892 request.SetType(cricket::STUN_BINDING_REQUEST);
1893 request.AddAttribute(new cricket::StunByteStringAttribute(
1894 cricket::STUN_ATTR_USERNAME, kIceUfrag[1]));
1895 uint32 prflx_priority = cricket::ICE_TYPE_PREFERENCE_PRFLX << 24 |
1896 (conn1->remote_candidate().priority() & 0x00FFFFFF);
pthatcher1 2015/06/09 23:58:03 Can you make this its own method?
guoweis_webrtc 2015/06/10 18:12:41 Done.
1897 request.AddAttribute(new cricket::StunUInt32Attribute(
1898 cricket::STUN_ATTR_PRIORITY, prflx_priority));
1899 EXPECT_NE(prflx_priority, remote_priority);
1900
1901 // conn1 should be resurrected with original priority.
1902 port->SignalUnknownAddress(port, rtc::SocketAddress("1.1.1.1", 1),
1903 cricket::PROTO_UDP, &request, kIceUfrag[1], false);
1904 conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
1905 ASSERT_TRUE(conn1 != nullptr);
1906 EXPECT_EQ(conn1->remote_candidate().priority(), remote_priority);
1907
1908 // conn3, a real prflx connection, should have prflx priority.
1909 port->SignalUnknownAddress(port, rtc::SocketAddress("3.3.3.3", 1),
1910 cricket::PROTO_UDP, &request, kIceUfrag[1], false);
1911 cricket::Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 1);
1912 ASSERT_TRUE(conn3 != nullptr);
1913 EXPECT_EQ(conn3->remote_candidate().priority(), prflx_priority);
1914 }
OLDNEW
« webrtc/p2p/base/p2ptransportchannel.cc ('K') | « webrtc/p2p/base/p2ptransportchannel.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698