| 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 87 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 98 static const char* kIcePwd[4] = {"TESTICEPWD00000000000000", | 98 static const char* kIcePwd[4] = {"TESTICEPWD00000000000000", | 
| 99                                  "TESTICEPWD00000000000001", | 99                                  "TESTICEPWD00000000000001", | 
| 100                                  "TESTICEPWD00000000000002", | 100                                  "TESTICEPWD00000000000002", | 
| 101                                  "TESTICEPWD00000000000003"}; | 101                                  "TESTICEPWD00000000000003"}; | 
| 102 | 102 | 
| 103 static const uint64_t kLowTiebreaker = 11111; | 103 static const uint64_t kLowTiebreaker = 11111; | 
| 104 static const uint64_t kHighTiebreaker = 22222; | 104 static const uint64_t kHighTiebreaker = 22222; | 
| 105 | 105 | 
| 106 enum { MSG_ADD_CANDIDATES, MSG_REMOVE_CANDIDATES }; | 106 enum { MSG_ADD_CANDIDATES, MSG_REMOVE_CANDIDATES }; | 
| 107 | 107 | 
| 108 cricket::IceConfig CreateIceConfig(int receiving_timeout, | 108 cricket::IceConfig CreateIceConfig( | 
| 109                                    bool gather_continually, | 109     int receiving_timeout, | 
| 110                                    int backup_ping_interval = -1) { | 110     cricket::ContinualGatheringPolicy continual_gathering_policy, | 
|  | 111     int backup_ping_interval = -1) { | 
| 111   cricket::IceConfig config; | 112   cricket::IceConfig config; | 
| 112   config.receiving_timeout = receiving_timeout; | 113   config.receiving_timeout = receiving_timeout; | 
| 113   config.gather_continually = gather_continually; | 114   config.continual_gathering_policy = continual_gathering_policy; | 
| 114   config.backup_connection_ping_interval = backup_ping_interval; | 115   config.backup_connection_ping_interval = backup_ping_interval; | 
| 115   return config; | 116   return config; | 
| 116 } | 117 } | 
| 117 | 118 | 
| 118 cricket::Candidate CreateUdpCandidate(const std::string& type, | 119 cricket::Candidate CreateUdpCandidate(const std::string& type, | 
| 119                                       const std::string& ip, | 120                                       const std::string& ip, | 
| 120                                       int port, | 121                                       int port, | 
| 121                                       int priority, | 122                                       int priority, | 
| 122                                       const std::string& ufrag = "") { | 123                                       const std::string& ufrag = "") { | 
| 123   cricket::Candidate c; | 124   cricket::Candidate c; | 
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 405   } | 406   } | 
| 406   void AddAddress(int endpoint, | 407   void AddAddress(int endpoint, | 
| 407                   const SocketAddress& addr, | 408                   const SocketAddress& addr, | 
| 408                   const std::string& ifname, | 409                   const std::string& ifname, | 
| 409                   rtc::AdapterType adapter_type) { | 410                   rtc::AdapterType adapter_type) { | 
| 410     GetEndpoint(endpoint)->network_manager_.AddInterface(addr, ifname, | 411     GetEndpoint(endpoint)->network_manager_.AddInterface(addr, ifname, | 
| 411                                                          adapter_type); | 412                                                          adapter_type); | 
| 412   } | 413   } | 
| 413   void RemoveAddress(int endpoint, const SocketAddress& addr) { | 414   void RemoveAddress(int endpoint, const SocketAddress& addr) { | 
| 414     GetEndpoint(endpoint)->network_manager_.RemoveInterface(addr); | 415     GetEndpoint(endpoint)->network_manager_.RemoveInterface(addr); | 
|  | 416     fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, addr); | 
| 415   } | 417   } | 
| 416   void SetProxy(int endpoint, rtc::ProxyType type) { | 418   void SetProxy(int endpoint, rtc::ProxyType type) { | 
| 417     rtc::ProxyInfo info; | 419     rtc::ProxyInfo info; | 
| 418     info.type = type; | 420     info.type = type; | 
| 419     info.address = (type == rtc::PROXY_HTTPS) ? | 421     info.address = (type == rtc::PROXY_HTTPS) ? | 
| 420         kHttpsProxyAddrs[endpoint] : kSocksProxyAddrs[endpoint]; | 422         kHttpsProxyAddrs[endpoint] : kSocksProxyAddrs[endpoint]; | 
| 421     GetAllocator(endpoint)->set_proxy("unittest/1.0", info); | 423     GetAllocator(endpoint)->set_proxy("unittest/1.0", info); | 
| 422   } | 424   } | 
| 423   void SetAllocatorFlags(int endpoint, int flags) { | 425   void SetAllocatorFlags(int endpoint, int flags) { | 
| 424     GetAllocator(endpoint)->set_flags(flags); | 426     GetAllocator(endpoint)->set_flags(flags); | 
| (...skipping 1111 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1536 } | 1538 } | 
| 1537 | 1539 | 
| 1538 // Test that if continual gathering is set to true, ICE gathering state will | 1540 // Test that if continual gathering is set to true, ICE gathering state will | 
| 1539 // not change to "Complete", and vice versa. | 1541 // not change to "Complete", and vice versa. | 
| 1540 TEST_F(P2PTransportChannelTest, TestContinualGathering) { | 1542 TEST_F(P2PTransportChannelTest, TestContinualGathering) { | 
| 1541   ConfigureEndpoints(OPEN, OPEN, kDefaultPortAllocatorFlags, | 1543   ConfigureEndpoints(OPEN, OPEN, kDefaultPortAllocatorFlags, | 
| 1542                      kDefaultPortAllocatorFlags); | 1544                      kDefaultPortAllocatorFlags); | 
| 1543   SetAllocationStepDelay(0, kDefaultStepDelay); | 1545   SetAllocationStepDelay(0, kDefaultStepDelay); | 
| 1544   SetAllocationStepDelay(1, kDefaultStepDelay); | 1546   SetAllocationStepDelay(1, kDefaultStepDelay); | 
| 1545   CreateChannels(1); | 1547   CreateChannels(1); | 
| 1546   IceConfig config = CreateIceConfig(1000, true); | 1548   IceConfig config = CreateIceConfig(1000, GATHER_CONTINUALLY); | 
| 1547   ep1_ch1()->SetIceConfig(config); | 1549   ep1_ch1()->SetIceConfig(config); | 
| 1548   // By default, ep2 does not gather continually. | 1550   // By default, ep2 does not gather continually. | 
| 1549 | 1551 | 
| 1550   EXPECT_TRUE_WAIT_MARGIN(ep1_ch1() != NULL && ep2_ch1() != NULL && | 1552   EXPECT_TRUE_WAIT_MARGIN(ep1_ch1() != NULL && ep2_ch1() != NULL && | 
| 1551                               ep1_ch1()->receiving() && ep1_ch1()->writable() && | 1553                               ep1_ch1()->receiving() && ep1_ch1()->writable() && | 
| 1552                               ep2_ch1()->receiving() && ep2_ch1()->writable(), | 1554                               ep2_ch1()->receiving() && ep2_ch1()->writable(), | 
| 1553                           1000, 1000); | 1555                           1000, 1000); | 
| 1554   WAIT(IceGatheringState::kIceGatheringComplete == ep1_ch1()->gathering_state(), | 1556   WAIT(IceGatheringState::kIceGatheringComplete == ep1_ch1()->gathering_state(), | 
| 1555        1000); | 1557        1000); | 
| 1556   EXPECT_EQ(IceGatheringState::kIceGatheringGathering, | 1558   EXPECT_EQ(IceGatheringState::kIceGatheringGathering, | 
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1813 TEST_F(P2PTransportChannelSameNatTest, TestConesBehindSameCone) { | 1815 TEST_F(P2PTransportChannelSameNatTest, TestConesBehindSameCone) { | 
| 1814   ConfigureEndpoints(NAT_FULL_CONE, NAT_FULL_CONE, NAT_FULL_CONE); | 1816   ConfigureEndpoints(NAT_FULL_CONE, NAT_FULL_CONE, NAT_FULL_CONE); | 
| 1815   Test(P2PTransportChannelTestBase::Result( | 1817   Test(P2PTransportChannelTestBase::Result( | 
| 1816       "prflx", "udp", "stun", "udp", "stun", "udp", "prflx", "udp", 1000)); | 1818       "prflx", "udp", "stun", "udp", "stun", "udp", "prflx", "udp", 1000)); | 
| 1817 } | 1819 } | 
| 1818 | 1820 | 
| 1819 // Test what happens when we have multiple available pathways. | 1821 // Test what happens when we have multiple available pathways. | 
| 1820 // In the future we will try different RTTs and configs for the different | 1822 // In the future we will try different RTTs and configs for the different | 
| 1821 // interfaces, so that we can simulate a user with Ethernet and VPN networks. | 1823 // interfaces, so that we can simulate a user with Ethernet and VPN networks. | 
| 1822 class P2PTransportChannelMultihomedTest : public P2PTransportChannelTestBase { | 1824 class P2PTransportChannelMultihomedTest : public P2PTransportChannelTestBase { | 
|  | 1825  public: | 
|  | 1826   const cricket::Connection* GetConnectionWithRemoteAddress( | 
|  | 1827       cricket::P2PTransportChannel* channel, | 
|  | 1828       const SocketAddress& address) { | 
|  | 1829     for (cricket::Connection* conn : channel->connections()) { | 
|  | 1830       if (conn->remote_candidate().address().EqualIPs(address)) { | 
|  | 1831         return conn; | 
|  | 1832       } | 
|  | 1833     } | 
|  | 1834     return nullptr; | 
|  | 1835   } | 
|  | 1836 | 
|  | 1837   const cricket::Connection* GetConnectionWithLocalAddress( | 
|  | 1838       cricket::P2PTransportChannel* channel, | 
|  | 1839       const SocketAddress& address) { | 
|  | 1840     for (cricket::Connection* conn : channel->connections()) { | 
|  | 1841       if (conn->local_candidate().address().EqualIPs(address)) { | 
|  | 1842         return conn; | 
|  | 1843       } | 
|  | 1844     } | 
|  | 1845     return nullptr; | 
|  | 1846   } | 
|  | 1847 | 
|  | 1848   void DestroyAllButBestConnection(cricket::P2PTransportChannel* channel) { | 
|  | 1849     const cricket::Connection* best_connection = channel->best_connection(); | 
|  | 1850     for (cricket::Connection* conn : channel->connections()) { | 
|  | 1851       if (conn != best_connection) { | 
|  | 1852         conn->Destroy(); | 
|  | 1853       } | 
|  | 1854     } | 
|  | 1855   } | 
| 1823 }; | 1856 }; | 
| 1824 | 1857 | 
| 1825 // Test that we can establish connectivity when both peers are multihomed. | 1858 // Test that we can establish connectivity when both peers are multihomed. | 
| 1826 TEST_F(P2PTransportChannelMultihomedTest, DISABLED_TestBasic) { | 1859 TEST_F(P2PTransportChannelMultihomedTest, DISABLED_TestBasic) { | 
| 1827   AddAddress(0, kPublicAddrs[0]); | 1860   AddAddress(0, kPublicAddrs[0]); | 
| 1828   AddAddress(0, kAlternateAddrs[0]); | 1861   AddAddress(0, kAlternateAddrs[0]); | 
| 1829   AddAddress(1, kPublicAddrs[1]); | 1862   AddAddress(1, kPublicAddrs[1]); | 
| 1830   AddAddress(1, kAlternateAddrs[1]); | 1863   AddAddress(1, kAlternateAddrs[1]); | 
| 1831   Test(kLocalUdpToLocalUdp); | 1864   Test(kLocalUdpToLocalUdp); | 
| 1832 } | 1865 } | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 1849 | 1882 | 
| 1850   EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->receiving() && ep1_ch1()->writable() && | 1883   EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->receiving() && ep1_ch1()->writable() && | 
| 1851                               ep2_ch1()->receiving() && ep2_ch1()->writable(), | 1884                               ep2_ch1()->receiving() && ep2_ch1()->writable(), | 
| 1852                           1000, 1000); | 1885                           1000, 1000); | 
| 1853   EXPECT_TRUE(ep1_ch1()->selected_connection() && | 1886   EXPECT_TRUE(ep1_ch1()->selected_connection() && | 
| 1854               ep2_ch1()->selected_connection() && | 1887               ep2_ch1()->selected_connection() && | 
| 1855               LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && | 1888               LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && | 
| 1856               RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1])); | 1889               RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1])); | 
| 1857 | 1890 | 
| 1858   // Make the receiving timeout shorter for testing. | 1891   // Make the receiving timeout shorter for testing. | 
| 1859   IceConfig config = CreateIceConfig(1000, false); | 1892   IceConfig config = CreateIceConfig(1000, GATHER_ONCE); | 
| 1860   ep1_ch1()->SetIceConfig(config); | 1893   ep1_ch1()->SetIceConfig(config); | 
| 1861   ep2_ch1()->SetIceConfig(config); | 1894   ep2_ch1()->SetIceConfig(config); | 
| 1862 | 1895 | 
| 1863   // Blackhole any traffic to or from the public addrs. | 1896   // Blackhole any traffic to or from the public addrs. | 
| 1864   LOG(LS_INFO) << "Failing over..."; | 1897   LOG(LS_INFO) << "Failing over..."; | 
| 1865   fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, kPublicAddrs[1]); | 1898   fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, kPublicAddrs[1]); | 
| 1866   // The selected connections will switch, so keep references to them. | 1899   // The selected connections will switch, so keep references to them. | 
| 1867   const Connection* selected_connection1 = ep1_ch1()->selected_connection(); | 1900   const Connection* selected_connection1 = ep1_ch1()->selected_connection(); | 
| 1868   const Connection* selected_connection2 = ep2_ch1()->selected_connection(); | 1901   const Connection* selected_connection2 = ep2_ch1()->selected_connection(); | 
| 1869   // We should detect loss of receiving within 1 second or so. | 1902   // We should detect loss of receiving within 1 second or so. | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1902   CreateChannels(1); | 1935   CreateChannels(1); | 
| 1903   EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->receiving() && ep1_ch1()->writable() && | 1936   EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->receiving() && ep1_ch1()->writable() && | 
| 1904                               ep2_ch1()->receiving() && ep2_ch1()->writable(), | 1937                               ep2_ch1()->receiving() && ep2_ch1()->writable(), | 
| 1905                           1000, 1000); | 1938                           1000, 1000); | 
| 1906   EXPECT_TRUE(ep1_ch1()->selected_connection() && | 1939   EXPECT_TRUE(ep1_ch1()->selected_connection() && | 
| 1907               ep2_ch1()->selected_connection() && | 1940               ep2_ch1()->selected_connection() && | 
| 1908               LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && | 1941               LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && | 
| 1909               RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1])); | 1942               RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1])); | 
| 1910 | 1943 | 
| 1911   // Make the receiving timeout shorter for testing. | 1944   // Make the receiving timeout shorter for testing. | 
| 1912   IceConfig config = CreateIceConfig(1000, false); | 1945   IceConfig config = CreateIceConfig(1000, GATHER_ONCE); | 
| 1913   ep1_ch1()->SetIceConfig(config); | 1946   ep1_ch1()->SetIceConfig(config); | 
| 1914   ep2_ch1()->SetIceConfig(config); | 1947   ep2_ch1()->SetIceConfig(config); | 
| 1915 | 1948 | 
| 1916   // Blackhole any traffic to or from the public addrs. | 1949   // Blackhole any traffic to or from the public addrs. | 
| 1917   LOG(LS_INFO) << "Failing over..."; | 1950   LOG(LS_INFO) << "Failing over..."; | 
| 1918   fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, kPublicAddrs[0]); | 1951   fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, kPublicAddrs[0]); | 
| 1919   // The selected connections will switch, so keep references to them. | 1952   // The selected connections will switch, so keep references to them. | 
| 1920   const Connection* selected_connection1 = ep1_ch1()->selected_connection(); | 1953   const Connection* selected_connection1 = ep1_ch1()->selected_connection(); | 
| 1921   const Connection* selected_connection2 = ep2_ch1()->selected_connection(); | 1954   const Connection* selected_connection2 = ep2_ch1()->selected_connection(); | 
| 1922   // We should detect loss of receiving within 1 second or so. | 1955   // We should detect loss of receiving within 1 second or so. | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1961                           1000, 1000); | 1994                           1000, 1000); | 
| 1962   // Need to wait to make sure the connections on both networks are writable. | 1995   // Need to wait to make sure the connections on both networks are writable. | 
| 1963   EXPECT_TRUE_WAIT(ep1_ch1()->selected_connection() && | 1996   EXPECT_TRUE_WAIT(ep1_ch1()->selected_connection() && | 
| 1964                        LocalCandidate(ep1_ch1())->address().EqualIPs(wifi[0]) && | 1997                        LocalCandidate(ep1_ch1())->address().EqualIPs(wifi[0]) && | 
| 1965                        RemoteCandidate(ep1_ch1())->address().EqualIPs(wifi[1]), | 1998                        RemoteCandidate(ep1_ch1())->address().EqualIPs(wifi[1]), | 
| 1966                    1000); | 1999                    1000); | 
| 1967   EXPECT_TRUE_WAIT(ep2_ch1()->selected_connection() && | 2000   EXPECT_TRUE_WAIT(ep2_ch1()->selected_connection() && | 
| 1968                        LocalCandidate(ep2_ch1())->address().EqualIPs(wifi[1]) && | 2001                        LocalCandidate(ep2_ch1())->address().EqualIPs(wifi[1]) && | 
| 1969                        RemoteCandidate(ep2_ch1())->address().EqualIPs(wifi[0]), | 2002                        RemoteCandidate(ep2_ch1())->address().EqualIPs(wifi[0]), | 
| 1970                    1000); | 2003                    1000); | 
|  | 2004   DestroyChannels(); | 
| 1971 } | 2005 } | 
| 1972 | 2006 | 
| 1973 // Tests that a Wifi-Cellular connection has higher precedence than | 2007 // Tests that a Wifi-Cellular connection has higher precedence than | 
| 1974 // a Cellular-Cellular connection. | 2008 // a Cellular-Cellular connection. | 
| 1975 TEST_F(P2PTransportChannelMultihomedTest, TestPreferWifiOverCellularNetwork) { | 2009 TEST_F(P2PTransportChannelMultihomedTest, TestPreferWifiOverCellularNetwork) { | 
| 1976   // The interface names are chosen so that |cellular| would have higher | 2010   // The interface names are chosen so that |cellular| would have higher | 
| 1977   // candidate priority if it is not for the network type. | 2011   // candidate priority if it is not for the network type. | 
| 1978   auto& wifi = kAlternateAddrs; | 2012   auto& wifi = kAlternateAddrs; | 
| 1979   auto& cellular = kPublicAddrs; | 2013   auto& cellular = kPublicAddrs; | 
| 1980   AddAddress(0, cellular[0], "test1", rtc::ADAPTER_TYPE_CELLULAR); | 2014   AddAddress(0, cellular[0], "test1", rtc::ADAPTER_TYPE_CELLULAR); | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 1991   EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->receiving() && ep1_ch1()->writable() && | 2025   EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->receiving() && ep1_ch1()->writable() && | 
| 1992                               ep2_ch1()->receiving() && ep2_ch1()->writable(), | 2026                               ep2_ch1()->receiving() && ep2_ch1()->writable(), | 
| 1993                           1000, 1000); | 2027                           1000, 1000); | 
| 1994   // Need to wait to make sure the connections on both networks are writable. | 2028   // Need to wait to make sure the connections on both networks are writable. | 
| 1995   EXPECT_TRUE_WAIT(ep1_ch1()->selected_connection() && | 2029   EXPECT_TRUE_WAIT(ep1_ch1()->selected_connection() && | 
| 1996                        RemoteCandidate(ep1_ch1())->address().EqualIPs(wifi[1]), | 2030                        RemoteCandidate(ep1_ch1())->address().EqualIPs(wifi[1]), | 
| 1997                    1000); | 2031                    1000); | 
| 1998   EXPECT_TRUE_WAIT(ep2_ch1()->selected_connection() && | 2032   EXPECT_TRUE_WAIT(ep2_ch1()->selected_connection() && | 
| 1999                        LocalCandidate(ep2_ch1())->address().EqualIPs(wifi[1]), | 2033                        LocalCandidate(ep2_ch1())->address().EqualIPs(wifi[1]), | 
| 2000                    1000); | 2034                    1000); | 
|  | 2035   DestroyChannels(); | 
| 2001 } | 2036 } | 
| 2002 | 2037 | 
| 2003 // Test that the backup connection is pinged at a rate no faster than | 2038 // Test that the backup connection is pinged at a rate no faster than | 
| 2004 // what was configured. | 2039 // what was configured. | 
| 2005 TEST_F(P2PTransportChannelMultihomedTest, TestPingBackupConnectionRate) { | 2040 TEST_F(P2PTransportChannelMultihomedTest, TestPingBackupConnectionRate) { | 
| 2006   AddAddress(0, kPublicAddrs[0]); | 2041   AddAddress(0, kPublicAddrs[0]); | 
| 2007   // Adding alternate address will make sure |kPublicAddrs| has the higher | 2042   // Adding alternate address will make sure |kPublicAddrs| has the higher | 
| 2008   // priority than others. This is due to FakeNetwork::AddInterface method. | 2043   // priority than others. This is due to FakeNetwork::AddInterface method. | 
| 2009   AddAddress(1, kAlternateAddrs[1]); | 2044   AddAddress(1, kAlternateAddrs[1]); | 
| 2010   AddAddress(1, kPublicAddrs[1]); | 2045   AddAddress(1, kPublicAddrs[1]); | 
| 2011 | 2046 | 
| 2012   // Use only local ports for simplicity. | 2047   // Use only local ports for simplicity. | 
| 2013   SetAllocatorFlags(0, kOnlyLocalPorts); | 2048   SetAllocatorFlags(0, kOnlyLocalPorts); | 
| 2014   SetAllocatorFlags(1, kOnlyLocalPorts); | 2049   SetAllocatorFlags(1, kOnlyLocalPorts); | 
| 2015 | 2050 | 
| 2016   // Create channels and let them go writable, as usual. | 2051   // Create channels and let them go writable, as usual. | 
| 2017   CreateChannels(1); | 2052   CreateChannels(1); | 
| 2018   EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->receiving() && ep1_ch1()->writable() && | 2053   EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->receiving() && ep1_ch1()->writable() && | 
| 2019                               ep2_ch1()->receiving() && ep2_ch1()->writable(), | 2054                               ep2_ch1()->receiving() && ep2_ch1()->writable(), | 
| 2020                           1000, 1000); | 2055                           1000, 1000); | 
| 2021   int backup_ping_interval = 2000; | 2056   int backup_ping_interval = 2000; | 
| 2022   ep2_ch1()->SetIceConfig(CreateIceConfig(2000, false, backup_ping_interval)); | 2057   ep2_ch1()->SetIceConfig( | 
|  | 2058       CreateIceConfig(2000, GATHER_ONCE, backup_ping_interval)); | 
| 2023   // After the state becomes COMPLETED, the backup connection will be pinged | 2059   // After the state becomes COMPLETED, the backup connection will be pinged | 
| 2024   // once every |backup_ping_interval| milliseconds. | 2060   // once every |backup_ping_interval| milliseconds. | 
| 2025   ASSERT_TRUE_WAIT(ep2_ch1()->GetState() == STATE_COMPLETED, 1000); | 2061   ASSERT_TRUE_WAIT(ep2_ch1()->GetState() == STATE_COMPLETED, 1000); | 
| 2026   const std::vector<Connection*>& connections = ep2_ch1()->connections(); | 2062   const std::vector<Connection*>& connections = ep2_ch1()->connections(); | 
| 2027   ASSERT_EQ(2U, connections.size()); | 2063   ASSERT_EQ(2U, connections.size()); | 
| 2028   Connection* backup_conn = connections[1]; | 2064   Connection* backup_conn = connections[1]; | 
| 2029   EXPECT_TRUE_WAIT(backup_conn->writable(), 3000); | 2065   EXPECT_TRUE_WAIT(backup_conn->writable(), 3000); | 
| 2030   int64_t last_ping_response_ms = backup_conn->last_ping_response_received(); | 2066   int64_t last_ping_response_ms = backup_conn->last_ping_response_received(); | 
| 2031   EXPECT_TRUE_WAIT( | 2067   EXPECT_TRUE_WAIT( | 
| 2032       last_ping_response_ms < backup_conn->last_ping_response_received(), 5000); | 2068       last_ping_response_ms < backup_conn->last_ping_response_received(), 5000); | 
| 2033   int time_elapsed = | 2069   int time_elapsed = | 
| 2034       backup_conn->last_ping_response_received() - last_ping_response_ms; | 2070       backup_conn->last_ping_response_received() - last_ping_response_ms; | 
| 2035   LOG(LS_INFO) << "Time elapsed: " << time_elapsed; | 2071   LOG(LS_INFO) << "Time elapsed: " << time_elapsed; | 
| 2036   EXPECT_GE(time_elapsed, backup_ping_interval); | 2072   EXPECT_GE(time_elapsed, backup_ping_interval); | 
|  | 2073 | 
|  | 2074   DestroyChannels(); | 
| 2037 } | 2075 } | 
| 2038 | 2076 | 
| 2039 TEST_F(P2PTransportChannelMultihomedTest, TestGetState) { | 2077 TEST_F(P2PTransportChannelMultihomedTest, TestGetState) { | 
| 2040   AddAddress(0, kAlternateAddrs[0]); | 2078   AddAddress(0, kAlternateAddrs[0]); | 
| 2041   AddAddress(0, kPublicAddrs[0]); | 2079   AddAddress(0, kPublicAddrs[0]); | 
| 2042   AddAddress(1, kPublicAddrs[1]); | 2080   AddAddress(1, kPublicAddrs[1]); | 
| 2043   // Create channels and let them go writable, as usual. | 2081   // Create channels and let them go writable, as usual. | 
| 2044   CreateChannels(1); | 2082   CreateChannels(1); | 
| 2045 | 2083 | 
| 2046   // Both transport channels will reach STATE_COMPLETED quickly. | 2084   // Both transport channels will reach STATE_COMPLETED quickly. | 
| 2047   EXPECT_EQ_WAIT(TransportChannelState::STATE_COMPLETED, ep1_ch1()->GetState(), | 2085   EXPECT_EQ_WAIT(TransportChannelState::STATE_COMPLETED, ep1_ch1()->GetState(), | 
| 2048                  1000); | 2086                  1000); | 
| 2049   EXPECT_EQ_WAIT(TransportChannelState::STATE_COMPLETED, ep2_ch1()->GetState(), | 2087   EXPECT_EQ_WAIT(TransportChannelState::STATE_COMPLETED, ep2_ch1()->GetState(), | 
| 2050                  1000); | 2088                  1000); | 
| 2051 } | 2089 } | 
| 2052 | 2090 | 
| 2053 // Tests that when a network interface becomes inactive, if and only if | 2091 // Tests that when a network interface becomes inactive, if Continual Gathering | 
| 2054 // Continual Gathering is enabled, the ports associated with that network | 2092 // policy is GATHER_CONTINUALLY, the ports associated with that network | 
| 2055 // will be removed from the port list of the channel, and the respective | 2093 // will be removed from the port list of the channel, and the respective | 
| 2056 // remote candidates on the other participant will be removed eventually. | 2094 // remote candidates on the other participant will be removed eventually. | 
| 2057 TEST_F(P2PTransportChannelMultihomedTest, TestNetworkBecomesInactive) { | 2095 TEST_F(P2PTransportChannelMultihomedTest, TestNetworkBecomesInactive) { | 
|  | 2096   rtc::ScopedFakeClock clock; | 
| 2058   AddAddress(0, kPublicAddrs[0]); | 2097   AddAddress(0, kPublicAddrs[0]); | 
| 2059   AddAddress(1, kPublicAddrs[1]); | 2098   AddAddress(1, kPublicAddrs[1]); | 
| 2060   // Create channels and let them go writable, as usual. | 2099   // Create channels and let them go writable, as usual. | 
| 2061   CreateChannels(1); | 2100   CreateChannels(1); | 
| 2062   ep1_ch1()->SetIceConfig(CreateIceConfig(2000, true)); | 2101   ep1_ch1()->SetIceConfig(CreateIceConfig(2000, GATHER_CONTINUALLY)); | 
| 2063   ep2_ch1()->SetIceConfig(CreateIceConfig(2000, false)); | 2102   ep2_ch1()->SetIceConfig(CreateIceConfig(2000, GATHER_ONCE)); | 
| 2064 | 2103 | 
| 2065   SetAllocatorFlags(0, kOnlyLocalPorts); | 2104   SetAllocatorFlags(0, kOnlyLocalPorts); | 
| 2066   SetAllocatorFlags(1, kOnlyLocalPorts); | 2105   SetAllocatorFlags(1, kOnlyLocalPorts); | 
| 2067   EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->receiving() && ep1_ch1()->writable() && | 2106   EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() && | 
| 2068                               ep2_ch1()->receiving() && ep2_ch1()->writable(), | 2107                                  ep2_ch1()->receiving() && | 
| 2069                           1000, 1000); | 2108                                  ep2_ch1()->writable(), | 
|  | 2109                              kDefaultTimeout, clock); | 
| 2070   // More than one port has been created. | 2110   // More than one port has been created. | 
| 2071   EXPECT_LE(1U, ep1_ch1()->ports().size()); | 2111   EXPECT_LE(1U, ep1_ch1()->ports().size()); | 
| 2072   // Endpoint 1 enabled continual gathering; the port will be removed | 2112   // Endpoint 1 enabled continual gathering; the port will be removed | 
| 2073   // when the interface is removed. | 2113   // when the interface is removed. | 
| 2074   RemoveAddress(0, kPublicAddrs[0]); | 2114   RemoveAddress(0, kPublicAddrs[0]); | 
| 2075   EXPECT_TRUE(ep1_ch1()->ports().empty()); | 2115   EXPECT_TRUE(ep1_ch1()->ports().empty()); | 
| 2076   // The remote candidates will be removed eventually. | 2116   // The remote candidates will be removed eventually. | 
| 2077   EXPECT_TRUE_WAIT(ep2_ch1()->remote_candidates().empty(), 1000); | 2117   EXPECT_TRUE_SIMULATED_WAIT(ep2_ch1()->remote_candidates().empty(), 1000, | 
|  | 2118                              clock); | 
| 2078 | 2119 | 
| 2079   size_t num_ports = ep2_ch1()->ports().size(); | 2120   size_t num_ports = ep2_ch1()->ports().size(); | 
| 2080   EXPECT_LE(1U, num_ports); | 2121   EXPECT_LE(1U, num_ports); | 
| 2081   size_t num_remote_candidates = ep1_ch1()->remote_candidates().size(); | 2122   size_t num_remote_candidates = ep1_ch1()->remote_candidates().size(); | 
| 2082   // Endpoint 2 did not enable continual gathering; the port will not be removed | 2123   // Endpoint 2 did not enable continual gathering; the local port will still be | 
| 2083   // when the interface is removed and neither the remote candidates on the | 2124   // removed when the interface is removed but the remote candidates on the | 
| 2084   // other participant. | 2125   // other participant will not be removed. | 
| 2085   RemoveAddress(1, kPublicAddrs[1]); | 2126   RemoveAddress(1, kPublicAddrs[1]); | 
| 2086   rtc::Thread::Current()->ProcessMessages(500); | 2127 | 
| 2087   EXPECT_EQ(num_ports, ep2_ch1()->ports().size()); | 2128   EXPECT_EQ_SIMULATED_WAIT(0U, ep2_ch1()->ports().size(), kDefaultTimeout, | 
|  | 2129                            clock); | 
|  | 2130   SIMULATED_WAIT(0U == ep1_ch1()->remote_candidates().size(), 500, clock); | 
| 2088   EXPECT_EQ(num_remote_candidates, ep1_ch1()->remote_candidates().size()); | 2131   EXPECT_EQ(num_remote_candidates, ep1_ch1()->remote_candidates().size()); | 
|  | 2132 | 
|  | 2133   DestroyChannels(); | 
| 2089 } | 2134 } | 
| 2090 | 2135 | 
| 2091 /* | 2136 // Tests that continual gathering will create new connections when a new | 
|  | 2137 // interface is added. | 
|  | 2138 TEST_F(P2PTransportChannelMultihomedTest, | 
|  | 2139        TestContinualGatheringOnNewInterface) { | 
|  | 2140   auto& wifi = kAlternateAddrs; | 
|  | 2141   auto& cellular = kPublicAddrs; | 
|  | 2142   AddAddress(0, wifi[0], "test_wifi0", rtc::ADAPTER_TYPE_WIFI); | 
|  | 2143   AddAddress(1, cellular[1], "test_cell1", rtc::ADAPTER_TYPE_CELLULAR); | 
|  | 2144   CreateChannels(1); | 
|  | 2145   // Set continual gathering policy. | 
|  | 2146   ep1_ch1()->SetIceConfig(CreateIceConfig(1000, GATHER_CONTINUALLY)); | 
|  | 2147   ep2_ch1()->SetIceConfig(CreateIceConfig(1000, GATHER_CONTINUALLY)); | 
|  | 2148   SetAllocatorFlags(0, kOnlyLocalPorts); | 
|  | 2149   SetAllocatorFlags(1, kOnlyLocalPorts); | 
|  | 2150   EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->receiving() && ep1_ch1()->writable() && | 
|  | 2151                               ep2_ch1()->receiving() && ep2_ch1()->writable(), | 
|  | 2152                           kDefaultTimeout, kDefaultTimeout); | 
| 2092 | 2153 | 
| 2093 TODO(pthatcher): Once have a way to handle network interfaces changes | 2154   // Add a new wifi interface on end point 2. We should expect a new connection | 
| 2094 without signalling an ICE restart, put a test like this back.  In the | 2155   // to be created and the new one will be the best connection. | 
| 2095 mean time, this test only worked for GICE.  With ICE, it's currently | 2156   AddAddress(1, wifi[1], "test_wifi1", rtc::ADAPTER_TYPE_WIFI); | 
| 2096 not possible without an ICE restart. | 2157   const cricket::Connection* conn; | 
|  | 2158   EXPECT_TRUE_WAIT((conn = ep1_ch1()->best_connection()) != nullptr && | 
|  | 2159                        conn->remote_candidate().address().EqualIPs(wifi[1]), | 
|  | 2160                    kDefaultTimeout); | 
|  | 2161   EXPECT_TRUE_WAIT((conn = ep2_ch1()->best_connection()) != nullptr && | 
|  | 2162                        conn->local_candidate().address().EqualIPs(wifi[1]), | 
|  | 2163                    kDefaultTimeout); | 
| 2097 | 2164 | 
| 2098 // Test that we can switch links in a coordinated fashion. | 2165   // Add a new cellular interface on end point 1, we should expect a new | 
| 2099 TEST_F(P2PTransportChannelMultihomedTest, TestDrain) { | 2166   // backup connection created using this new interface. | 
|  | 2167   AddAddress(0, cellular[0], "test_cellular0", rtc::ADAPTER_TYPE_CELLULAR); | 
|  | 2168   EXPECT_TRUE_WAIT(ep1_ch1()->GetState() == cricket::STATE_COMPLETED && | 
|  | 2169                        (conn = GetConnectionWithLocalAddress( | 
|  | 2170                             ep1_ch1(), cellular[0])) != nullptr && | 
|  | 2171                        conn != ep1_ch1()->best_connection() && conn->writable(), | 
|  | 2172                    kDefaultTimeout); | 
|  | 2173   EXPECT_TRUE_WAIT( | 
|  | 2174       ep2_ch1()->GetState() == cricket::STATE_COMPLETED && | 
|  | 2175           (conn = GetConnectionWithRemoteAddress(ep2_ch1(), cellular[0])) != | 
|  | 2176               nullptr && | 
|  | 2177           conn != ep2_ch1()->best_connection() && conn->receiving(), | 
|  | 2178       kDefaultTimeout); | 
|  | 2179 | 
|  | 2180   DestroyChannels(); | 
|  | 2181 } | 
|  | 2182 | 
|  | 2183 // Tests that we can switch links via continual gathering. | 
|  | 2184 TEST_F(P2PTransportChannelMultihomedTest, | 
|  | 2185        TestSwitchLinksViaContinualGathering) { | 
|  | 2186   rtc::ScopedFakeClock clock; | 
| 2100   AddAddress(0, kPublicAddrs[0]); | 2187   AddAddress(0, kPublicAddrs[0]); | 
| 2101   AddAddress(1, kPublicAddrs[1]); | 2188   AddAddress(1, kPublicAddrs[1]); | 
| 2102   // Use only local ports for simplicity. | 2189   // Use only local ports for simplicity. | 
| 2103   SetAllocatorFlags(0, kOnlyLocalPorts); | 2190   SetAllocatorFlags(0, kOnlyLocalPorts); | 
| 2104   SetAllocatorFlags(1, kOnlyLocalPorts); | 2191   SetAllocatorFlags(1, kOnlyLocalPorts); | 
| 2105 | 2192 | 
| 2106   // Create channels and let them go writable, as usual. | 2193   // Create channels and let them go writable, as usual. | 
| 2107   CreateChannels(1); | 2194   CreateChannels(1); | 
| 2108   EXPECT_TRUE_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() && | 2195   // Set continual gathering policy. | 
| 2109                    ep2_ch1()->receiving() && ep2_ch1()->writable(), | 2196   ep1_ch1()->SetIceConfig(CreateIceConfig(1000, GATHER_CONTINUALLY)); | 
| 2110                    1000); | 2197   ep2_ch1()->SetIceConfig(CreateIceConfig(1000, GATHER_CONTINUALLY)); | 
|  | 2198   EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() && | 
|  | 2199                                  ep2_ch1()->receiving() && | 
|  | 2200                                  ep2_ch1()->writable(), | 
|  | 2201                              3000, clock); | 
| 2111   EXPECT_TRUE( | 2202   EXPECT_TRUE( | 
| 2112       ep1_ch1()->selected_connection() && ep2_ch1()->selected_connection() && | 2203       ep1_ch1()->selected_connection() && ep2_ch1()->selected_connection() && | 
| 2113       LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && | 2204       LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && | 
| 2114       RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1])); | 2205       RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1])); | 
| 2115 | 2206 | 
| 2116 | 2207   // Add the new address first and then remove the other one. | 
| 2117   // Remove the public interface, add the alternate interface, and allocate |  | 
| 2118   // a new generation of candidates for the new interface (via |  | 
| 2119   // MaybeStartGathering()). |  | 
| 2120   LOG(LS_INFO) << "Draining..."; | 2208   LOG(LS_INFO) << "Draining..."; | 
| 2121   AddAddress(1, kAlternateAddrs[1]); | 2209   AddAddress(1, kAlternateAddrs[1]); | 
| 2122   RemoveAddress(1, kPublicAddrs[1]); | 2210   RemoveAddress(1, kPublicAddrs[1]); | 
| 2123   ep2_ch1()->MaybeStartGathering(); | 2211   // We should switch to use the alternate address after an exchange of pings. | 
|  | 2212   EXPECT_TRUE_SIMULATED_WAIT( | 
|  | 2213       ep1_ch1()->selected_connection() && ep2_ch1()->selected_connection() && | 
|  | 2214           LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && | 
|  | 2215           RemoteCandidate(ep1_ch1())->address().EqualIPs(kAlternateAddrs[1]), | 
|  | 2216       3000, clock); | 
| 2124 | 2217 | 
| 2125   // We should switch over to use the alternate address after | 2218   // Remove one address first and then add another address. | 
| 2126   // an exchange of pings. | 2219   LOG(LS_INFO) << "Draining again..."; | 
| 2127   EXPECT_TRUE_WAIT( | 2220   RemoveAddress(1, kAlternateAddrs[1]); | 
| 2128       ep1_ch1()->selected_connection() && ep2_ch1()->selected_connection() && | 2221   AddAddress(1, kAlternateAddrs[0]); | 
| 2129       LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && | 2222   EXPECT_TRUE_SIMULATED_WAIT( | 
| 2130       RemoteCandidate(ep1_ch1())->address().EqualIPs(kAlternateAddrs[1]), | 2223       ep1_ch1()->best_connection() && ep2_ch1()->best_connection() && | 
| 2131       3000); | 2224           LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) && | 
|  | 2225           RemoteCandidate(ep1_ch1())->address().EqualIPs(kAlternateAddrs[0]), | 
|  | 2226       3000, clock); | 
| 2132 | 2227 | 
| 2133   DestroyChannels(); | 2228   DestroyChannels(); | 
| 2134 } | 2229 } | 
| 2135 | 2230 | 
|  | 2231 /* | 
|  | 2232 TODO(honghaiz) Once continual gathering fully supports | 
|  | 2233 GATHER_CONTINUALLY_AND_RECOVER, put this test back. | 
|  | 2234 | 
|  | 2235 // Tests that if the backup connections are lost and then the interface with the | 
|  | 2236 // selected connection is gone, continual gathering will restore the | 
|  | 2237 // connectivity. | 
|  | 2238 TEST_F(P2PTransportChannelMultihomedTest, | 
|  | 2239        TestBackupConnectionLostThenInterfaceGone) { | 
|  | 2240   rtc::ScopedFakeClock clock; | 
|  | 2241   auto& wifi = kAlternateAddrs; | 
|  | 2242   auto& cellular = kPublicAddrs; | 
|  | 2243   AddAddress(0, wifi[0], "test_wifi0", rtc::ADAPTER_TYPE_WIFI); | 
|  | 2244   AddAddress(0, cellular[0], "test_cell0", rtc::ADAPTER_TYPE_CELLULAR); | 
|  | 2245   AddAddress(1, wifi[1], "test_wifi1", rtc::ADAPTER_TYPE_WIFI); | 
|  | 2246   AddAddress(1, cellular[1], "test_cell1", rtc::ADAPTER_TYPE_CELLULAR); | 
|  | 2247   // Use only local ports for simplicity. | 
|  | 2248   SetAllocatorFlags(0, kOnlyLocalPorts); | 
|  | 2249   SetAllocatorFlags(1, kOnlyLocalPorts); | 
|  | 2250 | 
|  | 2251   // Create channels and let them go writable, as usual. | 
|  | 2252   CreateChannels(1); | 
|  | 2253   // Set continual gathering policy. | 
|  | 2254   IceConfig config = CreateIceConfig(1000, GATHER_CONTINUALLY_AND_RECOVER); | 
|  | 2255   ep1_ch1()->SetIceConfig(config); | 
|  | 2256   ep2_ch1()->SetIceConfig(config); | 
|  | 2257   EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() && | 
|  | 2258                               ep2_ch1()->receiving() && ep2_ch1()->writable(), | 
|  | 2259                           3000, clock); | 
|  | 2260   EXPECT_TRUE(ep1_ch1()->best_connection() && ep2_ch1()->best_connection() && | 
|  | 2261               LocalCandidate(ep1_ch1())->address().EqualIPs(wifi[0]) && | 
|  | 2262               RemoteCandidate(ep1_ch1())->address().EqualIPs(wifi[1])); | 
|  | 2263 | 
|  | 2264   // First destroy all backup connection. | 
|  | 2265   DestroyAllButBestConnection(ep1_ch1()); | 
|  | 2266 | 
|  | 2267   SIMULATED_WAIT(false, 10, clock); | 
|  | 2268   // Then the interface of the best connection goes away. | 
|  | 2269   RemoveAddress(0, wifi[0]); | 
|  | 2270   EXPECT_TRUE_SIMULATED_WAIT( | 
|  | 2271       ep1_ch1()->best_connection() && ep2_ch1()->best_connection() && | 
|  | 2272           LocalCandidate(ep1_ch1())->address().EqualIPs(cellular[0]) && | 
|  | 2273           RemoteCandidate(ep1_ch1())->address().EqualIPs(wifi[1]), | 
|  | 2274       3000, clock); | 
|  | 2275 | 
|  | 2276   DestroyChannels(); | 
|  | 2277 } | 
| 2136 */ | 2278 */ | 
| 2137 | 2279 | 
|  | 2280 // Tests that the backup connection will be restored after it is destroyed. | 
|  | 2281 TEST_F(P2PTransportChannelMultihomedTest, TestRestoreBackupConnection) { | 
|  | 2282   rtc::ScopedFakeClock clock; | 
|  | 2283   auto& wifi = kAlternateAddrs; | 
|  | 2284   auto& cellular = kPublicAddrs; | 
|  | 2285   AddAddress(0, wifi[0], "test_wifi0", rtc::ADAPTER_TYPE_WIFI); | 
|  | 2286   AddAddress(0, cellular[0], "test_cell0", rtc::ADAPTER_TYPE_CELLULAR); | 
|  | 2287   AddAddress(1, wifi[1], "test_wifi1", rtc::ADAPTER_TYPE_WIFI); | 
|  | 2288   AddAddress(1, cellular[1], "test_cell1", rtc::ADAPTER_TYPE_CELLULAR); | 
|  | 2289   // Use only local ports for simplicity. | 
|  | 2290   SetAllocatorFlags(0, kOnlyLocalPorts); | 
|  | 2291   SetAllocatorFlags(1, kOnlyLocalPorts); | 
|  | 2292 | 
|  | 2293   // Create channels and let them go writable, as usual. | 
|  | 2294   CreateChannels(1); | 
|  | 2295   IceConfig config = CreateIceConfig(1000, GATHER_CONTINUALLY); | 
|  | 2296   config.regather_on_failed_networks_interval = rtc::Optional<int>(2000); | 
|  | 2297   ep1_ch1()->SetIceConfig(config); | 
|  | 2298   ep2_ch1()->SetIceConfig(config); | 
|  | 2299   EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() && | 
|  | 2300                                  ep2_ch1()->receiving() && | 
|  | 2301                                  ep2_ch1()->writable(), | 
|  | 2302                              3000, clock); | 
|  | 2303   EXPECT_TRUE(ep1_ch1()->best_connection() && ep2_ch1()->best_connection() && | 
|  | 2304               LocalCandidate(ep1_ch1())->address().EqualIPs(wifi[0]) && | 
|  | 2305               RemoteCandidate(ep1_ch1())->address().EqualIPs(wifi[1])); | 
|  | 2306 | 
|  | 2307   // Destroy all backup connections. | 
|  | 2308   DestroyAllButBestConnection(ep1_ch1()); | 
|  | 2309   // Ensure the backup connection is removed first. | 
|  | 2310   EXPECT_TRUE_SIMULATED_WAIT( | 
|  | 2311       GetConnectionWithLocalAddress(ep1_ch1(), cellular[0]) == nullptr, | 
|  | 2312       kDefaultTimeout, clock); | 
|  | 2313   const cricket::Connection* conn; | 
|  | 2314   EXPECT_TRUE_SIMULATED_WAIT( | 
|  | 2315       (conn = GetConnectionWithLocalAddress(ep1_ch1(), cellular[0])) != | 
|  | 2316               nullptr && | 
|  | 2317           conn != ep1_ch1()->best_connection() && conn->writable(), | 
|  | 2318       5000, clock); | 
|  | 2319 | 
|  | 2320   DestroyChannels(); | 
|  | 2321 } | 
|  | 2322 | 
| 2138 // A collection of tests which tests a single P2PTransportChannel by sending | 2323 // A collection of tests which tests a single P2PTransportChannel by sending | 
| 2139 // pings. | 2324 // pings. | 
| 2140 class P2PTransportChannelPingTest : public testing::Test, | 2325 class P2PTransportChannelPingTest : public testing::Test, | 
| 2141                                     public sigslot::has_slots<> { | 2326                                     public sigslot::has_slots<> { | 
| 2142  public: | 2327  public: | 
| 2143   P2PTransportChannelPingTest() | 2328   P2PTransportChannelPingTest() | 
| 2144       : pss_(new rtc::PhysicalSocketServer), | 2329       : pss_(new rtc::PhysicalSocketServer), | 
| 2145         vss_(new rtc::VirtualSocketServer(pss_.get())), | 2330         vss_(new rtc::VirtualSocketServer(pss_.get())), | 
| 2146         ss_scope_(vss_.get()) {} | 2331         ss_scope_(vss_.get()) {} | 
| 2147 | 2332 | 
| (...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2617 } | 2802 } | 
| 2618 | 2803 | 
| 2619 TEST_F(P2PTransportChannelPingTest, TestReceivingStateChange) { | 2804 TEST_F(P2PTransportChannelPingTest, TestReceivingStateChange) { | 
| 2620   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 2805   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 
| 2621   P2PTransportChannel ch("receiving state change", 1, &pa); | 2806   P2PTransportChannel ch("receiving state change", 1, &pa); | 
| 2622   PrepareChannel(&ch); | 2807   PrepareChannel(&ch); | 
| 2623   // Default receiving timeout and checking receiving interval should not be too | 2808   // Default receiving timeout and checking receiving interval should not be too | 
| 2624   // small. | 2809   // small. | 
| 2625   EXPECT_LE(1000, ch.receiving_timeout()); | 2810   EXPECT_LE(1000, ch.receiving_timeout()); | 
| 2626   EXPECT_LE(200, ch.check_receiving_interval()); | 2811   EXPECT_LE(200, ch.check_receiving_interval()); | 
| 2627   ch.SetIceConfig(CreateIceConfig(500, false)); | 2812   ch.SetIceConfig(CreateIceConfig(500, GATHER_ONCE)); | 
| 2628   EXPECT_EQ(500, ch.receiving_timeout()); | 2813   EXPECT_EQ(500, ch.receiving_timeout()); | 
| 2629   EXPECT_EQ(50, ch.check_receiving_interval()); | 2814   EXPECT_EQ(50, ch.check_receiving_interval()); | 
| 2630   ch.MaybeStartGathering(); | 2815   ch.MaybeStartGathering(); | 
| 2631   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1)); | 2816   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1)); | 
| 2632   Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 2817   Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 
| 2633   ASSERT_TRUE(conn1 != nullptr); | 2818   ASSERT_TRUE(conn1 != nullptr); | 
| 2634 | 2819 | 
| 2635   conn1->ReceivedPing(); | 2820   conn1->ReceivedPing(); | 
| 2636   conn1->OnReadPacket("ABC", 3, rtc::CreatePacketTime(0)); | 2821   conn1->OnReadPacket("ABC", 3, rtc::CreatePacketTime(0)); | 
| 2637   EXPECT_TRUE_WAIT(ch.selected_connection() != nullptr, 1000); | 2822   EXPECT_TRUE_WAIT(ch.selected_connection() != nullptr, 1000); | 
| (...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3031   // When a higher-priority, nominated candidate comes in, the connections with | 3216   // When a higher-priority, nominated candidate comes in, the connections with | 
| 3032   // lower-priority are pruned. | 3217   // lower-priority are pruned. | 
| 3033   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 10)); | 3218   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 10)); | 
| 3034   Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 3219   Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 
| 3035   ASSERT_TRUE(conn2 != nullptr); | 3220   ASSERT_TRUE(conn2 != nullptr); | 
| 3036   conn2->ReceivedPingResponse(LOW_RTT);  // Becomes writable and receiving | 3221   conn2->ReceivedPingResponse(LOW_RTT);  // Becomes writable and receiving | 
| 3037   conn2->set_nominated(true); | 3222   conn2->set_nominated(true); | 
| 3038   conn2->SignalNominated(conn2); | 3223   conn2->SignalNominated(conn2); | 
| 3039   EXPECT_TRUE_WAIT(conn1->pruned(), 3000); | 3224   EXPECT_TRUE_WAIT(conn1->pruned(), 3000); | 
| 3040 | 3225 | 
| 3041   ch.SetIceConfig(CreateIceConfig(500, false)); | 3226   ch.SetIceConfig(CreateIceConfig(500, GATHER_ONCE)); | 
| 3042   // Wait until conn2 becomes not receiving. | 3227   // Wait until conn2 becomes not receiving. | 
| 3043   EXPECT_TRUE_WAIT(!conn2->receiving(), 3000); | 3228   EXPECT_TRUE_WAIT(!conn2->receiving(), 3000); | 
| 3044 | 3229 | 
| 3045   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "3.3.3.3", 3, 1)); | 3230   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "3.3.3.3", 3, 1)); | 
| 3046   Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3); | 3231   Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3); | 
| 3047   ASSERT_TRUE(conn3 != nullptr); | 3232   ASSERT_TRUE(conn3 != nullptr); | 
| 3048   // The selected connection should still be conn2. Even through conn3 has lower | 3233   // The selected connection should still be conn2. Even through conn3 has lower | 
| 3049   // priority and is not receiving/writable, it is not pruned because the | 3234   // priority and is not receiving/writable, it is not pruned because the | 
| 3050   // selected connection is not receiving. | 3235   // selected connection is not receiving. | 
| 3051   WAIT(conn3->pruned(), 1000); | 3236   WAIT(conn3->pruned(), 1000); | 
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3097   // Need to wait until the channel state is updated. | 3282   // Need to wait until the channel state is updated. | 
| 3098   EXPECT_EQ_WAIT(TransportChannelState::STATE_FAILED, ch.GetState(), 1000); | 3283   EXPECT_EQ_WAIT(TransportChannelState::STATE_FAILED, ch.GetState(), 1000); | 
| 3099 } | 3284 } | 
| 3100 | 3285 | 
| 3101 // Test that when a low-priority connection is pruned, it is not deleted | 3286 // Test that when a low-priority connection is pruned, it is not deleted | 
| 3102 // right away, and it can become active and be pruned again. | 3287 // right away, and it can become active and be pruned again. | 
| 3103 TEST_F(P2PTransportChannelPingTest, TestConnectionPrunedAgain) { | 3288 TEST_F(P2PTransportChannelPingTest, TestConnectionPrunedAgain) { | 
| 3104   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3289   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 
| 3105   P2PTransportChannel ch("test channel", 1, &pa); | 3290   P2PTransportChannel ch("test channel", 1, &pa); | 
| 3106   PrepareChannel(&ch); | 3291   PrepareChannel(&ch); | 
| 3107   ch.SetIceConfig(CreateIceConfig(1000, false)); | 3292   ch.SetIceConfig(CreateIceConfig(1000, GATHER_ONCE)); | 
| 3108   ch.MaybeStartGathering(); | 3293   ch.MaybeStartGathering(); | 
| 3109   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 100)); | 3294   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 100)); | 
| 3110   Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 3295   Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 
| 3111   ASSERT_TRUE(conn1 != nullptr); | 3296   ASSERT_TRUE(conn1 != nullptr); | 
| 3112   EXPECT_EQ(conn1, ch.selected_connection()); | 3297   EXPECT_EQ(conn1, ch.selected_connection()); | 
| 3113   conn1->ReceivedPingResponse(LOW_RTT);  // Becomes writable and receiving | 3298   conn1->ReceivedPingResponse(LOW_RTT);  // Becomes writable and receiving | 
| 3114 | 3299 | 
| 3115   // Add a low-priority connection |conn2|, which will be pruned, but it will | 3300   // Add a low-priority connection |conn2|, which will be pruned, but it will | 
| 3116   // not be deleted right away. Once the current selected connection becomes not | 3301   // not be deleted right away. Once the current selected connection becomes not | 
| 3117   // receiving, |conn2| will start to ping and upon receiving the ping response, | 3302   // receiving, |conn2| will start to ping and upon receiving the ping response, | 
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3171 } | 3356 } | 
| 3172 | 3357 | 
| 3173 // Tests that after a port allocator session is started, it will be stopped | 3358 // Tests that after a port allocator session is started, it will be stopped | 
| 3174 // when a new connection becomes writable and receiving. Also tests that if a | 3359 // when a new connection becomes writable and receiving. Also tests that if a | 
| 3175 // connection belonging to an old session becomes writable, it won't stop | 3360 // connection belonging to an old session becomes writable, it won't stop | 
| 3176 // the current port allocator session. | 3361 // the current port allocator session. | 
| 3177 TEST_F(P2PTransportChannelPingTest, TestStopPortAllocatorSessions) { | 3362 TEST_F(P2PTransportChannelPingTest, TestStopPortAllocatorSessions) { | 
| 3178   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3363   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 
| 3179   P2PTransportChannel ch("test channel", 1, &pa); | 3364   P2PTransportChannel ch("test channel", 1, &pa); | 
| 3180   PrepareChannel(&ch); | 3365   PrepareChannel(&ch); | 
| 3181   ch.SetIceConfig(CreateIceConfig(2000, false)); | 3366   ch.SetIceConfig(CreateIceConfig(2000, GATHER_ONCE)); | 
| 3182   ch.MaybeStartGathering(); | 3367   ch.MaybeStartGathering(); | 
| 3183   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 100)); | 3368   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 100)); | 
| 3184   Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 3369   Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 
| 3185   ASSERT_TRUE(conn1 != nullptr); | 3370   ASSERT_TRUE(conn1 != nullptr); | 
| 3186   conn1->ReceivedPingResponse(LOW_RTT);  // Becomes writable and receiving | 3371   conn1->ReceivedPingResponse(LOW_RTT);  // Becomes writable and receiving | 
| 3187   EXPECT_TRUE(!ch.allocator_session()->IsGettingPorts()); | 3372   EXPECT_TRUE(!ch.allocator_session()->IsGettingPorts()); | 
| 3188 | 3373 | 
| 3189   // Start a new session. Even though conn1, which belongs to an older | 3374   // Start a new session. Even though conn1, which belongs to an older | 
| 3190   // session, becomes unwritable and writable again, it should not stop the | 3375   // session, becomes unwritable and writable again, it should not stop the | 
| 3191   // current session. | 3376   // current session. | 
| 3192   ch.SetIceCredentials(kIceUfrag[1], kIcePwd[1]); | 3377   ch.SetIceCredentials(kIceUfrag[1], kIcePwd[1]); | 
| 3193   ch.MaybeStartGathering(); | 3378   ch.MaybeStartGathering(); | 
| 3194   conn1->Prune(); | 3379   conn1->Prune(); | 
| 3195   conn1->ReceivedPingResponse(LOW_RTT); | 3380   conn1->ReceivedPingResponse(LOW_RTT); | 
| 3196   EXPECT_TRUE(ch.allocator_session()->IsGettingPorts()); | 3381   EXPECT_TRUE(ch.allocator_session()->IsGettingPorts()); | 
| 3197 | 3382 | 
| 3198   // But if a new connection created from the new session becomes writable, | 3383   // But if a new connection created from the new session becomes writable, | 
| 3199   // it will stop the current session. | 3384   // it will stop the current session. | 
| 3200   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 100)); | 3385   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 100)); | 
| 3201   Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 3386   Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); | 
| 3202   ASSERT_TRUE(conn2 != nullptr); | 3387   ASSERT_TRUE(conn2 != nullptr); | 
| 3203   conn2->ReceivedPingResponse(LOW_RTT);  // Becomes writable and receiving | 3388   conn2->ReceivedPingResponse(LOW_RTT);  // Becomes writable and receiving | 
| 3204   EXPECT_TRUE(!ch.allocator_session()->IsGettingPorts()); | 3389   EXPECT_TRUE(!ch.allocator_session()->IsGettingPorts()); | 
| 3205 } | 3390 } | 
| 3206 | 3391 | 
| 3207 // Test that the ICE role is updated even on ports with inactive networks when | 3392 // Test that the ICE role is updated even on ports that has been removed. | 
| 3208 // doing continual gathering. These ports may still have connections that need | 3393 // These ports may still have connections that need a correct role, in case that | 
| 3209 // a correct role, in case the network becomes active before the connection is | 3394 // the connections on it may still receive stun pings. | 
| 3210 // destroyed. | 3395 TEST_F(P2PTransportChannelPingTest, TestIceRoleUpdatedOnRemovedPort) { | 
| 3211 TEST_F(P2PTransportChannelPingTest, |  | 
| 3212        TestIceRoleUpdatedOnPortAfterSignalNetworkInactive) { |  | 
| 3213   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3396   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 
| 3214   P2PTransportChannel ch("test channel", ICE_CANDIDATE_COMPONENT_DEFAULT, &pa); | 3397   P2PTransportChannel ch("test channel", ICE_CANDIDATE_COMPONENT_DEFAULT, &pa); | 
| 3215   // Starts with ICEROLE_CONTROLLING. | 3398   // Starts with ICEROLE_CONTROLLING. | 
| 3216   PrepareChannel(&ch); | 3399   PrepareChannel(&ch); | 
| 3217   IceConfig config = CreateIceConfig(1000, true); | 3400   IceConfig config = CreateIceConfig(1000, GATHER_CONTINUALLY); | 
| 3218   ch.SetIceConfig(config); | 3401   ch.SetIceConfig(config); | 
| 3219   ch.MaybeStartGathering(); | 3402   ch.MaybeStartGathering(); | 
| 3220   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1)); | 3403   ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1)); | 
| 3221 | 3404 | 
| 3222   Connection* conn = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 3405   Connection* conn = WaitForConnectionTo(&ch, "1.1.1.1", 1); | 
| 3223   ASSERT_TRUE(conn != nullptr); | 3406   ASSERT_TRUE(conn != nullptr); | 
| 3224 | 3407 | 
| 3225   // Make the fake port signal that its network is inactive, then change the | 3408   // Make a fake signal to remove the ports in the p2ptransportchannel. then | 
| 3226   // ICE role and expect it to be updated. | 3409   // change the ICE role and expect it to be updated. | 
| 3227   conn->port()->SignalNetworkInactive(conn->port()); | 3410   std::vector<PortInterface*> ports(1, conn->port()); | 
|  | 3411   ch.allocator_session()->SignalPortsRemoved(ch.allocator_session(), ports); | 
| 3228   ch.SetIceRole(ICEROLE_CONTROLLED); | 3412   ch.SetIceRole(ICEROLE_CONTROLLED); | 
| 3229   EXPECT_EQ(ICEROLE_CONTROLLED, conn->port()->GetIceRole()); | 3413   EXPECT_EQ(ICEROLE_CONTROLLED, conn->port()->GetIceRole()); | 
| 3230 } | 3414 } | 
| 3231 | 3415 | 
| 3232 // Test that the ICE role is updated even on ports with inactive networks. | 3416 // Test that the ICE role is updated even on ports with inactive networks. | 
| 3233 // These ports may still have connections that need a correct role, for the | 3417 // These ports may still have connections that need a correct role, for the | 
| 3234 // pings sent by those connections until they're replaced by newer-generation | 3418 // pings sent by those connections until they're replaced by newer-generation | 
| 3235 // connections. | 3419 // connections. | 
| 3236 TEST_F(P2PTransportChannelPingTest, TestIceRoleUpdatedOnPortAfterIceRestart) { | 3420 TEST_F(P2PTransportChannelPingTest, TestIceRoleUpdatedOnPortAfterIceRestart) { | 
| 3237   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 3421   FakePortAllocator pa(rtc::Thread::Current(), nullptr); | 
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3482 | 3666 | 
| 3483   // TCP Relay/Relay is the next. | 3667   // TCP Relay/Relay is the next. | 
| 3484   VerifyNextPingableConnection(RELAY_PORT_TYPE, RELAY_PORT_TYPE, | 3668   VerifyNextPingableConnection(RELAY_PORT_TYPE, RELAY_PORT_TYPE, | 
| 3485                                TCP_PROTOCOL_NAME); | 3669                                TCP_PROTOCOL_NAME); | 
| 3486 | 3670 | 
| 3487   // Finally, Local/Relay will be pinged. | 3671   // Finally, Local/Relay will be pinged. | 
| 3488   VerifyNextPingableConnection(LOCAL_PORT_TYPE, RELAY_PORT_TYPE); | 3672   VerifyNextPingableConnection(LOCAL_PORT_TYPE, RELAY_PORT_TYPE); | 
| 3489 } | 3673 } | 
| 3490 | 3674 | 
| 3491 }  // namespace cricket { | 3675 }  // namespace cricket { | 
| OLD | NEW | 
|---|