OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2012 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 #if defined(WEBRTC_POSIX) | 10 #if defined(WEBRTC_POSIX) |
11 #include <dirent.h> | 11 #include <dirent.h> |
12 #endif | 12 #endif |
13 | 13 |
14 #include <memory> | 14 #include <memory> |
15 | 15 |
16 #include "webrtc/p2p/base/basicpacketsocketfactory.h" | 16 #include "webrtc/p2p/base/basicpacketsocketfactory.h" |
17 #include "webrtc/p2p/base/p2pconstants.h" | 17 #include "webrtc/p2p/base/p2pconstants.h" |
18 #include "webrtc/p2p/base/portallocator.h" | 18 #include "webrtc/p2p/base/portallocator.h" |
19 #include "webrtc/p2p/base/tcpport.h" | 19 #include "webrtc/p2p/base/tcpport.h" |
20 #include "webrtc/p2p/base/testturnserver.h" | 20 #include "webrtc/p2p/base/testturnserver.h" |
21 #include "webrtc/p2p/base/turnport.h" | 21 #include "webrtc/p2p/base/turnport.h" |
22 #include "webrtc/p2p/base/udpport.h" | 22 #include "webrtc/p2p/base/udpport.h" |
23 #include "webrtc/base/asynctcpsocket.h" | 23 #include "webrtc/base/asynctcpsocket.h" |
24 #include "webrtc/base/buffer.h" | 24 #include "webrtc/base/buffer.h" |
25 #include "webrtc/base/dscp.h" | 25 #include "webrtc/base/dscp.h" |
| 26 #include "webrtc/base/fakeclock.h" |
26 #include "webrtc/base/firewallsocketserver.h" | 27 #include "webrtc/base/firewallsocketserver.h" |
27 #include "webrtc/base/gunit.h" | 28 #include "webrtc/base/gunit.h" |
28 #include "webrtc/base/helpers.h" | 29 #include "webrtc/base/helpers.h" |
29 #include "webrtc/base/logging.h" | 30 #include "webrtc/base/logging.h" |
30 #include "webrtc/base/physicalsocketserver.h" | 31 #include "webrtc/base/physicalsocketserver.h" |
31 #include "webrtc/base/socketaddress.h" | 32 #include "webrtc/base/socketaddress.h" |
32 #include "webrtc/base/ssladapter.h" | 33 #include "webrtc/base/ssladapter.h" |
33 #include "webrtc/base/thread.h" | 34 #include "webrtc/base/thread.h" |
34 #include "webrtc/base/virtualsocketserver.h" | 35 #include "webrtc/base/virtualsocketserver.h" |
35 | 36 |
36 using rtc::SocketAddress; | 37 using rtc::SocketAddress; |
37 using cricket::Connection; | |
38 using cricket::Port; | |
39 using cricket::PortInterface; | |
40 using cricket::TurnPort; | |
41 using cricket::UDPPort; | |
42 | 38 |
43 static const SocketAddress kLocalAddr1("11.11.11.11", 0); | 39 static const SocketAddress kLocalAddr1("11.11.11.11", 0); |
44 static const SocketAddress kLocalAddr2("22.22.22.22", 0); | 40 static const SocketAddress kLocalAddr2("22.22.22.22", 0); |
45 static const SocketAddress kLocalIPv6Addr( | 41 static const SocketAddress kLocalIPv6Addr( |
46 "2401:fa00:4:1000:be30:5bff:fee5:c3", 0); | 42 "2401:fa00:4:1000:be30:5bff:fee5:c3", 0); |
47 static const SocketAddress kLocalIPv6Addr2( | 43 static const SocketAddress kLocalIPv6Addr2( |
48 "2401:fa00:4:2000:be30:5bff:fee5:d4", 0); | 44 "2401:fa00:4:2000:be30:5bff:fee5:d4", 0); |
49 static const SocketAddress kTurnUdpIntAddr("99.99.99.3", | 45 static const SocketAddress kTurnUdpIntAddr("99.99.99.3", |
50 cricket::TURN_SERVER_PORT); | 46 cricket::TURN_SERVER_PORT); |
51 static const SocketAddress kTurnTcpIntAddr("99.99.99.4", | 47 static const SocketAddress kTurnTcpIntAddr("99.99.99.4", |
(...skipping 10 matching lines...) Expand all Loading... |
62 "2400:4030:1:2c00:be30:abcd:efab:cdef", cricket::TURN_SERVER_PORT); | 58 "2400:4030:1:2c00:be30:abcd:efab:cdef", cricket::TURN_SERVER_PORT); |
63 | 59 |
64 static const char kCandidateFoundation[] = "foundation"; | 60 static const char kCandidateFoundation[] = "foundation"; |
65 static const char kIceUfrag1[] = "TESTICEUFRAG0001"; | 61 static const char kIceUfrag1[] = "TESTICEUFRAG0001"; |
66 static const char kIceUfrag2[] = "TESTICEUFRAG0002"; | 62 static const char kIceUfrag2[] = "TESTICEUFRAG0002"; |
67 static const char kIcePwd1[] = "TESTICEPWD00000000000001"; | 63 static const char kIcePwd1[] = "TESTICEPWD00000000000001"; |
68 static const char kIcePwd2[] = "TESTICEPWD00000000000002"; | 64 static const char kIcePwd2[] = "TESTICEPWD00000000000002"; |
69 static const char kTurnUsername[] = "test"; | 65 static const char kTurnUsername[] = "test"; |
70 static const char kTurnPassword[] = "test"; | 66 static const char kTurnPassword[] = "test"; |
71 static const char kTestOrigin[] = "http://example.com"; | 67 static const char kTestOrigin[] = "http://example.com"; |
72 static const unsigned int kTimeout = 1000; | 68 // This test configures the virtual socket server to simulate delay so that we |
| 69 // can verify operations take no more than the expected number of round trips. |
| 70 static constexpr unsigned int kSimulatedRtt = 50; |
| 71 // Connection destruction may happen asynchronously, but it should only |
| 72 // take one simulated clock tick. |
| 73 static constexpr unsigned int kConnectionDestructionDelay = 1; |
| 74 // This used to be 1 second, but that's not always enough for getaddrinfo(). |
| 75 // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=5191 |
| 76 static constexpr unsigned int kResolverTimeout = 10000; |
73 | 77 |
74 static const cricket::ProtocolAddress kTurnUdpProtoAddr( | 78 static const cricket::ProtocolAddress kTurnUdpProtoAddr( |
75 kTurnUdpIntAddr, cricket::PROTO_UDP); | 79 kTurnUdpIntAddr, cricket::PROTO_UDP); |
76 static const cricket::ProtocolAddress kTurnTcpProtoAddr( | 80 static const cricket::ProtocolAddress kTurnTcpProtoAddr( |
77 kTurnTcpIntAddr, cricket::PROTO_TCP); | 81 kTurnTcpIntAddr, cricket::PROTO_TCP); |
78 static const cricket::ProtocolAddress kTurnUdpIPv6ProtoAddr( | 82 static const cricket::ProtocolAddress kTurnUdpIPv6ProtoAddr( |
79 kTurnUdpIPv6IntAddr, cricket::PROTO_UDP); | 83 kTurnUdpIPv6IntAddr, cricket::PROTO_UDP); |
80 | 84 |
81 static const unsigned int MSG_TESTFINISH = 0; | 85 static const unsigned int MSG_TESTFINISH = 0; |
82 | 86 |
83 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) | 87 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) |
84 static int GetFDCount() { | 88 static int GetFDCount() { |
85 struct dirent *dp; | 89 struct dirent *dp; |
86 int fd_count = 0; | 90 int fd_count = 0; |
87 DIR *dir = opendir("/proc/self/fd/"); | 91 DIR *dir = opendir("/proc/self/fd/"); |
88 while ((dp = readdir(dir)) != NULL) { | 92 while ((dp = readdir(dir)) != NULL) { |
89 if (dp->d_name[0] == '.') | 93 if (dp->d_name[0] == '.') |
90 continue; | 94 continue; |
91 ++fd_count; | 95 ++fd_count; |
92 } | 96 } |
93 closedir(dir); | 97 closedir(dir); |
94 return fd_count; | 98 return fd_count; |
95 } | 99 } |
96 #endif | 100 #endif |
97 | 101 |
| 102 namespace cricket { |
| 103 |
98 class TurnPortTestVirtualSocketServer : public rtc::VirtualSocketServer { | 104 class TurnPortTestVirtualSocketServer : public rtc::VirtualSocketServer { |
99 public: | 105 public: |
100 explicit TurnPortTestVirtualSocketServer(SocketServer* ss) | 106 explicit TurnPortTestVirtualSocketServer(SocketServer* ss) |
101 : VirtualSocketServer(ss) {} | 107 : VirtualSocketServer(ss) { |
| 108 // This configures the virtual socket server to always add a simulated |
| 109 // delay of exactly half of kSimulatedRtt. |
| 110 set_delay_mean(kSimulatedRtt / 2); |
| 111 UpdateDelayDistribution(); |
| 112 } |
102 | 113 |
103 using rtc::VirtualSocketServer::LookupBinding; | 114 using rtc::VirtualSocketServer::LookupBinding; |
104 }; | 115 }; |
105 | 116 |
106 class TestConnectionWrapper : public sigslot::has_slots<> { | 117 class TestConnectionWrapper : public sigslot::has_slots<> { |
107 public: | 118 public: |
108 TestConnectionWrapper(Connection* conn) : connection_(conn) { | 119 TestConnectionWrapper(Connection* conn) : connection_(conn) { |
109 conn->SignalDestroyed.connect( | 120 conn->SignalDestroyed.connect( |
110 this, &TestConnectionWrapper::OnConnectionDestroyed); | 121 this, &TestConnectionWrapper::OnConnectionDestroyed); |
111 } | 122 } |
112 | 123 |
113 Connection* connection() { return connection_; } | 124 Connection* connection() { return connection_; } |
114 | 125 |
115 private: | 126 private: |
116 void OnConnectionDestroyed(Connection* conn) { | 127 void OnConnectionDestroyed(Connection* conn) { |
117 ASSERT_TRUE(conn == connection_); | 128 ASSERT_TRUE(conn == connection_); |
118 connection_ = nullptr; | 129 connection_ = nullptr; |
119 } | 130 } |
120 | 131 |
121 Connection* connection_; | 132 Connection* connection_; |
122 }; | 133 }; |
123 | 134 |
| 135 // Note: This test uses a fake clock with a simulated network round trip |
| 136 // (between local port and TURN server) of kSimulatedRtt. |
124 class TurnPortTest : public testing::Test, | 137 class TurnPortTest : public testing::Test, |
125 public sigslot::has_slots<>, | 138 public sigslot::has_slots<>, |
126 public rtc::MessageHandler { | 139 public rtc::MessageHandler { |
127 public: | 140 public: |
128 TurnPortTest() | 141 TurnPortTest() |
129 : main_(rtc::Thread::Current()), | 142 : main_(rtc::Thread::Current()), |
130 pss_(new rtc::PhysicalSocketServer), | 143 pss_(new rtc::PhysicalSocketServer), |
131 ss_(new TurnPortTestVirtualSocketServer(pss_.get())), | 144 ss_(new TurnPortTestVirtualSocketServer(pss_.get())), |
132 ss_scope_(ss_.get()), | 145 ss_scope_(ss_.get()), |
133 network_("unittest", "unittest", rtc::IPAddress(INADDR_ANY), 32), | 146 network_("unittest", "unittest", rtc::IPAddress(INADDR_ANY), 32), |
134 socket_factory_(rtc::Thread::Current()), | 147 socket_factory_(rtc::Thread::Current()), |
135 turn_server_(main_, kTurnUdpIntAddr, kTurnUdpExtAddr), | 148 turn_server_(main_, kTurnUdpIntAddr, kTurnUdpExtAddr), |
136 turn_ready_(false), | 149 turn_ready_(false), |
137 turn_error_(false), | 150 turn_error_(false), |
138 turn_unknown_address_(false), | 151 turn_unknown_address_(false), |
139 turn_create_permission_success_(false), | 152 turn_create_permission_success_(false), |
140 udp_ready_(false), | 153 udp_ready_(false), |
141 test_finish_(false) { | 154 test_finish_(false) { |
| 155 // Some code uses "last received time == 0" to represent "nothing received |
| 156 // so far", so we need to start the fake clock at a nonzero time... |
| 157 // TODO(deadbeef): Fix this. |
| 158 fake_clock_.AdvanceTime(rtc::TimeDelta::FromSeconds(1)); |
142 network_.AddIP(rtc::IPAddress(INADDR_ANY)); | 159 network_.AddIP(rtc::IPAddress(INADDR_ANY)); |
143 } | 160 } |
144 | 161 |
145 virtual void OnMessage(rtc::Message* msg) { | 162 virtual void OnMessage(rtc::Message* msg) { |
146 ASSERT(msg->message_id == MSG_TESTFINISH); | 163 ASSERT(msg->message_id == MSG_TESTFINISH); |
147 if (msg->message_id == MSG_TESTFINISH) | 164 if (msg->message_id == MSG_TESTFINISH) |
148 test_finish_ = true; | 165 test_finish_ = true; |
149 } | 166 } |
150 | 167 |
151 void ConnectSignalAddressReadyToSetLocalhostAsAltenertativeLocalAddress() { | 168 void ConnectSignalAddressReadyToSetLocalhostAsAltenertativeLocalAddress() { |
(...skipping 10 matching lines...) Expand all Loading... |
162 SocketAddress local_address("127.0.0.1", 2000); | 179 SocketAddress local_address("127.0.0.1", 2000); |
163 socket->SetAlternativeLocalAddress(local_address); | 180 socket->SetAlternativeLocalAddress(local_address); |
164 } | 181 } |
165 | 182 |
166 void OnTurnPortComplete(Port* port) { | 183 void OnTurnPortComplete(Port* port) { |
167 turn_ready_ = true; | 184 turn_ready_ = true; |
168 } | 185 } |
169 void OnTurnPortError(Port* port) { | 186 void OnTurnPortError(Port* port) { |
170 turn_error_ = true; | 187 turn_error_ = true; |
171 } | 188 } |
172 void OnTurnUnknownAddress(PortInterface* port, const SocketAddress& addr, | 189 void OnTurnUnknownAddress(PortInterface* port, |
173 cricket::ProtocolType proto, | 190 const SocketAddress& addr, |
174 cricket::IceMessage* msg, const std::string& rf, | 191 ProtocolType proto, |
| 192 IceMessage* msg, |
| 193 const std::string& rf, |
175 bool /*port_muxed*/) { | 194 bool /*port_muxed*/) { |
176 turn_unknown_address_ = true; | 195 turn_unknown_address_ = true; |
177 } | 196 } |
178 void OnTurnCreatePermissionResult(TurnPort* port, | 197 void OnTurnCreatePermissionResult(TurnPort* port, |
179 const SocketAddress& addr, | 198 const SocketAddress& addr, |
180 int code) { | 199 int code) { |
181 // Ignoring the address. | 200 // Ignoring the address. |
182 turn_create_permission_success_ = (code == 0); | 201 turn_create_permission_success_ = (code == 0); |
183 } | 202 } |
184 | 203 |
(...skipping 20 matching lines...) Expand all Loading... |
205 } | 224 } |
206 rtc::AsyncSocket* CreateServerSocket(const SocketAddress addr) { | 225 rtc::AsyncSocket* CreateServerSocket(const SocketAddress addr) { |
207 rtc::AsyncSocket* socket = ss_->CreateAsyncSocket(SOCK_STREAM); | 226 rtc::AsyncSocket* socket = ss_->CreateAsyncSocket(SOCK_STREAM); |
208 EXPECT_GE(socket->Bind(addr), 0); | 227 EXPECT_GE(socket->Bind(addr), 0); |
209 EXPECT_GE(socket->Listen(5), 0); | 228 EXPECT_GE(socket->Listen(5), 0); |
210 return socket; | 229 return socket; |
211 } | 230 } |
212 | 231 |
213 void CreateTurnPort(const std::string& username, | 232 void CreateTurnPort(const std::string& username, |
214 const std::string& password, | 233 const std::string& password, |
215 const cricket::ProtocolAddress& server_address) { | 234 const ProtocolAddress& server_address) { |
216 CreateTurnPort(kLocalAddr1, username, password, server_address); | 235 CreateTurnPort(kLocalAddr1, username, password, server_address); |
217 } | 236 } |
218 void CreateTurnPort(const rtc::SocketAddress& local_address, | 237 void CreateTurnPort(const rtc::SocketAddress& local_address, |
219 const std::string& username, | 238 const std::string& username, |
220 const std::string& password, | 239 const std::string& password, |
221 const cricket::ProtocolAddress& server_address) { | 240 const ProtocolAddress& server_address) { |
222 cricket::RelayCredentials credentials(username, password); | 241 RelayCredentials credentials(username, password); |
223 turn_port_.reset(TurnPort::Create(main_, &socket_factory_, &network_, | 242 turn_port_.reset(TurnPort::Create(main_, &socket_factory_, &network_, |
224 local_address.ipaddr(), 0, 0, | 243 local_address.ipaddr(), 0, 0, |
225 kIceUfrag1, kIcePwd1, | 244 kIceUfrag1, kIcePwd1, |
226 server_address, credentials, 0, | 245 server_address, credentials, 0, |
227 std::string())); | 246 std::string())); |
228 // This TURN port will be the controlling. | 247 // This TURN port will be the controlling. |
229 turn_port_->SetIceRole(cricket::ICEROLE_CONTROLLING); | 248 turn_port_->SetIceRole(ICEROLE_CONTROLLING); |
230 ConnectSignals(); | 249 ConnectSignals(); |
231 } | 250 } |
232 | 251 |
233 // Should be identical to CreateTurnPort but specifies an origin value | 252 // Should be identical to CreateTurnPort but specifies an origin value |
234 // when creating the instance of TurnPort. | 253 // when creating the instance of TurnPort. |
235 void CreateTurnPortWithOrigin(const rtc::SocketAddress& local_address, | 254 void CreateTurnPortWithOrigin(const rtc::SocketAddress& local_address, |
236 const std::string& username, | 255 const std::string& username, |
237 const std::string& password, | 256 const std::string& password, |
238 const cricket::ProtocolAddress& server_address, | 257 const ProtocolAddress& server_address, |
239 const std::string& origin) { | 258 const std::string& origin) { |
240 cricket::RelayCredentials credentials(username, password); | 259 RelayCredentials credentials(username, password); |
241 turn_port_.reset(TurnPort::Create(main_, &socket_factory_, &network_, | 260 turn_port_.reset(TurnPort::Create(main_, &socket_factory_, &network_, |
242 local_address.ipaddr(), 0, 0, | 261 local_address.ipaddr(), 0, 0, |
243 kIceUfrag1, kIcePwd1, | 262 kIceUfrag1, kIcePwd1, |
244 server_address, credentials, 0, | 263 server_address, credentials, 0, |
245 origin)); | 264 origin)); |
246 // This TURN port will be the controlling. | 265 // This TURN port will be the controlling. |
247 turn_port_->SetIceRole(cricket::ICEROLE_CONTROLLING); | 266 turn_port_->SetIceRole(ICEROLE_CONTROLLING); |
248 ConnectSignals(); | 267 ConnectSignals(); |
249 } | 268 } |
250 | 269 |
251 void CreateSharedTurnPort(const std::string& username, | 270 void CreateSharedTurnPort(const std::string& username, |
252 const std::string& password, | 271 const std::string& password, |
253 const cricket::ProtocolAddress& server_address) { | 272 const ProtocolAddress& server_address) { |
254 ASSERT(server_address.proto == cricket::PROTO_UDP); | 273 ASSERT(server_address.proto == PROTO_UDP); |
255 | 274 |
256 if (!socket_) { | 275 if (!socket_) { |
257 socket_.reset(socket_factory_.CreateUdpSocket( | 276 socket_.reset(socket_factory_.CreateUdpSocket( |
258 rtc::SocketAddress(kLocalAddr1.ipaddr(), 0), 0, 0)); | 277 rtc::SocketAddress(kLocalAddr1.ipaddr(), 0), 0, 0)); |
259 ASSERT_TRUE(socket_ != NULL); | 278 ASSERT_TRUE(socket_ != NULL); |
260 socket_->SignalReadPacket.connect( | 279 socket_->SignalReadPacket.connect( |
261 this, &TurnPortTest::OnSocketReadPacket); | 280 this, &TurnPortTest::OnSocketReadPacket); |
262 } | 281 } |
263 | 282 |
264 cricket::RelayCredentials credentials(username, password); | 283 RelayCredentials credentials(username, password); |
265 turn_port_.reset(cricket::TurnPort::Create( | 284 turn_port_.reset(TurnPort::Create( |
266 main_, &socket_factory_, &network_, socket_.get(), | 285 main_, &socket_factory_, &network_, socket_.get(), kIceUfrag1, kIcePwd1, |
267 kIceUfrag1, kIcePwd1, server_address, credentials, 0, std::string())); | 286 server_address, credentials, 0, std::string())); |
268 // This TURN port will be the controlling. | 287 // This TURN port will be the controlling. |
269 turn_port_->SetIceRole(cricket::ICEROLE_CONTROLLING); | 288 turn_port_->SetIceRole(ICEROLE_CONTROLLING); |
270 ConnectSignals(); | 289 ConnectSignals(); |
271 } | 290 } |
272 | 291 |
273 void ConnectSignals() { | 292 void ConnectSignals() { |
274 turn_port_->SignalPortComplete.connect(this, | 293 turn_port_->SignalPortComplete.connect(this, |
275 &TurnPortTest::OnTurnPortComplete); | 294 &TurnPortTest::OnTurnPortComplete); |
276 turn_port_->SignalPortError.connect(this, | 295 turn_port_->SignalPortError.connect(this, |
277 &TurnPortTest::OnTurnPortError); | 296 &TurnPortTest::OnTurnPortError); |
278 turn_port_->SignalUnknownAddress.connect(this, | 297 turn_port_->SignalUnknownAddress.connect(this, |
279 &TurnPortTest::OnTurnUnknownAddress); | 298 &TurnPortTest::OnTurnUnknownAddress); |
280 turn_port_->SignalCreatePermissionResult.connect(this, | 299 turn_port_->SignalCreatePermissionResult.connect(this, |
281 &TurnPortTest::OnTurnCreatePermissionResult); | 300 &TurnPortTest::OnTurnCreatePermissionResult); |
282 turn_port_->SignalTurnRefreshResult.connect( | 301 turn_port_->SignalTurnRefreshResult.connect( |
283 this, &TurnPortTest::OnTurnRefreshResult); | 302 this, &TurnPortTest::OnTurnRefreshResult); |
284 } | 303 } |
285 | 304 |
286 void CreateUdpPort() { CreateUdpPort(kLocalAddr2); } | 305 void CreateUdpPort() { CreateUdpPort(kLocalAddr2); } |
287 | 306 |
288 void CreateUdpPort(const SocketAddress& address) { | 307 void CreateUdpPort(const SocketAddress& address) { |
289 udp_port_.reset(UDPPort::Create(main_, &socket_factory_, &network_, | 308 udp_port_.reset(UDPPort::Create(main_, &socket_factory_, &network_, |
290 address.ipaddr(), 0, 0, kIceUfrag2, | 309 address.ipaddr(), 0, 0, kIceUfrag2, |
291 kIcePwd2, std::string(), false)); | 310 kIcePwd2, std::string(), false)); |
292 // UDP port will be controlled. | 311 // UDP port will be controlled. |
293 udp_port_->SetIceRole(cricket::ICEROLE_CONTROLLED); | 312 udp_port_->SetIceRole(ICEROLE_CONTROLLED); |
294 udp_port_->SignalPortComplete.connect( | 313 udp_port_->SignalPortComplete.connect( |
295 this, &TurnPortTest::OnUdpPortComplete); | 314 this, &TurnPortTest::OnUdpPortComplete); |
296 } | 315 } |
297 | 316 |
298 void PrepareTurnAndUdpPorts() { | 317 void PrepareTurnAndUdpPorts(ProtocolType protocol_type) { |
299 // turn_port_ should have been created. | 318 // turn_port_ should have been created. |
300 ASSERT_TRUE(turn_port_ != nullptr); | 319 ASSERT_TRUE(turn_port_ != nullptr); |
301 turn_port_->PrepareAddress(); | 320 turn_port_->PrepareAddress(); |
302 ASSERT_TRUE_WAIT(turn_ready_, kTimeout); | 321 // Two round trips are required to allocate a TURN candidate. |
| 322 // Plus, an extra round trip is needed for TCP. |
| 323 ASSERT_TRUE_SIMULATED_WAIT( |
| 324 turn_ready_, |
| 325 protocol_type == PROTO_TCP ? kSimulatedRtt * 3 : kSimulatedRtt * 2, |
| 326 fake_clock_); |
303 | 327 |
304 CreateUdpPort(); | 328 CreateUdpPort(); |
305 udp_port_->PrepareAddress(); | 329 udp_port_->PrepareAddress(); |
306 ASSERT_TRUE_WAIT(udp_ready_, kTimeout); | 330 ASSERT_TRUE_SIMULATED_WAIT(udp_ready_, kSimulatedRtt, fake_clock_); |
307 } | 331 } |
308 | 332 |
309 bool CheckConnectionFailedAndPruned(Connection* conn) { | 333 bool CheckConnectionFailedAndPruned(Connection* conn) { |
310 return conn && !conn->active() && conn->state() == Connection::STATE_FAILED; | 334 return conn && !conn->active() && conn->state() == Connection::STATE_FAILED; |
311 } | 335 } |
312 | 336 |
313 // Checks that |turn_port_| has a nonempty set of connections and they are all | 337 // Checks that |turn_port_| has a nonempty set of connections and they are all |
314 // failed and pruned. | 338 // failed and pruned. |
315 bool CheckAllConnectionsFailedAndPruned() { | 339 bool CheckAllConnectionsFailedAndPruned() { |
316 auto& connections = turn_port_->connections(); | 340 auto& connections = turn_port_->connections(); |
317 if (connections.empty()) { | 341 if (connections.empty()) { |
318 return false; | 342 return false; |
319 } | 343 } |
320 for (auto kv : connections) { | 344 for (auto kv : connections) { |
321 if (!CheckConnectionFailedAndPruned(kv.second)) { | 345 if (!CheckConnectionFailedAndPruned(kv.second)) { |
322 return false; | 346 return false; |
323 } | 347 } |
324 } | 348 } |
325 return true; | 349 return true; |
326 } | 350 } |
327 | 351 |
328 void TestTurnAlternateServer(cricket::ProtocolType protocol_type) { | 352 void TestTurnAlternateServer(ProtocolType protocol_type) { |
329 std::vector<rtc::SocketAddress> redirect_addresses; | 353 std::vector<rtc::SocketAddress> redirect_addresses; |
330 redirect_addresses.push_back(kTurnAlternateIntAddr); | 354 redirect_addresses.push_back(kTurnAlternateIntAddr); |
331 | 355 |
332 cricket::TestTurnRedirector redirector(redirect_addresses); | 356 TestTurnRedirector redirector(redirect_addresses); |
333 | 357 |
334 turn_server_.AddInternalSocket(kTurnIntAddr, protocol_type); | 358 turn_server_.AddInternalSocket(kTurnIntAddr, protocol_type); |
335 turn_server_.AddInternalSocket(kTurnAlternateIntAddr, protocol_type); | 359 turn_server_.AddInternalSocket(kTurnAlternateIntAddr, protocol_type); |
336 turn_server_.set_redirect_hook(&redirector); | 360 turn_server_.set_redirect_hook(&redirector); |
337 CreateTurnPort(kTurnUsername, kTurnPassword, | 361 CreateTurnPort(kTurnUsername, kTurnPassword, |
338 cricket::ProtocolAddress(kTurnIntAddr, protocol_type)); | 362 ProtocolAddress(kTurnIntAddr, protocol_type)); |
339 | 363 |
340 // Retrieve the address before we run the state machine. | 364 // Retrieve the address before we run the state machine. |
341 const SocketAddress old_addr = turn_port_->server_address().address; | 365 const SocketAddress old_addr = turn_port_->server_address().address; |
342 | 366 |
343 turn_port_->PrepareAddress(); | 367 turn_port_->PrepareAddress(); |
344 EXPECT_TRUE_WAIT(turn_ready_, kTimeout * 100); | 368 // Extra round trip due to "use alternate server" error response. |
| 369 EXPECT_TRUE_SIMULATED_WAIT( |
| 370 turn_ready_, |
| 371 (protocol_type == PROTO_TCP ? kSimulatedRtt * 4 : kSimulatedRtt * 3), |
| 372 fake_clock_); |
345 // Retrieve the address again, the turn port's address should be | 373 // Retrieve the address again, the turn port's address should be |
346 // changed. | 374 // changed. |
347 const SocketAddress new_addr = turn_port_->server_address().address; | 375 const SocketAddress new_addr = turn_port_->server_address().address; |
348 EXPECT_NE(old_addr, new_addr); | 376 EXPECT_NE(old_addr, new_addr); |
349 ASSERT_EQ(1U, turn_port_->Candidates().size()); | 377 ASSERT_EQ(1U, turn_port_->Candidates().size()); |
350 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), | 378 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), |
351 turn_port_->Candidates()[0].address().ipaddr()); | 379 turn_port_->Candidates()[0].address().ipaddr()); |
352 EXPECT_NE(0, turn_port_->Candidates()[0].address().port()); | 380 EXPECT_NE(0, turn_port_->Candidates()[0].address().port()); |
353 } | 381 } |
354 | 382 |
355 void TestTurnAlternateServerV4toV6(cricket::ProtocolType protocol_type) { | 383 void TestTurnAlternateServerV4toV6(ProtocolType protocol_type) { |
356 std::vector<rtc::SocketAddress> redirect_addresses; | 384 std::vector<rtc::SocketAddress> redirect_addresses; |
357 redirect_addresses.push_back(kTurnIPv6IntAddr); | 385 redirect_addresses.push_back(kTurnIPv6IntAddr); |
358 | 386 |
359 cricket::TestTurnRedirector redirector(redirect_addresses); | 387 TestTurnRedirector redirector(redirect_addresses); |
360 turn_server_.AddInternalSocket(kTurnIntAddr, protocol_type); | 388 turn_server_.AddInternalSocket(kTurnIntAddr, protocol_type); |
361 turn_server_.set_redirect_hook(&redirector); | 389 turn_server_.set_redirect_hook(&redirector); |
362 CreateTurnPort(kTurnUsername, kTurnPassword, | 390 CreateTurnPort(kTurnUsername, kTurnPassword, |
363 cricket::ProtocolAddress(kTurnIntAddr, protocol_type)); | 391 ProtocolAddress(kTurnIntAddr, protocol_type)); |
364 turn_port_->PrepareAddress(); | 392 turn_port_->PrepareAddress(); |
365 EXPECT_TRUE_WAIT(turn_error_, kTimeout); | 393 EXPECT_TRUE_SIMULATED_WAIT(turn_error_, kSimulatedRtt * 2, fake_clock_); |
366 } | 394 } |
367 | 395 |
368 void TestTurnAlternateServerPingPong(cricket::ProtocolType protocol_type) { | 396 void TestTurnAlternateServerPingPong(ProtocolType protocol_type) { |
369 std::vector<rtc::SocketAddress> redirect_addresses; | 397 std::vector<rtc::SocketAddress> redirect_addresses; |
370 redirect_addresses.push_back(kTurnAlternateIntAddr); | 398 redirect_addresses.push_back(kTurnAlternateIntAddr); |
371 redirect_addresses.push_back(kTurnIntAddr); | 399 redirect_addresses.push_back(kTurnIntAddr); |
372 | 400 |
373 cricket::TestTurnRedirector redirector(redirect_addresses); | 401 TestTurnRedirector redirector(redirect_addresses); |
374 | 402 |
375 turn_server_.AddInternalSocket(kTurnIntAddr, protocol_type); | 403 turn_server_.AddInternalSocket(kTurnIntAddr, protocol_type); |
376 turn_server_.AddInternalSocket(kTurnAlternateIntAddr, protocol_type); | 404 turn_server_.AddInternalSocket(kTurnAlternateIntAddr, protocol_type); |
377 turn_server_.set_redirect_hook(&redirector); | 405 turn_server_.set_redirect_hook(&redirector); |
378 CreateTurnPort(kTurnUsername, kTurnPassword, | 406 CreateTurnPort(kTurnUsername, kTurnPassword, |
379 cricket::ProtocolAddress(kTurnIntAddr, protocol_type)); | 407 ProtocolAddress(kTurnIntAddr, protocol_type)); |
380 | 408 |
381 turn_port_->PrepareAddress(); | 409 turn_port_->PrepareAddress(); |
382 EXPECT_TRUE_WAIT(turn_error_, kTimeout); | 410 // Extra round trip due to "use alternate server" error response. |
| 411 EXPECT_TRUE_SIMULATED_WAIT( |
| 412 turn_error_, |
| 413 (protocol_type == PROTO_TCP ? kSimulatedRtt * 4 : kSimulatedRtt * 3), |
| 414 fake_clock_); |
383 ASSERT_EQ(0U, turn_port_->Candidates().size()); | 415 ASSERT_EQ(0U, turn_port_->Candidates().size()); |
384 rtc::SocketAddress address; | 416 rtc::SocketAddress address; |
385 // Verify that we have exhausted all alternate servers instead of | 417 // Verify that we have exhausted all alternate servers instead of |
386 // failure caused by other errors. | 418 // failure caused by other errors. |
387 EXPECT_FALSE(redirector.ShouldRedirect(address, &address)); | 419 EXPECT_FALSE(redirector.ShouldRedirect(address, &address)); |
388 } | 420 } |
389 | 421 |
390 void TestTurnAlternateServerDetectRepetition( | 422 void TestTurnAlternateServerDetectRepetition(ProtocolType protocol_type) { |
391 cricket::ProtocolType protocol_type) { | |
392 std::vector<rtc::SocketAddress> redirect_addresses; | 423 std::vector<rtc::SocketAddress> redirect_addresses; |
393 redirect_addresses.push_back(kTurnAlternateIntAddr); | 424 redirect_addresses.push_back(kTurnAlternateIntAddr); |
394 redirect_addresses.push_back(kTurnAlternateIntAddr); | 425 redirect_addresses.push_back(kTurnAlternateIntAddr); |
395 | 426 |
396 cricket::TestTurnRedirector redirector(redirect_addresses); | 427 TestTurnRedirector redirector(redirect_addresses); |
397 | 428 |
398 turn_server_.AddInternalSocket(kTurnIntAddr, protocol_type); | 429 turn_server_.AddInternalSocket(kTurnIntAddr, protocol_type); |
399 turn_server_.AddInternalSocket(kTurnAlternateIntAddr, protocol_type); | 430 turn_server_.AddInternalSocket(kTurnAlternateIntAddr, protocol_type); |
400 turn_server_.set_redirect_hook(&redirector); | 431 turn_server_.set_redirect_hook(&redirector); |
401 CreateTurnPort(kTurnUsername, kTurnPassword, | 432 CreateTurnPort(kTurnUsername, kTurnPassword, |
402 cricket::ProtocolAddress(kTurnIntAddr, protocol_type)); | 433 ProtocolAddress(kTurnIntAddr, protocol_type)); |
403 | 434 |
404 turn_port_->PrepareAddress(); | 435 turn_port_->PrepareAddress(); |
405 EXPECT_TRUE_WAIT(turn_error_, kTimeout); | 436 // Extra round trip due to "use alternate server" error response. |
| 437 EXPECT_TRUE_SIMULATED_WAIT( |
| 438 turn_error_, |
| 439 (protocol_type == PROTO_TCP ? kSimulatedRtt * 4 : kSimulatedRtt * 3), |
| 440 fake_clock_); |
406 ASSERT_EQ(0U, turn_port_->Candidates().size()); | 441 ASSERT_EQ(0U, turn_port_->Candidates().size()); |
407 } | 442 } |
408 | 443 |
409 void TestTurnConnection() { | 444 void TestTurnConnection(ProtocolType protocol_type) { |
410 // Create ports and prepare addresses. | 445 // Create ports and prepare addresses. |
411 PrepareTurnAndUdpPorts(); | 446 PrepareTurnAndUdpPorts(protocol_type); |
412 | 447 |
413 // Send ping from UDP to TURN. | 448 // Send ping from UDP to TURN. |
414 Connection* conn1 = udp_port_->CreateConnection( | 449 Connection* conn1 = udp_port_->CreateConnection( |
415 turn_port_->Candidates()[0], Port::ORIGIN_MESSAGE); | 450 turn_port_->Candidates()[0], Port::ORIGIN_MESSAGE); |
416 ASSERT_TRUE(conn1 != NULL); | 451 ASSERT_TRUE(conn1 != NULL); |
417 conn1->Ping(0); | 452 conn1->Ping(0); |
418 WAIT(!turn_unknown_address_, kTimeout); | 453 SIMULATED_WAIT(!turn_unknown_address_, kSimulatedRtt * 2, fake_clock_); |
419 EXPECT_FALSE(turn_unknown_address_); | 454 EXPECT_FALSE(turn_unknown_address_); |
420 EXPECT_FALSE(conn1->receiving()); | 455 EXPECT_FALSE(conn1->receiving()); |
421 EXPECT_EQ(Connection::STATE_WRITE_INIT, conn1->write_state()); | 456 EXPECT_EQ(Connection::STATE_WRITE_INIT, conn1->write_state()); |
422 | 457 |
423 // Send ping from TURN to UDP. | 458 // Send ping from TURN to UDP. |
424 Connection* conn2 = turn_port_->CreateConnection( | 459 Connection* conn2 = turn_port_->CreateConnection( |
425 udp_port_->Candidates()[0], Port::ORIGIN_MESSAGE); | 460 udp_port_->Candidates()[0], Port::ORIGIN_MESSAGE); |
426 ASSERT_TRUE(conn2 != NULL); | 461 ASSERT_TRUE(conn2 != NULL); |
427 ASSERT_TRUE_WAIT(turn_create_permission_success_, kTimeout); | 462 ASSERT_TRUE_SIMULATED_WAIT(turn_create_permission_success_, kSimulatedRtt, |
| 463 fake_clock_); |
428 conn2->Ping(0); | 464 conn2->Ping(0); |
429 | 465 |
430 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, conn2->write_state(), kTimeout); | 466 // Two hops from TURN port to UDP port through TURN server, thus two RTTs. |
| 467 EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, conn2->write_state(), |
| 468 kSimulatedRtt * 2, fake_clock_); |
431 EXPECT_TRUE(conn1->receiving()); | 469 EXPECT_TRUE(conn1->receiving()); |
432 EXPECT_TRUE(conn2->receiving()); | 470 EXPECT_TRUE(conn2->receiving()); |
433 EXPECT_EQ(Connection::STATE_WRITE_INIT, conn1->write_state()); | 471 EXPECT_EQ(Connection::STATE_WRITE_INIT, conn1->write_state()); |
434 | 472 |
435 // Send another ping from UDP to TURN. | 473 // Send another ping from UDP to TURN. |
436 conn1->Ping(0); | 474 conn1->Ping(0); |
437 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, conn1->write_state(), kTimeout); | 475 EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, conn1->write_state(), |
| 476 kSimulatedRtt * 2, fake_clock_); |
438 EXPECT_TRUE(conn2->receiving()); | 477 EXPECT_TRUE(conn2->receiving()); |
439 } | 478 } |
440 | 479 |
441 void TestDestroyTurnConnection() { | 480 void TestDestroyTurnConnection() { |
442 PrepareTurnAndUdpPorts(); | 481 PrepareTurnAndUdpPorts(PROTO_UDP); |
443 | 482 |
444 // Create connections on both ends. | 483 // Create connections on both ends. |
445 Connection* conn1 = udp_port_->CreateConnection(turn_port_->Candidates()[0], | 484 Connection* conn1 = udp_port_->CreateConnection(turn_port_->Candidates()[0], |
446 Port::ORIGIN_MESSAGE); | 485 Port::ORIGIN_MESSAGE); |
447 Connection* conn2 = turn_port_->CreateConnection(udp_port_->Candidates()[0], | 486 Connection* conn2 = turn_port_->CreateConnection(udp_port_->Candidates()[0], |
448 Port::ORIGIN_MESSAGE); | 487 Port::ORIGIN_MESSAGE); |
449 ASSERT_TRUE(conn2 != NULL); | 488 ASSERT_TRUE(conn2 != NULL); |
450 ASSERT_TRUE_WAIT(turn_create_permission_success_, kTimeout); | 489 ASSERT_TRUE_SIMULATED_WAIT(turn_create_permission_success_, kSimulatedRtt, |
| 490 fake_clock_); |
451 // Make sure turn connection can receive. | 491 // Make sure turn connection can receive. |
452 conn1->Ping(0); | 492 conn1->Ping(0); |
453 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, conn1->write_state(), kTimeout); | 493 EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, conn1->write_state(), |
| 494 kSimulatedRtt * 2, fake_clock_); |
454 EXPECT_FALSE(turn_unknown_address_); | 495 EXPECT_FALSE(turn_unknown_address_); |
455 | 496 |
456 // Destroy the connection on the turn port. The TurnEntry is still | 497 // Destroy the connection on the TURN port. The TurnEntry still exists, so |
457 // there. So the turn port gets ping from unknown address if it is pinged. | 498 // the TURN port should still process a ping from an unknown address. |
458 conn2->Destroy(); | 499 conn2->Destroy(); |
459 conn1->Ping(0); | 500 conn1->Ping(0); |
460 EXPECT_TRUE_WAIT(turn_unknown_address_, kTimeout); | 501 EXPECT_TRUE_SIMULATED_WAIT(turn_unknown_address_, kSimulatedRtt, |
| 502 fake_clock_); |
461 | 503 |
462 // Flush all requests in the invoker to destroy the TurnEntry. | 504 // Flush all requests in the invoker to destroy the TurnEntry. |
463 // However, the TURN port should still signal the unknown address. | 505 // Expect that it still processes an incoming ping and signals the |
| 506 // unknown address. |
464 turn_unknown_address_ = false; | 507 turn_unknown_address_ = false; |
465 turn_port_->invoker()->Flush(rtc::Thread::Current()); | 508 turn_port_->invoker()->Flush(rtc::Thread::Current()); |
466 conn1->Ping(0); | 509 conn1->Ping(0); |
467 EXPECT_TRUE_WAIT(turn_unknown_address_, kTimeout); | 510 EXPECT_TRUE_SIMULATED_WAIT(turn_unknown_address_, kSimulatedRtt, |
| 511 fake_clock_); |
468 | 512 |
469 // If the connection is created again, it will start to receive pings. | 513 // If the connection is created again, it will start to receive pings. |
470 conn2 = turn_port_->CreateConnection(udp_port_->Candidates()[0], | 514 conn2 = turn_port_->CreateConnection(udp_port_->Candidates()[0], |
471 Port::ORIGIN_MESSAGE); | 515 Port::ORIGIN_MESSAGE); |
472 conn1->Ping(0); | 516 conn1->Ping(0); |
473 EXPECT_TRUE_WAIT(conn2->receiving(), kTimeout); | 517 EXPECT_TRUE_SIMULATED_WAIT(conn2->receiving(), kSimulatedRtt, fake_clock_); |
474 } | 518 } |
475 | 519 |
476 void TestTurnSendData() { | 520 void TestTurnSendData(ProtocolType protocol_type) { |
477 PrepareTurnAndUdpPorts(); | 521 PrepareTurnAndUdpPorts(protocol_type); |
478 | 522 |
479 // Create connections and send pings. | 523 // Create connections and send pings. |
480 Connection* conn1 = turn_port_->CreateConnection( | 524 Connection* conn1 = turn_port_->CreateConnection( |
481 udp_port_->Candidates()[0], Port::ORIGIN_MESSAGE); | 525 udp_port_->Candidates()[0], Port::ORIGIN_MESSAGE); |
482 Connection* conn2 = udp_port_->CreateConnection( | 526 Connection* conn2 = udp_port_->CreateConnection( |
483 turn_port_->Candidates()[0], Port::ORIGIN_MESSAGE); | 527 turn_port_->Candidates()[0], Port::ORIGIN_MESSAGE); |
484 ASSERT_TRUE(conn1 != NULL); | 528 ASSERT_TRUE(conn1 != NULL); |
485 ASSERT_TRUE(conn2 != NULL); | 529 ASSERT_TRUE(conn2 != NULL); |
486 conn1->SignalReadPacket.connect(static_cast<TurnPortTest*>(this), | 530 conn1->SignalReadPacket.connect(static_cast<TurnPortTest*>(this), |
487 &TurnPortTest::OnTurnReadPacket); | 531 &TurnPortTest::OnTurnReadPacket); |
488 conn2->SignalReadPacket.connect(static_cast<TurnPortTest*>(this), | 532 conn2->SignalReadPacket.connect(static_cast<TurnPortTest*>(this), |
489 &TurnPortTest::OnUdpReadPacket); | 533 &TurnPortTest::OnUdpReadPacket); |
490 conn1->Ping(0); | 534 conn1->Ping(0); |
491 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, conn1->write_state(), kTimeout); | 535 EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, conn1->write_state(), |
| 536 kSimulatedRtt * 2, fake_clock_); |
492 conn2->Ping(0); | 537 conn2->Ping(0); |
493 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, conn2->write_state(), kTimeout); | 538 EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, conn2->write_state(), |
| 539 kSimulatedRtt * 2, fake_clock_); |
494 | 540 |
495 // Send some data. | 541 // Send some data. |
496 size_t num_packets = 256; | 542 size_t num_packets = 256; |
497 for (size_t i = 0; i < num_packets; ++i) { | 543 for (size_t i = 0; i < num_packets; ++i) { |
498 unsigned char buf[256] = { 0 }; | 544 unsigned char buf[256] = { 0 }; |
499 for (size_t j = 0; j < i + 1; ++j) { | 545 for (size_t j = 0; j < i + 1; ++j) { |
500 buf[j] = 0xFF - static_cast<unsigned char>(j); | 546 buf[j] = 0xFF - static_cast<unsigned char>(j); |
501 } | 547 } |
502 conn1->Send(buf, i + 1, options); | 548 conn1->Send(buf, i + 1, options); |
503 conn2->Send(buf, i + 1, options); | 549 conn2->Send(buf, i + 1, options); |
504 main_->ProcessMessages(0); | 550 SIMULATED_WAIT(false, kSimulatedRtt, fake_clock_); |
505 } | 551 } |
506 | 552 |
507 // Check the data. | 553 // Check the data. |
508 ASSERT_EQ_WAIT(num_packets, turn_packets_.size(), kTimeout); | 554 ASSERT_EQ(num_packets, turn_packets_.size()); |
509 ASSERT_EQ_WAIT(num_packets, udp_packets_.size(), kTimeout); | 555 ASSERT_EQ(num_packets, udp_packets_.size()); |
510 for (size_t i = 0; i < num_packets; ++i) { | 556 for (size_t i = 0; i < num_packets; ++i) { |
511 EXPECT_EQ(i + 1, turn_packets_[i].size()); | 557 EXPECT_EQ(i + 1, turn_packets_[i].size()); |
512 EXPECT_EQ(i + 1, udp_packets_[i].size()); | 558 EXPECT_EQ(i + 1, udp_packets_[i].size()); |
513 EXPECT_EQ(turn_packets_[i], udp_packets_[i]); | 559 EXPECT_EQ(turn_packets_[i], udp_packets_[i]); |
514 } | 560 } |
515 } | 561 } |
516 | 562 |
517 protected: | 563 protected: |
| 564 rtc::ScopedFakeClock fake_clock_; |
518 rtc::Thread* main_; | 565 rtc::Thread* main_; |
519 std::unique_ptr<rtc::PhysicalSocketServer> pss_; | 566 std::unique_ptr<rtc::PhysicalSocketServer> pss_; |
520 std::unique_ptr<TurnPortTestVirtualSocketServer> ss_; | 567 std::unique_ptr<TurnPortTestVirtualSocketServer> ss_; |
521 rtc::SocketServerScope ss_scope_; | 568 rtc::SocketServerScope ss_scope_; |
522 rtc::Network network_; | 569 rtc::Network network_; |
523 rtc::BasicPacketSocketFactory socket_factory_; | 570 rtc::BasicPacketSocketFactory socket_factory_; |
524 std::unique_ptr<rtc::AsyncPacketSocket> socket_; | 571 std::unique_ptr<rtc::AsyncPacketSocket> socket_; |
525 cricket::TestTurnServer turn_server_; | 572 TestTurnServer turn_server_; |
526 std::unique_ptr<TurnPort> turn_port_; | 573 std::unique_ptr<TurnPort> turn_port_; |
527 std::unique_ptr<UDPPort> udp_port_; | 574 std::unique_ptr<UDPPort> udp_port_; |
528 bool turn_ready_; | 575 bool turn_ready_; |
529 bool turn_error_; | 576 bool turn_error_; |
530 bool turn_unknown_address_; | 577 bool turn_unknown_address_; |
531 bool turn_create_permission_success_; | 578 bool turn_create_permission_success_; |
532 bool udp_ready_; | 579 bool udp_ready_; |
533 bool test_finish_; | 580 bool test_finish_; |
534 bool turn_refresh_success_ = false; | 581 bool turn_refresh_success_ = false; |
535 std::vector<rtc::Buffer> turn_packets_; | 582 std::vector<rtc::Buffer> turn_packets_; |
536 std::vector<rtc::Buffer> udp_packets_; | 583 std::vector<rtc::Buffer> udp_packets_; |
537 rtc::PacketOptions options; | 584 rtc::PacketOptions options; |
538 }; | 585 }; |
539 | 586 |
540 // Do a normal TURN allocation. | 587 // Do a normal TURN allocation. |
541 TEST_F(TurnPortTest, TestTurnAllocate) { | 588 TEST_F(TurnPortTest, TestTurnAllocate) { |
542 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); | 589 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
543 EXPECT_EQ(0, turn_port_->SetOption(rtc::Socket::OPT_SNDBUF, 10*1024)); | 590 EXPECT_EQ(0, turn_port_->SetOption(rtc::Socket::OPT_SNDBUF, 10*1024)); |
544 turn_port_->PrepareAddress(); | 591 turn_port_->PrepareAddress(); |
545 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); | 592 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_); |
546 ASSERT_EQ(1U, turn_port_->Candidates().size()); | 593 ASSERT_EQ(1U, turn_port_->Candidates().size()); |
547 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), | 594 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), |
548 turn_port_->Candidates()[0].address().ipaddr()); | 595 turn_port_->Candidates()[0].address().ipaddr()); |
549 EXPECT_NE(0, turn_port_->Candidates()[0].address().port()); | 596 EXPECT_NE(0, turn_port_->Candidates()[0].address().port()); |
550 } | 597 } |
551 | 598 |
552 // Testing a normal UDP allocation using TCP connection. | 599 // Testing a normal UDP allocation using TCP connection. |
553 TEST_F(TurnPortTest, TestTurnTcpAllocate) { | 600 TEST_F(TurnPortTest, TestTurnTcpAllocate) { |
554 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); | 601 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
555 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); | 602 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
556 EXPECT_EQ(0, turn_port_->SetOption(rtc::Socket::OPT_SNDBUF, 10*1024)); | 603 EXPECT_EQ(0, turn_port_->SetOption(rtc::Socket::OPT_SNDBUF, 10*1024)); |
557 turn_port_->PrepareAddress(); | 604 turn_port_->PrepareAddress(); |
558 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); | 605 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 3, fake_clock_); |
559 ASSERT_EQ(1U, turn_port_->Candidates().size()); | 606 ASSERT_EQ(1U, turn_port_->Candidates().size()); |
560 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), | 607 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), |
561 turn_port_->Candidates()[0].address().ipaddr()); | 608 turn_port_->Candidates()[0].address().ipaddr()); |
562 EXPECT_NE(0, turn_port_->Candidates()[0].address().port()); | 609 EXPECT_NE(0, turn_port_->Candidates()[0].address().port()); |
563 } | 610 } |
564 | 611 |
565 // Test case for WebRTC issue 3927 where a proxy binds to the local host address | 612 // Test case for WebRTC issue 3927 where a proxy binds to the local host address |
566 // instead the address that TurnPort originally bound to. The candidate pair | 613 // instead the address that TurnPort originally bound to. The candidate pair |
567 // impacted by this behavior should still be used. | 614 // impacted by this behavior should still be used. |
568 TEST_F(TurnPortTest, TestTurnTcpAllocationWhenProxyChangesAddressToLocalHost) { | 615 TEST_F(TurnPortTest, TestTurnTcpAllocationWhenProxyChangesAddressToLocalHost) { |
569 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); | 616 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
570 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); | 617 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
571 EXPECT_EQ(0, turn_port_->SetOption(rtc::Socket::OPT_SNDBUF, 10 * 1024)); | 618 EXPECT_EQ(0, turn_port_->SetOption(rtc::Socket::OPT_SNDBUF, 10 * 1024)); |
572 turn_port_->PrepareAddress(); | 619 turn_port_->PrepareAddress(); |
573 ConnectSignalAddressReadyToSetLocalhostAsAltenertativeLocalAddress(); | 620 ConnectSignalAddressReadyToSetLocalhostAsAltenertativeLocalAddress(); |
574 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); | 621 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 3, fake_clock_); |
575 ASSERT_EQ(1U, turn_port_->Candidates().size()); | 622 ASSERT_EQ(1U, turn_port_->Candidates().size()); |
576 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), | 623 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), |
577 turn_port_->Candidates()[0].address().ipaddr()); | 624 turn_port_->Candidates()[0].address().ipaddr()); |
578 EXPECT_NE(0, turn_port_->Candidates()[0].address().port()); | 625 EXPECT_NE(0, turn_port_->Candidates()[0].address().port()); |
579 } | 626 } |
580 | 627 |
581 // Testing turn port will attempt to create TCP socket on address resolution | 628 // Testing turn port will attempt to create TCP socket on address resolution |
582 // failure. | 629 // failure. |
583 TEST_F(TurnPortTest, DISABLED_TestTurnTcpOnAddressResolveFailure) { | 630 TEST_F(TurnPortTest, TestTurnTcpOnAddressResolveFailure) { |
584 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); | 631 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
585 CreateTurnPort(kTurnUsername, kTurnPassword, cricket::ProtocolAddress( | 632 CreateTurnPort(kTurnUsername, kTurnPassword, |
586 rtc::SocketAddress("www.webrtc-blah-blah.com", 3478), | 633 ProtocolAddress(rtc::SocketAddress("www.google.invalid", 3478), |
587 cricket::PROTO_TCP)); | 634 PROTO_TCP)); |
588 turn_port_->PrepareAddress(); | 635 turn_port_->PrepareAddress(); |
589 EXPECT_TRUE_WAIT(turn_error_, kTimeout); | 636 EXPECT_TRUE_WAIT(turn_error_, kResolverTimeout); |
590 // As VSS doesn't provide a DNS resolution, name resolve will fail. TurnPort | 637 // As VSS doesn't provide a DNS resolution, name resolve will fail. TurnPort |
591 // will proceed in creating a TCP socket which will fail as there is no | 638 // will proceed in creating a TCP socket which will fail as there is no |
592 // server on the above domain and error will be set to SOCKET_ERROR. | 639 // server on the above domain and error will be set to SOCKET_ERROR. |
593 EXPECT_EQ(SOCKET_ERROR, turn_port_->error()); | 640 EXPECT_EQ(SOCKET_ERROR, turn_port_->error()); |
594 } | 641 } |
595 | 642 |
596 // In case of UDP on address resolve failure, TurnPort will not create socket | 643 // In case of UDP on address resolve failure, TurnPort will not create socket |
597 // and return allocate failure. | 644 // and return allocate failure. |
598 TEST_F(TurnPortTest, DISABLED_TestTurnUdpOnAddressResolveFailure) { | 645 TEST_F(TurnPortTest, TestTurnUdpOnAddressResolveFailure) { |
599 CreateTurnPort(kTurnUsername, kTurnPassword, cricket::ProtocolAddress( | 646 CreateTurnPort(kTurnUsername, kTurnPassword, |
600 rtc::SocketAddress("www.webrtc-blah-blah.com", 3478), | 647 ProtocolAddress(rtc::SocketAddress("www.google.invalid", 3478), |
601 cricket::PROTO_UDP)); | 648 PROTO_UDP)); |
602 turn_port_->PrepareAddress(); | 649 turn_port_->PrepareAddress(); |
603 EXPECT_TRUE_WAIT(turn_error_, kTimeout); | 650 EXPECT_TRUE_WAIT(turn_error_, kResolverTimeout); |
604 // Error from turn port will not be socket error. | 651 // Error from turn port will not be socket error. |
605 EXPECT_NE(SOCKET_ERROR, turn_port_->error()); | 652 EXPECT_NE(SOCKET_ERROR, turn_port_->error()); |
606 } | 653 } |
607 | 654 |
608 // Try to do a TURN allocation with an invalid password. | 655 // Try to do a TURN allocation with an invalid password. |
609 TEST_F(TurnPortTest, TestTurnAllocateBadPassword) { | 656 TEST_F(TurnPortTest, TestTurnAllocateBadPassword) { |
610 CreateTurnPort(kTurnUsername, "bad", kTurnUdpProtoAddr); | 657 CreateTurnPort(kTurnUsername, "bad", kTurnUdpProtoAddr); |
611 turn_port_->PrepareAddress(); | 658 turn_port_->PrepareAddress(); |
612 EXPECT_TRUE_WAIT(turn_error_, kTimeout); | 659 EXPECT_TRUE_SIMULATED_WAIT(turn_error_, kSimulatedRtt * 2, fake_clock_); |
613 ASSERT_EQ(0U, turn_port_->Candidates().size()); | 660 ASSERT_EQ(0U, turn_port_->Candidates().size()); |
614 } | 661 } |
615 | 662 |
616 // Tests that TURN port nonce will be reset when receiving an ALLOCATE MISMATCH | 663 // Tests that TURN port nonce will be reset when receiving an ALLOCATE MISMATCH |
617 // error. | 664 // error. |
618 TEST_F(TurnPortTest, TestTurnAllocateNonceResetAfterAllocateMismatch) { | 665 TEST_F(TurnPortTest, TestTurnAllocateNonceResetAfterAllocateMismatch) { |
619 // Do a normal allocation first. | 666 // Do a normal allocation first. |
620 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); | 667 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
621 turn_port_->PrepareAddress(); | 668 turn_port_->PrepareAddress(); |
622 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); | 669 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_); |
623 rtc::SocketAddress first_addr(turn_port_->socket()->GetLocalAddress()); | 670 rtc::SocketAddress first_addr(turn_port_->socket()->GetLocalAddress()); |
624 // Destroy the turnport while keeping the drop probability to 1 to | 671 // Destroy the turnport while keeping the drop probability to 1 to |
625 // suppress the release of the allocation at the server. | 672 // suppress the release of the allocation at the server. |
626 ss_->set_drop_probability(1.0); | 673 ss_->set_drop_probability(1.0); |
627 turn_port_.reset(); | 674 turn_port_.reset(); |
628 rtc::Thread::Current()->ProcessMessages(0); | 675 SIMULATED_WAIT(false, kSimulatedRtt, fake_clock_); |
629 ss_->set_drop_probability(0.0); | 676 ss_->set_drop_probability(0.0); |
630 | 677 |
631 // Force the socket server to assign the same port. | 678 // Force the socket server to assign the same port. |
632 ss_->SetNextPortForTesting(first_addr.port()); | 679 ss_->SetNextPortForTesting(first_addr.port()); |
633 turn_ready_ = false; | 680 turn_ready_ = false; |
634 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); | 681 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
635 | 682 |
636 // It is expected that the turn port will first get a nonce from the server | 683 // It is expected that the turn port will first get a nonce from the server |
637 // using timestamp |ts_before| but then get an allocate mismatch error and | 684 // using timestamp |ts_before| but then get an allocate mismatch error and |
638 // receive an even newer nonce based on the system clock. |ts_before| is | 685 // receive an even newer nonce based on the system clock. |ts_before| is |
639 // chosen so that the two NONCEs generated by the server will be different. | 686 // chosen so that the two NONCEs generated by the server will be different. |
640 int64_t ts_before = rtc::TimeMillis() - 1; | 687 int64_t ts_before = rtc::TimeMillis() - 1; |
641 std::string first_nonce = | 688 std::string first_nonce = |
642 turn_server_.server()->SetTimestampForNextNonce(ts_before); | 689 turn_server_.server()->SetTimestampForNextNonce(ts_before); |
643 turn_port_->PrepareAddress(); | 690 turn_port_->PrepareAddress(); |
644 | 691 |
645 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); | 692 // Four round trips; first we'll get "stale nonce", then |
| 693 // "allocate mismatch", then "stale nonce" again, then finally it will |
| 694 // succeed. |
| 695 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 4, fake_clock_); |
646 EXPECT_NE(first_nonce, turn_port_->nonce()); | 696 EXPECT_NE(first_nonce, turn_port_->nonce()); |
647 } | 697 } |
648 | 698 |
649 // Tests that a new local address is created after | 699 // Tests that a new local address is created after |
650 // STUN_ERROR_ALLOCATION_MISMATCH. | 700 // STUN_ERROR_ALLOCATION_MISMATCH. |
651 TEST_F(TurnPortTest, TestTurnAllocateMismatch) { | 701 TEST_F(TurnPortTest, TestTurnAllocateMismatch) { |
652 // Do a normal allocation first. | 702 // Do a normal allocation first. |
653 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); | 703 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
654 turn_port_->PrepareAddress(); | 704 turn_port_->PrepareAddress(); |
655 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); | 705 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_); |
656 rtc::SocketAddress first_addr(turn_port_->socket()->GetLocalAddress()); | 706 rtc::SocketAddress first_addr(turn_port_->socket()->GetLocalAddress()); |
657 | 707 |
658 // Clear connected_ flag on turnport to suppress the release of | 708 // Clear connected_ flag on turnport to suppress the release of |
659 // the allocation. | 709 // the allocation. |
660 turn_port_->OnSocketClose(turn_port_->socket(), 0); | 710 turn_port_->OnSocketClose(turn_port_->socket(), 0); |
661 | 711 |
662 // Forces the socket server to assign the same port. | 712 // Forces the socket server to assign the same port. |
663 ss_->SetNextPortForTesting(first_addr.port()); | 713 ss_->SetNextPortForTesting(first_addr.port()); |
664 | 714 |
665 turn_ready_ = false; | 715 turn_ready_ = false; |
666 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); | 716 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
667 turn_port_->PrepareAddress(); | 717 turn_port_->PrepareAddress(); |
668 | 718 |
669 // Verifies that the new port has the same address. | 719 // Verifies that the new port has the same address. |
670 EXPECT_EQ(first_addr, turn_port_->socket()->GetLocalAddress()); | 720 EXPECT_EQ(first_addr, turn_port_->socket()->GetLocalAddress()); |
671 | 721 |
672 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); | 722 // Four round trips; first we'll get "stale nonce", then |
| 723 // "allocate mismatch", then "stale nonce" again, then finally it will |
| 724 // succeed. |
| 725 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 4, fake_clock_); |
673 | 726 |
674 // Verifies that the new port has a different address now. | 727 // Verifies that the new port has a different address now. |
675 EXPECT_NE(first_addr, turn_port_->socket()->GetLocalAddress()); | 728 EXPECT_NE(first_addr, turn_port_->socket()->GetLocalAddress()); |
676 | 729 |
677 // Verify that all packets received from the shared socket are ignored. | 730 // Verify that all packets received from the shared socket are ignored. |
678 std::string test_packet = "Test packet"; | 731 std::string test_packet = "Test packet"; |
679 EXPECT_FALSE(turn_port_->HandleIncomingPacket( | 732 EXPECT_FALSE(turn_port_->HandleIncomingPacket( |
680 socket_.get(), test_packet.data(), test_packet.size(), | 733 socket_.get(), test_packet.data(), test_packet.size(), |
681 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0), | 734 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0), |
682 rtc::CreatePacketTime(0))); | 735 rtc::CreatePacketTime(0))); |
683 } | 736 } |
684 | 737 |
685 // Tests that a shared-socket-TurnPort creates its own socket after | 738 // Tests that a shared-socket-TurnPort creates its own socket after |
686 // STUN_ERROR_ALLOCATION_MISMATCH. | 739 // STUN_ERROR_ALLOCATION_MISMATCH. |
687 TEST_F(TurnPortTest, TestSharedSocketAllocateMismatch) { | 740 TEST_F(TurnPortTest, TestSharedSocketAllocateMismatch) { |
688 // Do a normal allocation first. | 741 // Do a normal allocation first. |
689 CreateSharedTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); | 742 CreateSharedTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
690 turn_port_->PrepareAddress(); | 743 turn_port_->PrepareAddress(); |
691 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); | 744 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_); |
692 rtc::SocketAddress first_addr(turn_port_->socket()->GetLocalAddress()); | 745 rtc::SocketAddress first_addr(turn_port_->socket()->GetLocalAddress()); |
693 | 746 |
694 // Clear connected_ flag on turnport to suppress the release of | 747 // Clear connected_ flag on turnport to suppress the release of |
695 // the allocation. | 748 // the allocation. |
696 turn_port_->OnSocketClose(turn_port_->socket(), 0); | 749 turn_port_->OnSocketClose(turn_port_->socket(), 0); |
697 | 750 |
698 turn_ready_ = false; | 751 turn_ready_ = false; |
699 CreateSharedTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); | 752 CreateSharedTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
700 | 753 |
701 // Verifies that the new port has the same address. | 754 // Verifies that the new port has the same address. |
702 EXPECT_EQ(first_addr, turn_port_->socket()->GetLocalAddress()); | 755 EXPECT_EQ(first_addr, turn_port_->socket()->GetLocalAddress()); |
703 EXPECT_TRUE(turn_port_->SharedSocket()); | 756 EXPECT_TRUE(turn_port_->SharedSocket()); |
704 | 757 |
705 turn_port_->PrepareAddress(); | 758 turn_port_->PrepareAddress(); |
706 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); | 759 // Extra 2 round trips due to allocate mismatch. |
| 760 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 4, fake_clock_); |
707 | 761 |
708 // Verifies that the new port has a different address now. | 762 // Verifies that the new port has a different address now. |
709 EXPECT_NE(first_addr, turn_port_->socket()->GetLocalAddress()); | 763 EXPECT_NE(first_addr, turn_port_->socket()->GetLocalAddress()); |
710 EXPECT_FALSE(turn_port_->SharedSocket()); | 764 EXPECT_FALSE(turn_port_->SharedSocket()); |
711 } | 765 } |
712 | 766 |
713 TEST_F(TurnPortTest, TestTurnTcpAllocateMismatch) { | 767 TEST_F(TurnPortTest, TestTurnTcpAllocateMismatch) { |
714 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); | 768 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
715 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); | 769 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
716 | 770 |
717 // Do a normal allocation first. | 771 // Do a normal allocation first. |
718 turn_port_->PrepareAddress(); | 772 turn_port_->PrepareAddress(); |
719 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); | 773 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 3, fake_clock_); |
720 rtc::SocketAddress first_addr(turn_port_->socket()->GetLocalAddress()); | 774 rtc::SocketAddress first_addr(turn_port_->socket()->GetLocalAddress()); |
721 | 775 |
722 // Clear connected_ flag on turnport to suppress the release of | 776 // Clear connected_ flag on turnport to suppress the release of |
723 // the allocation. | 777 // the allocation. |
724 turn_port_->OnSocketClose(turn_port_->socket(), 0); | 778 turn_port_->OnSocketClose(turn_port_->socket(), 0); |
725 | 779 |
726 // Forces the socket server to assign the same port. | 780 // Forces the socket server to assign the same port. |
727 ss_->SetNextPortForTesting(first_addr.port()); | 781 ss_->SetNextPortForTesting(first_addr.port()); |
728 | 782 |
729 turn_ready_ = false; | 783 turn_ready_ = false; |
730 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); | 784 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
731 turn_port_->PrepareAddress(); | 785 turn_port_->PrepareAddress(); |
732 | 786 |
733 // Verifies that the new port has the same address. | 787 // Verifies that the new port has the same address. |
734 EXPECT_EQ(first_addr, turn_port_->socket()->GetLocalAddress()); | 788 EXPECT_EQ(first_addr, turn_port_->socket()->GetLocalAddress()); |
735 | 789 |
736 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); | 790 // Extra 2 round trips due to allocate mismatch. |
| 791 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 5, fake_clock_); |
737 | 792 |
738 // Verifies that the new port has a different address now. | 793 // Verifies that the new port has a different address now. |
739 EXPECT_NE(first_addr, turn_port_->socket()->GetLocalAddress()); | 794 EXPECT_NE(first_addr, turn_port_->socket()->GetLocalAddress()); |
740 } | 795 } |
741 | 796 |
742 TEST_F(TurnPortTest, TestRefreshRequestGetsErrorResponse) { | 797 TEST_F(TurnPortTest, TestRefreshRequestGetsErrorResponse) { |
743 rtc::ScopedFakeClock clock; | |
744 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); | 798 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
745 PrepareTurnAndUdpPorts(); | 799 PrepareTurnAndUdpPorts(PROTO_UDP); |
746 turn_port_->CreateConnection(udp_port_->Candidates()[0], | 800 turn_port_->CreateConnection(udp_port_->Candidates()[0], |
747 Port::ORIGIN_MESSAGE); | 801 Port::ORIGIN_MESSAGE); |
748 // Set bad credentials. | 802 // Set bad credentials. |
749 cricket::RelayCredentials bad_credentials("bad_user", "bad_pwd"); | 803 RelayCredentials bad_credentials("bad_user", "bad_pwd"); |
750 turn_port_->set_credentials(bad_credentials); | 804 turn_port_->set_credentials(bad_credentials); |
751 turn_refresh_success_ = false; | 805 turn_refresh_success_ = false; |
752 // This sends out the first RefreshRequest with correct credentials. | 806 // This sends out the first RefreshRequest with correct credentials. |
753 // When this succeeds, it will schedule a new RefreshRequest with the bad | 807 // When this succeeds, it will schedule a new RefreshRequest with the bad |
754 // credential. | 808 // credential. |
755 turn_port_->FlushRequests(cricket::TURN_REFRESH_REQUEST); | 809 turn_port_->FlushRequests(TURN_REFRESH_REQUEST); |
756 EXPECT_TRUE_SIMULATED_WAIT(turn_refresh_success_, kTimeout, clock); | 810 EXPECT_TRUE_SIMULATED_WAIT(turn_refresh_success_, kSimulatedRtt, fake_clock_); |
757 // Flush it again, it will receive a bad response. | 811 // Flush it again, it will receive a bad response. |
758 turn_port_->FlushRequests(cricket::TURN_REFRESH_REQUEST); | 812 turn_port_->FlushRequests(TURN_REFRESH_REQUEST); |
759 EXPECT_TRUE_SIMULATED_WAIT(!turn_refresh_success_, kTimeout, clock); | 813 EXPECT_TRUE_SIMULATED_WAIT(!turn_refresh_success_, kSimulatedRtt, |
760 EXPECT_TRUE_SIMULATED_WAIT(!turn_port_->connected(), kTimeout, clock); | 814 fake_clock_); |
761 EXPECT_TRUE_SIMULATED_WAIT(CheckAllConnectionsFailedAndPruned(), kTimeout, | 815 EXPECT_FALSE(turn_port_->connected()); |
762 clock); | 816 EXPECT_TRUE(CheckAllConnectionsFailedAndPruned()); |
763 EXPECT_TRUE_SIMULATED_WAIT(!turn_port_->HasRequests(), kTimeout, clock); | 817 EXPECT_FALSE(turn_port_->HasRequests()); |
764 } | 818 } |
765 | 819 |
766 // Test that TurnPort will not handle any incoming packets once it has been | 820 // Test that TurnPort will not handle any incoming packets once it has been |
767 // closed. | 821 // closed. |
768 TEST_F(TurnPortTest, TestStopProcessingPacketsAfterClosed) { | 822 TEST_F(TurnPortTest, TestStopProcessingPacketsAfterClosed) { |
769 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); | 823 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
770 PrepareTurnAndUdpPorts(); | 824 PrepareTurnAndUdpPorts(PROTO_UDP); |
771 Connection* conn1 = turn_port_->CreateConnection(udp_port_->Candidates()[0], | 825 Connection* conn1 = turn_port_->CreateConnection(udp_port_->Candidates()[0], |
772 Port::ORIGIN_MESSAGE); | 826 Port::ORIGIN_MESSAGE); |
773 Connection* conn2 = udp_port_->CreateConnection(turn_port_->Candidates()[0], | 827 Connection* conn2 = udp_port_->CreateConnection(turn_port_->Candidates()[0], |
774 Port::ORIGIN_MESSAGE); | 828 Port::ORIGIN_MESSAGE); |
775 ASSERT_TRUE(conn1 != NULL); | 829 ASSERT_TRUE(conn1 != NULL); |
776 ASSERT_TRUE(conn2 != NULL); | 830 ASSERT_TRUE(conn2 != NULL); |
777 // Make sure conn2 is writable. | 831 // Make sure conn2 is writable. |
778 conn2->Ping(0); | 832 conn2->Ping(0); |
779 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, conn2->write_state(), kTimeout); | 833 EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, conn2->write_state(), |
| 834 kSimulatedRtt * 2, fake_clock_); |
780 | 835 |
781 turn_port_->Close(); | 836 turn_port_->Close(); |
782 rtc::Thread::Current()->ProcessMessages(0); | 837 SIMULATED_WAIT(false, kSimulatedRtt, fake_clock_); |
783 turn_unknown_address_ = false; | 838 turn_unknown_address_ = false; |
784 conn2->Ping(0); | 839 conn2->Ping(0); |
785 rtc::Thread::Current()->ProcessMessages(500); | 840 SIMULATED_WAIT(false, kSimulatedRtt, fake_clock_); |
786 // Since the turn port does not handle packets any more, it should not | 841 // Since the turn port does not handle packets any more, it should not |
787 // SignalUnknownAddress. | 842 // SignalUnknownAddress. |
788 EXPECT_FALSE(turn_unknown_address_); | 843 EXPECT_FALSE(turn_unknown_address_); |
789 } | 844 } |
790 | 845 |
791 // Test that CreateConnection will return null if port becomes disconnected. | 846 // Test that CreateConnection will return null if port becomes disconnected. |
792 TEST_F(TurnPortTest, TestCreateConnectionWhenSocketClosed) { | 847 TEST_F(TurnPortTest, TestCreateConnectionWhenSocketClosed) { |
793 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); | 848 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
794 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); | 849 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
795 PrepareTurnAndUdpPorts(); | 850 PrepareTurnAndUdpPorts(PROTO_TCP); |
796 // Create a connection. | 851 // Create a connection. |
797 Connection* conn1 = turn_port_->CreateConnection(udp_port_->Candidates()[0], | 852 Connection* conn1 = turn_port_->CreateConnection(udp_port_->Candidates()[0], |
798 Port::ORIGIN_MESSAGE); | 853 Port::ORIGIN_MESSAGE); |
799 ASSERT_TRUE(conn1 != NULL); | 854 ASSERT_TRUE(conn1 != NULL); |
800 | 855 |
801 // Close the socket and create a connection again. | 856 // Close the socket and create a connection again. |
802 turn_port_->OnSocketClose(turn_port_->socket(), 1); | 857 turn_port_->OnSocketClose(turn_port_->socket(), 1); |
803 conn1 = turn_port_->CreateConnection(udp_port_->Candidates()[0], | 858 conn1 = turn_port_->CreateConnection(udp_port_->Candidates()[0], |
804 Port::ORIGIN_MESSAGE); | 859 Port::ORIGIN_MESSAGE); |
805 ASSERT_TRUE(conn1 == NULL); | 860 ASSERT_TRUE(conn1 == NULL); |
806 } | 861 } |
807 | 862 |
808 // Tests that when a TCP socket is closed, the respective TURN connection will | 863 // Tests that when a TCP socket is closed, the respective TURN connection will |
809 // be destroyed. | 864 // be destroyed. |
810 TEST_F(TurnPortTest, TestSocketCloseWillDestroyConnection) { | 865 TEST_F(TurnPortTest, TestSocketCloseWillDestroyConnection) { |
811 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); | 866 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
812 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); | 867 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
813 PrepareTurnAndUdpPorts(); | 868 PrepareTurnAndUdpPorts(PROTO_TCP); |
814 Connection* conn = turn_port_->CreateConnection(udp_port_->Candidates()[0], | 869 Connection* conn = turn_port_->CreateConnection(udp_port_->Candidates()[0], |
815 Port::ORIGIN_MESSAGE); | 870 Port::ORIGIN_MESSAGE); |
816 EXPECT_NE(nullptr, conn); | 871 EXPECT_NE(nullptr, conn); |
817 EXPECT_TRUE(!turn_port_->connections().empty()); | 872 EXPECT_TRUE(!turn_port_->connections().empty()); |
818 turn_port_->socket()->SignalClose(turn_port_->socket(), 1); | 873 turn_port_->socket()->SignalClose(turn_port_->socket(), 1); |
819 EXPECT_TRUE_WAIT(turn_port_->connections().empty(), kTimeout); | 874 EXPECT_TRUE_SIMULATED_WAIT(turn_port_->connections().empty(), |
| 875 kConnectionDestructionDelay, fake_clock_); |
820 } | 876 } |
821 | 877 |
822 // Test try-alternate-server feature. | 878 // Test try-alternate-server feature. |
823 TEST_F(TurnPortTest, TestTurnAlternateServerUDP) { | 879 TEST_F(TurnPortTest, TestTurnAlternateServerUDP) { |
824 TestTurnAlternateServer(cricket::PROTO_UDP); | 880 TestTurnAlternateServer(PROTO_UDP); |
825 } | 881 } |
826 | 882 |
827 TEST_F(TurnPortTest, TestTurnAlternateServerTCP) { | 883 TEST_F(TurnPortTest, TestTurnAlternateServerTCP) { |
828 TestTurnAlternateServer(cricket::PROTO_TCP); | 884 TestTurnAlternateServer(PROTO_TCP); |
829 } | 885 } |
830 | 886 |
831 // Test that we fail when we redirect to an address different from | 887 // Test that we fail when we redirect to an address different from |
832 // current IP family. | 888 // current IP family. |
833 TEST_F(TurnPortTest, TestTurnAlternateServerV4toV6UDP) { | 889 TEST_F(TurnPortTest, TestTurnAlternateServerV4toV6UDP) { |
834 TestTurnAlternateServerV4toV6(cricket::PROTO_UDP); | 890 TestTurnAlternateServerV4toV6(PROTO_UDP); |
835 } | 891 } |
836 | 892 |
837 TEST_F(TurnPortTest, TestTurnAlternateServerV4toV6TCP) { | 893 TEST_F(TurnPortTest, TestTurnAlternateServerV4toV6TCP) { |
838 TestTurnAlternateServerV4toV6(cricket::PROTO_TCP); | 894 TestTurnAlternateServerV4toV6(PROTO_TCP); |
839 } | 895 } |
840 | 896 |
841 // Test try-alternate-server catches the case of pingpong. | 897 // Test try-alternate-server catches the case of pingpong. |
842 TEST_F(TurnPortTest, TestTurnAlternateServerPingPongUDP) { | 898 TEST_F(TurnPortTest, TestTurnAlternateServerPingPongUDP) { |
843 TestTurnAlternateServerPingPong(cricket::PROTO_UDP); | 899 TestTurnAlternateServerPingPong(PROTO_UDP); |
844 } | 900 } |
845 | 901 |
846 TEST_F(TurnPortTest, TestTurnAlternateServerPingPongTCP) { | 902 TEST_F(TurnPortTest, TestTurnAlternateServerPingPongTCP) { |
847 TestTurnAlternateServerPingPong(cricket::PROTO_TCP); | 903 TestTurnAlternateServerPingPong(PROTO_TCP); |
848 } | 904 } |
849 | 905 |
850 // Test try-alternate-server catch the case of repeated server. | 906 // Test try-alternate-server catch the case of repeated server. |
851 TEST_F(TurnPortTest, TestTurnAlternateServerDetectRepetitionUDP) { | 907 TEST_F(TurnPortTest, TestTurnAlternateServerDetectRepetitionUDP) { |
852 TestTurnAlternateServerDetectRepetition(cricket::PROTO_UDP); | 908 TestTurnAlternateServerDetectRepetition(PROTO_UDP); |
853 } | 909 } |
854 | 910 |
855 TEST_F(TurnPortTest, TestTurnAlternateServerDetectRepetitionTCP) { | 911 TEST_F(TurnPortTest, TestTurnAlternateServerDetectRepetitionTCP) { |
856 TestTurnAlternateServerDetectRepetition(cricket::PROTO_TCP); | 912 TestTurnAlternateServerDetectRepetition(PROTO_TCP); |
857 } | 913 } |
858 | 914 |
859 // Do a TURN allocation and try to send a packet to it from the outside. | 915 // Do a TURN allocation and try to send a packet to it from the outside. |
860 // The packet should be dropped. Then, try to send a packet from TURN to the | 916 // The packet should be dropped. Then, try to send a packet from TURN to the |
861 // outside. It should reach its destination. Finally, try again from the | 917 // outside. It should reach its destination. Finally, try again from the |
862 // outside. It should now work as well. | 918 // outside. It should now work as well. |
863 TEST_F(TurnPortTest, TestTurnConnection) { | 919 TEST_F(TurnPortTest, TestTurnConnection) { |
864 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); | 920 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
865 TestTurnConnection(); | 921 TestTurnConnection(PROTO_UDP); |
866 } | 922 } |
867 | 923 |
868 // Similar to above, except that this test will use the shared socket. | 924 // Similar to above, except that this test will use the shared socket. |
869 TEST_F(TurnPortTest, TestTurnConnectionUsingSharedSocket) { | 925 TEST_F(TurnPortTest, TestTurnConnectionUsingSharedSocket) { |
870 CreateSharedTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); | 926 CreateSharedTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
871 TestTurnConnection(); | 927 TestTurnConnection(PROTO_UDP); |
872 } | 928 } |
873 | 929 |
874 // Test that we can establish a TCP connection with TURN server. | 930 // Test that we can establish a TCP connection with TURN server. |
875 TEST_F(TurnPortTest, TestTurnTcpConnection) { | 931 TEST_F(TurnPortTest, TestTurnTcpConnection) { |
876 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); | 932 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
877 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); | 933 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
878 TestTurnConnection(); | 934 TestTurnConnection(PROTO_TCP); |
879 } | 935 } |
880 | 936 |
881 // Test that if a connection on a TURN port is destroyed, the TURN port can | 937 // Test that if a connection on a TURN port is destroyed, the TURN port can |
882 // still receive ping on that connection as if it is from an unknown address. | 938 // still receive ping on that connection as if it is from an unknown address. |
883 // If the connection is created again, it will be used to receive ping. | 939 // If the connection is created again, it will be used to receive ping. |
884 TEST_F(TurnPortTest, TestDestroyTurnConnection) { | 940 TEST_F(TurnPortTest, TestDestroyTurnConnection) { |
885 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); | 941 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
886 TestDestroyTurnConnection(); | 942 TestDestroyTurnConnection(); |
887 } | 943 } |
888 | 944 |
889 // Similar to above, except that this test will use the shared socket. | 945 // Similar to above, except that this test will use the shared socket. |
890 TEST_F(TurnPortTest, TestDestroyTurnConnectionUsingSharedSocket) { | 946 TEST_F(TurnPortTest, TestDestroyTurnConnectionUsingSharedSocket) { |
891 CreateSharedTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); | 947 CreateSharedTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
892 TestDestroyTurnConnection(); | 948 TestDestroyTurnConnection(); |
893 } | 949 } |
894 | 950 |
895 // Test that we fail to create a connection when we want to use TLS over TCP. | 951 // Test that we fail to create a connection when we want to use TLS over TCP. |
896 // This test should be removed once we have TLS support. | 952 // This test should be removed once we have TLS support. |
897 TEST_F(TurnPortTest, TestTurnTlsTcpConnectionFails) { | 953 TEST_F(TurnPortTest, TestTurnTlsTcpConnectionFails) { |
898 cricket::ProtocolAddress secure_addr(kTurnTcpProtoAddr.address, | 954 ProtocolAddress secure_addr(kTurnTcpProtoAddr.address, |
899 kTurnTcpProtoAddr.proto, | 955 kTurnTcpProtoAddr.proto, true); |
900 true); | |
901 CreateTurnPort(kTurnUsername, kTurnPassword, secure_addr); | 956 CreateTurnPort(kTurnUsername, kTurnPassword, secure_addr); |
902 turn_port_->PrepareAddress(); | 957 turn_port_->PrepareAddress(); |
903 EXPECT_TRUE_WAIT(turn_error_, kTimeout); | 958 EXPECT_TRUE_SIMULATED_WAIT(turn_error_, kSimulatedRtt * 2, fake_clock_); |
904 ASSERT_EQ(0U, turn_port_->Candidates().size()); | 959 ASSERT_EQ(0U, turn_port_->Candidates().size()); |
905 } | 960 } |
906 | 961 |
907 // Run TurnConnectionTest with one-time-use nonce feature. | 962 // Run TurnConnectionTest with one-time-use nonce feature. |
908 // Here server will send a 438 STALE_NONCE error message for | 963 // Here server will send a 438 STALE_NONCE error message for |
909 // every TURN transaction. | 964 // every TURN transaction. |
910 TEST_F(TurnPortTest, TestTurnConnectionUsingOTUNonce) { | 965 TEST_F(TurnPortTest, TestTurnConnectionUsingOTUNonce) { |
911 turn_server_.set_enable_otu_nonce(true); | 966 turn_server_.set_enable_otu_nonce(true); |
912 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); | 967 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
913 TestTurnConnection(); | 968 TestTurnConnection(PROTO_UDP); |
914 } | 969 } |
915 | 970 |
916 // Test that CreatePermissionRequest will be scheduled after the success | 971 // Test that CreatePermissionRequest will be scheduled after the success |
917 // of the first create permission request and the request will get an | 972 // of the first create permission request and the request will get an |
918 // ErrorResponse if the ufrag and pwd are incorrect. | 973 // ErrorResponse if the ufrag and pwd are incorrect. |
919 TEST_F(TurnPortTest, TestRefreshCreatePermissionRequest) { | 974 TEST_F(TurnPortTest, TestRefreshCreatePermissionRequest) { |
920 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); | 975 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
921 PrepareTurnAndUdpPorts(); | 976 PrepareTurnAndUdpPorts(PROTO_UDP); |
922 | 977 |
923 Connection* conn = turn_port_->CreateConnection(udp_port_->Candidates()[0], | 978 Connection* conn = turn_port_->CreateConnection(udp_port_->Candidates()[0], |
924 Port::ORIGIN_MESSAGE); | 979 Port::ORIGIN_MESSAGE); |
925 ASSERT_TRUE(conn != NULL); | 980 ASSERT_TRUE(conn != NULL); |
926 EXPECT_TRUE_WAIT(turn_create_permission_success_, kTimeout); | 981 EXPECT_TRUE_SIMULATED_WAIT(turn_create_permission_success_, kSimulatedRtt, |
| 982 fake_clock_); |
927 turn_create_permission_success_ = false; | 983 turn_create_permission_success_ = false; |
928 // A create-permission-request should be pending. | 984 // A create-permission-request should be pending. |
929 // After the next create-permission-response is received, it will schedule | 985 // After the next create-permission-response is received, it will schedule |
930 // another request with bad_ufrag and bad_pwd. | 986 // another request with bad_ufrag and bad_pwd. |
931 cricket::RelayCredentials bad_credentials("bad_user", "bad_pwd"); | 987 RelayCredentials bad_credentials("bad_user", "bad_pwd"); |
932 turn_port_->set_credentials(bad_credentials); | 988 turn_port_->set_credentials(bad_credentials); |
933 turn_port_->FlushRequests(cricket::kAllRequests); | 989 turn_port_->FlushRequests(kAllRequests); |
934 EXPECT_TRUE_WAIT(turn_create_permission_success_, kTimeout); | 990 EXPECT_TRUE_SIMULATED_WAIT(turn_create_permission_success_, kSimulatedRtt, |
| 991 fake_clock_); |
935 // Flush the requests again; the create-permission-request will fail. | 992 // Flush the requests again; the create-permission-request will fail. |
936 turn_port_->FlushRequests(cricket::kAllRequests); | 993 turn_port_->FlushRequests(kAllRequests); |
937 EXPECT_TRUE_WAIT(!turn_create_permission_success_, kTimeout); | 994 EXPECT_TRUE_SIMULATED_WAIT(!turn_create_permission_success_, kSimulatedRtt, |
938 EXPECT_TRUE_WAIT(CheckConnectionFailedAndPruned(conn), kTimeout); | 995 fake_clock_); |
| 996 EXPECT_TRUE(CheckConnectionFailedAndPruned(conn)); |
939 } | 997 } |
940 | 998 |
941 TEST_F(TurnPortTest, TestChannelBindGetErrorResponse) { | 999 TEST_F(TurnPortTest, TestChannelBindGetErrorResponse) { |
942 rtc::ScopedFakeClock clock; | |
943 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); | 1000 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
944 PrepareTurnAndUdpPorts(); | 1001 PrepareTurnAndUdpPorts(PROTO_UDP); |
945 Connection* conn1 = turn_port_->CreateConnection(udp_port_->Candidates()[0], | 1002 Connection* conn1 = turn_port_->CreateConnection(udp_port_->Candidates()[0], |
946 Port::ORIGIN_MESSAGE); | 1003 Port::ORIGIN_MESSAGE); |
947 ASSERT_TRUE(conn1 != nullptr); | 1004 ASSERT_TRUE(conn1 != nullptr); |
948 Connection* conn2 = udp_port_->CreateConnection(turn_port_->Candidates()[0], | 1005 Connection* conn2 = udp_port_->CreateConnection(turn_port_->Candidates()[0], |
949 Port::ORIGIN_MESSAGE); | 1006 Port::ORIGIN_MESSAGE); |
950 | 1007 |
951 ASSERT_TRUE(conn2 != nullptr); | 1008 ASSERT_TRUE(conn2 != nullptr); |
952 conn1->Ping(0); | 1009 conn1->Ping(0); |
953 EXPECT_TRUE_SIMULATED_WAIT(conn1->writable(), kTimeout, clock); | 1010 EXPECT_TRUE_SIMULATED_WAIT(conn1->writable(), kSimulatedRtt * 2, fake_clock_); |
954 bool success = | 1011 // TODO(deadbeef): SetEntryChannelId should not be a public method. |
955 turn_port_->SetEntryChannelId(udp_port_->Candidates()[0].address(), -1); | 1012 // Instead we should set an option on the fake TURN server to force it to |
956 ASSERT_TRUE(success); | 1013 // send a channel bind errors. |
| 1014 ASSERT_TRUE( |
| 1015 turn_port_->SetEntryChannelId(udp_port_->Candidates()[0].address(), -1)); |
957 | 1016 |
958 std::string data = "ABC"; | 1017 std::string data = "ABC"; |
959 conn1->Send(data.data(), data.length(), options); | 1018 conn1->Send(data.data(), data.length(), options); |
960 | 1019 |
961 EXPECT_TRUE_SIMULATED_WAIT(CheckConnectionFailedAndPruned(conn1), kTimeout, | 1020 EXPECT_TRUE_SIMULATED_WAIT(CheckConnectionFailedAndPruned(conn1), |
962 clock); | 1021 kSimulatedRtt, fake_clock_); |
963 // Verify that no packet can be sent after a bind request error. | 1022 // Verify that no packet can be sent after a bind request error. |
964 conn2->SignalReadPacket.connect(static_cast<TurnPortTest*>(this), | 1023 conn2->SignalReadPacket.connect(static_cast<TurnPortTest*>(this), |
965 &TurnPortTest::OnUdpReadPacket); | 1024 &TurnPortTest::OnUdpReadPacket); |
966 conn1->Send(data.data(), data.length(), options); | 1025 conn1->Send(data.data(), data.length(), options); |
967 SIMULATED_WAIT(!udp_packets_.empty(), kTimeout, clock); | 1026 SIMULATED_WAIT(!udp_packets_.empty(), kSimulatedRtt, fake_clock_); |
968 EXPECT_TRUE(udp_packets_.empty()); | 1027 EXPECT_TRUE(udp_packets_.empty()); |
969 } | 1028 } |
970 | 1029 |
971 // Do a TURN allocation, establish a UDP connection, and send some data. | 1030 // Do a TURN allocation, establish a UDP connection, and send some data. |
972 TEST_F(TurnPortTest, TestTurnSendDataTurnUdpToUdp) { | 1031 TEST_F(TurnPortTest, TestTurnSendDataTurnUdpToUdp) { |
973 // Create ports and prepare addresses. | 1032 // Create ports and prepare addresses. |
974 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); | 1033 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
975 TestTurnSendData(); | 1034 TestTurnSendData(PROTO_UDP); |
976 EXPECT_EQ(cricket::UDP_PROTOCOL_NAME, | 1035 EXPECT_EQ(UDP_PROTOCOL_NAME, turn_port_->Candidates()[0].relay_protocol()); |
977 turn_port_->Candidates()[0].relay_protocol()); | |
978 } | 1036 } |
979 | 1037 |
980 // Do a TURN allocation, establish a TCP connection, and send some data. | 1038 // Do a TURN allocation, establish a TCP connection, and send some data. |
981 TEST_F(TurnPortTest, TestTurnSendDataTurnTcpToUdp) { | 1039 TEST_F(TurnPortTest, TestTurnSendDataTurnTcpToUdp) { |
982 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); | 1040 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
983 // Create ports and prepare addresses. | 1041 // Create ports and prepare addresses. |
984 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); | 1042 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
985 TestTurnSendData(); | 1043 TestTurnSendData(PROTO_TCP); |
986 EXPECT_EQ(cricket::TCP_PROTOCOL_NAME, | 1044 EXPECT_EQ(TCP_PROTOCOL_NAME, turn_port_->Candidates()[0].relay_protocol()); |
987 turn_port_->Candidates()[0].relay_protocol()); | |
988 } | 1045 } |
989 | 1046 |
990 // Test TURN fails to make a connection from IPv6 address to a server which has | 1047 // Test TURN fails to make a connection from IPv6 address to a server which has |
991 // IPv4 address. | 1048 // IPv4 address. |
992 TEST_F(TurnPortTest, TestTurnLocalIPv6AddressServerIPv4) { | 1049 TEST_F(TurnPortTest, TestTurnLocalIPv6AddressServerIPv4) { |
993 turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, cricket::PROTO_UDP); | 1050 turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, PROTO_UDP); |
994 CreateTurnPort(kLocalIPv6Addr, kTurnUsername, kTurnPassword, | 1051 CreateTurnPort(kLocalIPv6Addr, kTurnUsername, kTurnPassword, |
995 kTurnUdpProtoAddr); | 1052 kTurnUdpProtoAddr); |
996 turn_port_->PrepareAddress(); | 1053 turn_port_->PrepareAddress(); |
997 ASSERT_TRUE_WAIT(turn_error_, kTimeout); | 1054 ASSERT_TRUE_SIMULATED_WAIT(turn_error_, kSimulatedRtt, fake_clock_); |
998 EXPECT_TRUE(turn_port_->Candidates().empty()); | 1055 EXPECT_TRUE(turn_port_->Candidates().empty()); |
999 } | 1056 } |
1000 | 1057 |
1001 // Test TURN make a connection from IPv6 address to a server which has | 1058 // Test TURN make a connection from IPv6 address to a server which has |
1002 // IPv6 intenal address. But in this test external address is a IPv4 address, | 1059 // IPv6 intenal address. But in this test external address is a IPv4 address, |
1003 // hence allocated address will be a IPv4 address. | 1060 // hence allocated address will be a IPv4 address. |
1004 TEST_F(TurnPortTest, TestTurnLocalIPv6AddressServerIPv6ExtenalIPv4) { | 1061 TEST_F(TurnPortTest, TestTurnLocalIPv6AddressServerIPv6ExtenalIPv4) { |
1005 turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, cricket::PROTO_UDP); | 1062 turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, PROTO_UDP); |
1006 CreateTurnPort(kLocalIPv6Addr, kTurnUsername, kTurnPassword, | 1063 CreateTurnPort(kLocalIPv6Addr, kTurnUsername, kTurnPassword, |
1007 kTurnUdpIPv6ProtoAddr); | 1064 kTurnUdpIPv6ProtoAddr); |
1008 turn_port_->PrepareAddress(); | 1065 turn_port_->PrepareAddress(); |
1009 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); | 1066 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_); |
1010 ASSERT_EQ(1U, turn_port_->Candidates().size()); | 1067 ASSERT_EQ(1U, turn_port_->Candidates().size()); |
1011 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), | 1068 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), |
1012 turn_port_->Candidates()[0].address().ipaddr()); | 1069 turn_port_->Candidates()[0].address().ipaddr()); |
1013 EXPECT_NE(0, turn_port_->Candidates()[0].address().port()); | 1070 EXPECT_NE(0, turn_port_->Candidates()[0].address().port()); |
1014 } | 1071 } |
1015 | 1072 |
1016 // Tests that the local and remote candidate address families should match when | 1073 // Tests that the local and remote candidate address families should match when |
1017 // a connection is created. Specifically, if a TURN port has an IPv6 address, | 1074 // a connection is created. Specifically, if a TURN port has an IPv6 address, |
1018 // its local candidate will still be an IPv4 address and it can only create | 1075 // its local candidate will still be an IPv4 address and it can only create |
1019 // connections with IPv4 remote candidates. | 1076 // connections with IPv4 remote candidates. |
1020 TEST_F(TurnPortTest, TestCandidateAddressFamilyMatch) { | 1077 TEST_F(TurnPortTest, TestCandidateAddressFamilyMatch) { |
1021 turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, cricket::PROTO_UDP); | 1078 turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, PROTO_UDP); |
1022 | 1079 |
1023 CreateTurnPort(kLocalIPv6Addr, kTurnUsername, kTurnPassword, | 1080 CreateTurnPort(kLocalIPv6Addr, kTurnUsername, kTurnPassword, |
1024 kTurnUdpIPv6ProtoAddr); | 1081 kTurnUdpIPv6ProtoAddr); |
1025 turn_port_->PrepareAddress(); | 1082 turn_port_->PrepareAddress(); |
1026 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); | 1083 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_); |
1027 ASSERT_EQ(1U, turn_port_->Candidates().size()); | 1084 ASSERT_EQ(1U, turn_port_->Candidates().size()); |
1028 | 1085 |
1029 // Create an IPv4 candidate. It will match the TURN candidate. | 1086 // Create an IPv4 candidate. It will match the TURN candidate. |
1030 cricket::Candidate remote_candidate(cricket::ICE_CANDIDATE_COMPONENT_RTP, | 1087 Candidate remote_candidate(ICE_CANDIDATE_COMPONENT_RTP, "udp", kLocalAddr2, 0, |
1031 "udp", kLocalAddr2, 0, "", "", "local", 0, | 1088 "", "", "local", 0, kCandidateFoundation); |
1032 kCandidateFoundation); | |
1033 remote_candidate.set_address(kLocalAddr2); | 1089 remote_candidate.set_address(kLocalAddr2); |
1034 Connection* conn = | 1090 Connection* conn = |
1035 turn_port_->CreateConnection(remote_candidate, Port::ORIGIN_MESSAGE); | 1091 turn_port_->CreateConnection(remote_candidate, Port::ORIGIN_MESSAGE); |
1036 EXPECT_NE(nullptr, conn); | 1092 EXPECT_NE(nullptr, conn); |
1037 | 1093 |
1038 // Set the candidate address family to IPv6. It won't match the TURN | 1094 // Set the candidate address family to IPv6. It won't match the TURN |
1039 // candidate. | 1095 // candidate. |
1040 remote_candidate.set_address(kLocalIPv6Addr2); | 1096 remote_candidate.set_address(kLocalIPv6Addr2); |
1041 conn = turn_port_->CreateConnection(remote_candidate, Port::ORIGIN_MESSAGE); | 1097 conn = turn_port_->CreateConnection(remote_candidate, Port::ORIGIN_MESSAGE); |
1042 EXPECT_EQ(nullptr, conn); | 1098 EXPECT_EQ(nullptr, conn); |
1043 } | 1099 } |
1044 | 1100 |
1045 TEST_F(TurnPortTest, TestOriginHeader) { | 1101 TEST_F(TurnPortTest, TestOriginHeader) { |
1046 CreateTurnPortWithOrigin(kLocalAddr1, kTurnUsername, kTurnPassword, | 1102 CreateTurnPortWithOrigin(kLocalAddr1, kTurnUsername, kTurnPassword, |
1047 kTurnUdpProtoAddr, kTestOrigin); | 1103 kTurnUdpProtoAddr, kTestOrigin); |
1048 turn_port_->PrepareAddress(); | 1104 turn_port_->PrepareAddress(); |
1049 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); | 1105 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_); |
1050 ASSERT_GT(turn_server_.server()->allocations().size(), 0U); | 1106 ASSERT_GT(turn_server_.server()->allocations().size(), 0U); |
1051 SocketAddress local_address = turn_port_->GetLocalAddress(); | 1107 SocketAddress local_address = turn_port_->GetLocalAddress(); |
1052 ASSERT_TRUE(turn_server_.FindAllocation(local_address) != NULL); | 1108 ASSERT_TRUE(turn_server_.FindAllocation(local_address) != NULL); |
1053 EXPECT_EQ(kTestOrigin, turn_server_.FindAllocation(local_address)->origin()); | 1109 EXPECT_EQ(kTestOrigin, turn_server_.FindAllocation(local_address)->origin()); |
1054 } | 1110 } |
1055 | 1111 |
1056 // Test that a CreatePermission failure will result in the connection being | 1112 // Test that a CreatePermission failure will result in the connection being |
1057 // pruned and failed. | 1113 // pruned and failed. |
1058 TEST_F(TurnPortTest, TestConnectionFaildAndPrunedOnCreatePermissionFailure) { | 1114 TEST_F(TurnPortTest, TestConnectionFailedAndPrunedOnCreatePermissionFailure) { |
1059 rtc::ScopedFakeClock clock; | 1115 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
1060 SIMULATED_WAIT(false, 101, clock); | |
1061 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); | |
1062 turn_server_.server()->set_reject_private_addresses(true); | 1116 turn_server_.server()->set_reject_private_addresses(true); |
1063 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); | 1117 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
1064 turn_port_->PrepareAddress(); | 1118 turn_port_->PrepareAddress(); |
1065 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kTimeout, clock); | 1119 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 3, fake_clock_); |
1066 | 1120 |
1067 CreateUdpPort(SocketAddress("10.0.0.10", 0)); | 1121 CreateUdpPort(SocketAddress("10.0.0.10", 0)); |
1068 udp_port_->PrepareAddress(); | 1122 udp_port_->PrepareAddress(); |
1069 EXPECT_TRUE_SIMULATED_WAIT(udp_ready_, kTimeout, clock); | 1123 EXPECT_TRUE_SIMULATED_WAIT(udp_ready_, kSimulatedRtt, fake_clock_); |
1070 // Create a connection. | 1124 // Create a connection. |
1071 TestConnectionWrapper conn(turn_port_->CreateConnection( | 1125 TestConnectionWrapper conn(turn_port_->CreateConnection( |
1072 udp_port_->Candidates()[0], Port::ORIGIN_MESSAGE)); | 1126 udp_port_->Candidates()[0], Port::ORIGIN_MESSAGE)); |
1073 EXPECT_TRUE(conn.connection() != nullptr); | 1127 EXPECT_TRUE(conn.connection() != nullptr); |
1074 | 1128 |
1075 // Asynchronously, CreatePermission request should be sent and fail, which | 1129 // Asynchronously, CreatePermission request should be sent and fail, which |
1076 // will make the connection pruned and failed. | 1130 // will make the connection pruned and failed. |
1077 EXPECT_TRUE_SIMULATED_WAIT(CheckConnectionFailedAndPruned(conn.connection()), | 1131 EXPECT_TRUE_SIMULATED_WAIT(CheckConnectionFailedAndPruned(conn.connection()), |
1078 kTimeout, clock); | 1132 kSimulatedRtt, fake_clock_); |
1079 EXPECT_TRUE_SIMULATED_WAIT(!turn_create_permission_success_, kTimeout, clock); | 1133 EXPECT_TRUE_SIMULATED_WAIT(!turn_create_permission_success_, kSimulatedRtt, |
| 1134 fake_clock_); |
1080 // Check that the connection is not deleted asynchronously. | 1135 // Check that the connection is not deleted asynchronously. |
1081 SIMULATED_WAIT(conn.connection() == nullptr, kTimeout, clock); | 1136 SIMULATED_WAIT(conn.connection() == nullptr, kConnectionDestructionDelay, |
1082 EXPECT_TRUE(conn.connection() != nullptr); | 1137 fake_clock_); |
| 1138 EXPECT_NE(nullptr, conn.connection()); |
1083 } | 1139 } |
1084 | 1140 |
1085 // Test that a TURN allocation is released when the port is closed. | 1141 // Test that a TURN allocation is released when the port is closed. |
1086 TEST_F(TurnPortTest, TestTurnReleaseAllocation) { | 1142 TEST_F(TurnPortTest, TestTurnReleaseAllocation) { |
1087 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); | 1143 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); |
1088 turn_port_->PrepareAddress(); | 1144 turn_port_->PrepareAddress(); |
1089 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); | 1145 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_); |
1090 | 1146 |
1091 ASSERT_GT(turn_server_.server()->allocations().size(), 0U); | 1147 ASSERT_GT(turn_server_.server()->allocations().size(), 0U); |
1092 turn_port_.reset(); | 1148 turn_port_.reset(); |
1093 EXPECT_EQ_WAIT(0U, turn_server_.server()->allocations().size(), kTimeout); | 1149 EXPECT_EQ_SIMULATED_WAIT(0U, turn_server_.server()->allocations().size(), |
| 1150 kSimulatedRtt, fake_clock_); |
1094 } | 1151 } |
1095 | 1152 |
1096 // Test that a TURN TCP allocation is released when the port is closed. | 1153 // Test that a TURN TCP allocation is released when the port is closed. |
1097 TEST_F(TurnPortTest, DISABLED_TestTurnTCPReleaseAllocation) { | 1154 TEST_F(TurnPortTest, TestTurnTCPReleaseAllocation) { |
1098 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); | 1155 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
1099 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); | 1156 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
1100 turn_port_->PrepareAddress(); | 1157 turn_port_->PrepareAddress(); |
1101 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); | 1158 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 3, fake_clock_); |
1102 | 1159 |
1103 ASSERT_GT(turn_server_.server()->allocations().size(), 0U); | 1160 ASSERT_GT(turn_server_.server()->allocations().size(), 0U); |
1104 turn_port_.reset(); | 1161 turn_port_.reset(); |
1105 EXPECT_EQ_WAIT(0U, turn_server_.server()->allocations().size(), kTimeout); | 1162 EXPECT_EQ_SIMULATED_WAIT(0U, turn_server_.server()->allocations().size(), |
| 1163 kSimulatedRtt, fake_clock_); |
1106 } | 1164 } |
1107 | 1165 |
1108 // This test verifies any FD's are not leaked after TurnPort is destroyed. | 1166 // This test verifies any FD's are not leaked after TurnPort is destroyed. |
1109 // https://code.google.com/p/webrtc/issues/detail?id=2651 | 1167 // https://code.google.com/p/webrtc/issues/detail?id=2651 |
1110 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) | 1168 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) |
1111 // 1 second is not always enough for getaddrinfo(). | |
1112 // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=5191 | |
1113 static const unsigned int kResolverTimeout = 10000; | |
1114 | 1169 |
1115 TEST_F(TurnPortTest, TestResolverShutdown) { | 1170 TEST_F(TurnPortTest, TestResolverShutdown) { |
1116 turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, cricket::PROTO_UDP); | 1171 turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, PROTO_UDP); |
1117 int last_fd_count = GetFDCount(); | 1172 int last_fd_count = GetFDCount(); |
1118 // Need to supply unresolved address to kick off resolver. | 1173 // Need to supply unresolved address to kick off resolver. |
1119 CreateTurnPort(kLocalIPv6Addr, kTurnUsername, kTurnPassword, | 1174 CreateTurnPort(kLocalIPv6Addr, kTurnUsername, kTurnPassword, |
1120 cricket::ProtocolAddress(rtc::SocketAddress( | 1175 ProtocolAddress(rtc::SocketAddress("www.google.invalid", 3478), |
1121 "www.google.invalid", 3478), cricket::PROTO_UDP)); | 1176 PROTO_UDP)); |
1122 turn_port_->PrepareAddress(); | 1177 turn_port_->PrepareAddress(); |
1123 ASSERT_TRUE_WAIT(turn_error_, kResolverTimeout); | 1178 ASSERT_TRUE_WAIT(turn_error_, kResolverTimeout); |
1124 EXPECT_TRUE(turn_port_->Candidates().empty()); | 1179 EXPECT_TRUE(turn_port_->Candidates().empty()); |
1125 turn_port_.reset(); | 1180 turn_port_.reset(); |
1126 rtc::Thread::Current()->Post(RTC_FROM_HERE, this, MSG_TESTFINISH); | 1181 rtc::Thread::Current()->Post(RTC_FROM_HERE, this, MSG_TESTFINISH); |
1127 // Waiting for above message to be processed. | 1182 // Waiting for above message to be processed. |
1128 ASSERT_TRUE_WAIT(test_finish_, kTimeout); | 1183 ASSERT_TRUE_SIMULATED_WAIT(test_finish_, 1, fake_clock_); |
1129 EXPECT_EQ(last_fd_count, GetFDCount()); | 1184 EXPECT_EQ(last_fd_count, GetFDCount()); |
1130 } | 1185 } |
1131 #endif | 1186 #endif |
| 1187 |
| 1188 } // namespace cricket |
OLD | NEW |