|  | /* | 
|  | *  Copyright 2009 The WebRTC Project Authors. All rights reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #include <memory> | 
|  | #include <string> | 
|  |  | 
|  | #include "rtc_base/gunit.h" | 
|  | #include "rtc_base/proxy_server.h" | 
|  | #include "rtc_base/socket_adapters.h" | 
|  | #include "rtc_base/test_client.h" | 
|  | #include "rtc_base/test_echo_server.h" | 
|  | #include "rtc_base/virtual_socket_server.h" | 
|  |  | 
|  | using rtc::Socket; | 
|  | using rtc::SocketAddress; | 
|  |  | 
|  | static const SocketAddress kSocksProxyIntAddr("1.2.3.4", 1080); | 
|  | static const SocketAddress kSocksProxyExtAddr("1.2.3.5", 0); | 
|  | static const SocketAddress kBogusProxyIntAddr("1.2.3.4", 999); | 
|  |  | 
|  | // Sets up a virtual socket server and a SOCKS5 proxy server. | 
|  | class ProxyTest : public ::testing::Test { | 
|  | public: | 
|  | ProxyTest() : ss_(new rtc::VirtualSocketServer()), thread_(ss_.get()) { | 
|  | socks_.reset(new rtc::SocksProxyServer(ss_.get(), kSocksProxyIntAddr, | 
|  | ss_.get(), kSocksProxyExtAddr)); | 
|  | } | 
|  |  | 
|  | rtc::SocketServer* ss() { return ss_.get(); } | 
|  |  | 
|  | private: | 
|  | std::unique_ptr<rtc::SocketServer> ss_; | 
|  | rtc::AutoSocketServerThread thread_; | 
|  | std::unique_ptr<rtc::SocksProxyServer> socks_; | 
|  | }; | 
|  |  | 
|  | // Tests whether we can use a SOCKS5 proxy to connect to a server. | 
|  | TEST_F(ProxyTest, TestSocks5Connect) { | 
|  | rtc::AsyncSocket* socket = | 
|  | ss()->CreateAsyncSocket(kSocksProxyIntAddr.family(), SOCK_STREAM); | 
|  | rtc::AsyncSocksProxySocket* proxy_socket = new rtc::AsyncSocksProxySocket( | 
|  | socket, kSocksProxyIntAddr, "", rtc::CryptString()); | 
|  | // TODO: IPv6-ize these tests when proxy supports IPv6. | 
|  |  | 
|  | rtc::TestEchoServer server(rtc::Thread::Current(), | 
|  | SocketAddress(INADDR_ANY, 0)); | 
|  |  | 
|  | std::unique_ptr<rtc::AsyncTCPSocket> packet_socket( | 
|  | rtc::AsyncTCPSocket::Create(proxy_socket, SocketAddress(INADDR_ANY, 0), | 
|  | server.address())); | 
|  | EXPECT_TRUE(packet_socket != nullptr); | 
|  | rtc::TestClient client(std::move(packet_socket)); | 
|  |  | 
|  | EXPECT_EQ(Socket::CS_CONNECTING, proxy_socket->GetState()); | 
|  | EXPECT_TRUE(client.CheckConnected()); | 
|  | EXPECT_EQ(Socket::CS_CONNECTED, proxy_socket->GetState()); | 
|  | EXPECT_EQ(server.address(), client.remote_address()); | 
|  | client.Send("foo", 3); | 
|  | EXPECT_TRUE(client.CheckNextPacket("foo", 3, nullptr)); | 
|  | EXPECT_TRUE(client.CheckNoPacket()); | 
|  | } |