| 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 <list> |
| 14 #include <memory> | 15 #include <memory> |
| 15 | 16 |
| 16 #include "webrtc/p2p/base/basicpacketsocketfactory.h" | 17 #include "webrtc/p2p/base/basicpacketsocketfactory.h" |
| 17 #include "webrtc/p2p/base/p2pconstants.h" | 18 #include "webrtc/p2p/base/p2pconstants.h" |
| 18 #include "webrtc/p2p/base/portallocator.h" | 19 #include "webrtc/p2p/base/portallocator.h" |
| 19 #include "webrtc/p2p/base/tcpport.h" | 20 #include "webrtc/p2p/base/tcpport.h" |
| 20 #include "webrtc/p2p/base/testturnserver.h" | 21 #include "webrtc/p2p/base/testturnserver.h" |
| 21 #include "webrtc/p2p/base/turnport.h" | 22 #include "webrtc/p2p/base/turnport.h" |
| 22 #include "webrtc/p2p/base/udpport.h" | 23 #include "webrtc/p2p/base/udpport.h" |
| 23 #include "webrtc/rtc_base/asynctcpsocket.h" | 24 #include "webrtc/rtc_base/asynctcpsocket.h" |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 | 137 |
| 137 // Note: This test uses a fake clock with a simulated network round trip | 138 // Note: This test uses a fake clock with a simulated network round trip |
| 138 // (between local port and TURN server) of kSimulatedRtt. | 139 // (between local port and TURN server) of kSimulatedRtt. |
| 139 class TurnPortTest : public testing::Test, | 140 class TurnPortTest : public testing::Test, |
| 140 public sigslot::has_slots<>, | 141 public sigslot::has_slots<>, |
| 141 public rtc::MessageHandler { | 142 public rtc::MessageHandler { |
| 142 public: | 143 public: |
| 143 TurnPortTest() | 144 TurnPortTest() |
| 144 : ss_(new TurnPortTestVirtualSocketServer()), | 145 : ss_(new TurnPortTestVirtualSocketServer()), |
| 145 main_(ss_.get()), | 146 main_(ss_.get()), |
| 146 network_("unittest", "unittest", rtc::IPAddress(INADDR_ANY), 32), | |
| 147 socket_factory_(rtc::Thread::Current()), | 147 socket_factory_(rtc::Thread::Current()), |
| 148 turn_server_(&main_, kTurnUdpIntAddr, kTurnUdpExtAddr), | 148 turn_server_(&main_, kTurnUdpIntAddr, kTurnUdpExtAddr), |
| 149 turn_ready_(false), | 149 turn_ready_(false), |
| 150 turn_error_(false), | 150 turn_error_(false), |
| 151 turn_unknown_address_(false), | 151 turn_unknown_address_(false), |
| 152 turn_create_permission_success_(false), | 152 turn_create_permission_success_(false), |
| 153 udp_ready_(false), | 153 udp_ready_(false), |
| 154 test_finish_(false) { | 154 test_finish_(false) { |
| 155 // Some code uses "last received time == 0" to represent "nothing received | 155 // Some code uses "last received time == 0" to represent "nothing received |
| 156 // so far", so we need to start the fake clock at a nonzero time... | 156 // so far", so we need to start the fake clock at a nonzero time... |
| 157 // TODO(deadbeef): Fix this. | 157 // TODO(deadbeef): Fix this. |
| 158 fake_clock_.AdvanceTime(rtc::TimeDelta::FromSeconds(1)); | 158 fake_clock_.AdvanceTime(rtc::TimeDelta::FromSeconds(1)); |
| 159 network_.AddIP(rtc::IPAddress(INADDR_ANY)); | |
| 160 } | 159 } |
| 161 | 160 |
| 162 virtual void OnMessage(rtc::Message* msg) { | 161 virtual void OnMessage(rtc::Message* msg) { |
| 163 RTC_CHECK(msg->message_id == MSG_TESTFINISH); | 162 RTC_CHECK(msg->message_id == MSG_TESTFINISH); |
| 164 if (msg->message_id == MSG_TESTFINISH) | 163 if (msg->message_id == MSG_TESTFINISH) |
| 165 test_finish_ = true; | 164 test_finish_ = true; |
| 166 } | 165 } |
| 167 | 166 |
| 168 void ConnectSignalAddressReadyToSetLocalhostAsAltenertativeLocalAddress() { | |
| 169 rtc::AsyncPacketSocket* socket = turn_port_->socket(); | |
| 170 rtc::VirtualSocket* virtual_socket = | |
| 171 ss_->LookupBinding(socket->GetLocalAddress()); | |
| 172 virtual_socket->SignalAddressReady.connect( | |
| 173 this, &TurnPortTest::SetLocalhostAsAltenertativeLocalAddress); | |
| 174 } | |
| 175 | |
| 176 void SetLocalhostAsAltenertativeLocalAddress( | |
| 177 rtc::VirtualSocket* socket, | |
| 178 const rtc::SocketAddress& address) { | |
| 179 SocketAddress local_address("127.0.0.1", 2000); | |
| 180 socket->SetAlternativeLocalAddress(local_address); | |
| 181 } | |
| 182 | |
| 183 void OnTurnPortComplete(Port* port) { | 167 void OnTurnPortComplete(Port* port) { |
| 184 turn_ready_ = true; | 168 turn_ready_ = true; |
| 185 } | 169 } |
| 186 void OnTurnPortError(Port* port) { | 170 void OnTurnPortError(Port* port) { |
| 187 turn_error_ = true; | 171 turn_error_ = true; |
| 188 } | 172 } |
| 189 void OnTurnUnknownAddress(PortInterface* port, | 173 void OnTurnUnknownAddress(PortInterface* port, |
| 190 const SocketAddress& addr, | 174 const SocketAddress& addr, |
| 191 ProtocolType proto, | 175 ProtocolType proto, |
| 192 IceMessage* msg, | 176 IceMessage* msg, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 222 turn_port_->HandleIncomingPacket(socket, data, size, remote_addr, | 206 turn_port_->HandleIncomingPacket(socket, data, size, remote_addr, |
| 223 packet_time); | 207 packet_time); |
| 224 } | 208 } |
| 225 rtc::AsyncSocket* CreateServerSocket(const SocketAddress addr) { | 209 rtc::AsyncSocket* CreateServerSocket(const SocketAddress addr) { |
| 226 rtc::AsyncSocket* socket = ss_->CreateAsyncSocket(SOCK_STREAM); | 210 rtc::AsyncSocket* socket = ss_->CreateAsyncSocket(SOCK_STREAM); |
| 227 EXPECT_GE(socket->Bind(addr), 0); | 211 EXPECT_GE(socket->Bind(addr), 0); |
| 228 EXPECT_GE(socket->Listen(5), 0); | 212 EXPECT_GE(socket->Listen(5), 0); |
| 229 return socket; | 213 return socket; |
| 230 } | 214 } |
| 231 | 215 |
| 216 rtc::Network* MakeNetwork(const SocketAddress& addr) { |
| 217 networks_.emplace_back("unittest", "unittest", addr.ipaddr(), 32); |
| 218 networks_.back().AddIP(addr.ipaddr()); |
| 219 return &networks_.back(); |
| 220 } |
| 221 |
| 232 void CreateTurnPort(const std::string& username, | 222 void CreateTurnPort(const std::string& username, |
| 233 const std::string& password, | 223 const std::string& password, |
| 234 const ProtocolAddress& server_address) { | 224 const ProtocolAddress& server_address) { |
| 235 CreateTurnPort(kLocalAddr1, username, password, server_address); | 225 CreateTurnPortWithAllParams(MakeNetwork(kLocalAddr1), username, password, |
| 226 server_address, std::string()); |
| 236 } | 227 } |
| 237 void CreateTurnPort(const rtc::SocketAddress& local_address, | 228 void CreateTurnPort(const rtc::SocketAddress& local_address, |
| 238 const std::string& username, | 229 const std::string& username, |
| 239 const std::string& password, | 230 const std::string& password, |
| 240 const ProtocolAddress& server_address) { | 231 const ProtocolAddress& server_address) { |
| 241 RelayCredentials credentials(username, password); | 232 CreateTurnPortWithAllParams(MakeNetwork(local_address), username, password, |
| 242 turn_port_.reset(TurnPort::Create(&main_, &socket_factory_, &network_, | 233 server_address, std::string()); |
| 243 local_address.ipaddr(), 0, 0, | |
| 244 kIceUfrag1, kIcePwd1, | |
| 245 server_address, credentials, 0, | |
| 246 std::string())); | |
| 247 // This TURN port will be the controlling. | |
| 248 turn_port_->SetIceRole(ICEROLE_CONTROLLING); | |
| 249 ConnectSignals(); | |
| 250 } | 234 } |
| 251 | 235 |
| 252 // Should be identical to CreateTurnPort but specifies an origin value | 236 // Should be identical to CreateTurnPort but specifies an origin value |
| 253 // when creating the instance of TurnPort. | 237 // when creating the instance of TurnPort. |
| 254 void CreateTurnPortWithOrigin(const rtc::SocketAddress& local_address, | 238 void CreateTurnPortWithOrigin(const rtc::SocketAddress& local_address, |
| 255 const std::string& username, | 239 const std::string& username, |
| 256 const std::string& password, | 240 const std::string& password, |
| 257 const ProtocolAddress& server_address, | 241 const ProtocolAddress& server_address, |
| 258 const std::string& origin) { | 242 const std::string& origin) { |
| 243 CreateTurnPortWithAllParams(MakeNetwork(local_address), username, password, |
| 244 server_address, origin); |
| 245 } |
| 246 |
| 247 void CreateTurnPortWithNetwork(rtc::Network* network, |
| 248 const std::string& username, |
| 249 const std::string& password, |
| 250 const ProtocolAddress& server_address) { |
| 251 CreateTurnPortWithAllParams(network, username, password, server_address, |
| 252 std::string()); |
| 253 } |
| 254 |
| 255 // Version of CreateTurnPort that takes all possible parameters; all other |
| 256 // helper methods call this, such that "SetIceRole" and "ConnectSignals" (and |
| 257 // possibly other things in the future) only happen in one place. |
| 258 void CreateTurnPortWithAllParams(rtc::Network* network, |
| 259 const std::string& username, |
| 260 const std::string& password, |
| 261 const ProtocolAddress& server_address, |
| 262 const std::string& origin) { |
| 259 RelayCredentials credentials(username, password); | 263 RelayCredentials credentials(username, password); |
| 260 turn_port_.reset(TurnPort::Create(&main_, &socket_factory_, &network_, | 264 turn_port_.reset(TurnPort::Create(&main_, &socket_factory_, network, 0, 0, |
| 261 local_address.ipaddr(), 0, 0, | 265 kIceUfrag1, kIcePwd1, server_address, |
| 262 kIceUfrag1, kIcePwd1, | 266 credentials, 0, origin)); |
| 263 server_address, credentials, 0, | |
| 264 origin)); | |
| 265 // This TURN port will be the controlling. | 267 // This TURN port will be the controlling. |
| 266 turn_port_->SetIceRole(ICEROLE_CONTROLLING); | 268 turn_port_->SetIceRole(ICEROLE_CONTROLLING); |
| 267 ConnectSignals(); | 269 ConnectSignals(); |
| 268 } | 270 } |
| 269 | 271 |
| 270 void CreateSharedTurnPort(const std::string& username, | 272 void CreateSharedTurnPort(const std::string& username, |
| 271 const std::string& password, | 273 const std::string& password, |
| 272 const ProtocolAddress& server_address) { | 274 const ProtocolAddress& server_address) { |
| 273 RTC_CHECK(server_address.proto == PROTO_UDP); | 275 RTC_CHECK(server_address.proto == PROTO_UDP); |
| 274 | 276 |
| 275 if (!socket_) { | 277 if (!socket_) { |
| 276 socket_.reset(socket_factory_.CreateUdpSocket( | 278 socket_.reset(socket_factory_.CreateUdpSocket( |
| 277 rtc::SocketAddress(kLocalAddr1.ipaddr(), 0), 0, 0)); | 279 rtc::SocketAddress(kLocalAddr1.ipaddr(), 0), 0, 0)); |
| 278 ASSERT_TRUE(socket_ != NULL); | 280 ASSERT_TRUE(socket_ != NULL); |
| 279 socket_->SignalReadPacket.connect( | 281 socket_->SignalReadPacket.connect( |
| 280 this, &TurnPortTest::OnSocketReadPacket); | 282 this, &TurnPortTest::OnSocketReadPacket); |
| 281 } | 283 } |
| 282 | 284 |
| 283 RelayCredentials credentials(username, password); | 285 RelayCredentials credentials(username, password); |
| 284 turn_port_.reset(TurnPort::Create( | 286 turn_port_.reset(TurnPort::Create( |
| 285 &main_, &socket_factory_, &network_, socket_.get(), kIceUfrag1, | 287 &main_, &socket_factory_, MakeNetwork(kLocalAddr1), socket_.get(), |
| 286 kIcePwd1, server_address, credentials, 0, std::string())); | 288 kIceUfrag1, kIcePwd1, server_address, credentials, 0, std::string())); |
| 287 // This TURN port will be the controlling. | 289 // This TURN port will be the controlling. |
| 288 turn_port_->SetIceRole(ICEROLE_CONTROLLING); | 290 turn_port_->SetIceRole(ICEROLE_CONTROLLING); |
| 289 ConnectSignals(); | 291 ConnectSignals(); |
| 290 } | 292 } |
| 291 | 293 |
| 292 void ConnectSignals() { | 294 void ConnectSignals() { |
| 293 turn_port_->SignalPortComplete.connect(this, | 295 turn_port_->SignalPortComplete.connect(this, |
| 294 &TurnPortTest::OnTurnPortComplete); | 296 &TurnPortTest::OnTurnPortComplete); |
| 295 turn_port_->SignalPortError.connect(this, | 297 turn_port_->SignalPortError.connect(this, |
| 296 &TurnPortTest::OnTurnPortError); | 298 &TurnPortTest::OnTurnPortError); |
| 297 turn_port_->SignalUnknownAddress.connect(this, | 299 turn_port_->SignalUnknownAddress.connect(this, |
| 298 &TurnPortTest::OnTurnUnknownAddress); | 300 &TurnPortTest::OnTurnUnknownAddress); |
| 299 turn_port_->SignalCreatePermissionResult.connect(this, | 301 turn_port_->SignalCreatePermissionResult.connect(this, |
| 300 &TurnPortTest::OnTurnCreatePermissionResult); | 302 &TurnPortTest::OnTurnCreatePermissionResult); |
| 301 turn_port_->SignalTurnRefreshResult.connect( | 303 turn_port_->SignalTurnRefreshResult.connect( |
| 302 this, &TurnPortTest::OnTurnRefreshResult); | 304 this, &TurnPortTest::OnTurnRefreshResult); |
| 303 } | 305 } |
| 304 | 306 |
| 305 void CreateUdpPort() { CreateUdpPort(kLocalAddr2); } | 307 void CreateUdpPort() { CreateUdpPort(kLocalAddr2); } |
| 306 | 308 |
| 307 void CreateUdpPort(const SocketAddress& address) { | 309 void CreateUdpPort(const SocketAddress& address) { |
| 308 udp_port_.reset(UDPPort::Create(&main_, &socket_factory_, &network_, | 310 udp_port_.reset(UDPPort::Create(&main_, &socket_factory_, |
| 309 address.ipaddr(), 0, 0, kIceUfrag2, | 311 MakeNetwork(address), 0, 0, kIceUfrag2, |
| 310 kIcePwd2, std::string(), false)); | 312 kIcePwd2, std::string(), false)); |
| 311 // UDP port will be controlled. | 313 // UDP port will be controlled. |
| 312 udp_port_->SetIceRole(ICEROLE_CONTROLLED); | 314 udp_port_->SetIceRole(ICEROLE_CONTROLLED); |
| 313 udp_port_->SignalPortComplete.connect( | 315 udp_port_->SignalPortComplete.connect( |
| 314 this, &TurnPortTest::OnUdpPortComplete); | 316 this, &TurnPortTest::OnUdpPortComplete); |
| 315 } | 317 } |
| 316 | 318 |
| 317 void PrepareTurnAndUdpPorts(ProtocolType protocol_type) { | 319 void PrepareTurnAndUdpPorts(ProtocolType protocol_type) { |
| 318 // turn_port_ should have been created. | 320 // turn_port_ should have been created. |
| 319 ASSERT_TRUE(turn_port_ != nullptr); | 321 ASSERT_TRUE(turn_port_ != nullptr); |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 609 ASSERT_EQ(num_packets, udp_packets_.size()); | 611 ASSERT_EQ(num_packets, udp_packets_.size()); |
| 610 for (size_t i = 0; i < num_packets; ++i) { | 612 for (size_t i = 0; i < num_packets; ++i) { |
| 611 EXPECT_EQ(i + 1, turn_packets_[i].size()); | 613 EXPECT_EQ(i + 1, turn_packets_[i].size()); |
| 612 EXPECT_EQ(i + 1, udp_packets_[i].size()); | 614 EXPECT_EQ(i + 1, udp_packets_[i].size()); |
| 613 EXPECT_EQ(turn_packets_[i], udp_packets_[i]); | 615 EXPECT_EQ(turn_packets_[i], udp_packets_[i]); |
| 614 } | 616 } |
| 615 } | 617 } |
| 616 | 618 |
| 617 protected: | 619 protected: |
| 618 rtc::ScopedFakeClock fake_clock_; | 620 rtc::ScopedFakeClock fake_clock_; |
| 621 // When a "create port" helper method is called with an IP, we create a |
| 622 // Network with that IP and add it to this list. Using a list instead of a |
| 623 // vector so that when it grows, pointers aren't invalidated. |
| 624 std::list<rtc::Network> networks_; |
| 619 std::unique_ptr<TurnPortTestVirtualSocketServer> ss_; | 625 std::unique_ptr<TurnPortTestVirtualSocketServer> ss_; |
| 620 rtc::AutoSocketServerThread main_; | 626 rtc::AutoSocketServerThread main_; |
| 621 rtc::Network network_; | |
| 622 rtc::BasicPacketSocketFactory socket_factory_; | 627 rtc::BasicPacketSocketFactory socket_factory_; |
| 623 std::unique_ptr<rtc::AsyncPacketSocket> socket_; | 628 std::unique_ptr<rtc::AsyncPacketSocket> socket_; |
| 624 TestTurnServer turn_server_; | 629 TestTurnServer turn_server_; |
| 625 std::unique_ptr<TurnPort> turn_port_; | 630 std::unique_ptr<TurnPort> turn_port_; |
| 626 std::unique_ptr<UDPPort> udp_port_; | 631 std::unique_ptr<UDPPort> udp_port_; |
| 627 bool turn_ready_; | 632 bool turn_ready_; |
| 628 bool turn_error_; | 633 bool turn_error_; |
| 629 bool turn_unknown_address_; | 634 bool turn_unknown_address_; |
| 630 bool turn_create_permission_success_; | 635 bool turn_create_permission_success_; |
| 631 bool udp_ready_; | 636 bool udp_ready_; |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 697 ASSERT_EQ(1U, turn_port_->Candidates().size()); | 702 ASSERT_EQ(1U, turn_port_->Candidates().size()); |
| 698 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), | 703 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), |
| 699 turn_port_->Candidates()[0].address().ipaddr()); | 704 turn_port_->Candidates()[0].address().ipaddr()); |
| 700 EXPECT_NE(0, turn_port_->Candidates()[0].address().port()); | 705 EXPECT_NE(0, turn_port_->Candidates()[0].address().port()); |
| 701 } | 706 } |
| 702 | 707 |
| 703 // Test case for WebRTC issue 3927 where a proxy binds to the local host address | 708 // Test case for WebRTC issue 3927 where a proxy binds to the local host address |
| 704 // instead the address that TurnPort originally bound to. The candidate pair | 709 // instead the address that TurnPort originally bound to. The candidate pair |
| 705 // impacted by this behavior should still be used. | 710 // impacted by this behavior should still be used. |
| 706 TEST_F(TurnPortTest, TestTurnTcpAllocationWhenProxyChangesAddressToLocalHost) { | 711 TEST_F(TurnPortTest, TestTurnTcpAllocationWhenProxyChangesAddressToLocalHost) { |
| 712 SocketAddress local_address("127.0.0.1", 0); |
| 713 // After calling this, when TurnPort attempts to get a socket bound to |
| 714 // kLocalAddr, it will end up using localhost instead. |
| 715 ss_->SetAlternativeLocalAddress(kLocalAddr1.ipaddr(), local_address.ipaddr()); |
| 716 |
| 707 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); | 717 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
| 708 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); | 718 CreateTurnPort(kLocalAddr1, kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
| 709 EXPECT_EQ(0, turn_port_->SetOption(rtc::Socket::OPT_SNDBUF, 10 * 1024)); | 719 EXPECT_EQ(0, turn_port_->SetOption(rtc::Socket::OPT_SNDBUF, 10 * 1024)); |
| 710 turn_port_->PrepareAddress(); | 720 turn_port_->PrepareAddress(); |
| 711 ConnectSignalAddressReadyToSetLocalhostAsAltenertativeLocalAddress(); | |
| 712 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 3, fake_clock_); | 721 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 3, fake_clock_); |
| 713 ASSERT_EQ(1U, turn_port_->Candidates().size()); | 722 ASSERT_EQ(1U, turn_port_->Candidates().size()); |
| 714 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), | 723 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), |
| 715 turn_port_->Candidates()[0].address().ipaddr()); | 724 turn_port_->Candidates()[0].address().ipaddr()); |
| 716 EXPECT_NE(0, turn_port_->Candidates()[0].address().port()); | 725 EXPECT_NE(0, turn_port_->Candidates()[0].address().port()); |
| 726 |
| 727 // Verify that the socket actually used localhost, otherwise this test isn't |
| 728 // doing what it meant to. |
| 729 ASSERT_EQ(local_address.ipaddr(), |
| 730 turn_port_->Candidates()[0].related_address().ipaddr()); |
| 731 } |
| 732 |
| 733 // If the address the socket ends up bound to does not match any address of the |
| 734 // TurnPort's Network, then the socket should be discarded and no candidates |
| 735 // should be signaled. In the context of ICE, where one TurnPort is created for |
| 736 // each Network, when this happens it's likely that the unexpected address is |
| 737 // associated with some other Network, which another TurnPort is already |
| 738 // covering. |
| 739 TEST_F(TurnPortTest, |
| 740 TurnTcpAllocationDiscardedIfBoundAddressDoesNotMatchNetwork) { |
| 741 // Sockets bound to kLocalAddr1 will actually end up with kLocalAddr2. |
| 742 ss_->SetAlternativeLocalAddress(kLocalAddr1.ipaddr(), kLocalAddr2.ipaddr()); |
| 743 |
| 744 // Set up TURN server to use TCP (this logic only exists for TCP). |
| 745 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
| 746 |
| 747 // Create TURN port and tell it to start allocation. |
| 748 CreateTurnPort(kLocalAddr1, kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); |
| 749 turn_port_->PrepareAddress(); |
| 750 |
| 751 // Shouldn't take more than 1 RTT to realize the bound address isn't the one |
| 752 // expected. |
| 753 EXPECT_TRUE_SIMULATED_WAIT(turn_error_, kSimulatedRtt, fake_clock_); |
| 754 } |
| 755 |
| 756 // A caveat for the above logic: if the socket ends up bound to one of the IPs |
| 757 // associated with the Network, just not the "best" one, this is ok. |
| 758 TEST_F(TurnPortTest, TurnTcpAllocationNotDiscardedIfNotBoundToBestIP) { |
| 759 // Sockets bound to kLocalAddr1 will actually end up with kLocalAddr2. |
| 760 ss_->SetAlternativeLocalAddress(kLocalAddr1.ipaddr(), kLocalAddr2.ipaddr()); |
| 761 |
| 762 // Set up a network with kLocalAddr1 as the "best" IP, and kLocalAddr2 as an |
| 763 // alternate. |
| 764 rtc::Network* network = MakeNetwork(kLocalAddr1); |
| 765 network->AddIP(kLocalAddr2.ipaddr()); |
| 766 ASSERT_EQ(kLocalAddr1.ipaddr(), network->GetBestIP()); |
| 767 |
| 768 // Set up TURN server to use TCP (this logic only exists for TCP). |
| 769 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
| 770 |
| 771 // Create TURN port using our special Network, and tell it to start |
| 772 // allocation. |
| 773 CreateTurnPortWithNetwork(network, kTurnUsername, kTurnPassword, |
| 774 kTurnTcpProtoAddr); |
| 775 turn_port_->PrepareAddress(); |
| 776 |
| 777 // Candidate should be gathered as normally. |
| 778 EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 3, fake_clock_); |
| 779 ASSERT_EQ(1U, turn_port_->Candidates().size()); |
| 780 |
| 781 // Verify that the socket actually used the alternate address, otherwise this |
| 782 // test isn't doing what it meant to. |
| 783 ASSERT_EQ(kLocalAddr2.ipaddr(), |
| 784 turn_port_->Candidates()[0].related_address().ipaddr()); |
| 717 } | 785 } |
| 718 | 786 |
| 719 // Testing turn port will attempt to create TCP socket on address resolution | 787 // Testing turn port will attempt to create TCP socket on address resolution |
| 720 // failure. | 788 // failure. |
| 721 TEST_F(TurnPortTest, TestTurnTcpOnAddressResolveFailure) { | 789 TEST_F(TurnPortTest, TestTurnTcpOnAddressResolveFailure) { |
| 722 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); | 790 turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP); |
| 723 CreateTurnPort(kTurnUsername, kTurnPassword, | 791 CreateTurnPort(kTurnUsername, kTurnPassword, |
| 724 ProtocolAddress(rtc::SocketAddress("www.google.invalid", 3478), | 792 ProtocolAddress(rtc::SocketAddress("www.google.invalid", 3478), |
| 725 PROTO_TCP)); | 793 PROTO_TCP)); |
| 726 turn_port_->PrepareAddress(); | 794 turn_port_->PrepareAddress(); |
| (...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1287 EXPECT_TRUE(turn_port_->Candidates().empty()); | 1355 EXPECT_TRUE(turn_port_->Candidates().empty()); |
| 1288 turn_port_.reset(); | 1356 turn_port_.reset(); |
| 1289 rtc::Thread::Current()->Post(RTC_FROM_HERE, this, MSG_TESTFINISH); | 1357 rtc::Thread::Current()->Post(RTC_FROM_HERE, this, MSG_TESTFINISH); |
| 1290 // Waiting for above message to be processed. | 1358 // Waiting for above message to be processed. |
| 1291 ASSERT_TRUE_SIMULATED_WAIT(test_finish_, 1, fake_clock_); | 1359 ASSERT_TRUE_SIMULATED_WAIT(test_finish_, 1, fake_clock_); |
| 1292 EXPECT_EQ(last_fd_count, GetFDCount()); | 1360 EXPECT_EQ(last_fd_count, GetFDCount()); |
| 1293 } | 1361 } |
| 1294 #endif | 1362 #endif |
| 1295 | 1363 |
| 1296 } // namespace cricket | 1364 } // namespace cricket |
| OLD | NEW |