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

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

Issue 1842093002: Add the last_sent_packet_id to the candidate pair change signal (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: Merge with head Created 4 years, 8 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') | webrtc/p2p/base/transportchannel.h » ('j') | 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 299 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 cricket::P2PTransportChannel* channel = new cricket::P2PTransportChannel( 310 cricket::P2PTransportChannel* channel = new cricket::P2PTransportChannel(
311 "test content name", component, GetAllocator(endpoint)); 311 "test content name", component, GetAllocator(endpoint));
312 channel->SignalCandidateGathered.connect( 312 channel->SignalCandidateGathered.connect(
313 this, &P2PTransportChannelTestBase::OnCandidateGathered); 313 this, &P2PTransportChannelTestBase::OnCandidateGathered);
314 channel->SignalCandidatesRemoved.connect( 314 channel->SignalCandidatesRemoved.connect(
315 this, &P2PTransportChannelTestBase::OnCandidatesRemoved); 315 this, &P2PTransportChannelTestBase::OnCandidatesRemoved);
316 channel->SignalReadPacket.connect( 316 channel->SignalReadPacket.connect(
317 this, &P2PTransportChannelTestBase::OnReadPacket); 317 this, &P2PTransportChannelTestBase::OnReadPacket);
318 channel->SignalRoleConflict.connect( 318 channel->SignalRoleConflict.connect(
319 this, &P2PTransportChannelTestBase::OnRoleConflict); 319 this, &P2PTransportChannelTestBase::OnRoleConflict);
320 channel->SignalSelectedCandidatePairChanged.connect(
321 this, &P2PTransportChannelTestBase::OnSelectedCandidatePairChanged);
322 channel->SetIceCredentials(local_ice_ufrag, local_ice_pwd); 320 channel->SetIceCredentials(local_ice_ufrag, local_ice_pwd);
323 if (clear_remote_candidates_ufrag_pwd_) { 321 if (clear_remote_candidates_ufrag_pwd_) {
324 // This only needs to be set if we're clearing them from the 322 // This only needs to be set if we're clearing them from the
325 // candidates. Some unit tests rely on this not being set. 323 // candidates. Some unit tests rely on this not being set.
326 channel->SetRemoteIceCredentials(remote_ice_ufrag, remote_ice_pwd); 324 channel->SetRemoteIceCredentials(remote_ice_ufrag, remote_ice_pwd);
327 } 325 }
328 channel->SetIceRole(GetEndpoint(endpoint)->ice_role()); 326 channel->SetIceRole(GetEndpoint(endpoint)->ice_role());
329 channel->SetIceTiebreaker(GetEndpoint(endpoint)->GetIceTiebreaker()); 327 channel->SetIceTiebreaker(GetEndpoint(endpoint)->GetIceTiebreaker());
330 channel->Connect(); 328 channel->Connect();
331 channel->MaybeStartGathering(); 329 channel->MaybeStartGathering();
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
559 } 557 }
560 // Try sending some data to other end. 558 // Try sending some data to other end.
561 TestSendRecv(1); 559 TestSendRecv(1);
562 560
563 // Destroy the channels, and wait for them to be fully cleaned up. 561 // Destroy the channels, and wait for them to be fully cleaned up.
564 DestroyChannels(); 562 DestroyChannels();
565 } 563 }
566 564
567 void TestSendRecv(int channels) { 565 void TestSendRecv(int channels) {
568 for (int i = 0; i < 10; ++i) { 566 for (int i = 0; i < 10; ++i) {
569 const char* data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; 567 const char* data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
570 int len = static_cast<int>(strlen(data)); 568 int len = static_cast<int>(strlen(data));
571 // local_channel1 <==> remote_channel1 569 // local_channel1 <==> remote_channel1
572 EXPECT_EQ_WAIT(len, SendData(ep1_ch1(), data, len), 1000); 570 EXPECT_EQ_WAIT(len, SendData(ep1_ch1(), data, len), 1000);
573 EXPECT_TRUE_WAIT(CheckDataOnChannel(ep2_ch1(), data, len), 1000); 571 EXPECT_TRUE_WAIT(CheckDataOnChannel(ep2_ch1(), data, len), 1000);
574 EXPECT_EQ_WAIT(len, SendData(ep2_ch1(), data, len), 1000); 572 EXPECT_EQ_WAIT(len, SendData(ep2_ch1(), data, len), 1000);
575 EXPECT_TRUE_WAIT(CheckDataOnChannel(ep1_ch1(), data, len), 1000); 573 EXPECT_TRUE_WAIT(CheckDataOnChannel(ep1_ch1(), data, len), 1000);
576 if (channels == 2 && ep1_ch2() && ep2_ch2()) { 574 if (channels == 2 && ep1_ch2() && ep2_ch2()) {
577 // local_channel2 <==> remote_channel2 575 // local_channel2 <==> remote_channel2
578 EXPECT_EQ_WAIT(len, SendData(ep1_ch2(), data, len), 1000); 576 EXPECT_EQ_WAIT(len, SendData(ep1_ch2(), data, len), 1000);
579 EXPECT_TRUE_WAIT(CheckDataOnChannel(ep2_ch2(), data, len), 1000); 577 EXPECT_TRUE_WAIT(CheckDataOnChannel(ep2_ch2(), data, len), 1000);
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 packets.push_front(std::string(data, len)); 735 packets.push_front(std::string(data, len));
738 } 736 }
739 void OnRoleConflict(cricket::TransportChannelImpl* channel) { 737 void OnRoleConflict(cricket::TransportChannelImpl* channel) {
740 GetEndpoint(channel)->OnRoleConflict(true); 738 GetEndpoint(channel)->OnRoleConflict(true);
741 cricket::IceRole new_role = 739 cricket::IceRole new_role =
742 GetEndpoint(channel)->ice_role() == cricket::ICEROLE_CONTROLLING ? 740 GetEndpoint(channel)->ice_role() == cricket::ICEROLE_CONTROLLING ?
743 cricket::ICEROLE_CONTROLLED : cricket::ICEROLE_CONTROLLING; 741 cricket::ICEROLE_CONTROLLED : cricket::ICEROLE_CONTROLLING;
744 channel->SetIceRole(new_role); 742 channel->SetIceRole(new_role);
745 } 743 }
746 744
747 void OnSelectedCandidatePairChanged(
748 cricket::TransportChannel* channel,
749 cricket::CandidatePairInterface* candidate_pair) {
750 ++num_selected_candidate_pair_changes_;
751 }
752
753 int SendData(cricket::TransportChannel* channel, 745 int SendData(cricket::TransportChannel* channel,
754 const char* data, size_t len) { 746 const char* data, size_t len) {
755 rtc::PacketOptions options; 747 rtc::PacketOptions options;
756 return channel->SendPacket(data, len, options, 0); 748 return channel->SendPacket(data, len, options, 0);
757 } 749 }
758 bool CheckDataOnChannel(cricket::TransportChannel* channel, 750 bool CheckDataOnChannel(cricket::TransportChannel* channel,
759 const char* data, int len) { 751 const char* data, int len) {
760 return GetChannelData(channel)->CheckData(data, len); 752 return GetChannelData(channel)->CheckData(data, len);
761 } 753 }
762 static const cricket::Candidate* LocalCandidate( 754 static const cricket::Candidate* LocalCandidate(
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 } 788 }
797 789
798 void set_clear_remote_candidates_ufrag_pwd(bool clear) { 790 void set_clear_remote_candidates_ufrag_pwd(bool clear) {
799 clear_remote_candidates_ufrag_pwd_ = clear; 791 clear_remote_candidates_ufrag_pwd_ = clear;
800 } 792 }
801 793
802 void set_force_relay(bool relay) { 794 void set_force_relay(bool relay) {
803 force_relay_ = relay; 795 force_relay_ = relay;
804 } 796 }
805 797
806 int num_selected_candidate_pair_changes() {
807 return num_selected_candidate_pair_changes_;
808 }
809 void set_num_selected_candidate_pair_changes(int num) {
810 num_selected_candidate_pair_changes_ = num;
811 }
812
813 private: 798 private:
814 rtc::Thread* main_; 799 rtc::Thread* main_;
815 rtc::scoped_ptr<rtc::PhysicalSocketServer> pss_; 800 rtc::scoped_ptr<rtc::PhysicalSocketServer> pss_;
816 rtc::scoped_ptr<rtc::VirtualSocketServer> vss_; 801 rtc::scoped_ptr<rtc::VirtualSocketServer> vss_;
817 rtc::scoped_ptr<rtc::NATSocketServer> nss_; 802 rtc::scoped_ptr<rtc::NATSocketServer> nss_;
818 rtc::scoped_ptr<rtc::FirewallSocketServer> ss_; 803 rtc::scoped_ptr<rtc::FirewallSocketServer> ss_;
819 rtc::SocketServerScope ss_scope_; 804 rtc::SocketServerScope ss_scope_;
820 rtc::scoped_ptr<cricket::TestStunServer> stun_server_; 805 rtc::scoped_ptr<cricket::TestStunServer> stun_server_;
821 cricket::TestTurnServer turn_server_; 806 cricket::TestTurnServer turn_server_;
822 cricket::TestRelayServer relay_server_; 807 cricket::TestRelayServer relay_server_;
823 rtc::SocksProxyServer socks_server1_; 808 rtc::SocksProxyServer socks_server1_;
824 rtc::SocksProxyServer socks_server2_; 809 rtc::SocksProxyServer socks_server2_;
825 Endpoint ep1_; 810 Endpoint ep1_;
826 Endpoint ep2_; 811 Endpoint ep2_;
827 int num_selected_candidate_pair_changes_ = 0;
828 bool clear_remote_candidates_ufrag_pwd_; 812 bool clear_remote_candidates_ufrag_pwd_;
829 bool force_relay_; 813 bool force_relay_;
830 }; 814 };
831 815
832 // The tests have only a few outcomes, which we predefine. 816 // The tests have only a few outcomes, which we predefine.
833 const P2PTransportChannelTestBase::Result P2PTransportChannelTestBase:: 817 const P2PTransportChannelTestBase::Result P2PTransportChannelTestBase::
834 kLocalUdpToLocalUdp("local", "udp", "local", "udp", 818 kLocalUdpToLocalUdp("local", "udp", "local", "udp",
835 "local", "udp", "local", "udp", 1000); 819 "local", "udp", "local", "udp", 1000);
836 const P2PTransportChannelTestBase::Result P2PTransportChannelTestBase:: 820 const P2PTransportChannelTestBase::Result P2PTransportChannelTestBase::
837 kLocalUdpToStunUdp("local", "udp", "stun", "udp", 821 kLocalUdpToStunUdp("local", "udp", "stun", "udp",
(...skipping 750 matching lines...) Expand 10 before | Expand all | Expand 10 after
1588 1572
1589 // Test that we can establish connectivity when both peers are multihomed. 1573 // Test that we can establish connectivity when both peers are multihomed.
1590 TEST_F(P2PTransportChannelMultihomedTest, DISABLED_TestBasic) { 1574 TEST_F(P2PTransportChannelMultihomedTest, DISABLED_TestBasic) {
1591 AddAddress(0, kPublicAddrs[0]); 1575 AddAddress(0, kPublicAddrs[0]);
1592 AddAddress(0, kAlternateAddrs[0]); 1576 AddAddress(0, kAlternateAddrs[0]);
1593 AddAddress(1, kPublicAddrs[1]); 1577 AddAddress(1, kPublicAddrs[1]);
1594 AddAddress(1, kAlternateAddrs[1]); 1578 AddAddress(1, kAlternateAddrs[1]);
1595 Test(kLocalUdpToLocalUdp); 1579 Test(kLocalUdpToLocalUdp);
1596 } 1580 }
1597 1581
1598 // Test that we can quickly switch links if an interface goes down. This also 1582 // Test that we can quickly switch links if an interface goes down.
1599 // tests that when the link switches, |SignalSelectedCandidatePairChanged| will 1583 // The controlled side has two interfaces and one will die.
1600 // be fired. The controlled side has two interfaces and one will die.
1601 TEST_F(P2PTransportChannelMultihomedTest, TestFailoverControlledSide) { 1584 TEST_F(P2PTransportChannelMultihomedTest, TestFailoverControlledSide) {
1602 AddAddress(0, kPublicAddrs[0]); 1585 AddAddress(0, kPublicAddrs[0]);
1603 // Adding alternate address will make sure |kPublicAddrs| has the higher 1586 // Adding alternate address will make sure |kPublicAddrs| has the higher
1604 // priority than others. This is due to FakeNetwork::AddInterface method. 1587 // priority than others. This is due to FakeNetwork::AddInterface method.
1605 AddAddress(1, kAlternateAddrs[1]); 1588 AddAddress(1, kAlternateAddrs[1]);
1606 AddAddress(1, kPublicAddrs[1]); 1589 AddAddress(1, kPublicAddrs[1]);
1607 1590
1608 // Use only local ports for simplicity. 1591 // Use only local ports for simplicity.
1609 SetAllocatorFlags(0, kOnlyLocalPorts); 1592 SetAllocatorFlags(0, kOnlyLocalPorts);
1610 SetAllocatorFlags(1, kOnlyLocalPorts); 1593 SetAllocatorFlags(1, kOnlyLocalPorts);
1611 1594
1612 // Create channels and let them go writable, as usual. 1595 // Create channels and let them go writable, as usual.
1613 CreateChannels(1); 1596 CreateChannels(1);
1614 1597
1615 EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->receiving() && ep1_ch1()->writable() && 1598 EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
1616 ep2_ch1()->receiving() && ep2_ch1()->writable(), 1599 ep2_ch1()->receiving() && ep2_ch1()->writable(),
1617 1000, 1000); 1600 1000, 1000);
1618 EXPECT_TRUE( 1601 EXPECT_TRUE(
1619 ep1_ch1()->best_connection() && ep2_ch1()->best_connection() && 1602 ep1_ch1()->best_connection() && ep2_ch1()->best_connection() &&
1620 LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && 1603 LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) &&
1621 RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1])); 1604 RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1]));
1622 1605
1623 // Make the receiving timeout shorter for testing. 1606 // Make the receiving timeout shorter for testing.
1624 cricket::IceConfig config = CreateIceConfig(1000, false); 1607 cricket::IceConfig config = CreateIceConfig(1000, false);
1625 ep1_ch1()->SetIceConfig(config); 1608 ep1_ch1()->SetIceConfig(config);
1626 ep2_ch1()->SetIceConfig(config); 1609 ep2_ch1()->SetIceConfig(config);
1627 1610
1628 set_num_selected_candidate_pair_changes(0);
1629 // Blackhole any traffic to or from the public addrs. 1611 // Blackhole any traffic to or from the public addrs.
1630 LOG(LS_INFO) << "Failing over..."; 1612 LOG(LS_INFO) << "Failing over...";
1631 fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, kPublicAddrs[1]); 1613 fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, kPublicAddrs[1]);
1632 // The best connections will switch, so keep references to them. 1614 // The best connections will switch, so keep references to them.
1633 const cricket::Connection* best_connection1 = ep1_ch1()->best_connection(); 1615 const cricket::Connection* best_connection1 = ep1_ch1()->best_connection();
1634 const cricket::Connection* best_connection2 = ep2_ch1()->best_connection(); 1616 const cricket::Connection* best_connection2 = ep2_ch1()->best_connection();
1635 // We should detect loss of receiving within 1 second or so. 1617 // We should detect loss of receiving within 1 second or so.
1636 EXPECT_TRUE_WAIT( 1618 EXPECT_TRUE_WAIT(
1637 !best_connection1->receiving() && !best_connection2->receiving(), 3000); 1619 !best_connection1->receiving() && !best_connection2->receiving(), 3000);
1638 1620
1639 // We should switch over to use the alternate addr immediately on both sides 1621 // We should switch over to use the alternate addr immediately on both sides
1640 // when we are not receiving. 1622 // when we are not receiving.
1641 EXPECT_TRUE_WAIT( 1623 EXPECT_TRUE_WAIT(
1642 ep1_ch1()->best_connection()->receiving() && 1624 ep1_ch1()->best_connection()->receiving() &&
1643 ep2_ch1()->best_connection()->receiving(), 1000); 1625 ep2_ch1()->best_connection()->receiving(), 1000);
1644 EXPECT_TRUE(LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0])); 1626 EXPECT_TRUE(LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]));
1645 EXPECT_TRUE( 1627 EXPECT_TRUE(
1646 RemoteCandidate(ep1_ch1())->address().EqualIPs(kAlternateAddrs[1])); 1628 RemoteCandidate(ep1_ch1())->address().EqualIPs(kAlternateAddrs[1]));
1647 EXPECT_TRUE( 1629 EXPECT_TRUE(
1648 LocalCandidate(ep2_ch1())->address().EqualIPs(kAlternateAddrs[1])); 1630 LocalCandidate(ep2_ch1())->address().EqualIPs(kAlternateAddrs[1]));
1649 // It should have changed twice, one on each side.
1650 EXPECT_EQ(2, num_selected_candidate_pair_changes());
1651 1631
1652 DestroyChannels(); 1632 DestroyChannels();
1653 } 1633 }
1654 1634
1655 // Test that we can quickly switch links if an interface goes down. This also 1635 // Test that we can quickly switch links if an interface goes down.
1656 // tests that when the link switches, |SignalSelectedCandidatePairChanged| will 1636 // The controlling side has two interfaces and one will die.
1657 // be fired. The controlling side has two interfaces and one will die.
1658 TEST_F(P2PTransportChannelMultihomedTest, TestFailoverControllingSide) { 1637 TEST_F(P2PTransportChannelMultihomedTest, TestFailoverControllingSide) {
1659 // Adding alternate address will make sure |kPublicAddrs| has the higher 1638 // Adding alternate address will make sure |kPublicAddrs| has the higher
1660 // priority than others. This is due to FakeNetwork::AddInterface method. 1639 // priority than others. This is due to FakeNetwork::AddInterface method.
1661 AddAddress(0, kAlternateAddrs[0]); 1640 AddAddress(0, kAlternateAddrs[0]);
1662 AddAddress(0, kPublicAddrs[0]); 1641 AddAddress(0, kPublicAddrs[0]);
1663 AddAddress(1, kPublicAddrs[1]); 1642 AddAddress(1, kPublicAddrs[1]);
1664 1643
1665 // Use only local ports for simplicity. 1644 // Use only local ports for simplicity.
1666 SetAllocatorFlags(0, kOnlyLocalPorts); 1645 SetAllocatorFlags(0, kOnlyLocalPorts);
1667 SetAllocatorFlags(1, kOnlyLocalPorts); 1646 SetAllocatorFlags(1, kOnlyLocalPorts);
1668 1647
1669 // Create channels and let them go writable, as usual. 1648 // Create channels and let them go writable, as usual.
1670 CreateChannels(1); 1649 CreateChannels(1);
1671 EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->receiving() && ep1_ch1()->writable() && 1650 EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
1672 ep2_ch1()->receiving() && ep2_ch1()->writable(), 1651 ep2_ch1()->receiving() && ep2_ch1()->writable(),
1673 1000, 1000); 1652 1000, 1000);
1674 EXPECT_TRUE( 1653 EXPECT_TRUE(
1675 ep1_ch1()->best_connection() && ep2_ch1()->best_connection() && 1654 ep1_ch1()->best_connection() && ep2_ch1()->best_connection() &&
1676 LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && 1655 LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) &&
1677 RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1])); 1656 RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1]));
1678 1657
1679 // Make the receiving timeout shorter for testing. 1658 // Make the receiving timeout shorter for testing.
1680 cricket::IceConfig config = CreateIceConfig(1000, false); 1659 cricket::IceConfig config = CreateIceConfig(1000, false);
1681 ep1_ch1()->SetIceConfig(config); 1660 ep1_ch1()->SetIceConfig(config);
1682 ep2_ch1()->SetIceConfig(config); 1661 ep2_ch1()->SetIceConfig(config);
1683 set_num_selected_candidate_pair_changes(0);
1684 1662
1685 // Blackhole any traffic to or from the public addrs. 1663 // Blackhole any traffic to or from the public addrs.
1686 LOG(LS_INFO) << "Failing over..."; 1664 LOG(LS_INFO) << "Failing over...";
1687 fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, kPublicAddrs[0]); 1665 fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, kPublicAddrs[0]);
1688 // The best connections will switch, so keep references to them. 1666 // The best connections will switch, so keep references to them.
1689 const cricket::Connection* best_connection1 = ep1_ch1()->best_connection(); 1667 const cricket::Connection* best_connection1 = ep1_ch1()->best_connection();
1690 const cricket::Connection* best_connection2 = ep2_ch1()->best_connection(); 1668 const cricket::Connection* best_connection2 = ep2_ch1()->best_connection();
1691 // We should detect loss of receiving within 1 second or so. 1669 // We should detect loss of receiving within 1 second or so.
1692 EXPECT_TRUE_WAIT( 1670 EXPECT_TRUE_WAIT(
1693 !best_connection1->receiving() && !best_connection2->receiving(), 3000); 1671 !best_connection1->receiving() && !best_connection2->receiving(), 3000);
1694 1672
1695 // We should switch over to use the alternate addr immediately on both sides 1673 // We should switch over to use the alternate addr immediately on both sides
1696 // when we are not receiving. 1674 // when we are not receiving.
1697 EXPECT_TRUE_WAIT( 1675 EXPECT_TRUE_WAIT(
1698 ep1_ch1()->best_connection()->receiving() && 1676 ep1_ch1()->best_connection()->receiving() &&
1699 ep2_ch1()->best_connection()->receiving(), 1000); 1677 ep2_ch1()->best_connection()->receiving(), 1000);
1700 EXPECT_TRUE( 1678 EXPECT_TRUE(
1701 LocalCandidate(ep1_ch1())->address().EqualIPs(kAlternateAddrs[0])); 1679 LocalCandidate(ep1_ch1())->address().EqualIPs(kAlternateAddrs[0]));
1702 EXPECT_TRUE(RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1])); 1680 EXPECT_TRUE(RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1]));
1703 EXPECT_TRUE( 1681 EXPECT_TRUE(
1704 RemoteCandidate(ep2_ch1())->address().EqualIPs(kAlternateAddrs[0])); 1682 RemoteCandidate(ep2_ch1())->address().EqualIPs(kAlternateAddrs[0]));
1705 EXPECT_EQ(2, num_selected_candidate_pair_changes());
1706 1683
1707 DestroyChannels(); 1684 DestroyChannels();
1708 } 1685 }
1709 1686
1710 // Tests that a Wifi-Wifi connection has the highest precedence. 1687 // Tests that a Wifi-Wifi connection has the highest precedence.
1711 TEST_F(P2PTransportChannelMultihomedTest, TestPreferWifiToWifiConnection) { 1688 TEST_F(P2PTransportChannelMultihomedTest, TestPreferWifiToWifiConnection) {
1712 // The interface names are chosen so that |cellular| would have higher 1689 // The interface names are chosen so that |cellular| would have higher
1713 // candidate priority if it is not for the network type. 1690 // candidate priority if it is not for the network type.
1714 auto& wifi = kAlternateAddrs; 1691 auto& wifi = kAlternateAddrs;
1715 auto& cellular = kPublicAddrs; 1692 auto& cellular = kPublicAddrs;
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
1913 P2PTransportChannelPingTest() 1890 P2PTransportChannelPingTest()
1914 : pss_(new rtc::PhysicalSocketServer), 1891 : pss_(new rtc::PhysicalSocketServer),
1915 vss_(new rtc::VirtualSocketServer(pss_.get())), 1892 vss_(new rtc::VirtualSocketServer(pss_.get())),
1916 ss_scope_(vss_.get()) {} 1893 ss_scope_(vss_.get()) {}
1917 1894
1918 protected: 1895 protected:
1919 void PrepareChannel(cricket::P2PTransportChannel* ch) { 1896 void PrepareChannel(cricket::P2PTransportChannel* ch) {
1920 ch->SetIceRole(cricket::ICEROLE_CONTROLLING); 1897 ch->SetIceRole(cricket::ICEROLE_CONTROLLING);
1921 ch->SetIceCredentials(kIceUfrag[0], kIcePwd[0]); 1898 ch->SetIceCredentials(kIceUfrag[0], kIcePwd[0]);
1922 ch->SetRemoteIceCredentials(kIceUfrag[1], kIcePwd[1]); 1899 ch->SetRemoteIceCredentials(kIceUfrag[1], kIcePwd[1]);
1900 ch->SignalSelectedCandidatePairChanged.connect(
1901 this, &P2PTransportChannelPingTest::OnSelectedCandidatePairChanged);
1923 ch->SignalReadyToSend.connect(this, 1902 ch->SignalReadyToSend.connect(this,
1924 &P2PTransportChannelPingTest::OnReadyToSend); 1903 &P2PTransportChannelPingTest::OnReadyToSend);
1925 } 1904 }
1926 1905
1927 cricket::Candidate CreateHostCandidate(const std::string& ip, 1906 cricket::Candidate CreateHostCandidate(const std::string& ip,
1928 int port, 1907 int port,
1929 int priority, 1908 int priority,
1930 const std::string& ufrag = "") { 1909 const std::string& ufrag = "") {
1931 cricket::Candidate c; 1910 cricket::Candidate c;
1932 c.set_address(rtc::SocketAddress(ip, port)); 1911 c.set_address(rtc::SocketAddress(ip, port));
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1964 1943
1965 cricket::Connection* FindNextPingableConnectionAndPingIt( 1944 cricket::Connection* FindNextPingableConnectionAndPingIt(
1966 cricket::P2PTransportChannel* ch) { 1945 cricket::P2PTransportChannel* ch) {
1967 cricket::Connection* conn = ch->FindNextPingableConnection(); 1946 cricket::Connection* conn = ch->FindNextPingableConnection();
1968 if (conn) { 1947 if (conn) {
1969 ch->MarkConnectionPinged(conn); 1948 ch->MarkConnectionPinged(conn);
1970 } 1949 }
1971 return conn; 1950 return conn;
1972 } 1951 }
1973 1952
1953 int SendData(cricket::TransportChannel& channel,
1954 const char* data,
1955 size_t len,
1956 int packet_id) {
1957 rtc::PacketOptions options;
1958 options.packet_id = packet_id;
1959 return channel.SendPacket(data, len, options, 0);
1960 }
1961
1962 void OnSelectedCandidatePairChanged(
1963 cricket::TransportChannel* transport_channel,
1964 cricket::CandidatePairInterface* selected_candidate_pair,
1965 int last_sent_packet_id) {
1966 last_selected_candidate_pair_ = selected_candidate_pair;
1967 last_sent_packet_id_ = last_sent_packet_id;
1968 }
1969
1974 void OnReadyToSend(cricket::TransportChannel* channel) { 1970 void OnReadyToSend(cricket::TransportChannel* channel) {
1975 channel_ready_to_send_ = true; 1971 channel_ready_to_send_ = true;
1976 } 1972 }
1977 1973
1974 cricket::CandidatePairInterface* last_selected_candidate_pair() {
1975 return last_selected_candidate_pair_;
1976 }
1977 int last_sent_packet_id() { return last_sent_packet_id_; }
1978 bool channel_ready_to_send() { return channel_ready_to_send_; } 1978 bool channel_ready_to_send() { return channel_ready_to_send_; }
1979 void reset_channel_ready_to_send() { channel_ready_to_send_ = false; } 1979 void reset_channel_ready_to_send() { channel_ready_to_send_ = false; }
1980 1980
1981 private: 1981 private:
1982 rtc::scoped_ptr<rtc::PhysicalSocketServer> pss_; 1982 rtc::scoped_ptr<rtc::PhysicalSocketServer> pss_;
1983 rtc::scoped_ptr<rtc::VirtualSocketServer> vss_; 1983 rtc::scoped_ptr<rtc::VirtualSocketServer> vss_;
1984 rtc::SocketServerScope ss_scope_; 1984 rtc::SocketServerScope ss_scope_;
1985 cricket::CandidatePairInterface* last_selected_candidate_pair_ = nullptr;
1986 int last_sent_packet_id_ = -1;
1985 bool channel_ready_to_send_ = false; 1987 bool channel_ready_to_send_ = false;
1986 }; 1988 };
1987 1989
1988 TEST_F(P2PTransportChannelPingTest, TestTriggeredChecks) { 1990 TEST_F(P2PTransportChannelPingTest, TestTriggeredChecks) {
1989 cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr); 1991 cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr);
1990 cricket::P2PTransportChannel ch("trigger checks", 1, &pa); 1992 cricket::P2PTransportChannel ch("trigger checks", 1, &pa);
1991 PrepareChannel(&ch); 1993 PrepareChannel(&ch);
1992 ch.Connect(); 1994 ch.Connect();
1993 ch.MaybeStartGathering(); 1995 ch.MaybeStartGathering();
1994 ch.AddRemoteCandidate(CreateHostCandidate("1.1.1.1", 1, 1)); 1996 ch.AddRemoteCandidate(CreateHostCandidate("1.1.1.1", 1, 1));
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
2165 conn1->ReceivedPing(); 2167 conn1->ReceivedPing();
2166 conn1->OnReadPacket("ABC", 3, rtc::CreatePacketTime(0)); 2168 conn1->OnReadPacket("ABC", 3, rtc::CreatePacketTime(0));
2167 EXPECT_TRUE_WAIT(ch.best_connection() != nullptr, 1000); 2169 EXPECT_TRUE_WAIT(ch.best_connection() != nullptr, 1000);
2168 EXPECT_TRUE_WAIT(ch.receiving(), 1000); 2170 EXPECT_TRUE_WAIT(ch.receiving(), 1000);
2169 EXPECT_TRUE_WAIT(!ch.receiving(), 1000); 2171 EXPECT_TRUE_WAIT(!ch.receiving(), 1000);
2170 } 2172 }
2171 2173
2172 // The controlled side will select a connection as the "best connection" based 2174 // The controlled side will select a connection as the "best connection" based
2173 // on priority until the controlling side nominates a connection, at which 2175 // on priority until the controlling side nominates a connection, at which
2174 // point the controlled side will select that connection as the 2176 // point the controlled side will select that connection as the
2175 // "best connection". Plus, the channel will fire SignalReadyToSend if the new 2177 // "best connection". Plus, SignalSelectedCandidatePair will be fired if the
2176 // best connection is writable. 2178 // best connection changes and SignalReadyToSend will be fired if the new best
2179 // connection is writable.
2177 TEST_F(P2PTransportChannelPingTest, TestSelectConnectionBeforeNomination) { 2180 TEST_F(P2PTransportChannelPingTest, TestSelectConnectionBeforeNomination) {
2178 cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr); 2181 cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr);
2179 cricket::P2PTransportChannel ch("receiving state change", 1, &pa); 2182 cricket::P2PTransportChannel ch("receiving state change", 1, &pa);
2180 PrepareChannel(&ch); 2183 PrepareChannel(&ch);
2181 ch.SetIceRole(cricket::ICEROLE_CONTROLLED); 2184 ch.SetIceRole(cricket::ICEROLE_CONTROLLED);
2182 ch.Connect(); 2185 ch.Connect();
2183 ch.MaybeStartGathering(); 2186 ch.MaybeStartGathering();
2184 ch.AddRemoteCandidate(CreateHostCandidate("1.1.1.1", 1, 1)); 2187 ch.AddRemoteCandidate(CreateHostCandidate("1.1.1.1", 1, 1));
2185 cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); 2188 cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
2186 ASSERT_TRUE(conn1 != nullptr); 2189 ASSERT_TRUE(conn1 != nullptr);
2187 EXPECT_EQ(conn1, ch.best_connection()); 2190 EXPECT_EQ(conn1, ch.best_connection());
2188 // Channel is not ready because it is not writable. 2191 EXPECT_EQ(conn1, last_selected_candidate_pair());
2192 EXPECT_EQ(-1, last_sent_packet_id());
2193 // Channel is not ready to send because it is not writable.
2189 EXPECT_FALSE(channel_ready_to_send()); 2194 EXPECT_FALSE(channel_ready_to_send());
2190 2195
2196 int last_packet_id = 0;
2197 const char* data = "ABCDEFGH";
2198 int len = static_cast<int>(strlen(data));
2199 SendData(ch, data, len, ++last_packet_id);
2191 // When a higher priority candidate comes in, the new connection is chosen 2200 // When a higher priority candidate comes in, the new connection is chosen
2192 // as the best connection. 2201 // as the best connection.
2193 ch.AddRemoteCandidate(CreateHostCandidate("2.2.2.2", 2, 10)); 2202 ch.AddRemoteCandidate(CreateHostCandidate("2.2.2.2", 2, 10));
2194 cricket::Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); 2203 cricket::Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2);
2195 ASSERT_TRUE(conn2 != nullptr); 2204 ASSERT_TRUE(conn2 != nullptr);
2196 EXPECT_EQ(conn2, ch.best_connection()); 2205 EXPECT_EQ(conn2, ch.best_connection());
2206 EXPECT_EQ(conn2, last_selected_candidate_pair());
2207 EXPECT_EQ(last_packet_id, last_sent_packet_id());
2197 EXPECT_FALSE(channel_ready_to_send()); 2208 EXPECT_FALSE(channel_ready_to_send());
2198 2209
2199 // If a stun request with use-candidate attribute arrives, the receiving 2210 // If a stun request with use-candidate attribute arrives, the receiving
2200 // connection will be set as the best connection, even though 2211 // connection will be set as the best connection, even though
2201 // its priority is lower. 2212 // its priority is lower.
2213 SendData(ch, data, len, ++last_packet_id);
2202 ch.AddRemoteCandidate(CreateHostCandidate("3.3.3.3", 3, 1)); 2214 ch.AddRemoteCandidate(CreateHostCandidate("3.3.3.3", 3, 1));
2203 cricket::Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3); 2215 cricket::Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3);
2204 ASSERT_TRUE(conn3 != nullptr); 2216 ASSERT_TRUE(conn3 != nullptr);
2205 // Because it has a lower priority, the best connection is still conn2. 2217 // Because it has a lower priority, the best connection is still conn2.
2206 EXPECT_EQ(conn2, ch.best_connection()); 2218 EXPECT_EQ(conn2, ch.best_connection());
2207 conn3->ReceivedPingResponse(); // Become writable. 2219 conn3->ReceivedPingResponse(); // Become writable.
2208 // But if it is nominated via use_candidate, it is chosen as the best 2220 // But if it is nominated via use_candidate, it is chosen as the best
2209 // connection. 2221 // connection.
2210 conn3->set_nominated(true); 2222 conn3->set_nominated(true);
2211 conn3->SignalNominated(conn3); 2223 conn3->SignalNominated(conn3);
2212 EXPECT_EQ(conn3, ch.best_connection()); 2224 EXPECT_EQ(conn3, ch.best_connection());
2225 EXPECT_EQ(conn3, last_selected_candidate_pair());
2226 EXPECT_EQ(last_packet_id, last_sent_packet_id());
2213 EXPECT_TRUE(channel_ready_to_send()); 2227 EXPECT_TRUE(channel_ready_to_send());
2214 2228
2215 // Even if another higher priority candidate arrives, 2229 // Even if another higher priority candidate arrives,
2216 // it will not be set as the best connection because the best connection 2230 // it will not be set as the best connection because the best connection
2217 // is nominated by the controlling side. 2231 // is nominated by the controlling side.
2232 SendData(ch, data, len, ++last_packet_id);
2218 ch.AddRemoteCandidate(CreateHostCandidate("4.4.4.4", 4, 100)); 2233 ch.AddRemoteCandidate(CreateHostCandidate("4.4.4.4", 4, 100));
2219 cricket::Connection* conn4 = WaitForConnectionTo(&ch, "4.4.4.4", 4); 2234 cricket::Connection* conn4 = WaitForConnectionTo(&ch, "4.4.4.4", 4);
2220 ASSERT_TRUE(conn4 != nullptr); 2235 ASSERT_TRUE(conn4 != nullptr);
2221 EXPECT_EQ(conn3, ch.best_connection()); 2236 EXPECT_EQ(conn3, ch.best_connection());
2222 // But if it is nominated via use_candidate and writable, it will be set as 2237 // But if it is nominated via use_candidate and writable, it will be set as
2223 // the best connection. 2238 // the best connection.
2224 conn4->set_nominated(true); 2239 conn4->set_nominated(true);
2225 conn4->SignalNominated(conn4); 2240 conn4->SignalNominated(conn4);
2226 // Not switched yet because conn4 is not writable. 2241 // Not switched yet because conn4 is not writable.
2227 EXPECT_EQ(conn3, ch.best_connection()); 2242 EXPECT_EQ(conn3, ch.best_connection());
2228 reset_channel_ready_to_send(); 2243 reset_channel_ready_to_send();
2229 // The best connection switches after conn4 becomes writable. 2244 // The best connection switches after conn4 becomes writable.
2230 conn4->ReceivedPingResponse(); 2245 conn4->ReceivedPingResponse();
2231 EXPECT_EQ(conn4, ch.best_connection()); 2246 EXPECT_EQ(conn4, ch.best_connection());
2247 EXPECT_EQ(conn4, last_selected_candidate_pair());
2248 EXPECT_EQ(last_packet_id, last_sent_packet_id());
2232 // SignalReadyToSend is fired again because conn4 is writable. 2249 // SignalReadyToSend is fired again because conn4 is writable.
2233 EXPECT_TRUE(channel_ready_to_send()); 2250 EXPECT_TRUE(channel_ready_to_send());
2234 } 2251 }
2235 2252
2236 // The controlled side will select a connection as the "best connection" based 2253 // The controlled side will select a connection as the "best connection" based
2237 // on requests from an unknown address before the controlling side nominates 2254 // on requests from an unknown address before the controlling side nominates
2238 // a connection, and will nominate a connection from an unknown address if the 2255 // a connection, and will nominate a connection from an unknown address if the
2239 // request contains the use_candidate attribute. Plus, it will also sends back 2256 // request contains the use_candidate attribute. Plus, it will also sends back
2240 // a ping response and set the ICE pwd in the remote candidate appropriately. 2257 // a ping response and set the ICE pwd in the remote candidate appropriately.
2241 TEST_F(P2PTransportChannelPingTest, TestSelectConnectionFromUnknownAddress) { 2258 TEST_F(P2PTransportChannelPingTest, TestSelectConnectionFromUnknownAddress) {
(...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after
2763 2780
2764 // TCP Relay/Relay is the next. 2781 // TCP Relay/Relay is the next.
2765 VerifyNextPingableConnection(cricket::RELAY_PORT_TYPE, 2782 VerifyNextPingableConnection(cricket::RELAY_PORT_TYPE,
2766 cricket::RELAY_PORT_TYPE, 2783 cricket::RELAY_PORT_TYPE,
2767 cricket::TCP_PROTOCOL_NAME); 2784 cricket::TCP_PROTOCOL_NAME);
2768 2785
2769 // Finally, Local/Relay will be pinged. 2786 // Finally, Local/Relay will be pinged.
2770 VerifyNextPingableConnection(cricket::LOCAL_PORT_TYPE, 2787 VerifyNextPingableConnection(cricket::LOCAL_PORT_TYPE,
2771 cricket::RELAY_PORT_TYPE); 2788 cricket::RELAY_PORT_TYPE);
2772 } 2789 }
OLDNEW
« no previous file with comments | « webrtc/p2p/base/p2ptransportchannel.cc ('k') | webrtc/p2p/base/transportchannel.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698