2017-03-23 15:45:49 -07:00
|
|
|
/*
|
|
|
|
|
* 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>
|
2017-09-15 06:47:31 +02:00
|
|
|
#include "rtc_base/gunit.h"
|
2019-01-11 09:11:00 -08:00
|
|
|
#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"
|
2017-03-23 15:45:49 -07:00
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
2018-09-26 16:18:38 +02:00
|
|
|
// Sets up a virtual socket server and a SOCKS5 proxy server.
|
2019-04-09 15:11:12 +02:00
|
|
|
class ProxyTest : public ::testing::Test {
|
2017-03-23 15:45:49 -07:00
|
|
|
public:
|
2017-05-16 18:00:06 -07:00
|
|
|
ProxyTest() : ss_(new rtc::VirtualSocketServer()), thread_(ss_.get()) {
|
2017-03-23 15:45:49 -07:00
|
|
|
socks_.reset(new rtc::SocksProxyServer(ss_.get(), kSocksProxyIntAddr,
|
|
|
|
|
ss_.get(), kSocksProxyExtAddr));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rtc::SocketServer* ss() { return ss_.get(); }
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
std::unique_ptr<rtc::SocketServer> ss_;
|
2017-05-08 05:25:41 -07:00
|
|
|
rtc::AutoSocketServerThread thread_;
|
2017-03-23 15:45:49 -07:00
|
|
|
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.
|
|
|
|
|
|
2018-11-13 18:07:46 +01:00
|
|
|
rtc::TestEchoServer server(rtc::Thread::Current(),
|
|
|
|
|
SocketAddress(INADDR_ANY, 0));
|
2017-03-23 15:45:49 -07:00
|
|
|
|
2017-05-08 01:57:18 -07:00
|
|
|
std::unique_ptr<rtc::AsyncTCPSocket> packet_socket(
|
|
|
|
|
rtc::AsyncTCPSocket::Create(proxy_socket, SocketAddress(INADDR_ANY, 0),
|
|
|
|
|
server.address()));
|
2017-03-23 15:45:49 -07:00
|
|
|
EXPECT_TRUE(packet_socket != nullptr);
|
2017-05-08 01:57:18 -07:00
|
|
|
rtc::TestClient client(std::move(packet_socket));
|
2017-03-23 15:45:49 -07:00
|
|
|
|
|
|
|
|
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());
|
|
|
|
|
}
|