blob: 4696f2399c761942f37d6a51538e1c9486d82567 [file] [log] [blame]
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001/*
2 * Copyright 2009 The WebRTC Project Authors. All rights reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Taylor Brandstettera1c30352016-05-13 08:15:11 -070011#include <algorithm>
kwiberg3ec46792016-04-27 07:22:53 -070012#include <memory>
13
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000014#include "webrtc/p2p/base/basicpacketsocketfactory.h"
kjellanderf4752772016-03-02 05:42:30 -080015#include "webrtc/p2p/base/p2pconstants.h"
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000016#include "webrtc/p2p/base/p2ptransportchannel.h"
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000017#include "webrtc/p2p/base/testrelayserver.h"
18#include "webrtc/p2p/base/teststunserver.h"
19#include "webrtc/p2p/base/testturnserver.h"
20#include "webrtc/p2p/client/basicportallocator.h"
21#include "webrtc/p2p/client/httpportallocator.h"
22#include "webrtc/base/fakenetwork.h"
23#include "webrtc/base/firewallsocketserver.h"
24#include "webrtc/base/gunit.h"
25#include "webrtc/base/helpers.h"
honghaizf421bdc2015-07-17 16:21:55 -070026#include "webrtc/base/ipaddress.h"
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000027#include "webrtc/base/logging.h"
28#include "webrtc/base/natserver.h"
29#include "webrtc/base/natsocketfactory.h"
30#include "webrtc/base/network.h"
31#include "webrtc/base/physicalsocketserver.h"
32#include "webrtc/base/socketaddress.h"
33#include "webrtc/base/ssladapter.h"
34#include "webrtc/base/thread.h"
35#include "webrtc/base/virtualsocketserver.h"
36
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -080037using rtc::IPAddress;
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000038using rtc::SocketAddress;
39using rtc::Thread;
40
41static const SocketAddress kClientAddr("11.11.11.11", 0);
Honghai Zhangb9e7b4a2016-06-30 20:52:02 -070042static const SocketAddress kClientAddr2("22.22.22.22", 0);
Guo-wei Shiehfe3bc9d2015-08-20 08:48:20 -070043static const SocketAddress kLoopbackAddr("127.0.0.1", 0);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000044static const SocketAddress kPrivateAddr("192.168.1.11", 0);
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +000045static const SocketAddress kPrivateAddr2("192.168.1.12", 0);
Taylor Brandstettera1c30352016-05-13 08:15:11 -070046static const SocketAddress kClientIPv6Addr("2401:fa00:4:1000:be30:5bff:fee5:c3",
47 0);
Honghai Zhangb9e7b4a2016-06-30 20:52:02 -070048static const SocketAddress kClientIPv6Addr2(
49 "2401:fa00:4:2000:be30:5bff:fee5:c3",
50 0);
deadbeefc5d0d952015-07-16 10:22:21 -070051static const SocketAddress kNatUdpAddr("77.77.77.77", rtc::NAT_SERVER_UDP_PORT);
52static const SocketAddress kNatTcpAddr("77.77.77.77", rtc::NAT_SERVER_TCP_PORT);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000053static const SocketAddress kRemoteClientAddr("22.22.22.22", 0);
54static const SocketAddress kStunAddr("99.99.99.1", cricket::STUN_SERVER_PORT);
55static const SocketAddress kRelayUdpIntAddr("99.99.99.2", 5000);
56static const SocketAddress kRelayUdpExtAddr("99.99.99.3", 5001);
57static const SocketAddress kRelayTcpIntAddr("99.99.99.2", 5002);
58static const SocketAddress kRelayTcpExtAddr("99.99.99.3", 5003);
59static const SocketAddress kRelaySslTcpIntAddr("99.99.99.2", 5004);
60static const SocketAddress kRelaySslTcpExtAddr("99.99.99.3", 5005);
61static const SocketAddress kTurnUdpIntAddr("99.99.99.4", 3478);
Honghai Zhangb9e7b4a2016-06-30 20:52:02 -070062static const SocketAddress kTurnUdpIntIPv6Addr(
63 "2402:fb00:4:1000:be30:5bff:fee5:c3",
64 3479);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000065static const SocketAddress kTurnTcpIntAddr("99.99.99.5", 3478);
Honghai Zhangb9e7b4a2016-06-30 20:52:02 -070066static const SocketAddress kTurnTcpIntIPv6Addr(
67 "2402:fb00:4:2000:be30:5bff:fee5:c3",
68 3479);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000069static const SocketAddress kTurnUdpExtAddr("99.99.99.6", 0);
70
71// Minimum and maximum port for port range tests.
72static const int kMinPort = 10000;
73static const int kMaxPort = 10099;
74
75// Based on ICE_UFRAG_LENGTH
zhihuang6d0d4bf2016-05-24 10:13:32 -070076static const char kIceUfrag0[] = "UF00";
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000077// Based on ICE_PWD_LENGTH
78static const char kIcePwd0[] = "TESTICEPWD00000000000000";
79
80static const char kContentName[] = "test content";
81
82static const int kDefaultAllocationTimeout = 1000;
83static const char kTurnUsername[] = "test";
84static const char kTurnPassword[] = "test";
85
Taylor Brandstetter8fcf4142016-05-23 12:49:30 -070086// STUN timeout (with all retries) is 9500ms.
87// Add some margin of error for slow bots.
88// TODO(deadbeef): Use simulated clock instead of just increasing timeouts to
89// fix flaky tests.
90static const int kStunTimeoutMs = 15000;
91
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000092namespace cricket {
93
94// Helper for dumping candidates
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -070095std::ostream& operator<<(std::ostream& os,
96 const std::vector<Candidate>& candidates) {
97 os << '[';
98 bool first = true;
99 for (const Candidate& c : candidates) {
100 if (!first) {
101 os << ", ";
102 }
103 os << c.ToString();
104 first = false;
105 };
106 os << ']';
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000107 return os;
108}
109
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700110class BasicPortAllocatorTest : public testing::Test,
111 public sigslot::has_slots<> {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000112 public:
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700113 BasicPortAllocatorTest()
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000114 : pss_(new rtc::PhysicalSocketServer),
115 vss_(new rtc::VirtualSocketServer(pss_.get())),
116 fss_(new rtc::FirewallSocketServer(vss_.get())),
117 ss_scope_(fss_.get()),
deadbeefc5d0d952015-07-16 10:22:21 -0700118 nat_factory_(vss_.get(), kNatUdpAddr, kNatTcpAddr),
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700119 nat_socket_factory_(new rtc::BasicPacketSocketFactory(&nat_factory_)),
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700120 stun_server_(TestStunServer::Create(Thread::Current(), kStunAddr)),
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700121 relay_server_(Thread::Current(),
122 kRelayUdpIntAddr,
123 kRelayUdpExtAddr,
124 kRelayTcpIntAddr,
125 kRelayTcpExtAddr,
126 kRelaySslTcpIntAddr,
127 kRelaySslTcpExtAddr),
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000128 turn_server_(Thread::Current(), kTurnUdpIntAddr, kTurnUdpExtAddr),
129 candidate_allocation_done_(false) {
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700130 ServerAddresses stun_servers;
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000131 stun_servers.insert(kStunAddr);
132 // Passing the addresses of GTURN servers will enable GTURN in
133 // Basicportallocator.
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700134 allocator_.reset(new BasicPortAllocator(&network_manager_, stun_servers,
135 kRelayUdpIntAddr, kRelayTcpIntAddr,
136 kRelaySslTcpIntAddr));
137 allocator_->set_step_delay(kMinimumStepDelay);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000138 }
139
140 void AddInterface(const SocketAddress& addr) {
141 network_manager_.AddInterface(addr);
142 }
honghaiz8c404fa2015-09-28 07:59:43 -0700143 void AddInterface(const SocketAddress& addr, const std::string& if_name) {
144 network_manager_.AddInterface(addr, if_name);
145 }
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800146 void AddInterface(const SocketAddress& addr,
147 const std::string& if_name,
148 rtc::AdapterType type) {
149 network_manager_.AddInterface(addr, if_name, type);
150 }
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800151 // The default route is the public address that STUN server will observe when
152 // the endpoint is sitting on the public internet and the local port is bound
153 // to the "any" address. This may be different from the default local address
154 // which the endpoint observes. This can occur if the route to the public
155 // endpoint like 8.8.8.8 (specified as the default local address) is
156 // different from the route to the STUN server (the default route).
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700157 void AddInterfaceAsDefaultRoute(const SocketAddress& addr) {
158 AddInterface(addr);
159 // When a binding comes from the any address, the |addr| will be used as the
160 // srflx address.
161 vss_->SetDefaultRoute(addr.ipaddr());
162 }
honghaiz8c404fa2015-09-28 07:59:43 -0700163 void RemoveInterface(const SocketAddress& addr) {
164 network_manager_.RemoveInterface(addr);
165 }
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000166 bool SetPortRange(int min_port, int max_port) {
167 return allocator_->SetPortRange(min_port, max_port);
168 }
Guo-wei Shieh11477022015-08-15 09:28:41 -0700169 // Endpoint is on the public network. No STUN or TURN.
170 void ResetWithNoServersOrNat() {
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700171 allocator_.reset(new BasicPortAllocator(&network_manager_));
172 allocator_->set_step_delay(kMinimumStepDelay);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700173 }
Guo-wei Shieh11477022015-08-15 09:28:41 -0700174 // Endpoint is behind a NAT, with STUN specified.
175 void ResetWithStunServerAndNat(const rtc::SocketAddress& stun_server) {
176 ResetWithStunServer(stun_server, true);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700177 }
Guo-wei Shieh11477022015-08-15 09:28:41 -0700178 // Endpoint is on the public network, with STUN specified.
179 void ResetWithStunServerNoNat(const rtc::SocketAddress& stun_server) {
180 ResetWithStunServer(stun_server, false);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000181 }
Guo-wei Shieh11477022015-08-15 09:28:41 -0700182 // Endpoint is on the public network, with TURN specified.
183 void ResetWithTurnServersNoNat(const rtc::SocketAddress& udp_turn,
184 const rtc::SocketAddress& tcp_turn) {
185 ResetWithNoServersOrNat();
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000186 AddTurnServers(udp_turn, tcp_turn);
187 }
188
189 void AddTurnServers(const rtc::SocketAddress& udp_turn,
190 const rtc::SocketAddress& tcp_turn) {
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700191 RelayServerConfig turn_server(RELAY_TURN);
192 RelayCredentials credentials(kTurnUsername, kTurnPassword);
deadbeef653b8e02015-11-11 12:55:10 -0800193 turn_server.credentials = credentials;
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000194
195 if (!udp_turn.IsNil()) {
Honghai Zhangb9e7b4a2016-06-30 20:52:02 -0700196 turn_server.ports.push_back(ProtocolAddress(udp_turn, PROTO_UDP, false));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000197 }
198 if (!tcp_turn.IsNil()) {
Honghai Zhangb9e7b4a2016-06-30 20:52:02 -0700199 turn_server.ports.push_back(ProtocolAddress(tcp_turn, PROTO_TCP, false));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000200 }
deadbeef653b8e02015-11-11 12:55:10 -0800201 allocator_->AddTurnServer(turn_server);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000202 }
203
204 bool CreateSession(int component) {
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700205 session_ = CreateSession("session", component);
206 if (!session_) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000207 return false;
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700208 }
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000209 return true;
210 }
211
212 bool CreateSession(int component, const std::string& content_name) {
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700213 session_ = CreateSession("session", content_name, component);
214 if (!session_) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000215 return false;
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700216 }
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000217 return true;
218 }
219
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700220 std::unique_ptr<PortAllocatorSession> CreateSession(const std::string& sid,
221 int component) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000222 return CreateSession(sid, kContentName, component);
223 }
224
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700225 std::unique_ptr<PortAllocatorSession> CreateSession(
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700226 const std::string& sid,
227 const std::string& content_name,
228 int component) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000229 return CreateSession(sid, content_name, component, kIceUfrag0, kIcePwd0);
230 }
231
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700232 std::unique_ptr<PortAllocatorSession> CreateSession(
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700233 const std::string& sid,
234 const std::string& content_name,
235 int component,
236 const std::string& ice_ufrag,
237 const std::string& ice_pwd) {
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700238 std::unique_ptr<PortAllocatorSession> session = allocator_->CreateSession(
239 sid, content_name, component, ice_ufrag, ice_pwd);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000240 session->SignalPortReady.connect(this,
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700241 &BasicPortAllocatorTest::OnPortReady);
Honghai Zhangb9e7b4a2016-06-30 20:52:02 -0700242 session->SignalPortPruned.connect(this,
243 &BasicPortAllocatorTest::OnPortPruned);
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700244 session->SignalCandidatesReady.connect(
245 this, &BasicPortAllocatorTest::OnCandidatesReady);
246 session->SignalCandidatesAllocationDone.connect(
247 this, &BasicPortAllocatorTest::OnCandidatesAllocationDone);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000248 return session;
249 }
250
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -0700251 // Return true if the addresses are the same, or the port is 0 in |pattern|
252 // (acting as a wildcard) and the IPs are the same.
253 // Even with a wildcard port, the port of the address should be nonzero if
254 // the IP is nonzero.
255 static bool AddressMatch(const SocketAddress& address,
256 const SocketAddress& pattern) {
257 return address.ipaddr() == pattern.ipaddr() &&
258 ((pattern.port() == 0 &&
259 (address.port() != 0 || IPIsAny(address.ipaddr()))) ||
260 (pattern.port() != 0 && address.port() == pattern.port()));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000261 }
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -0700262
Honghai Zhangb9e7b4a2016-06-30 20:52:02 -0700263 // Returns the number of ports that have matching type, protocol and
264 // address.
265 static int CountPorts(const std::vector<PortInterface*>& ports,
266 const std::string& type,
267 ProtocolType protocol,
268 const SocketAddress& client_addr) {
269 return std::count_if(
270 ports.begin(), ports.end(),
271 [type, protocol, client_addr](PortInterface* port) {
272 return port->Type() == type && port->GetProtocol() == protocol &&
273 port->Network()->GetBestIP() == client_addr.ipaddr();
274 });
275 }
276
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -0700277 // Find a candidate and return it.
278 static bool FindCandidate(const std::vector<Candidate>& candidates,
279 const std::string& type,
280 const std::string& proto,
281 const SocketAddress& addr,
282 Candidate* found) {
283 auto it = std::find_if(candidates.begin(), candidates.end(),
284 [type, proto, addr](const Candidate& c) {
285 return c.type() == type && c.protocol() == proto &&
286 AddressMatch(c.address(), addr);
287 });
288 if (it != candidates.end() && found) {
289 *found = *it;
290 }
291 return it != candidates.end();
292 }
293
294 // Convenience method to call FindCandidate with no return.
295 static bool HasCandidate(const std::vector<Candidate>& candidates,
296 const std::string& type,
297 const std::string& proto,
298 const SocketAddress& addr) {
299 return FindCandidate(candidates, type, proto, addr, nullptr);
300 }
301
302 // Version of HasCandidate that also takes a related address.
303 static bool HasCandidateWithRelatedAddr(
304 const std::vector<Candidate>& candidates,
305 const std::string& type,
306 const std::string& proto,
307 const SocketAddress& addr,
308 const SocketAddress& related_addr) {
309 auto it =
310 std::find_if(candidates.begin(), candidates.end(),
311 [type, proto, addr, related_addr](const Candidate& c) {
312 return c.type() == type && c.protocol() == proto &&
313 AddressMatch(c.address(), addr) &&
314 AddressMatch(c.related_address(), related_addr);
315 });
316 return it != candidates.end();
317 }
318
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000319 static bool CheckPort(const rtc::SocketAddress& addr,
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700320 int min_port,
321 int max_port) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000322 return (addr.port() >= min_port && addr.port() <= max_port);
323 }
324
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700325 void OnCandidatesAllocationDone(PortAllocatorSession* session) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000326 // We should only get this callback once, except in the mux test where
327 // we have multiple port allocation sessions.
328 if (session == session_.get()) {
329 ASSERT_FALSE(candidate_allocation_done_);
330 candidate_allocation_done_ = true;
331 }
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700332 EXPECT_TRUE(session->CandidatesAllocationDone());
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000333 }
334
335 // Check if all ports allocated have send-buffer size |expected|. If
336 // |expected| == -1, check if GetOptions returns SOCKET_ERROR.
337 void CheckSendBufferSizesOfAllPorts(int expected) {
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700338 std::vector<PortInterface*>::iterator it;
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000339 for (it = ports_.begin(); it < ports_.end(); ++it) {
340 int send_buffer_size;
341 if (expected == -1) {
342 EXPECT_EQ(SOCKET_ERROR,
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700343 (*it)->GetOption(rtc::Socket::OPT_SNDBUF, &send_buffer_size));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000344 } else {
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700345 EXPECT_EQ(0,
346 (*it)->GetOption(rtc::Socket::OPT_SNDBUF, &send_buffer_size));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000347 ASSERT_EQ(expected, send_buffer_size);
348 }
349 }
350 }
351
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700352 // This function starts the port/address gathering and check the existence of
353 // candidates as specified. When |expect_stun_candidate| is true,
354 // |stun_candidate_addr| carries the expected reflective address, which is
355 // also the related address for TURN candidate if it is expected. Otherwise,
356 // it should be ignore.
357 void CheckDisableAdapterEnumeration(
Peter Boström0c4e06b2015-10-07 12:23:21 +0200358 uint32_t total_ports,
Guo-wei Shiehfe3bc9d2015-08-20 08:48:20 -0700359 const rtc::IPAddress& host_candidate_addr,
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700360 const rtc::IPAddress& stun_candidate_addr,
361 const rtc::IPAddress& relay_candidate_udp_transport_addr,
362 const rtc::IPAddress& relay_candidate_tcp_transport_addr) {
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800363 network_manager_.set_default_local_addresses(kPrivateAddr.ipaddr(),
364 rtc::IPAddress());
Guo-wei Shiehfe3bc9d2015-08-20 08:48:20 -0700365 if (!session_) {
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700366 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
Guo-wei Shiehfe3bc9d2015-08-20 08:48:20 -0700367 }
368 session_->set_flags(session_->flags() |
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700369 PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION |
370 PORTALLOCATOR_ENABLE_SHARED_SOCKET);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700371 allocator().set_allow_tcp_listen(false);
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000372 session_->StartGettingPorts();
373 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
374
Peter Boström0c4e06b2015-10-07 12:23:21 +0200375 uint32_t total_candidates = 0;
Guo-wei Shiehfe3bc9d2015-08-20 08:48:20 -0700376 if (!host_candidate_addr.IsNil()) {
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -0700377 EXPECT_PRED4(HasCandidate, candidates_, "local", "udp",
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800378 rtc::SocketAddress(kPrivateAddr.ipaddr(), 0));
Guo-wei Shieh370c8842015-08-18 17:00:13 -0700379 ++total_candidates;
Guo-wei Shiehfe3bc9d2015-08-20 08:48:20 -0700380 }
381 if (!stun_candidate_addr.IsNil()) {
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -0700382 rtc::SocketAddress related_address(host_candidate_addr, 0);
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800383 if (host_candidate_addr.IsNil()) {
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -0700384 related_address.SetIP(rtc::GetAnyIP(stun_candidate_addr.family()));
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800385 }
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -0700386 EXPECT_PRED5(HasCandidateWithRelatedAddr, candidates_, "stun", "udp",
387 rtc::SocketAddress(stun_candidate_addr, 0), related_address);
Guo-wei Shiehfe3bc9d2015-08-20 08:48:20 -0700388 ++total_candidates;
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700389 }
Guo-wei Shieh11477022015-08-15 09:28:41 -0700390 if (!relay_candidate_udp_transport_addr.IsNil()) {
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -0700391 EXPECT_PRED5(HasCandidateWithRelatedAddr, candidates_, "relay", "udp",
392 rtc::SocketAddress(relay_candidate_udp_transport_addr, 0),
393 rtc::SocketAddress(stun_candidate_addr, 0));
Guo-wei Shiehfe3bc9d2015-08-20 08:48:20 -0700394 ++total_candidates;
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700395 }
Guo-wei Shieh11477022015-08-15 09:28:41 -0700396 if (!relay_candidate_tcp_transport_addr.IsNil()) {
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -0700397 EXPECT_PRED5(HasCandidateWithRelatedAddr, candidates_, "relay", "udp",
398 rtc::SocketAddress(relay_candidate_tcp_transport_addr, 0),
399 rtc::SocketAddress(stun_candidate_addr, 0));
Guo-wei Shiehfe3bc9d2015-08-20 08:48:20 -0700400 ++total_candidates;
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700401 }
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000402
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700403 EXPECT_EQ(total_candidates, candidates_.size());
404 EXPECT_EQ(total_ports, ports_.size());
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000405 }
406
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000407 protected:
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700408 BasicPortAllocator& allocator() { return *allocator_; }
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000409
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700410 void OnPortReady(PortAllocatorSession* ses, PortInterface* port) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000411 LOG(LS_INFO) << "OnPortReady: " << port->ToString();
412 ports_.push_back(port);
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700413 // Make sure the new port is added to ReadyPorts.
414 auto ready_ports = ses->ReadyPorts();
415 EXPECT_NE(ready_ports.end(),
416 std::find(ready_ports.begin(), ready_ports.end(), port));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000417 }
Honghai Zhangb9e7b4a2016-06-30 20:52:02 -0700418 void OnPortPruned(PortAllocatorSession* ses, PortInterface* port) {
419 LOG(LS_INFO) << "OnPortPruned: " << port->ToString();
420 ports_.erase(std::remove(ports_.begin(), ports_.end(), port), ports_.end());
421 // Make sure the pruned port is not in ReadyPorts.
422 auto ready_ports = ses->ReadyPorts();
423 EXPECT_EQ(ready_ports.end(),
424 std::find(ready_ports.begin(), ready_ports.end(), port));
425 }
426
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700427 void OnCandidatesReady(PortAllocatorSession* ses,
428 const std::vector<Candidate>& candidates) {
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -0700429 for (const Candidate& candidate : candidates) {
430 LOG(LS_INFO) << "OnCandidatesReady: " << candidate.ToString();
431 // Sanity check that the ICE component is set.
432 EXPECT_EQ(ICE_CANDIDATE_COMPONENT_RTP, candidate.component());
433 candidates_.push_back(candidate);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000434 }
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700435 // Make sure the new candidates are added to Candidates.
436 auto ses_candidates = ses->ReadyCandidates();
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700437 for (const Candidate& candidate : candidates) {
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700438 EXPECT_NE(
439 ses_candidates.end(),
440 std::find(ses_candidates.begin(), ses_candidates.end(), candidate));
441 }
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000442 }
443
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700444 bool HasRelayAddress(const ProtocolAddress& proto_addr) {
deadbeef653b8e02015-11-11 12:55:10 -0800445 for (size_t i = 0; i < allocator_->turn_servers().size(); ++i) {
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700446 RelayServerConfig server_config = allocator_->turn_servers()[i];
447 PortList::const_iterator relay_port;
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000448 for (relay_port = server_config.ports.begin();
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700449 relay_port != server_config.ports.end(); ++relay_port) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000450 if (proto_addr.address == relay_port->address &&
451 proto_addr.proto == relay_port->proto)
452 return true;
453 }
454 }
455 return false;
456 }
457
Guo-wei Shieh11477022015-08-15 09:28:41 -0700458 void ResetWithStunServer(const rtc::SocketAddress& stun_server,
459 bool with_nat) {
460 if (with_nat) {
461 nat_server_.reset(new rtc::NATServer(
462 rtc::NAT_OPEN_CONE, vss_.get(), kNatUdpAddr, kNatTcpAddr, vss_.get(),
463 rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0)));
464 } else {
465 nat_socket_factory_.reset(new rtc::BasicPacketSocketFactory());
466 }
467
468 ServerAddresses stun_servers;
469 if (!stun_server.IsNil()) {
470 stun_servers.insert(stun_server);
471 }
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700472 allocator_.reset(new BasicPortAllocator(
Guo-wei Shieh11477022015-08-15 09:28:41 -0700473 &network_manager_, nat_socket_factory_.get(), stun_servers));
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700474 allocator().set_step_delay(kMinimumStepDelay);
Guo-wei Shieh11477022015-08-15 09:28:41 -0700475 }
476
kwiberg3ec46792016-04-27 07:22:53 -0700477 std::unique_ptr<rtc::PhysicalSocketServer> pss_;
478 std::unique_ptr<rtc::VirtualSocketServer> vss_;
479 std::unique_ptr<rtc::FirewallSocketServer> fss_;
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000480 rtc::SocketServerScope ss_scope_;
kwiberg3ec46792016-04-27 07:22:53 -0700481 std::unique_ptr<rtc::NATServer> nat_server_;
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000482 rtc::NATSocketFactory nat_factory_;
kwiberg3ec46792016-04-27 07:22:53 -0700483 std::unique_ptr<rtc::BasicPacketSocketFactory> nat_socket_factory_;
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700484 std::unique_ptr<TestStunServer> stun_server_;
485 TestRelayServer relay_server_;
486 TestTurnServer turn_server_;
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000487 rtc::FakeNetworkManager network_manager_;
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700488 std::unique_ptr<BasicPortAllocator> allocator_;
489 std::unique_ptr<PortAllocatorSession> session_;
490 std::vector<PortInterface*> ports_;
491 std::vector<Candidate> candidates_;
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000492 bool candidate_allocation_done_;
493};
494
495// Tests that we can init the port allocator and create a session.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700496TEST_F(BasicPortAllocatorTest, TestBasic) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000497 EXPECT_EQ(&network_manager_, allocator().network_manager());
498 EXPECT_EQ(kStunAddr, *allocator().stun_servers().begin());
deadbeef653b8e02015-11-11 12:55:10 -0800499 ASSERT_EQ(1u, allocator().turn_servers().size());
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700500 EXPECT_EQ(RELAY_GTURN, allocator().turn_servers()[0].type);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000501 // Empty relay credentials are used for GTURN.
deadbeef653b8e02015-11-11 12:55:10 -0800502 EXPECT_TRUE(allocator().turn_servers()[0].credentials.username.empty());
503 EXPECT_TRUE(allocator().turn_servers()[0].credentials.password.empty());
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700504 EXPECT_TRUE(HasRelayAddress(ProtocolAddress(kRelayUdpIntAddr, PROTO_UDP)));
505 EXPECT_TRUE(HasRelayAddress(ProtocolAddress(kRelayTcpIntAddr, PROTO_TCP)));
506 EXPECT_TRUE(
507 HasRelayAddress(ProtocolAddress(kRelaySslTcpIntAddr, PROTO_SSLTCP)));
508 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700509 EXPECT_FALSE(session_->CandidatesAllocationDone());
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000510}
511
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800512// Tests that our network filtering works properly.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700513TEST_F(BasicPortAllocatorTest, TestIgnoreOnlyLoopbackNetworkByDefault) {
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800514 AddInterface(SocketAddress(IPAddress(0x12345600U), 0), "test_eth0",
515 rtc::ADAPTER_TYPE_ETHERNET);
516 AddInterface(SocketAddress(IPAddress(0x12345601U), 0), "test_wlan0",
517 rtc::ADAPTER_TYPE_WIFI);
518 AddInterface(SocketAddress(IPAddress(0x12345602U), 0), "test_cell0",
519 rtc::ADAPTER_TYPE_CELLULAR);
520 AddInterface(SocketAddress(IPAddress(0x12345603U), 0), "test_vpn0",
521 rtc::ADAPTER_TYPE_VPN);
522 AddInterface(SocketAddress(IPAddress(0x12345604U), 0), "test_lo",
523 rtc::ADAPTER_TYPE_LOOPBACK);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700524 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
525 session_->set_flags(PORTALLOCATOR_DISABLE_STUN | PORTALLOCATOR_DISABLE_RELAY |
526 PORTALLOCATOR_DISABLE_TCP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800527 session_->StartGettingPorts();
528 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
529 EXPECT_EQ(4U, candidates_.size());
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700530 for (Candidate candidate : candidates_) {
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800531 EXPECT_LT(candidate.address().ip(), 0x12345604U);
532 }
533}
534
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700535TEST_F(BasicPortAllocatorTest, TestIgnoreNetworksAccordingToIgnoreMask) {
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800536 AddInterface(SocketAddress(IPAddress(0x12345600U), 0), "test_eth0",
537 rtc::ADAPTER_TYPE_ETHERNET);
538 AddInterface(SocketAddress(IPAddress(0x12345601U), 0), "test_wlan0",
539 rtc::ADAPTER_TYPE_WIFI);
540 AddInterface(SocketAddress(IPAddress(0x12345602U), 0), "test_cell0",
541 rtc::ADAPTER_TYPE_CELLULAR);
542 allocator_->SetNetworkIgnoreMask(rtc::ADAPTER_TYPE_ETHERNET |
543 rtc::ADAPTER_TYPE_LOOPBACK |
544 rtc::ADAPTER_TYPE_WIFI);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700545 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
546 session_->set_flags(PORTALLOCATOR_DISABLE_STUN | PORTALLOCATOR_DISABLE_RELAY |
547 PORTALLOCATOR_DISABLE_TCP);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800548 session_->StartGettingPorts();
549 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
550 EXPECT_EQ(1U, candidates_.size());
551 EXPECT_EQ(0x12345602U, candidates_[0].address().ip());
552}
553
honghaiz60347052016-05-31 18:29:12 -0700554// Test that high cost networks are filtered if the flag
555// PORTALLOCATOR_DISABLE_COSTLY_NETWORKS is set.
556TEST_F(BasicPortAllocatorTest, TestGatherLowCostNetworkOnly) {
557 SocketAddress addr_wifi(IPAddress(0x12345600U), 0);
558 SocketAddress addr_cellular(IPAddress(0x12345601U), 0);
559 SocketAddress addr_unknown1(IPAddress(0x12345602U), 0);
560 SocketAddress addr_unknown2(IPAddress(0x12345603U), 0);
561 // If both Wi-Fi and cellular interfaces are present, only gather on the Wi-Fi
562 // interface.
563 AddInterface(addr_wifi, "test_wlan0", rtc::ADAPTER_TYPE_WIFI);
564 AddInterface(addr_cellular, "test_cell0", rtc::ADAPTER_TYPE_CELLULAR);
565 allocator().set_flags(cricket::PORTALLOCATOR_DISABLE_STUN |
566 cricket::PORTALLOCATOR_DISABLE_RELAY |
567 cricket::PORTALLOCATOR_DISABLE_TCP |
568 cricket::PORTALLOCATOR_DISABLE_COSTLY_NETWORKS);
569 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP));
570 session_->StartGettingPorts();
571 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
572 EXPECT_EQ(1U, candidates_.size());
573 EXPECT_TRUE(addr_wifi.EqualIPs(candidates_[0].address()));
574
575 // If both cellular and unknown interfaces are present, only gather on the
576 // unknown interfaces.
577 candidates_.clear();
578 candidate_allocation_done_ = false;
579 RemoveInterface(addr_wifi);
580 AddInterface(addr_unknown1, "test_unknown0", rtc::ADAPTER_TYPE_UNKNOWN);
581 AddInterface(addr_unknown2, "test_unknown1", rtc::ADAPTER_TYPE_UNKNOWN);
582 session_->StartGettingPorts();
583 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
584 EXPECT_EQ(2U, candidates_.size());
585 EXPECT_TRUE((addr_unknown1.EqualIPs(candidates_[0].address()) &&
586 addr_unknown2.EqualIPs(candidates_[1].address())) ||
587 (addr_unknown1.EqualIPs(candidates_[1].address()) &&
588 addr_unknown2.EqualIPs(candidates_[0].address())));
589
590 // If Wi-Fi, cellular, unknown interfaces are all present, only gather on the
591 // Wi-Fi interface.
592 candidates_.clear();
593 candidate_allocation_done_ = false;
594 AddInterface(addr_wifi, "test_wlan0", rtc::ADAPTER_TYPE_WIFI);
595 session_->StartGettingPorts();
596 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
597 EXPECT_EQ(1U, candidates_.size());
598 EXPECT_TRUE(addr_wifi.EqualIPs(candidates_[0].address()));
599}
600
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000601// Tests that we allocator session not trying to allocate ports for every 250ms.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700602TEST_F(BasicPortAllocatorTest, TestNoNetworkInterface) {
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700603 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000604 session_->StartGettingPorts();
605 // Waiting for one second to make sure BasicPortAllocatorSession has not
606 // called OnAllocate multiple times. In old behavior it's called every 250ms.
607 // When there are no network interfaces, each execution of OnAllocate will
608 // result in SignalCandidatesAllocationDone signal.
609 rtc::Thread::Current()->ProcessMessages(1000);
610 EXPECT_TRUE(candidate_allocation_done_);
611 EXPECT_EQ(0U, candidates_.size());
612}
613
Guo-wei Shiehfe3bc9d2015-08-20 08:48:20 -0700614// Test that we could use loopback interface as host candidate.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700615TEST_F(BasicPortAllocatorTest, TestLoopbackNetworkInterface) {
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800616 AddInterface(kLoopbackAddr, "test_loopback", rtc::ADAPTER_TYPE_LOOPBACK);
617 allocator_->SetNetworkIgnoreMask(0);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700618 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
619 session_->set_flags(PORTALLOCATOR_DISABLE_STUN | PORTALLOCATOR_DISABLE_RELAY |
620 PORTALLOCATOR_DISABLE_TCP);
Guo-wei Shiehfe3bc9d2015-08-20 08:48:20 -0700621 session_->StartGettingPorts();
622 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
623 EXPECT_EQ(1U, candidates_.size());
624}
625
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000626// Tests that we can get all the desired addresses successfully.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700627TEST_F(BasicPortAllocatorTest, TestGetAllPortsWithMinimumStepDelay) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000628 AddInterface(kClientAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700629 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000630 session_->StartGettingPorts();
631 ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout);
632 EXPECT_EQ(4U, ports_.size());
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -0700633 EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
634 EXPECT_PRED4(HasCandidate, candidates_, "stun", "udp", kClientAddr);
635 EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp", kRelayUdpIntAddr);
636 EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp", kRelayUdpExtAddr);
637 EXPECT_PRED4(HasCandidate, candidates_, "relay", "tcp", kRelayTcpIntAddr);
638 EXPECT_PRED4(HasCandidate, candidates_, "local", "tcp", kClientAddr);
639 EXPECT_PRED4(HasCandidate, candidates_, "relay", "ssltcp",
640 kRelaySslTcpIntAddr);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000641 EXPECT_TRUE(candidate_allocation_done_);
642}
643
honghaiz8c404fa2015-09-28 07:59:43 -0700644// Test that when the same network interface is brought down and up, the
645// port allocator session will restart a new allocation sequence if
646// it is not stopped.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700647TEST_F(BasicPortAllocatorTest, TestSameNetworkDownAndUpWhenSessionNotStopped) {
honghaiz8c404fa2015-09-28 07:59:43 -0700648 std::string if_name("test_net0");
649 AddInterface(kClientAddr, if_name);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700650 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
honghaiz8c404fa2015-09-28 07:59:43 -0700651 session_->StartGettingPorts();
652 ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout);
653 EXPECT_EQ(4U, ports_.size());
654 EXPECT_TRUE(candidate_allocation_done_);
655 candidate_allocation_done_ = false;
656 candidates_.clear();
657 ports_.clear();
658
659 RemoveInterface(kClientAddr);
660 ASSERT_EQ_WAIT(0U, candidates_.size(), kDefaultAllocationTimeout);
661 EXPECT_EQ(0U, ports_.size());
662 EXPECT_FALSE(candidate_allocation_done_);
663
664 // When the same interfaces are added again, new candidates/ports should be
665 // generated.
666 AddInterface(kClientAddr, if_name);
667 ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout);
668 EXPECT_EQ(4U, ports_.size());
669 EXPECT_TRUE(candidate_allocation_done_);
670}
671
672// Test that when the same network interface is brought down and up, the
673// port allocator session will not restart a new allocation sequence if
674// it is stopped.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700675TEST_F(BasicPortAllocatorTest, TestSameNetworkDownAndUpWhenSessionStopped) {
honghaiz8c404fa2015-09-28 07:59:43 -0700676 std::string if_name("test_net0");
677 AddInterface(kClientAddr, if_name);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700678 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
honghaiz8c404fa2015-09-28 07:59:43 -0700679 session_->StartGettingPorts();
680 ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout);
681 EXPECT_EQ(4U, ports_.size());
682 EXPECT_TRUE(candidate_allocation_done_);
683 session_->StopGettingPorts();
684 candidates_.clear();
685 ports_.clear();
686
687 RemoveInterface(kClientAddr);
688 ASSERT_EQ_WAIT(0U, candidates_.size(), kDefaultAllocationTimeout);
689 EXPECT_EQ(0U, ports_.size());
690
691 // When the same interfaces are added again, new candidates/ports should not
692 // be generated because the session has stopped.
693 AddInterface(kClientAddr, if_name);
694 ASSERT_EQ_WAIT(0U, candidates_.size(), kDefaultAllocationTimeout);
695 EXPECT_EQ(0U, ports_.size());
696 EXPECT_TRUE(candidate_allocation_done_);
697}
698
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000699// Verify candidates with default step delay of 1sec.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700700TEST_F(BasicPortAllocatorTest, TestGetAllPortsWithOneSecondStepDelay) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000701 AddInterface(kClientAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700702 allocator_->set_step_delay(kDefaultStepDelay);
703 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000704 session_->StartGettingPorts();
705 ASSERT_EQ_WAIT(2U, candidates_.size(), 1000);
706 EXPECT_EQ(2U, ports_.size());
707 ASSERT_EQ_WAIT(4U, candidates_.size(), 2000);
708 EXPECT_EQ(3U, ports_.size());
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -0700709 EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp", kRelayUdpIntAddr);
710 EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp", kRelayUdpExtAddr);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000711 ASSERT_EQ_WAIT(6U, candidates_.size(), 1500);
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -0700712 EXPECT_PRED4(HasCandidate, candidates_, "relay", "tcp", kRelayTcpIntAddr);
713 EXPECT_PRED4(HasCandidate, candidates_, "local", "tcp", kClientAddr);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000714 EXPECT_EQ(4U, ports_.size());
715 ASSERT_EQ_WAIT(7U, candidates_.size(), 2000);
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -0700716 EXPECT_PRED4(HasCandidate, candidates_, "relay", "ssltcp",
717 kRelaySslTcpIntAddr);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000718 EXPECT_EQ(4U, ports_.size());
719 EXPECT_TRUE(candidate_allocation_done_);
720 // If we Stop gathering now, we shouldn't get a second "done" callback.
721 session_->StopGettingPorts();
722}
723
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700724TEST_F(BasicPortAllocatorTest, TestSetupVideoRtpPortsWithNormalSendBuffers) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000725 AddInterface(kClientAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700726 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP, CN_VIDEO));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000727 session_->StartGettingPorts();
728 ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout);
729 EXPECT_TRUE(candidate_allocation_done_);
730 // If we Stop gathering now, we shouldn't get a second "done" callback.
731 session_->StopGettingPorts();
732
733 // All ports should have unset send-buffer sizes.
734 CheckSendBufferSizesOfAllPorts(-1);
735}
736
737// Tests that we can get callback after StopGetAllPorts.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700738TEST_F(BasicPortAllocatorTest, TestStopGetAllPorts) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000739 AddInterface(kClientAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700740 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000741 session_->StartGettingPorts();
742 ASSERT_EQ_WAIT(2U, candidates_.size(), kDefaultAllocationTimeout);
743 EXPECT_EQ(2U, ports_.size());
744 session_->StopGettingPorts();
745 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
746}
747
748// Test that we restrict client ports appropriately when a port range is set.
749// We check the candidates for udp/stun/tcp ports, and the from address
750// for relay ports.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700751TEST_F(BasicPortAllocatorTest, TestGetAllPortsPortRange) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000752 AddInterface(kClientAddr);
753 // Check that an invalid port range fails.
754 EXPECT_FALSE(SetPortRange(kMaxPort, kMinPort));
755 // Check that a null port range succeeds.
756 EXPECT_TRUE(SetPortRange(0, 0));
757 // Check that a valid port range succeeds.
758 EXPECT_TRUE(SetPortRange(kMinPort, kMaxPort));
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700759 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000760 session_->StartGettingPorts();
761 ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout);
762 EXPECT_EQ(4U, ports_.size());
763 // Check the port number for the UDP port object.
764 EXPECT_PRED3(CheckPort, candidates_[0].address(), kMinPort, kMaxPort);
765 // Check the port number for the STUN port object.
766 EXPECT_PRED3(CheckPort, candidates_[1].address(), kMinPort, kMaxPort);
767 // Check the port number used to connect to the relay server.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700768 EXPECT_PRED3(CheckPort, relay_server_.GetConnection(0).source(), kMinPort,
769 kMaxPort);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000770 // Check the port number for the TCP port object.
771 EXPECT_PRED3(CheckPort, candidates_[5].address(), kMinPort, kMaxPort);
772 EXPECT_TRUE(candidate_allocation_done_);
773}
774
775// Test that we don't crash or malfunction if we have no network adapters.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700776TEST_F(BasicPortAllocatorTest, TestGetAllPortsNoAdapters) {
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700777 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000778 session_->StartGettingPorts();
779 rtc::Thread::Current()->ProcessMessages(100);
780 // Without network adapter, we should not get any candidate.
781 EXPECT_EQ(0U, candidates_.size());
782 EXPECT_TRUE(candidate_allocation_done_);
783}
784
Guo-wei Shieh898d21c2015-09-30 10:54:55 -0700785// Test that when enumeration is disabled, we should not have any ports when
786// candidate_filter() is set to CF_RELAY and no relay is specified.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700787TEST_F(BasicPortAllocatorTest,
Guo-wei Shieh898d21c2015-09-30 10:54:55 -0700788 TestDisableAdapterEnumerationWithoutNatRelayTransportOnly) {
Guo-wei Shieh898d21c2015-09-30 10:54:55 -0700789 ResetWithStunServerNoNat(kStunAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700790 allocator().set_candidate_filter(CF_RELAY);
Guo-wei Shieh898d21c2015-09-30 10:54:55 -0700791 // Expect to see no ports and no candidates.
792 CheckDisableAdapterEnumeration(0U, rtc::IPAddress(), rtc::IPAddress(),
793 rtc::IPAddress(), rtc::IPAddress());
794}
795
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800796// Test that even with multiple interfaces, the result should still be a single
797// default private, one STUN and one TURN candidate since we bind to any address
798// (i.e. all 0s).
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700799TEST_F(BasicPortAllocatorTest,
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700800 TestDisableAdapterEnumerationBehindNatMultipleInterfaces) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000801 AddInterface(kPrivateAddr);
802 AddInterface(kPrivateAddr2);
Guo-wei Shieh11477022015-08-15 09:28:41 -0700803 ResetWithStunServerAndNat(kStunAddr);
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000804 AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress());
guoweis255d6f62015-11-23 14:12:38 -0800805
806 // Enable IPv6 here. Since the network_manager doesn't have IPv6 default
807 // address set and we have no IPv6 STUN server, there should be no IPv6
808 // candidates.
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700809 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
810 session_->set_flags(PORTALLOCATOR_ENABLE_IPV6);
guoweis255d6f62015-11-23 14:12:38 -0800811
812 // Expect to see 3 ports for IPv4: HOST/STUN, TURN/UDP and TCP ports, 2 ports
813 // for IPv6: HOST, and TCP. Only IPv4 candidates: a default private, STUN and
814 // TURN/UDP candidates.
815 CheckDisableAdapterEnumeration(5U, kPrivateAddr.ipaddr(),
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800816 kNatUdpAddr.ipaddr(), kTurnUdpExtAddr.ipaddr(),
817 rtc::IPAddress());
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700818}
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000819
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800820// Test that we should get a default private, STUN, TURN/UDP and TURN/TCP
821// candidates when both TURN/UDP and TURN/TCP servers are specified.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700822TEST_F(BasicPortAllocatorTest, TestDisableAdapterEnumerationBehindNatWithTcp) {
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700823 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800824 AddInterface(kPrivateAddr);
Guo-wei Shieh11477022015-08-15 09:28:41 -0700825 ResetWithStunServerAndNat(kStunAddr);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700826 AddTurnServers(kTurnUdpIntAddr, kTurnTcpIntAddr);
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800827 // Expect to see 4 ports - STUN, TURN/UDP, TURN/TCP and TCP port. A default
828 // private, STUN, TURN/UDP, and TURN/TCP candidates.
829 CheckDisableAdapterEnumeration(4U, kPrivateAddr.ipaddr(),
830 kNatUdpAddr.ipaddr(), kTurnUdpExtAddr.ipaddr(),
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700831 kTurnUdpExtAddr.ipaddr());
832}
833
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800834// Test that when adapter enumeration is disabled, for endpoints without
835// STUN/TURN specified, a default private candidate is still generated.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700836TEST_F(BasicPortAllocatorTest,
837 TestDisableAdapterEnumerationWithoutNatOrServers) {
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800838 ResetWithNoServersOrNat();
839 // Expect to see 2 ports: STUN and TCP ports, one default private candidate.
840 CheckDisableAdapterEnumeration(2U, kPrivateAddr.ipaddr(), rtc::IPAddress(),
841 rtc::IPAddress(), rtc::IPAddress());
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700842}
843
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800844// Test that when adapter enumeration is disabled, with
845// PORTALLOCATOR_DISABLE_LOCALHOST_CANDIDATE specified, for endpoints not behind
846// a NAT, there is no local candidate.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700847TEST_F(BasicPortAllocatorTest,
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800848 TestDisableAdapterEnumerationWithoutNatLocalhostCandidateDisabled) {
849 ResetWithStunServerNoNat(kStunAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700850 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
851 session_->set_flags(PORTALLOCATOR_DISABLE_DEFAULT_LOCAL_CANDIDATE);
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800852 // Expect to see 2 ports: STUN and TCP ports, localhost candidate and STUN
853 // candidate.
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700854 CheckDisableAdapterEnumeration(2U, rtc::IPAddress(), rtc::IPAddress(),
Guo-wei Shiehfe3bc9d2015-08-20 08:48:20 -0700855 rtc::IPAddress(), rtc::IPAddress());
856}
857
858// Test that when adapter enumeration is disabled, with
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800859// PORTALLOCATOR_DISABLE_LOCALHOST_CANDIDATE specified, for endpoints not behind
860// a NAT, there is no local candidate. However, this specified default route
861// (kClientAddr) which was discovered when sending STUN requests, will become
862// the srflx addresses.
863TEST_F(
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700864 BasicPortAllocatorTest,
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800865 TestDisableAdapterEnumerationWithoutNatLocalhostCandidateDisabledWithDifferentDefaultRoute) {
Guo-wei Shiehfe3bc9d2015-08-20 08:48:20 -0700866 ResetWithStunServerNoNat(kStunAddr);
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800867 AddInterfaceAsDefaultRoute(kClientAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700868 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
869 session_->set_flags(PORTALLOCATOR_DISABLE_DEFAULT_LOCAL_CANDIDATE);
Guo-wei Shiehfe3bc9d2015-08-20 08:48:20 -0700870 // Expect to see 2 ports: STUN and TCP ports, localhost candidate and STUN
871 // candidate.
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800872 CheckDisableAdapterEnumeration(2U, rtc::IPAddress(), kClientAddr.ipaddr(),
873 rtc::IPAddress(), rtc::IPAddress());
874}
875
876// Test that when adapter enumeration is disabled, with
877// PORTALLOCATOR_DISABLE_LOCALHOST_CANDIDATE specified, for endpoints behind a
878// NAT, there is only one STUN candidate.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700879TEST_F(BasicPortAllocatorTest,
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800880 TestDisableAdapterEnumerationWithNatLocalhostCandidateDisabled) {
881 ResetWithStunServerAndNat(kStunAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700882 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
883 session_->set_flags(PORTALLOCATOR_DISABLE_DEFAULT_LOCAL_CANDIDATE);
Guo-wei Shieh9af97f82015-11-10 14:47:39 -0800884 // Expect to see 2 ports: STUN and TCP ports, and single STUN candidate.
885 CheckDisableAdapterEnumeration(2U, rtc::IPAddress(), kNatUdpAddr.ipaddr(),
886 rtc::IPAddress(), rtc::IPAddress());
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000887}
888
Guo-wei Shieh13d35f62015-08-26 15:32:56 -0700889// Test that we disable relay over UDP, and only TCP is used when connecting to
890// the relay server.
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -0700891TEST_F(BasicPortAllocatorTest, TestDisableUdpTurn) {
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700892 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
Guo-wei Shieh13d35f62015-08-26 15:32:56 -0700893 AddInterface(kClientAddr);
894 ResetWithStunServerAndNat(kStunAddr);
895 AddTurnServers(kTurnUdpIntAddr, kTurnTcpIntAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700896 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
897 session_->set_flags(PORTALLOCATOR_DISABLE_UDP_RELAY |
898 PORTALLOCATOR_DISABLE_UDP | PORTALLOCATOR_DISABLE_STUN |
899 PORTALLOCATOR_ENABLE_SHARED_SOCKET);
Guo-wei Shieh13d35f62015-08-26 15:32:56 -0700900
901 session_->StartGettingPorts();
902 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
903
904 // Expect to see 2 ports and 2 candidates - TURN/TCP and TCP ports, TCP and
905 // TURN/TCP candidates.
906 EXPECT_EQ(2U, ports_.size());
907 EXPECT_EQ(2U, candidates_.size());
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -0700908 Candidate turn_candidate;
909 EXPECT_PRED5(FindCandidate, candidates_, "relay", "udp", kTurnUdpExtAddr,
910 &turn_candidate);
Guo-wei Shieh13d35f62015-08-26 15:32:56 -0700911 // The TURN candidate should use TCP to contact the TURN server.
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -0700912 EXPECT_EQ(TCP_PROTOCOL_NAME, turn_candidate.relay_protocol());
913 EXPECT_PRED4(HasCandidate, candidates_, "local", "tcp", kClientAddr);
Guo-wei Shieh13d35f62015-08-26 15:32:56 -0700914}
915
Erik Språngefdce692015-06-05 09:41:26 +0200916// Disable for asan, see
917// https://code.google.com/p/webrtc/issues/detail?id=4743 for details.
918#if !defined(ADDRESS_SANITIZER)
919
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000920// Test that we can get OnCandidatesAllocationDone callback when all the ports
921// are disabled.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700922TEST_F(BasicPortAllocatorTest, TestDisableAllPorts) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000923 AddInterface(kClientAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700924 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
925 session_->set_flags(PORTALLOCATOR_DISABLE_UDP | PORTALLOCATOR_DISABLE_STUN |
926 PORTALLOCATOR_DISABLE_RELAY | PORTALLOCATOR_DISABLE_TCP);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000927 session_->StartGettingPorts();
928 rtc::Thread::Current()->ProcessMessages(100);
929 EXPECT_EQ(0U, candidates_.size());
930 EXPECT_TRUE(candidate_allocation_done_);
931}
932
933// Test that we don't crash or malfunction if we can't create UDP sockets.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700934TEST_F(BasicPortAllocatorTest, TestGetAllPortsNoUdpSockets) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000935 AddInterface(kClientAddr);
936 fss_->set_udp_sockets_enabled(false);
937 EXPECT_TRUE(CreateSession(1));
938 session_->StartGettingPorts();
939 ASSERT_EQ_WAIT(5U, candidates_.size(), kDefaultAllocationTimeout);
940 EXPECT_EQ(2U, ports_.size());
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -0700941 EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp", kRelayUdpIntAddr);
942 EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp", kRelayUdpExtAddr);
943 EXPECT_PRED4(HasCandidate, candidates_, "relay", "tcp", kRelayTcpIntAddr);
944 EXPECT_PRED4(HasCandidate, candidates_, "local", "tcp", kClientAddr);
945 EXPECT_PRED4(HasCandidate, candidates_, "relay", "ssltcp",
946 kRelaySslTcpIntAddr);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000947 EXPECT_TRUE(candidate_allocation_done_);
948}
949
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700950#endif // if !defined(ADDRESS_SANITIZER)
Erik Språngefdce692015-06-05 09:41:26 +0200951
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000952// Test that we don't crash or malfunction if we can't create UDP sockets or
953// listen on TCP sockets. We still give out a local TCP address, since
954// apparently this is needed for the remote side to accept our connection.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700955TEST_F(BasicPortAllocatorTest, TestGetAllPortsNoUdpSocketsNoTcpListen) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000956 AddInterface(kClientAddr);
957 fss_->set_udp_sockets_enabled(false);
958 fss_->set_tcp_listen_enabled(false);
959 EXPECT_TRUE(CreateSession(1));
960 session_->StartGettingPorts();
961 ASSERT_EQ_WAIT(5U, candidates_.size(), kDefaultAllocationTimeout);
962 EXPECT_EQ(2U, ports_.size());
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -0700963 EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp", kRelayUdpIntAddr);
964 EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp", kRelayUdpExtAddr);
965 EXPECT_PRED4(HasCandidate, candidates_, "relay", "tcp", kRelayTcpIntAddr);
966 EXPECT_PRED4(HasCandidate, candidates_, "local", "tcp", kClientAddr);
967 EXPECT_PRED4(HasCandidate, candidates_, "relay", "ssltcp",
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700968 kRelaySslTcpIntAddr);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000969 EXPECT_TRUE(candidate_allocation_done_);
970}
971
972// Test that we don't crash or malfunction if we can't create any sockets.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700973// TODO(deadbeef): Find a way to exit early here.
974TEST_F(BasicPortAllocatorTest, TestGetAllPortsNoSockets) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000975 AddInterface(kClientAddr);
976 fss_->set_tcp_sockets_enabled(false);
977 fss_->set_udp_sockets_enabled(false);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700978 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000979 session_->StartGettingPorts();
980 WAIT(candidates_.size() > 0, 2000);
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700981 // TODO(deadbeef): Check candidate_allocation_done signal.
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000982 // In case of Relay, ports creation will succeed but sockets will fail.
983 // There is no error reporting from RelayEntry to handle this failure.
984}
985
986// Testing STUN timeout.
Taylor Brandstettera1c30352016-05-13 08:15:11 -0700987TEST_F(BasicPortAllocatorTest, TestGetAllPortsNoUdpAllowed) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000988 fss_->AddRule(false, rtc::FP_UDP, rtc::FD_ANY, kClientAddr);
989 AddInterface(kClientAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -0700990 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000991 session_->StartGettingPorts();
992 EXPECT_EQ_WAIT(2U, candidates_.size(), kDefaultAllocationTimeout);
993 EXPECT_EQ(2U, ports_.size());
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -0700994 EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
995 EXPECT_PRED4(HasCandidate, candidates_, "local", "tcp", kClientAddr);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000996 // RelayPort connection timeout is 3sec. TCP connection with RelayServer
997 // will be tried after 3 seconds.
deadbeef8271a7f2016-05-31 16:27:10 -0700998 // TODO(deadbeef): Use simulated clock here, waiting for exactly 3 seconds.
999 EXPECT_EQ_WAIT(6U, candidates_.size(), kStunTimeoutMs);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001000 EXPECT_EQ(3U, ports_.size());
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -07001001 EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp", kRelayUdpIntAddr);
1002 EXPECT_PRED4(HasCandidate, candidates_, "relay", "tcp", kRelayTcpIntAddr);
1003 EXPECT_PRED4(HasCandidate, candidates_, "relay", "ssltcp",
1004 kRelaySslTcpIntAddr);
1005 EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp", kRelayUdpExtAddr);
deadbeef8271a7f2016-05-31 16:27:10 -07001006 // Stun Timeout is 9.5sec.
1007 // TODO(deadbeef): Use simulated clock here, waiting exactly 6.5 seconds.
1008 EXPECT_TRUE_WAIT(candidate_allocation_done_, kStunTimeoutMs);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001009}
1010
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001011TEST_F(BasicPortAllocatorTest, TestCandidatePriorityOfMultipleInterfaces) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001012 AddInterface(kClientAddr);
1013 AddInterface(kClientAddr2);
1014 // Allocating only host UDP ports. This is done purely for testing
1015 // convenience.
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001016 allocator().set_flags(PORTALLOCATOR_DISABLE_TCP | PORTALLOCATOR_DISABLE_STUN |
1017 PORTALLOCATOR_DISABLE_RELAY);
1018 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001019 session_->StartGettingPorts();
1020 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
1021 ASSERT_EQ(2U, candidates_.size());
1022 EXPECT_EQ(2U, ports_.size());
1023 // Candidates priorities should be different.
1024 EXPECT_NE(candidates_[0].priority(), candidates_[1].priority());
1025}
1026
1027// Test to verify ICE restart process.
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001028TEST_F(BasicPortAllocatorTest, TestGetAllPortsRestarts) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001029 AddInterface(kClientAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001030 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001031 session_->StartGettingPorts();
1032 EXPECT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout);
1033 EXPECT_EQ(4U, ports_.size());
1034 EXPECT_TRUE(candidate_allocation_done_);
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001035 // TODO(deadbeef): Extend this to verify ICE restart.
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001036}
1037
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001038// Test that the allocator session uses the candidate filter it's created with,
1039// rather than the filter of its parent allocator.
1040// The filter of the allocator should only affect the next gathering phase,
1041// according to JSEP, which means the *next* allocator session returned.
1042TEST_F(BasicPortAllocatorTest, TestSessionUsesOwnCandidateFilter) {
1043 AddInterface(kClientAddr);
1044 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
1045 // Set candidate filter *after* creating the session. Should have no effect.
1046 allocator().set_candidate_filter(CF_RELAY);
1047 session_->StartGettingPorts();
1048 // 7 candidates and 4 ports is what we would normally get (see the
1049 // TestGetAllPorts* tests).
1050 EXPECT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout);
1051 EXPECT_EQ(4U, ports_.size());
1052 EXPECT_TRUE(candidate_allocation_done_);
1053}
1054
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001055// Test ICE candidate filter mechanism with options Relay/Host/Reflexive.
1056// This test also verifies that when the allocator is only allowed to use
1057// relay (i.e. IceTransportsType is relay), the raddr is an empty
1058// address with the correct family. This is to prevent any local
1059// reflective address leakage in the sdp line.
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001060TEST_F(BasicPortAllocatorTest, TestCandidateFilterWithRelayOnly) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001061 AddInterface(kClientAddr);
1062 // GTURN is not configured here.
Guo-wei Shieh11477022015-08-15 09:28:41 -07001063 ResetWithTurnServersNoNat(kTurnUdpIntAddr, rtc::SocketAddress());
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001064 allocator().set_candidate_filter(CF_RELAY);
1065 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001066 session_->StartGettingPorts();
1067 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -07001068 EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp",
1069 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001070
1071 EXPECT_EQ(1U, candidates_.size());
1072 EXPECT_EQ(1U, ports_.size()); // Only Relay port will be in ready state.
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -07001073 EXPECT_EQ(std::string(RELAY_PORT_TYPE), candidates_[0].type());
1074 EXPECT_EQ(
1075 candidates_[0].related_address(),
1076 rtc::EmptySocketAddressWithFamily(candidates_[0].address().family()));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001077}
1078
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001079TEST_F(BasicPortAllocatorTest, TestCandidateFilterWithHostOnly) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001080 AddInterface(kClientAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001081 allocator().set_flags(PORTALLOCATOR_ENABLE_SHARED_SOCKET);
1082 allocator().set_candidate_filter(CF_HOST);
1083 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001084 session_->StartGettingPorts();
1085 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001086 EXPECT_EQ(2U, candidates_.size()); // Host UDP/TCP candidates only.
1087 EXPECT_EQ(2U, ports_.size()); // UDP/TCP ports only.
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -07001088 for (const Candidate& candidate : candidates_) {
1089 EXPECT_EQ(std::string(LOCAL_PORT_TYPE), candidate.type());
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001090 }
1091}
1092
1093// Host is behind the NAT.
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001094TEST_F(BasicPortAllocatorTest, TestCandidateFilterWithReflexiveOnly) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001095 AddInterface(kPrivateAddr);
Guo-wei Shieh11477022015-08-15 09:28:41 -07001096 ResetWithStunServerAndNat(kStunAddr);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001097
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001098 allocator().set_flags(PORTALLOCATOR_ENABLE_SHARED_SOCKET);
1099 allocator().set_candidate_filter(CF_REFLEXIVE);
1100 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001101 session_->StartGettingPorts();
1102 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
1103 // Host is behind NAT, no private address will be exposed. Hence only UDP
1104 // port with STUN candidate will be sent outside.
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001105 EXPECT_EQ(1U, candidates_.size()); // Only STUN candidate.
1106 EXPECT_EQ(1U, ports_.size()); // Only UDP port will be in ready state.
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -07001107 EXPECT_EQ(std::string(STUN_PORT_TYPE), candidates_[0].type());
1108 EXPECT_EQ(
1109 candidates_[0].related_address(),
1110 rtc::EmptySocketAddressWithFamily(candidates_[0].address().family()));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001111}
1112
1113// Host is not behind the NAT.
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001114TEST_F(BasicPortAllocatorTest, TestCandidateFilterWithReflexiveOnlyAndNoNAT) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001115 AddInterface(kClientAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001116 allocator().set_flags(PORTALLOCATOR_ENABLE_SHARED_SOCKET);
1117 allocator().set_candidate_filter(CF_REFLEXIVE);
1118 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001119 session_->StartGettingPorts();
1120 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
1121 // Host has a public address, both UDP and TCP candidates will be exposed.
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001122 EXPECT_EQ(2U, candidates_.size()); // Local UDP + TCP candidate.
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001123 EXPECT_EQ(2U, ports_.size()); // UDP and TCP ports will be in ready state.
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -07001124 for (const Candidate& candidate : candidates_) {
1125 EXPECT_EQ(std::string(LOCAL_PORT_TYPE), candidate.type());
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001126 }
1127}
1128
Peter Thatcher7cbd1882015-09-17 18:54:52 -07001129// Test that we get the same ufrag and pwd for all candidates.
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001130TEST_F(BasicPortAllocatorTest, TestEnableSharedUfrag) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001131 AddInterface(kClientAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001132 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001133 session_->StartGettingPorts();
1134 ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout);
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -07001135 EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
1136 EXPECT_PRED4(HasCandidate, candidates_, "stun", "udp", kClientAddr);
1137 EXPECT_PRED4(HasCandidate, candidates_, "local", "tcp", kClientAddr);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001138 EXPECT_EQ(4U, ports_.size());
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -07001139 for (const Candidate& candidate : candidates_) {
1140 EXPECT_EQ(kIceUfrag0, candidate.username());
1141 EXPECT_EQ(kIcePwd0, candidate.password());
1142 }
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001143 EXPECT_TRUE(candidate_allocation_done_);
1144}
1145
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001146// Test that when PORTALLOCATOR_ENABLE_SHARED_SOCKET is enabled only one port
1147// is allocated for udp and stun. Also verify there is only one candidate
1148// (local) if stun candidate is same as local candidate, which will be the case
1149// in a public network like the below test.
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001150TEST_F(BasicPortAllocatorTest, TestSharedSocketWithoutNat) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001151 AddInterface(kClientAddr);
1152 allocator_->set_flags(allocator().flags() |
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001153 PORTALLOCATOR_ENABLE_SHARED_SOCKET);
1154 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001155 session_->StartGettingPorts();
1156 ASSERT_EQ_WAIT(6U, candidates_.size(), kDefaultAllocationTimeout);
1157 EXPECT_EQ(3U, ports_.size());
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -07001158 EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001159 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
1160}
1161
1162// Test that when PORTALLOCATOR_ENABLE_SHARED_SOCKET is enabled only one port
1163// is allocated for udp and stun. In this test we should expect both stun and
1164// local candidates as client behind a nat.
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001165TEST_F(BasicPortAllocatorTest, TestSharedSocketWithNat) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001166 AddInterface(kClientAddr);
Guo-wei Shieh11477022015-08-15 09:28:41 -07001167 ResetWithStunServerAndNat(kStunAddr);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001168
1169 allocator_->set_flags(allocator().flags() |
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001170 PORTALLOCATOR_ENABLE_SHARED_SOCKET);
1171 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001172 session_->StartGettingPorts();
1173 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout);
1174 ASSERT_EQ(2U, ports_.size());
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -07001175 EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
1176 EXPECT_PRED4(HasCandidate, candidates_, "stun", "udp",
1177 rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001178 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
1179 EXPECT_EQ(3U, candidates_.size());
1180}
1181
deadbeefc5d0d952015-07-16 10:22:21 -07001182// Test TURN port in shared socket mode with UDP and TCP TURN server addresses.
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001183TEST_F(BasicPortAllocatorTest, TestSharedSocketWithoutNatUsingTurn) {
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001184 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001185 AddInterface(kClientAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001186 allocator_.reset(new BasicPortAllocator(&network_manager_));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001187
1188 AddTurnServers(kTurnUdpIntAddr, kTurnTcpIntAddr);
1189
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001190 allocator_->set_step_delay(kMinimumStepDelay);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001191 allocator_->set_flags(allocator().flags() |
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001192 PORTALLOCATOR_ENABLE_SHARED_SOCKET |
1193 PORTALLOCATOR_DISABLE_TCP);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001194
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001195 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001196 session_->StartGettingPorts();
1197
1198 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout);
1199 ASSERT_EQ(3U, ports_.size());
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -07001200 EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
1201 EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp",
1202 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0));
1203 EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp",
1204 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001205 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
1206 EXPECT_EQ(3U, candidates_.size());
1207}
1208
Honghai Zhangb9e7b4a2016-06-30 20:52:02 -07001209// Test that if prune_turn_ports is set, TCP TurnPort will not
1210// be used if UDP TurnPort is used.
1211TEST_F(BasicPortAllocatorTest, TestUdpTurnPortPrunesTcpTurnPorts) {
1212 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
1213 AddInterface(kClientAddr);
1214 allocator_.reset(new BasicPortAllocator(&network_manager_));
1215 allocator_->SetConfiguration(allocator_->stun_servers(),
1216 allocator_->turn_servers(), 0, true);
1217 AddTurnServers(kTurnUdpIntAddr, kTurnTcpIntAddr);
1218 allocator_->set_step_delay(kMinimumStepDelay);
1219 allocator_->set_flags(allocator().flags() |
1220 PORTALLOCATOR_ENABLE_SHARED_SOCKET |
1221 PORTALLOCATOR_DISABLE_TCP);
1222
1223 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
1224 session_->StartGettingPorts();
1225 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
1226 // Only 2 ports (one STUN and one TURN) are actually being used.
1227 EXPECT_EQ(2U, session_->ReadyPorts().size());
1228 // We have verified that each port, when it is added to |ports_|, it is found
1229 // in |ready_ports|, and when it is pruned, it is not found in |ready_ports|,
1230 // so we only need to verify the content in one of them.
1231 EXPECT_EQ(2U, ports_.size());
1232 EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_UDP, kClientAddr));
1233 EXPECT_EQ(1, CountPorts(ports_, "relay", PROTO_UDP, kClientAddr));
1234 EXPECT_EQ(0, CountPorts(ports_, "relay", PROTO_TCP, kClientAddr));
1235
1236 // We don't remove candidates, so the size of |candidates_| will depend on
1237 // when the TCP TURN port becomes ready. If it is ready after the UDP TURN
1238 // port becomes ready, its candidates will be used there will be 3 candidates.
1239 // Otherwise there will be only 2 candidates.
1240 EXPECT_LE(2U, candidates_.size());
1241 // There will only be 2 candidates in |ready_candidates| because it only
1242 // includes the candidates in the ready ports.
1243 const std::vector<Candidate>& ready_candidates = session_->ReadyCandidates();
1244 EXPECT_EQ(2U, ready_candidates.size());
1245 EXPECT_PRED4(HasCandidate, ready_candidates, "local", "udp", kClientAddr);
1246 EXPECT_PRED4(HasCandidate, ready_candidates, "relay", "udp",
1247 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0));
1248}
1249
1250// Tests that if prune_turn_ports is set, IPv4 TurnPort will not
1251// be used if IPv6 TurnPort is used.
1252TEST_F(BasicPortAllocatorTest, TestIPv6TurnPortPrunesIPv4TurnPorts) {
1253 turn_server_.AddInternalSocket(kTurnUdpIntIPv6Addr, PROTO_UDP);
1254 // Add two IP addresses on the same interface.
1255 AddInterface(kClientAddr, "net1");
1256 AddInterface(kClientIPv6Addr, "net1");
1257 allocator_.reset(new BasicPortAllocator(&network_manager_));
1258 allocator_->SetConfiguration(allocator_->stun_servers(),
1259 allocator_->turn_servers(), 0, true);
1260 AddTurnServers(kTurnUdpIntIPv6Addr, rtc::SocketAddress());
1261
1262 allocator_->set_step_delay(kMinimumStepDelay);
1263 allocator_->set_flags(allocator().flags() |
1264 PORTALLOCATOR_ENABLE_SHARED_SOCKET |
1265 PORTALLOCATOR_ENABLE_IPV6 | PORTALLOCATOR_DISABLE_TCP);
1266
1267 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
1268 session_->StartGettingPorts();
1269 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
1270 // Three ports (one IPv4 STUN, one IPv6 STUN and one TURN) will be ready.
1271 EXPECT_EQ(3U, session_->ReadyPorts().size());
1272 EXPECT_EQ(3U, ports_.size());
1273 EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_UDP, kClientAddr));
1274 EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_UDP, kClientIPv6Addr));
1275 EXPECT_EQ(1, CountPorts(ports_, "relay", PROTO_UDP, kClientIPv6Addr));
1276 EXPECT_EQ(0, CountPorts(ports_, "relay", PROTO_UDP, kClientAddr));
1277
1278 // We don't remove candidates, so there may be more than 3 elemenets in
1279 // |candidates_|, although |ready_candidates| only includes the candidates
1280 // in |ready_ports|.
1281 EXPECT_LE(3U, candidates_.size());
1282 const std::vector<Candidate>& ready_candidates = session_->ReadyCandidates();
1283 EXPECT_EQ(3U, ready_candidates.size());
1284 EXPECT_PRED4(HasCandidate, ready_candidates, "local", "udp", kClientAddr);
1285 EXPECT_PRED4(HasCandidate, ready_candidates, "relay", "udp",
1286 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0));
1287}
1288
1289// Test has an assert error on win_x64_dbg and win_dbg. See: webrtc:6068
1290#if defined(WEBRTC_WIN)
1291#define MAYBE_TestEachInterfaceHasItsOwnTurnPorts \
1292 DISABLED_TestEachInterfaceHasItsOwnTurnPort
1293#else
1294#define MAYBE_TestEachInterfaceHasItsOwnTurnPorts \
1295 TestEachInterfaceHasItsOwnTurnPorts
1296#endif
1297// Tests that if prune_turn_ports is set, each network interface
1298// will has its own set of TurnPorts based on their priorities.
1299TEST_F(BasicPortAllocatorTest, MAYBE_TestEachInterfaceHasItsOwnTurnPorts) {
1300 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
1301 turn_server_.AddInternalSocket(kTurnUdpIntIPv6Addr, PROTO_UDP);
1302 turn_server_.AddInternalSocket(kTurnTcpIntIPv6Addr, PROTO_TCP);
1303 // Add two interfaces both having IPv4 and IPv6 addresses.
1304 AddInterface(kClientAddr, "net1", rtc::ADAPTER_TYPE_WIFI);
1305 AddInterface(kClientIPv6Addr, "net1", rtc::ADAPTER_TYPE_WIFI);
1306 AddInterface(kClientAddr2, "net2", rtc::ADAPTER_TYPE_CELLULAR);
1307 AddInterface(kClientIPv6Addr2, "net2", rtc::ADAPTER_TYPE_CELLULAR);
1308 allocator_.reset(new BasicPortAllocator(&network_manager_));
1309 allocator_->SetConfiguration(allocator_->stun_servers(),
1310 allocator_->turn_servers(), 0, true);
1311 // Have both UDP/TCP and IPv4/IPv6 TURN ports.
1312 AddTurnServers(kTurnUdpIntAddr, kTurnTcpIntAddr);
1313 AddTurnServers(kTurnUdpIntIPv6Addr, kTurnTcpIntIPv6Addr);
1314
1315 allocator_->set_step_delay(kMinimumStepDelay);
1316 allocator_->set_flags(allocator().flags() |
1317 PORTALLOCATOR_ENABLE_SHARED_SOCKET |
1318 PORTALLOCATOR_ENABLE_IPV6);
1319 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
1320 session_->StartGettingPorts();
1321 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
1322 // 10 ports (4 STUN and 1 TURN ports on each interface) will be ready to use.
1323 EXPECT_EQ(10U, session_->ReadyPorts().size());
1324 EXPECT_EQ(10U, ports_.size());
1325 EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_UDP, kClientAddr));
1326 EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_UDP, kClientAddr2));
1327 EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_UDP, kClientIPv6Addr));
1328 EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_UDP, kClientIPv6Addr2));
1329 EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_TCP, kClientAddr));
1330 EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_TCP, kClientAddr2));
1331 EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_TCP, kClientIPv6Addr));
1332 EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_TCP, kClientIPv6Addr2));
1333 EXPECT_EQ(1, CountPorts(ports_, "relay", PROTO_UDP, kClientIPv6Addr));
1334 EXPECT_EQ(1, CountPorts(ports_, "relay", PROTO_UDP, kClientIPv6Addr2));
1335
1336 // We don't remove candidates, so there may be more than 10 candidates
1337 // in |candidates_|.
1338 EXPECT_LE(10U, candidates_.size());
1339 const std::vector<Candidate>& ready_candidates = session_->ReadyCandidates();
1340 EXPECT_EQ(10U, ready_candidates.size());
1341 EXPECT_PRED4(HasCandidate, ready_candidates, "local", "udp", kClientAddr);
1342 EXPECT_PRED4(HasCandidate, ready_candidates, "local", "udp", kClientAddr2);
1343 EXPECT_PRED4(HasCandidate, ready_candidates, "local", "udp", kClientIPv6Addr);
1344 EXPECT_PRED4(HasCandidate, ready_candidates, "local", "udp",
1345 kClientIPv6Addr2);
1346 EXPECT_PRED4(HasCandidate, ready_candidates, "local", "tcp", kClientAddr);
1347 EXPECT_PRED4(HasCandidate, ready_candidates, "local", "tcp", kClientAddr2);
1348 EXPECT_PRED4(HasCandidate, ready_candidates, "local", "tcp", kClientIPv6Addr);
1349 EXPECT_PRED4(HasCandidate, ready_candidates, "local", "tcp",
1350 kClientIPv6Addr2);
1351 EXPECT_PRED4(HasCandidate, ready_candidates, "relay", "udp",
1352 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0));
1353}
1354
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001355// Testing DNS resolve for the TURN server, this will test AllocationSequence
1356// handling the unresolved address signal from TurnPort.
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001357TEST_F(BasicPortAllocatorTest, TestSharedSocketWithServerAddressResolve) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001358 turn_server_.AddInternalSocket(rtc::SocketAddress("127.0.0.1", 3478),
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001359 PROTO_UDP);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001360 AddInterface(kClientAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001361 allocator_.reset(new BasicPortAllocator(&network_manager_));
1362 RelayServerConfig turn_server(RELAY_TURN);
1363 RelayCredentials credentials(kTurnUsername, kTurnPassword);
deadbeef653b8e02015-11-11 12:55:10 -08001364 turn_server.credentials = credentials;
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001365 turn_server.ports.push_back(
1366 ProtocolAddress(rtc::SocketAddress("localhost", 3478), PROTO_UDP, false));
deadbeef653b8e02015-11-11 12:55:10 -08001367 allocator_->AddTurnServer(turn_server);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001368
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001369 allocator_->set_step_delay(kMinimumStepDelay);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001370 allocator_->set_flags(allocator().flags() |
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001371 PORTALLOCATOR_ENABLE_SHARED_SOCKET |
1372 PORTALLOCATOR_DISABLE_TCP);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001373
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001374 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001375 session_->StartGettingPorts();
1376
1377 EXPECT_EQ_WAIT(2U, ports_.size(), kDefaultAllocationTimeout);
1378}
1379
1380// Test that when PORTALLOCATOR_ENABLE_SHARED_SOCKET is enabled only one port
1381// is allocated for udp/stun/turn. In this test we should expect all local,
1382// stun and turn candidates.
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001383TEST_F(BasicPortAllocatorTest, TestSharedSocketWithNatUsingTurn) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001384 AddInterface(kClientAddr);
Guo-wei Shieh11477022015-08-15 09:28:41 -07001385 ResetWithStunServerAndNat(kStunAddr);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001386
1387 AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress());
1388
1389 allocator_->set_flags(allocator().flags() |
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001390 PORTALLOCATOR_ENABLE_SHARED_SOCKET |
1391 PORTALLOCATOR_DISABLE_TCP);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001392
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001393 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001394 session_->StartGettingPorts();
1395
1396 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout);
1397 ASSERT_EQ(2U, ports_.size());
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -07001398 EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
1399 EXPECT_PRED4(HasCandidate, candidates_, "stun", "udp",
1400 rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0));
1401 EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp",
1402 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001403 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
1404 EXPECT_EQ(3U, candidates_.size());
1405 // Local port will be created first and then TURN port.
1406 EXPECT_EQ(2U, ports_[0]->Candidates().size());
1407 EXPECT_EQ(1U, ports_[1]->Candidates().size());
1408}
1409
1410// Test that when PORTALLOCATOR_ENABLE_SHARED_SOCKET is enabled and the TURN
1411// server is also used as the STUN server, we should get 'local', 'stun', and
1412// 'relay' candidates.
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001413TEST_F(BasicPortAllocatorTest, TestSharedSocketWithNatUsingTurnAsStun) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001414 AddInterface(kClientAddr);
Jiayang Liud7e5c442015-04-27 11:47:21 -07001415 // Use an empty SocketAddress to add a NAT without STUN server.
Guo-wei Shieh11477022015-08-15 09:28:41 -07001416 ResetWithStunServerAndNat(SocketAddress());
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001417 AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress());
1418
1419 // Must set the step delay to 0 to make sure the relay allocation phase is
1420 // started before the STUN candidates are obtained, so that the STUN binding
1421 // response is processed when both StunPort and TurnPort exist to reproduce
1422 // webrtc issue 3537.
1423 allocator_->set_step_delay(0);
1424 allocator_->set_flags(allocator().flags() |
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001425 PORTALLOCATOR_ENABLE_SHARED_SOCKET |
1426 PORTALLOCATOR_DISABLE_TCP);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001427
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001428 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001429 session_->StartGettingPorts();
1430
1431 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout);
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -07001432 EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
1433 Candidate stun_candidate;
1434 EXPECT_PRED5(FindCandidate, candidates_, "stun", "udp",
1435 rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0), &stun_candidate);
1436 EXPECT_PRED5(HasCandidateWithRelatedAddr, candidates_, "relay", "udp",
1437 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0),
1438 stun_candidate.address());
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001439
1440 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
1441 EXPECT_EQ(3U, candidates_.size());
1442 // Local port will be created first and then TURN port.
1443 EXPECT_EQ(2U, ports_[0]->Candidates().size());
1444 EXPECT_EQ(1U, ports_[1]->Candidates().size());
1445}
1446
deadbeefc5d0d952015-07-16 10:22:21 -07001447// Test that when only a TCP TURN server is available, we do NOT use it as
1448// a UDP STUN server, as this could leak our IP address. Thus we should only
1449// expect two ports, a UDPPort and TurnPort.
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001450TEST_F(BasicPortAllocatorTest, TestSharedSocketWithNatUsingTurnTcpOnly) {
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001451 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
deadbeefc5d0d952015-07-16 10:22:21 -07001452 AddInterface(kClientAddr);
Guo-wei Shieh11477022015-08-15 09:28:41 -07001453 ResetWithStunServerAndNat(rtc::SocketAddress());
deadbeefc5d0d952015-07-16 10:22:21 -07001454 AddTurnServers(rtc::SocketAddress(), kTurnTcpIntAddr);
1455
1456 allocator_->set_flags(allocator().flags() |
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001457 PORTALLOCATOR_ENABLE_SHARED_SOCKET |
1458 PORTALLOCATOR_DISABLE_TCP);
deadbeefc5d0d952015-07-16 10:22:21 -07001459
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001460 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
deadbeefc5d0d952015-07-16 10:22:21 -07001461 session_->StartGettingPorts();
1462
1463 ASSERT_EQ_WAIT(2U, candidates_.size(), kDefaultAllocationTimeout);
1464 ASSERT_EQ(2U, ports_.size());
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -07001465 EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
1466 EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp",
1467 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0));
deadbeefc5d0d952015-07-16 10:22:21 -07001468 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
1469 EXPECT_EQ(2U, candidates_.size());
1470 EXPECT_EQ(1U, ports_[0]->Candidates().size());
1471 EXPECT_EQ(1U, ports_[1]->Candidates().size());
1472}
1473
1474// Test that even when PORTALLOCATOR_ENABLE_SHARED_SOCKET is NOT enabled, the
1475// TURN server is used as the STUN server and we get 'local', 'stun', and
1476// 'relay' candidates.
1477// TODO(deadbeef): Remove this test when support for non-shared socket mode
1478// is removed.
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001479TEST_F(BasicPortAllocatorTest, TestNonSharedSocketWithNatUsingTurnAsStun) {
deadbeefc5d0d952015-07-16 10:22:21 -07001480 AddInterface(kClientAddr);
1481 // Use an empty SocketAddress to add a NAT without STUN server.
Guo-wei Shieh11477022015-08-15 09:28:41 -07001482 ResetWithStunServerAndNat(SocketAddress());
deadbeefc5d0d952015-07-16 10:22:21 -07001483 AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress());
1484
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001485 allocator_->set_flags(allocator().flags() | PORTALLOCATOR_DISABLE_TCP);
deadbeefc5d0d952015-07-16 10:22:21 -07001486
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001487 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
deadbeefc5d0d952015-07-16 10:22:21 -07001488 session_->StartGettingPorts();
1489
1490 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout);
1491 ASSERT_EQ(3U, ports_.size());
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -07001492 EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
1493 Candidate stun_candidate;
1494 EXPECT_PRED5(FindCandidate, candidates_, "stun", "udp",
1495 rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0), &stun_candidate);
1496 Candidate turn_candidate;
1497 EXPECT_PRED5(FindCandidate, candidates_, "relay", "udp",
1498 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0),
1499 &turn_candidate);
deadbeefc5d0d952015-07-16 10:22:21 -07001500 // Not using shared socket, so the STUN request's server reflexive address
1501 // should be different than the TURN request's server reflexive address.
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -07001502 EXPECT_NE(turn_candidate.related_address(), stun_candidate.address());
deadbeefc5d0d952015-07-16 10:22:21 -07001503
1504 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
1505 EXPECT_EQ(3U, candidates_.size());
1506 EXPECT_EQ(1U, ports_[0]->Candidates().size());
1507 EXPECT_EQ(1U, ports_[1]->Candidates().size());
1508 EXPECT_EQ(1U, ports_[2]->Candidates().size());
1509}
1510
1511// Test that even when both a STUN and TURN server are configured, the TURN
1512// server is used as a STUN server and we get a 'stun' candidate.
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001513TEST_F(BasicPortAllocatorTest, TestSharedSocketWithNatUsingTurnAndStun) {
deadbeefc5d0d952015-07-16 10:22:21 -07001514 AddInterface(kClientAddr);
1515 // Configure with STUN server but destroy it, so we can ensure that it's
1516 // the TURN server actually being used as a STUN server.
Guo-wei Shieh11477022015-08-15 09:28:41 -07001517 ResetWithStunServerAndNat(kStunAddr);
deadbeefc5d0d952015-07-16 10:22:21 -07001518 stun_server_.reset();
1519 AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress());
1520
1521 allocator_->set_flags(allocator().flags() |
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001522 PORTALLOCATOR_ENABLE_SHARED_SOCKET |
1523 PORTALLOCATOR_DISABLE_TCP);
deadbeefc5d0d952015-07-16 10:22:21 -07001524
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001525 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
deadbeefc5d0d952015-07-16 10:22:21 -07001526 session_->StartGettingPorts();
1527
1528 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout);
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -07001529 EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
1530 Candidate stun_candidate;
1531 EXPECT_PRED5(FindCandidate, candidates_, "stun", "udp",
1532 rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0), &stun_candidate);
1533 EXPECT_PRED5(HasCandidateWithRelatedAddr, candidates_, "relay", "udp",
1534 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0),
1535 stun_candidate.address());
deadbeefc5d0d952015-07-16 10:22:21 -07001536
1537 // Don't bother waiting for STUN timeout, since we already verified
1538 // that we got a STUN candidate from the TURN server.
1539}
1540
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001541// This test verifies when PORTALLOCATOR_ENABLE_SHARED_SOCKET flag is enabled
1542// and fail to generate STUN candidate, local UDP candidate is generated
1543// properly.
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001544TEST_F(BasicPortAllocatorTest, TestSharedSocketNoUdpAllowed) {
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001545 allocator().set_flags(allocator().flags() | PORTALLOCATOR_DISABLE_RELAY |
1546 PORTALLOCATOR_DISABLE_TCP |
1547 PORTALLOCATOR_ENABLE_SHARED_SOCKET);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001548 fss_->AddRule(false, rtc::FP_UDP, rtc::FD_ANY, kClientAddr);
1549 AddInterface(kClientAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001550 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001551 session_->StartGettingPorts();
1552 ASSERT_EQ_WAIT(1U, ports_.size(), kDefaultAllocationTimeout);
1553 EXPECT_EQ(1U, candidates_.size());
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -07001554 EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
Taylor Brandstetter8fcf4142016-05-23 12:49:30 -07001555 // STUN timeout is 9.5sec. We need to wait to get candidate done signal.
1556 EXPECT_TRUE_WAIT(candidate_allocation_done_, kStunTimeoutMs);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001557 EXPECT_EQ(1U, candidates_.size());
1558}
1559
Guo-wei Shieh47872ec2015-08-19 10:32:46 -07001560// Test that when the NetworkManager doesn't have permission to enumerate
1561// adapters, the PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION is specified
1562// automatically.
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001563TEST_F(BasicPortAllocatorTest, TestNetworkPermissionBlocked) {
Guo-wei Shieh9af97f82015-11-10 14:47:39 -08001564 network_manager_.set_default_local_addresses(kPrivateAddr.ipaddr(),
1565 rtc::IPAddress());
Guo-wei Shieh47872ec2015-08-19 10:32:46 -07001566 network_manager_.set_enumeration_permission(
guoweisea1012b2015-08-21 09:06:28 -07001567 rtc::NetworkManager::ENUMERATION_BLOCKED);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001568 allocator().set_flags(allocator().flags() | PORTALLOCATOR_DISABLE_RELAY |
1569 PORTALLOCATOR_DISABLE_TCP |
1570 PORTALLOCATOR_ENABLE_SHARED_SOCKET);
1571 EXPECT_EQ(0U,
1572 allocator_->flags() & PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION);
1573 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
1574 EXPECT_EQ(0U, session_->flags() & PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION);
Guo-wei Shieh47872ec2015-08-19 10:32:46 -07001575 session_->StartGettingPorts();
1576 EXPECT_EQ_WAIT(1U, ports_.size(), kDefaultAllocationTimeout);
Guo-wei Shieh9af97f82015-11-10 14:47:39 -08001577 EXPECT_EQ(1U, candidates_.size());
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -07001578 EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kPrivateAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001579 EXPECT_NE(0U, session_->flags() & PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION);
Guo-wei Shieh47872ec2015-08-19 10:32:46 -07001580}
1581
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001582// This test verifies allocator can use IPv6 addresses along with IPv4.
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001583TEST_F(BasicPortAllocatorTest, TestEnableIPv6Addresses) {
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001584 allocator().set_flags(allocator().flags() | PORTALLOCATOR_DISABLE_RELAY |
1585 PORTALLOCATOR_ENABLE_IPV6 |
1586 PORTALLOCATOR_ENABLE_SHARED_SOCKET);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001587 AddInterface(kClientIPv6Addr);
1588 AddInterface(kClientAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001589 allocator_->set_step_delay(kMinimumStepDelay);
1590 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001591 session_->StartGettingPorts();
1592 ASSERT_EQ_WAIT(4U, ports_.size(), kDefaultAllocationTimeout);
1593 EXPECT_EQ(4U, candidates_.size());
1594 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
Taylor Brandstetter8c9be5e2016-05-26 16:07:31 -07001595 EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientIPv6Addr);
1596 EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
1597 EXPECT_PRED4(HasCandidate, candidates_, "local", "tcp", kClientIPv6Addr);
1598 EXPECT_PRED4(HasCandidate, candidates_, "local", "tcp", kClientAddr);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001599 EXPECT_EQ(4U, candidates_.size());
1600}
honghaiz98db68f2015-09-29 07:58:17 -07001601
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001602TEST_F(BasicPortAllocatorTest, TestStopGettingPorts) {
honghaiz98db68f2015-09-29 07:58:17 -07001603 AddInterface(kClientAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001604 allocator_->set_step_delay(kDefaultStepDelay);
1605 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
honghaiz98db68f2015-09-29 07:58:17 -07001606 session_->StartGettingPorts();
1607 ASSERT_EQ_WAIT(2U, candidates_.size(), 1000);
1608 EXPECT_EQ(2U, ports_.size());
1609 session_->StopGettingPorts();
1610 EXPECT_TRUE_WAIT(candidate_allocation_done_, 1000);
1611
1612 // After stopping getting ports, adding a new interface will not start
1613 // getting ports again.
1614 candidates_.clear();
1615 ports_.clear();
1616 candidate_allocation_done_ = false;
1617 network_manager_.AddInterface(kClientAddr2);
1618 rtc::Thread::Current()->ProcessMessages(1000);
1619 EXPECT_EQ(0U, candidates_.size());
1620 EXPECT_EQ(0U, ports_.size());
1621}
1622
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001623TEST_F(BasicPortAllocatorTest, TestClearGettingPorts) {
honghaiz98db68f2015-09-29 07:58:17 -07001624 AddInterface(kClientAddr);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001625 allocator_->set_step_delay(kDefaultStepDelay);
1626 EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
honghaiz98db68f2015-09-29 07:58:17 -07001627 session_->StartGettingPorts();
1628 ASSERT_EQ_WAIT(2U, candidates_.size(), 1000);
1629 EXPECT_EQ(2U, ports_.size());
1630 session_->ClearGettingPorts();
1631 WAIT(candidate_allocation_done_, 1000);
1632 EXPECT_FALSE(candidate_allocation_done_);
1633
1634 // After clearing getting ports, adding a new interface will start getting
1635 // ports again.
1636 candidates_.clear();
1637 ports_.clear();
1638 candidate_allocation_done_ = false;
1639 network_manager_.AddInterface(kClientAddr2);
1640 ASSERT_EQ_WAIT(2U, candidates_.size(), 1000);
1641 EXPECT_EQ(2U, ports_.size());
1642}
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001643
1644// Test that the ports and candidates are updated with new ufrag/pwd/etc. when
1645// a pooled session is taken out of the pool.
1646TEST_F(BasicPortAllocatorTest, TestTransportInformationUpdated) {
1647 AddInterface(kClientAddr);
1648 int pool_size = 1;
1649 allocator_->SetConfiguration(allocator_->stun_servers(),
Honghai Zhangb9e7b4a2016-06-30 20:52:02 -07001650 allocator_->turn_servers(), pool_size, false);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001651 const PortAllocatorSession* peeked_session = allocator_->GetPooledSession();
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001652 ASSERT_NE(nullptr, peeked_session);
1653 EXPECT_EQ_WAIT(true, peeked_session->CandidatesAllocationDone(),
1654 kDefaultAllocationTimeout);
1655 // Expect that when TakePooledSession is called,
1656 // UpdateTransportInformationInternal will be called and the
1657 // BasicPortAllocatorSession will update the ufrag/pwd of ports and
1658 // candidates.
1659 session_ =
1660 allocator_->TakePooledSession(kContentName, 1, kIceUfrag0, kIcePwd0);
1661 ASSERT_NE(nullptr, session_.get());
1662 auto ready_ports = session_->ReadyPorts();
1663 auto candidates = session_->ReadyCandidates();
1664 EXPECT_FALSE(ready_ports.empty());
1665 EXPECT_FALSE(candidates.empty());
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001666 for (const PortInterface* port_interface : ready_ports) {
1667 const Port* port = static_cast<const Port*>(port_interface);
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001668 EXPECT_EQ(kContentName, port->content_name());
1669 EXPECT_EQ(1, port->component());
1670 EXPECT_EQ(kIceUfrag0, port->username_fragment());
1671 EXPECT_EQ(kIcePwd0, port->password());
1672 }
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001673 for (const Candidate& candidate : candidates) {
Taylor Brandstettera1c30352016-05-13 08:15:11 -07001674 EXPECT_EQ(1, candidate.component());
1675 EXPECT_EQ(kIceUfrag0, candidate.username());
1676 EXPECT_EQ(kIcePwd0, candidate.password());
1677 }
1678}
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001679
1680// Test that a new candidate filter takes effect even on already-gathered
1681// candidates.
1682TEST_F(BasicPortAllocatorTest, TestSetCandidateFilterAfterCandidatesGathered) {
1683 AddInterface(kClientAddr);
1684 int pool_size = 1;
1685 allocator_->SetConfiguration(allocator_->stun_servers(),
Honghai Zhangb9e7b4a2016-06-30 20:52:02 -07001686 allocator_->turn_servers(), pool_size, false);
Taylor Brandstetter417eebe2016-05-23 16:02:19 -07001687 const PortAllocatorSession* peeked_session = allocator_->GetPooledSession();
1688 ASSERT_NE(nullptr, peeked_session);
1689 EXPECT_EQ_WAIT(true, peeked_session->CandidatesAllocationDone(),
1690 kDefaultAllocationTimeout);
1691 size_t initial_candidates_size = peeked_session->ReadyCandidates().size();
1692 size_t initial_ports_size = peeked_session->ReadyPorts().size();
1693 allocator_->set_candidate_filter(CF_RELAY);
1694 // Assume that when TakePooledSession is called, the candidate filter will be
1695 // applied to the pooled session. This is tested by PortAllocatorTest.
1696 session_ =
1697 allocator_->TakePooledSession(kContentName, 1, kIceUfrag0, kIcePwd0);
1698 ASSERT_NE(nullptr, session_.get());
1699 auto candidates = session_->ReadyCandidates();
1700 auto ports = session_->ReadyPorts();
1701 // Sanity check that the number of candidates and ports decreased.
1702 EXPECT_GT(initial_candidates_size, candidates.size());
1703 EXPECT_GT(initial_ports_size, ports.size());
1704 for (const PortInterface* port : ports) {
1705 // Expect only relay ports.
1706 EXPECT_EQ(RELAY_PORT_TYPE, port->Type());
1707 }
1708 for (const Candidate& candidate : candidates) {
1709 // Expect only relay candidates now that the filter is applied.
1710 EXPECT_EQ(std::string(RELAY_PORT_TYPE), candidate.type());
1711 // Expect that the raddr is emptied due to the CF_RELAY filter.
1712 EXPECT_EQ(candidate.related_address(),
1713 rtc::EmptySocketAddressWithFamily(candidate.address().family()));
1714 }
1715}
1716
1717} // namespace cricket