15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/* 25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle 35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2009 Google Inc. 45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without 65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met: 75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer. 105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer in the documentation 125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * and/or other materials provided with the distribution. 135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 3. The name of the author may not be used to endorse or promote products 145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * derived from this software without specific prior written permission. 155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */ 275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/fakenetwork.h" 295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/firewallsocketserver.h" 305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/gunit.h" 315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/helpers.h" 325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/logging.h" 335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/natserver.h" 345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/natsocketfactory.h" 355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/network.h" 365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/physicalsocketserver.h" 375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/socketaddress.h" 385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/thread.h" 395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/virtualsocketserver.h" 405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/p2p/base/basicpacketsocketfactory.h" 415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/p2p/base/constants.h" 425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/p2p/base/p2ptransportchannel.h" 435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/p2p/base/portallocatorsessionproxy.h" 445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/p2p/base/testrelayserver.h" 455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/p2p/base/teststunserver.h" 465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/p2p/client/basicportallocator.h" 475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/p2p/client/httpportallocator.h" 485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing talk_base::SocketAddress; 505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing talk_base::Thread; 515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const SocketAddress kClientAddr("11.11.11.11", 0); 53582fe818e571fa2571267f5e369715188472f352wu@webrtc.orgstatic const SocketAddress kClientIPv6Addr( 54582fe818e571fa2571267f5e369715188472f352wu@webrtc.org "2401:fa00:4:1000:be30:5bff:fee5:c3", 0); 555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const SocketAddress kNatAddr("77.77.77.77", talk_base::NAT_SERVER_PORT); 565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const SocketAddress kRemoteClientAddr("22.22.22.22", 0); 575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const SocketAddress kStunAddr("99.99.99.1", cricket::STUN_SERVER_PORT); 585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const SocketAddress kRelayUdpIntAddr("99.99.99.2", 5000); 595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const SocketAddress kRelayUdpExtAddr("99.99.99.3", 5001); 605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const SocketAddress kRelayTcpIntAddr("99.99.99.2", 5002); 615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const SocketAddress kRelayTcpExtAddr("99.99.99.3", 5003); 625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const SocketAddress kRelaySslTcpIntAddr("99.99.99.2", 5004); 635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const SocketAddress kRelaySslTcpExtAddr("99.99.99.3", 5005); 645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Minimum and maximum port for port range tests. 665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const int kMinPort = 10000; 675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const int kMaxPort = 10099; 685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Based on ICE_UFRAG_LENGTH 705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const char kIceUfrag0[] = "TESTICEUFRAG0000"; 715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Based on ICE_PWD_LENGTH 725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const char kIcePwd0[] = "TESTICEPWD00000000000000"; 735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const char kContentName[] = "test content"; 755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const int kDefaultAllocationTimeout = 1000; 775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace cricket { 795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Helper for dumping candidates 815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstd::ostream& operator<<(std::ostream& os, const cricket::Candidate& c) { 825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org os << c.ToString(); 835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return os; 845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} // namespace cricket 875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass PortAllocatorTest : public testing::Test, public sigslot::has_slots<> { 895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static void SetUpTestCase() { 915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Ensure the RNG is inited. 925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::InitRandom(NULL, 0); 935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org PortAllocatorTest() 955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org : pss_(new talk_base::PhysicalSocketServer), 965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org vss_(new talk_base::VirtualSocketServer(pss_.get())), 975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org fss_(new talk_base::FirewallSocketServer(vss_.get())), 985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ss_scope_(fss_.get()), 995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org nat_factory_(vss_.get(), kNatAddr), 1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org nat_socket_factory_(&nat_factory_), 1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stun_server_(Thread::Current(), kStunAddr), 1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org relay_server_(Thread::Current(), kRelayUdpIntAddr, kRelayUdpExtAddr, 1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kRelayTcpIntAddr, kRelayTcpExtAddr, 1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kRelaySslTcpIntAddr, kRelaySslTcpExtAddr), 1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org allocator_(new cricket::BasicPortAllocator( 1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &network_manager_, kStunAddr, 1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kRelayUdpIntAddr, kRelayTcpIntAddr, kRelaySslTcpIntAddr)), 1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidate_allocation_done_(false) { 1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org allocator_->set_step_delay(cricket::kMinimumStepDelay); 1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void AddInterface(const SocketAddress& addr) { 1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org network_manager_.AddInterface(addr); 1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool SetPortRange(int min_port, int max_port) { 1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return allocator_->SetPortRange(min_port, max_port); 1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::NATServer* CreateNatServer(const SocketAddress& addr, 1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::NATType type) { 1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return new talk_base::NATServer(type, vss_.get(), addr, vss_.get(), addr); 1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool CreateSession(int component) { 1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_.reset(CreateSession("session", component)); 1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!session_) 1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return true; 1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool CreateSession(int component, const std::string& content_name) { 1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_.reset(CreateSession("session", content_name, component)); 1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!session_) 1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return true; 1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PortAllocatorSession* CreateSession( 1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& sid, int component) { 1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return CreateSession(sid, kContentName, component); 1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PortAllocatorSession* CreateSession( 1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& sid, const std::string& content_name, int component) { 1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return CreateSession(sid, content_name, component, kIceUfrag0, kIcePwd0); 1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PortAllocatorSession* CreateSession( 1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& sid, const std::string& content_name, int component, 1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& ice_ufrag, const std::string& ice_pwd) { 1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PortAllocatorSession* session = 1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org allocator_->CreateSession( 1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org sid, content_name, component, ice_ufrag, ice_pwd); 1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session->SignalPortReady.connect(this, 1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &PortAllocatorTest::OnPortReady); 1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session->SignalCandidatesReady.connect(this, 1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &PortAllocatorTest::OnCandidatesReady); 1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session->SignalCandidatesAllocationDone.connect(this, 1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &PortAllocatorTest::OnCandidatesAllocationDone); 1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return session; 1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool CheckCandidate(const cricket::Candidate& c, 1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int component, const std::string& type, 1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& proto, 1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const SocketAddress& addr) { 1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return (c.component() == component && c.type() == type && 1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org c.protocol() == proto && c.address().ipaddr() == addr.ipaddr() && 1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ((addr.port() == 0 && (c.address().port() != 0)) || 1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org (c.address().port() == addr.port()))); 1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool CheckPort(const talk_base::SocketAddress& addr, 1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int min_port, int max_port) { 1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return (addr.port() >= min_port && addr.port() <= max_port); 1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnCandidatesAllocationDone(cricket::PortAllocatorSession* session) { 1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // We should only get this callback once, except in the mux test where 1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // we have multiple port allocation sessions. 1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (session == session_.get()) { 1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_FALSE(candidate_allocation_done_); 1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidate_allocation_done_ = true; 1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Check if all ports allocated have send-buffer size |expected|. If 1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // |expected| == -1, check if GetOptions returns SOCKET_ERROR. 1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void CheckSendBufferSizesOfAllPorts(int expected) { 1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::vector<cricket::PortInterface*>::iterator it; 1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (it = ports_.begin(); it < ports_.end(); ++it) { 1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int send_buffer_size; 1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (expected == -1) { 1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SOCKET_ERROR, 1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org (*it)->GetOption(talk_base::Socket::OPT_SNDBUF, 1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &send_buffer_size)); 1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, (*it)->GetOption(talk_base::Socket::OPT_SNDBUF, 1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &send_buffer_size)); 1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(expected, send_buffer_size); 1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org protected: 2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::BasicPortAllocator& allocator() { 2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return *allocator_; 2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnPortReady(cricket::PortAllocatorSession* ses, 2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PortInterface* port) { 2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LOG(LS_INFO) << "OnPortReady: " << port->ToString(); 2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ports_.push_back(port); 2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnCandidatesReady(cricket::PortAllocatorSession* ses, 2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::vector<cricket::Candidate>& candidates) { 2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (size_t i = 0; i < candidates.size(); ++i) { 2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LOG(LS_INFO) << "OnCandidatesReady: " << candidates[i].ToString(); 2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org candidates_.push_back(candidates[i]); 2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool HasRelayAddress(const cricket::ProtocolAddress& proto_addr) { 2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (size_t i = 0; i < allocator_->relays().size(); ++i) { 2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::RelayServerConfig server_config = allocator_->relays()[i]; 2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PortList::const_iterator relay_port; 2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (relay_port = server_config.ports.begin(); 2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org relay_port != server_config.ports.end(); ++relay_port) { 2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (proto_addr.address == relay_port->address && 2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org proto_addr.proto == relay_port->proto) 2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return true; 2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<talk_base::PhysicalSocketServer> pss_; 2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<talk_base::VirtualSocketServer> vss_; 2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<talk_base::FirewallSocketServer> fss_; 2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::SocketServerScope ss_scope_; 2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::NATSocketFactory nat_factory_; 2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::BasicPacketSocketFactory nat_socket_factory_; 2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::TestStunServer stun_server_; 2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::TestRelayServer relay_server_; 2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::FakeNetworkManager network_manager_; 2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<cricket::BasicPortAllocator> allocator_; 2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<cricket::PortAllocatorSession> session_; 2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::vector<cricket::PortInterface*> ports_; 2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::vector<cricket::Candidate> candidates_; 2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool candidate_allocation_done_; 2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Tests that we can init the port allocator and create a session. 2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestBasic) { 2535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(&network_manager_, allocator().network_manager()); 2545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kStunAddr, allocator().stun_address()); 2555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(1u, allocator().relays().size()); 2565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(cricket::RELAY_GTURN, allocator().relays()[0].type); 2575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Empty relay credentials are used for GTURN. 2585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(allocator().relays()[0].credentials.username.empty()); 2595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(allocator().relays()[0].credentials.password.empty()); 2605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(HasRelayAddress(cricket::ProtocolAddress( 2615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kRelayUdpIntAddr, cricket::PROTO_UDP))); 2625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(HasRelayAddress(cricket::ProtocolAddress( 2635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kRelayTcpIntAddr, cricket::PROTO_TCP))); 2645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(HasRelayAddress(cricket::ProtocolAddress( 2655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kRelaySslTcpIntAddr, cricket::PROTO_SSLTCP))); 2665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 2675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Tests that we can get all the desired addresses successfully. 2705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestGetAllPortsWithMinimumStepDelay) { 2715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 2725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 2735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StartGettingPorts(); 2745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); 2755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(4U, ports_.size()); 2765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[0], 2775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); 2785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[1], 2795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp", kClientAddr); 2805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[2], 2815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", kRelayUdpIntAddr); 2825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[3], 2835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", kRelayUdpExtAddr); 2845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[4], 2855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "tcp", kRelayTcpIntAddr); 2865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[5], 2875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "tcp", kClientAddr); 2885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[6], 2895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, 2905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "relay", "ssltcp", kRelaySslTcpIntAddr); 2915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(candidate_allocation_done_); 2925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Verify candidates with default step delay of 1sec. 2955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestGetAllPortsWithOneSecondStepDelay) { 2965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 2975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org allocator_->set_step_delay(cricket::kDefaultStepDelay); 2985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 2995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StartGettingPorts(); 3005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(2U, candidates_.size(), 1000); 3015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(2U, ports_.size()); 3025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(4U, candidates_.size(), 2000); 3035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(3U, ports_.size()); 3045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[2], 3055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", kRelayUdpIntAddr); 3065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[3], 3075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", kRelayUdpExtAddr); 3085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(6U, candidates_.size(), 1500); 3095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[4], 3105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "tcp", kRelayTcpIntAddr); 3115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[5], 3125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "tcp", kClientAddr); 3135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(4U, ports_.size()); 3145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(7U, candidates_.size(), 2000); 3155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[6], 3165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, 3175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "relay", "ssltcp", kRelaySslTcpIntAddr); 3185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(4U, ports_.size()); 3195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(candidate_allocation_done_); 3205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // If we Stop gathering now, we shouldn't get a second "done" callback. 3215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StopGettingPorts(); 3225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 3235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestSetupVideoRtpPortsWithNormalSendBuffers) { 3255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 3265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP, 3275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::CN_VIDEO)); 3285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StartGettingPorts(); 3295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); 3305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(candidate_allocation_done_); 3315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // If we Stop gathering now, we shouldn't get a second "done" callback. 3325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StopGettingPorts(); 3335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // All ports should have normal send-buffer sizes (64KB). 3355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CheckSendBufferSizesOfAllPorts(64 * 1024); 3365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 3375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestSetupVideoRtpPortsWithLargeSendBuffers) { 3395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 3405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org allocator_->set_flags(allocator_->flags() | 3415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_USE_LARGE_SOCKET_SEND_BUFFERS); 3425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP, 3435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::CN_VIDEO)); 3445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StartGettingPorts(); 3455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); 3465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(candidate_allocation_done_); 3475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // If we Stop gathering now, we shouldn't get a second "done" callback. 3485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StopGettingPorts(); 3495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // All ports should have large send-buffer sizes (128KB). 3515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CheckSendBufferSizesOfAllPorts(128 * 1024); 3525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 3535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestSetupVideoRtcpPortsAndCheckSendBuffers) { 3555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 3565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org allocator_->set_flags(allocator_->flags() | 3575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_USE_LARGE_SOCKET_SEND_BUFFERS); 3585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTCP, 3595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::CN_DATA)); 3605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StartGettingPorts(); 3615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); 3625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(candidate_allocation_done_); 3635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // If we Stop gathering now, we shouldn't get a second "done" callback. 3645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StopGettingPorts(); 3655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // No ports should have send-buffer size set. 3675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CheckSendBufferSizesOfAllPorts(-1); 3685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 3695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestSetupNonVideoPortsAndCheckSendBuffers) { 3725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 3735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org allocator_->set_flags(allocator_->flags() | 3745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_USE_LARGE_SOCKET_SEND_BUFFERS); 3755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP, 3765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::CN_DATA)); 3775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StartGettingPorts(); 3785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); 3795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(candidate_allocation_done_); 3805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // If we Stop gathering now, we shouldn't get a second "done" callback. 3815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StopGettingPorts(); 3825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // No ports should have send-buffer size set. 3845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CheckSendBufferSizesOfAllPorts(-1); 3855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 3865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Tests that we can get callback after StopGetAllPorts. 3885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestStopGetAllPorts) { 3895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 3905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 3915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StartGettingPorts(); 3925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(2U, candidates_.size(), kDefaultAllocationTimeout); 3935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(2U, ports_.size()); 3945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StopGettingPorts(); 3955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 3965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 3975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that we restrict client ports appropriately when a port range is set. 3995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// We check the candidates for udp/stun/tcp ports, and the from address 4005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// for relay ports. 4015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestGetAllPortsPortRange) { 4025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 4035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Check that an invalid port range fails. 4045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(SetPortRange(kMaxPort, kMinPort)); 4055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Check that a null port range succeeds. 4065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(SetPortRange(0, 0)); 4075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Check that a valid port range succeeds. 4085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(SetPortRange(kMinPort, kMaxPort)); 4095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 4105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StartGettingPorts(); 4115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); 4125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(4U, ports_.size()); 4135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Check the port number for the UDP port object. 4145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED3(CheckPort, candidates_[0].address(), kMinPort, kMaxPort); 4155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Check the port number for the STUN port object. 4165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED3(CheckPort, candidates_[1].address(), kMinPort, kMaxPort); 4175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Check the port number used to connect to the relay server. 4185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED3(CheckPort, relay_server_.GetConnection(0).source(), 4195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kMinPort, kMaxPort); 4205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Check the port number for the TCP port object. 4215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED3(CheckPort, candidates_[5].address(), kMinPort, kMaxPort); 4225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(candidate_allocation_done_); 4235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 4245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that we don't crash or malfunction if we have no network adapters. 4265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestGetAllPortsNoAdapters) { 4275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 4285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StartGettingPorts(); 4295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::Thread::Current()->ProcessMessages(100); 4305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Without network adapter, we should not get any candidate. 4315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0U, candidates_.size()); 4325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(candidate_allocation_done_); 4335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 4345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that we can get OnCandidatesAllocationDone callback when all the ports 4365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// are disabled. 4375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestDisableAllPorts) { 4385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 4395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 4405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->set_flags(cricket::PORTALLOCATOR_DISABLE_UDP | 4415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_DISABLE_STUN | 4425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_DISABLE_RELAY | 4435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_DISABLE_TCP); 4445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StartGettingPorts(); 4455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::Thread::Current()->ProcessMessages(100); 4465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0U, candidates_.size()); 4475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(candidate_allocation_done_); 4485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 4495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that we don't crash or malfunction if we can't create UDP sockets. 4515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestGetAllPortsNoUdpSockets) { 4525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 4535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org fss_->set_udp_sockets_enabled(false); 4545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(1)); 4555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StartGettingPorts(); 4565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(5U, candidates_.size(), kDefaultAllocationTimeout); 4575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(2U, ports_.size()); 4585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[0], 4595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", kRelayUdpIntAddr); 4605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[1], 4615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", kRelayUdpExtAddr); 4625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[2], 4635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "tcp", kRelayTcpIntAddr); 4645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[3], 4655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "tcp", kClientAddr); 4665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[4], 4675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, 4685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "relay", "ssltcp", kRelaySslTcpIntAddr); 4695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(candidate_allocation_done_); 4705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 4715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that we don't crash or malfunction if we can't create UDP sockets or 4735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// listen on TCP sockets. We still give out a local TCP address, since 4745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// apparently this is needed for the remote side to accept our connection. 4755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestGetAllPortsNoUdpSocketsNoTcpListen) { 4765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 4775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org fss_->set_udp_sockets_enabled(false); 4785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org fss_->set_tcp_listen_enabled(false); 4795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(1)); 4805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StartGettingPorts(); 4815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(5U, candidates_.size(), kDefaultAllocationTimeout); 4825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(2U, ports_.size()); 4835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[0], 4845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1, "relay", "udp", kRelayUdpIntAddr); 4855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[1], 4865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1, "relay", "udp", kRelayUdpExtAddr); 4875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[2], 4885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1, "relay", "tcp", kRelayTcpIntAddr); 4895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[3], 4905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1, "local", "tcp", kClientAddr); 4915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[4], 4925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1, "relay", "ssltcp", kRelaySslTcpIntAddr); 4935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(candidate_allocation_done_); 4945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 4955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that we don't crash or malfunction if we can't create any sockets. 4975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// TODO: Find a way to exit early here. 4985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestGetAllPortsNoSockets) { 4995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 5005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org fss_->set_tcp_sockets_enabled(false); 5015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org fss_->set_udp_sockets_enabled(false); 5025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 5035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StartGettingPorts(); 5045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org WAIT(candidates_.size() > 0, 2000); 5055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // TODO - Check candidate_allocation_done signal. 5065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // In case of Relay, ports creation will succeed but sockets will fail. 5075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // There is no error reporting from RelayEntry to handle this failure. 5085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 5095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Testing STUN timeout. 5115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestGetAllPortsNoUdpAllowed) { 5125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org fss_->AddRule(false, talk_base::FP_UDP, talk_base::FD_ANY, kClientAddr); 5135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 5145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 5155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StartGettingPorts(); 5165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ_WAIT(2U, candidates_.size(), kDefaultAllocationTimeout); 5175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(2U, ports_.size()); 5185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[0], 5195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); 5205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[1], 5215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "tcp", kClientAddr); 5225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // RelayPort connection timeout is 3sec. TCP connection with RelayServer 5235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // will be tried after 3 seconds. 5245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ_WAIT(6U, candidates_.size(), 4000); 5255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(3U, ports_.size()); 5265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[2], 5275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", kRelayUdpIntAddr); 5285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[3], 5295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "tcp", kRelayTcpIntAddr); 5305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[4], 5315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "ssltcp", 5325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kRelaySslTcpIntAddr); 5335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[5], 5345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", kRelayUdpExtAddr); 5355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Stun Timeout is 9sec. 5365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE_WAIT(candidate_allocation_done_, 9000); 5375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 5385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test to verify ICE restart process. 5405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestGetAllPortsRestarts) { 5415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 5425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(1)); 5435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StartGettingPorts(); 5445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); 5455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(4U, ports_.size()); 5465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(candidate_allocation_done_); 5475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // TODO - Extend this to verify ICE restart. 5485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 5495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestBasicMuxFeatures) { 5515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 5525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org allocator().set_flags(cricket::PORTALLOCATOR_ENABLE_BUNDLE); 5535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Session ID - session1. 5545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<cricket::PortAllocatorSession> session1( 5555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateSession("session1", cricket::ICE_CANDIDATE_COMPONENT_RTP)); 5565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<cricket::PortAllocatorSession> session2( 5575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateSession("session1", cricket::ICE_CANDIDATE_COMPONENT_RTCP)); 5585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session1->StartGettingPorts(); 5595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session2->StartGettingPorts(); 5605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Each session should receive two proxy ports of local and stun. 5615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(14U, candidates_.size(), kDefaultAllocationTimeout); 5625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(8U, ports_.size()); 5635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<cricket::PortAllocatorSession> session3( 5655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateSession("session1", cricket::ICE_CANDIDATE_COMPONENT_RTP)); 5665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session3->StartGettingPorts(); 5675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Already allocated candidates and ports will be sent to the newly 5685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // allocated proxy session. 5695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(21U, candidates_.size(), kDefaultAllocationTimeout); 5705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(12U, ports_.size()); 5715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 5725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This test verifies by changing ice_ufrag and/or ice_pwd 5745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// will result in different set of candidates when BUNDLE is enabled. 5755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// If BUNDLE is disabled, CreateSession will always allocate new 5765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// set of candidates. 5775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestBundleIceRestart) { 5785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 5795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org allocator().set_flags(cricket::PORTALLOCATOR_ENABLE_BUNDLE); 5805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Session ID - session1. 5815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<cricket::PortAllocatorSession> session1( 5825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateSession("session1", kContentName, 5835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, 5845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kIceUfrag0, kIcePwd0)); 5855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session1->StartGettingPorts(); 5865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); 5875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(4U, ports_.size()); 5885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Allocate a different session with sid |session1| and different ice_ufrag. 5905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<cricket::PortAllocatorSession> session2( 5915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateSession("session1", kContentName, 5925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, 5935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "TestIceUfrag", kIcePwd0)); 5945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session2->StartGettingPorts(); 5955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(14U, candidates_.size(), kDefaultAllocationTimeout); 5965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(8U, ports_.size()); 5975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Verifying the candidate address different from previously allocated 5985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // address. 5995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Skipping verification of component id and candidate type. 6005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(candidates_[0].address(), candidates_[7].address()); 6015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(candidates_[1].address(), candidates_[8].address()); 6025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 6035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Allocating a different session with sid |session1| and 6045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // different ice_pwd. 6055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<cricket::PortAllocatorSession> session3( 6065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateSession("session1", kContentName, 6075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, 6085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org kIceUfrag0, "TestIcePwd")); 6095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session3->StartGettingPorts(); 6105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(21U, candidates_.size(), kDefaultAllocationTimeout); 6115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(12U, ports_.size()); 6125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Verifying the candidate address different from previously 6135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // allocated address. 6145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(candidates_[7].address(), candidates_[14].address()); 6155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(candidates_[8].address(), candidates_[15].address()); 6165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 6175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Allocating a session with by changing both ice_ufrag and ice_pwd. 6185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<cricket::PortAllocatorSession> session4( 6195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateSession("session1", kContentName, 6205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, 6215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "TestIceUfrag", "TestIcePwd")); 6225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session4->StartGettingPorts(); 6235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(28U, candidates_.size(), kDefaultAllocationTimeout); 6245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(16U, ports_.size()); 6255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Verifying the candidate address different from previously 6265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // allocated address. 6275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(candidates_[14].address(), candidates_[21].address()); 6285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(candidates_[15].address(), candidates_[22].address()); 6295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 6305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 6315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that when the PORTALLOCATOR_ENABLE_SHARED_UFRAG is enabled we got same 6325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// ufrag and pwd for the collected candidates. 6335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestEnableSharedUfrag) { 6345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org allocator().set_flags(allocator().flags() | 6355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG); 6365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 6375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 6385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StartGettingPorts(); 6395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); 6405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[0], 6415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); 6425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[1], 6435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp", kClientAddr); 6445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[5], 6455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "tcp", kClientAddr); 6465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(4U, ports_.size()); 6475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kIceUfrag0, candidates_[0].username()); 6485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kIceUfrag0, candidates_[1].username()); 6495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kIceUfrag0, candidates_[2].username()); 6505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kIcePwd0, candidates_[0].password()); 6515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kIcePwd0, candidates_[1].password()); 6525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(candidate_allocation_done_); 6535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 6545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 6555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that when the PORTALLOCATOR_ENABLE_SHARED_UFRAG isn't enabled we got 6565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// different ufrag and pwd for the collected candidates. 6575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestDisableSharedUfrag) { 6585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org allocator().set_flags(allocator().flags() & 6595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ~cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG); 6605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 6615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 6625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StartGettingPorts(); 6635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); 6645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[0], 6655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); 6665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[1], 6675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp", kClientAddr); 6685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(4U, ports_.size()); 6695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Port should generate random ufrag and pwd. 6705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(kIceUfrag0, candidates_[0].username()); 6715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(kIceUfrag0, candidates_[1].username()); 6725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(candidates_[0].username(), candidates_[1].username()); 6735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(kIcePwd0, candidates_[0].password()); 6745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(kIcePwd0, candidates_[1].password()); 6755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(candidates_[0].password(), candidates_[1].password()); 6765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(candidate_allocation_done_); 6775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 6785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 6795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that when PORTALLOCATOR_ENABLE_SHARED_SOCKET is enabled only one port 6805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// is allocated for udp and stun. Also verify there is only one candidate 6815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// (local) if stun candidate is same as local candidate, which will be the case 6825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// in a public network like the below test. 6835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestEnableSharedSocketWithoutNat) { 6845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 6855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org allocator_->set_flags(allocator().flags() | 6865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | 6875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); 6885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 6895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StartGettingPorts(); 6905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(6U, candidates_.size(), kDefaultAllocationTimeout); 6915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(3U, ports_.size()); 6925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[0], 6935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); 6945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 6955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 6965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 6975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that when PORTALLOCATOR_ENABLE_SHARED_SOCKET is enabled only one port 6985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// is allocated for udp and stun. In this test we should expect both stun and 6995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// local candidates as client behind a nat. 7005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestEnableSharedSocketWithNat) { 7015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 7025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<talk_base::NATServer> nat_server( 7035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateNatServer(kNatAddr, talk_base::NAT_OPEN_CONE)); 7045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org allocator_.reset(new cricket::BasicPortAllocator( 7055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &network_manager_, &nat_socket_factory_, kStunAddr)); 7065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org allocator_->set_step_delay(cricket::kMinimumStepDelay); 7075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org allocator_->set_flags(allocator().flags() | 7085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | 7095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); 7105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 7115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StartGettingPorts(); 7125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout); 7135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(2U, ports_.size()); 7145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[0], 7155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); 7165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[1], 7175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp", 7185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::SocketAddress(kNatAddr.ipaddr(), 0)); 7195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 7205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(3U, candidates_.size()); 7215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 7225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 7235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This test verifies when PORTALLOCATOR_ENABLE_SHARED_SOCKET flag is enabled 7245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// and fail to generate STUN candidate, local UDP candidate is generated 7255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// properly. 7265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PortAllocatorTest, TestEnableSharedSocketNoUdpAllowed) { 7275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org allocator().set_flags(allocator().flags() | 7285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_DISABLE_RELAY | 7295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_DISABLE_TCP | 7305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | 7315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); 7325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org fss_->AddRule(false, talk_base::FP_UDP, talk_base::FD_ANY, kClientAddr); 7335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddInterface(kClientAddr); 7345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 7355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session_->StartGettingPorts(); 7365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ_WAIT(1U, ports_.size(), kDefaultAllocationTimeout); 7375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1U, candidates_.size()); 7385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[0], 7395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); 7405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // STUN timeout is 9sec. We need to wait to get candidate done signal. 7415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE_WAIT(candidate_allocation_done_, 10000); 7425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1U, candidates_.size()); 7435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 7445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 745582fe818e571fa2571267f5e369715188472f352wu@webrtc.org// This test verifies allocator can use IPv6 addresses along with IPv4. 746582fe818e571fa2571267f5e369715188472f352wu@webrtc.orgTEST_F(PortAllocatorTest, TestEnableIPv6Addresses) { 747582fe818e571fa2571267f5e369715188472f352wu@webrtc.org allocator().set_flags(allocator().flags() | 748582fe818e571fa2571267f5e369715188472f352wu@webrtc.org cricket::PORTALLOCATOR_DISABLE_RELAY | 749582fe818e571fa2571267f5e369715188472f352wu@webrtc.org cricket::PORTALLOCATOR_ENABLE_IPV6 | 750582fe818e571fa2571267f5e369715188472f352wu@webrtc.org cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | 751582fe818e571fa2571267f5e369715188472f352wu@webrtc.org cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); 752582fe818e571fa2571267f5e369715188472f352wu@webrtc.org AddInterface(kClientIPv6Addr); 753582fe818e571fa2571267f5e369715188472f352wu@webrtc.org AddInterface(kClientAddr); 754582fe818e571fa2571267f5e369715188472f352wu@webrtc.org allocator_->set_step_delay(cricket::kMinimumStepDelay); 755582fe818e571fa2571267f5e369715188472f352wu@webrtc.org EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 756582fe818e571fa2571267f5e369715188472f352wu@webrtc.org session_->StartGettingPorts(); 757582fe818e571fa2571267f5e369715188472f352wu@webrtc.org ASSERT_EQ_WAIT(4U, ports_.size(), kDefaultAllocationTimeout); 758582fe818e571fa2571267f5e369715188472f352wu@webrtc.org EXPECT_EQ(4U, candidates_.size()); 759582fe818e571fa2571267f5e369715188472f352wu@webrtc.org EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 760582fe818e571fa2571267f5e369715188472f352wu@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[0], 761582fe818e571fa2571267f5e369715188472f352wu@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", 762582fe818e571fa2571267f5e369715188472f352wu@webrtc.org kClientIPv6Addr); 763582fe818e571fa2571267f5e369715188472f352wu@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[1], 764582fe818e571fa2571267f5e369715188472f352wu@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", 765582fe818e571fa2571267f5e369715188472f352wu@webrtc.org kClientAddr); 766582fe818e571fa2571267f5e369715188472f352wu@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[2], 767582fe818e571fa2571267f5e369715188472f352wu@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "tcp", 768582fe818e571fa2571267f5e369715188472f352wu@webrtc.org kClientIPv6Addr); 769582fe818e571fa2571267f5e369715188472f352wu@webrtc.org EXPECT_PRED5(CheckCandidate, candidates_[3], 770582fe818e571fa2571267f5e369715188472f352wu@webrtc.org cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "tcp", 771582fe818e571fa2571267f5e369715188472f352wu@webrtc.org kClientAddr); 772582fe818e571fa2571267f5e369715188472f352wu@webrtc.org EXPECT_EQ(4U, candidates_.size()); 773582fe818e571fa2571267f5e369715188472f352wu@webrtc.org} 774582fe818e571fa2571267f5e369715188472f352wu@webrtc.org 7755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that the httpportallocator correctly maintains its lists of stun and 7765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// relay servers, by never allowing an empty list. 7775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST(HttpPortAllocatorTest, TestHttpPortAllocatorHostLists) { 7785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::FakeNetworkManager network_manager; 7795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::HttpPortAllocator alloc(&network_manager, "unit test agent"); 7805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1U, alloc.relay_hosts().size()); 7815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1U, alloc.stun_hosts().size()); 7825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 7835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::vector<std::string> relay_servers; 7845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::vector<talk_base::SocketAddress> stun_servers; 7855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 7865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org alloc.SetRelayHosts(relay_servers); 7875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org alloc.SetStunHosts(stun_servers); 7885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1U, alloc.relay_hosts().size()); 7895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1U, alloc.stun_hosts().size()); 7905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 7915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org relay_servers.push_back("1.unittest.corp.google.com"); 7925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org relay_servers.push_back("2.unittest.corp.google.com"); 7935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stun_servers.push_back( 7945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::SocketAddress("1.unittest.corp.google.com", 0)); 7955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stun_servers.push_back( 7965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::SocketAddress("2.unittest.corp.google.com", 0)); 7975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org alloc.SetRelayHosts(relay_servers); 7985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org alloc.SetStunHosts(stun_servers); 7995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(2U, alloc.relay_hosts().size()); 8005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(2U, alloc.stun_hosts().size()); 8015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 8025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 8035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Test that the HttpPortAllocator uses correct URL to create sessions. 8045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST(HttpPortAllocatorTest, TestSessionRequestUrl) { 8055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::FakeNetworkManager network_manager; 8065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::HttpPortAllocator alloc(&network_manager, "unit test agent"); 8075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 8085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Disable PORTALLOCATOR_ENABLE_SHARED_UFRAG. 8095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org alloc.set_flags(alloc.flags() & ~cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG); 8105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<cricket::HttpPortAllocatorSessionBase> session( 8115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static_cast<cricket::HttpPortAllocatorSession*>( 8125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org alloc.CreateSessionInternal( 8135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "test content", 0, kIceUfrag0, kIcePwd0))); 8145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string url = session->GetSessionRequestUrl(); 8155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LOG(LS_INFO) << "url: " << url; 8165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(std::string(cricket::HttpPortAllocator::kCreateSessionURL), url); 8175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 8185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Enable PORTALLOCATOR_ENABLE_SHARED_UFRAG. 8195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org alloc.set_flags(alloc.flags() | cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG); 8205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org session.reset(static_cast<cricket::HttpPortAllocatorSession*>( 8215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org alloc.CreateSessionInternal("test content", 0, kIceUfrag0, kIcePwd0))); 8225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org url = session->GetSessionRequestUrl(); 8235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LOG(LS_INFO) << "url: " << url; 8245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::vector<std::string> parts; 8255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::split(url, '?', &parts); 8265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(2U, parts.size()); 8275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 8285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::vector<std::string> args_parts; 8295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::split(parts[1], '&', &args_parts); 8305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 8315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::map<std::string, std::string> args; 8325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (std::vector<std::string>::iterator it = args_parts.begin(); 8335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org it != args_parts.end(); ++it) { 8345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::vector<std::string> parts; 8355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::split(*it, '=', &parts); 8365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT_EQ(2U, parts.size()); 8375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org args[talk_base::s_url_decode(parts[0])] = talk_base::s_url_decode(parts[1]); 8385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 8395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 8405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kIceUfrag0, args["username"]); 8415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kIcePwd0, args["password"]); 8425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 843