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