| Index: webrtc/base/nat_unittest.cc
|
| diff --git a/webrtc/base/nat_unittest.cc b/webrtc/base/nat_unittest.cc
|
| deleted file mode 100644
|
| index b7ec16180de46009a20be95a223d18dab1ab1548..0000000000000000000000000000000000000000
|
| --- a/webrtc/base/nat_unittest.cc
|
| +++ /dev/null
|
| @@ -1,389 +0,0 @@
|
| -/*
|
| - * Copyright 2004 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 <algorithm>
|
| -#include <memory>
|
| -#include <string>
|
| -
|
| -#include "webrtc/base/asynctcpsocket.h"
|
| -#include "webrtc/base/gunit.h"
|
| -#include "webrtc/base/logging.h"
|
| -#include "webrtc/base/natserver.h"
|
| -#include "webrtc/base/natsocketfactory.h"
|
| -#include "webrtc/base/nethelpers.h"
|
| -#include "webrtc/base/network.h"
|
| -#include "webrtc/base/physicalsocketserver.h"
|
| -#include "webrtc/base/ptr_util.h"
|
| -#include "webrtc/base/testclient.h"
|
| -#include "webrtc/base/virtualsocketserver.h"
|
| -
|
| -using namespace rtc;
|
| -
|
| -bool CheckReceive(
|
| - TestClient* client, bool should_receive, const char* buf, size_t size) {
|
| - return (should_receive) ?
|
| - client->CheckNextPacket(buf, size, 0) :
|
| - client->CheckNoPacket();
|
| -}
|
| -
|
| -TestClient* CreateTestClient(
|
| - SocketFactory* factory, const SocketAddress& local_addr) {
|
| - return new TestClient(
|
| - WrapUnique(AsyncUDPSocket::Create(factory, local_addr)));
|
| -}
|
| -
|
| -TestClient* CreateTCPTestClient(AsyncSocket* socket) {
|
| - return new TestClient(MakeUnique<AsyncTCPSocket>(socket, false));
|
| -}
|
| -
|
| -// Tests that when sending from internal_addr to external_addrs through the
|
| -// NAT type specified by nat_type, all external addrs receive the sent packet
|
| -// and, if exp_same is true, all use the same mapped-address on the NAT.
|
| -void TestSend(
|
| - SocketServer* internal, const SocketAddress& internal_addr,
|
| - SocketServer* external, const SocketAddress external_addrs[4],
|
| - NATType nat_type, bool exp_same) {
|
| - Thread th_int(internal);
|
| - Thread th_ext(external);
|
| -
|
| - SocketAddress server_addr = internal_addr;
|
| - server_addr.SetPort(0); // Auto-select a port
|
| - NATServer* nat = new NATServer(nat_type, internal, server_addr, server_addr,
|
| - external, external_addrs[0]);
|
| - NATSocketFactory* natsf = new NATSocketFactory(internal,
|
| - nat->internal_udp_address(),
|
| - nat->internal_tcp_address());
|
| -
|
| - TestClient* in = CreateTestClient(natsf, internal_addr);
|
| - TestClient* out[4];
|
| - for (int i = 0; i < 4; i++)
|
| - out[i] = CreateTestClient(external, external_addrs[i]);
|
| -
|
| - th_int.Start();
|
| - th_ext.Start();
|
| -
|
| - const char* buf = "filter_test";
|
| - size_t len = strlen(buf);
|
| -
|
| - in->SendTo(buf, len, out[0]->address());
|
| - SocketAddress trans_addr;
|
| - EXPECT_TRUE(out[0]->CheckNextPacket(buf, len, &trans_addr));
|
| -
|
| - for (int i = 1; i < 4; i++) {
|
| - in->SendTo(buf, len, out[i]->address());
|
| - SocketAddress trans_addr2;
|
| - EXPECT_TRUE(out[i]->CheckNextPacket(buf, len, &trans_addr2));
|
| - bool are_same = (trans_addr == trans_addr2);
|
| - ASSERT_EQ(are_same, exp_same) << "same translated address";
|
| - ASSERT_NE(AF_UNSPEC, trans_addr.family());
|
| - ASSERT_NE(AF_UNSPEC, trans_addr2.family());
|
| - }
|
| -
|
| - th_int.Stop();
|
| - th_ext.Stop();
|
| -
|
| - delete nat;
|
| - delete natsf;
|
| - delete in;
|
| - for (int i = 0; i < 4; i++)
|
| - delete out[i];
|
| -}
|
| -
|
| -// Tests that when sending from external_addrs to internal_addr, the packet
|
| -// is delivered according to the specified filter_ip and filter_port rules.
|
| -void TestRecv(
|
| - SocketServer* internal, const SocketAddress& internal_addr,
|
| - SocketServer* external, const SocketAddress external_addrs[4],
|
| - NATType nat_type, bool filter_ip, bool filter_port) {
|
| - Thread th_int(internal);
|
| - Thread th_ext(external);
|
| -
|
| - SocketAddress server_addr = internal_addr;
|
| - server_addr.SetPort(0); // Auto-select a port
|
| - NATServer* nat = new NATServer(nat_type, internal, server_addr, server_addr,
|
| - external, external_addrs[0]);
|
| - NATSocketFactory* natsf = new NATSocketFactory(internal,
|
| - nat->internal_udp_address(),
|
| - nat->internal_tcp_address());
|
| -
|
| - TestClient* in = CreateTestClient(natsf, internal_addr);
|
| - TestClient* out[4];
|
| - for (int i = 0; i < 4; i++)
|
| - out[i] = CreateTestClient(external, external_addrs[i]);
|
| -
|
| - th_int.Start();
|
| - th_ext.Start();
|
| -
|
| - const char* buf = "filter_test";
|
| - size_t len = strlen(buf);
|
| -
|
| - in->SendTo(buf, len, out[0]->address());
|
| - SocketAddress trans_addr;
|
| - EXPECT_TRUE(out[0]->CheckNextPacket(buf, len, &trans_addr));
|
| -
|
| - out[1]->SendTo(buf, len, trans_addr);
|
| - EXPECT_TRUE(CheckReceive(in, !filter_ip, buf, len));
|
| -
|
| - out[2]->SendTo(buf, len, trans_addr);
|
| - EXPECT_TRUE(CheckReceive(in, !filter_port, buf, len));
|
| -
|
| - out[3]->SendTo(buf, len, trans_addr);
|
| - EXPECT_TRUE(CheckReceive(in, !filter_ip && !filter_port, buf, len));
|
| -
|
| - th_int.Stop();
|
| - th_ext.Stop();
|
| -
|
| - delete nat;
|
| - delete natsf;
|
| - delete in;
|
| - for (int i = 0; i < 4; i++)
|
| - delete out[i];
|
| -}
|
| -
|
| -// Tests that NATServer allocates bindings properly.
|
| -void TestBindings(
|
| - SocketServer* internal, const SocketAddress& internal_addr,
|
| - SocketServer* external, const SocketAddress external_addrs[4]) {
|
| - TestSend(internal, internal_addr, external, external_addrs,
|
| - NAT_OPEN_CONE, true);
|
| - TestSend(internal, internal_addr, external, external_addrs,
|
| - NAT_ADDR_RESTRICTED, true);
|
| - TestSend(internal, internal_addr, external, external_addrs,
|
| - NAT_PORT_RESTRICTED, true);
|
| - TestSend(internal, internal_addr, external, external_addrs,
|
| - NAT_SYMMETRIC, false);
|
| -}
|
| -
|
| -// Tests that NATServer filters packets properly.
|
| -void TestFilters(
|
| - SocketServer* internal, const SocketAddress& internal_addr,
|
| - SocketServer* external, const SocketAddress external_addrs[4]) {
|
| - TestRecv(internal, internal_addr, external, external_addrs,
|
| - NAT_OPEN_CONE, false, false);
|
| - TestRecv(internal, internal_addr, external, external_addrs,
|
| - NAT_ADDR_RESTRICTED, true, false);
|
| - TestRecv(internal, internal_addr, external, external_addrs,
|
| - NAT_PORT_RESTRICTED, true, true);
|
| - TestRecv(internal, internal_addr, external, external_addrs,
|
| - NAT_SYMMETRIC, true, true);
|
| -}
|
| -
|
| -bool TestConnectivity(const SocketAddress& src, const IPAddress& dst) {
|
| - // The physical NAT tests require connectivity to the selected ip from the
|
| - // internal address used for the NAT. Things like firewalls can break that, so
|
| - // check to see if it's worth even trying with this ip.
|
| - std::unique_ptr<PhysicalSocketServer> pss(new PhysicalSocketServer());
|
| - std::unique_ptr<AsyncSocket> client(
|
| - pss->CreateAsyncSocket(src.family(), SOCK_DGRAM));
|
| - std::unique_ptr<AsyncSocket> server(
|
| - pss->CreateAsyncSocket(src.family(), SOCK_DGRAM));
|
| - if (client->Bind(SocketAddress(src.ipaddr(), 0)) != 0 ||
|
| - server->Bind(SocketAddress(dst, 0)) != 0) {
|
| - return false;
|
| - }
|
| - const char* buf = "hello other socket";
|
| - size_t len = strlen(buf);
|
| - int sent = client->SendTo(buf, len, server->GetLocalAddress());
|
| - SocketAddress addr;
|
| - const size_t kRecvBufSize = 64;
|
| - char recvbuf[kRecvBufSize];
|
| - Thread::Current()->SleepMs(100);
|
| - int received = server->RecvFrom(recvbuf, kRecvBufSize, &addr, nullptr);
|
| - return received == sent && ::memcmp(buf, recvbuf, len) == 0;
|
| -}
|
| -
|
| -void TestPhysicalInternal(const SocketAddress& int_addr) {
|
| - BasicNetworkManager network_manager;
|
| - network_manager.set_ipv6_enabled(true);
|
| - network_manager.StartUpdating();
|
| - // Process pending messages so the network list is updated.
|
| - Thread::Current()->ProcessMessages(0);
|
| -
|
| - std::vector<Network*> networks;
|
| - network_manager.GetNetworks(&networks);
|
| - networks.erase(std::remove_if(networks.begin(), networks.end(),
|
| - [](rtc::Network* network) {
|
| - return rtc::kDefaultNetworkIgnoreMask &
|
| - network->type();
|
| - }),
|
| - networks.end());
|
| - if (networks.empty()) {
|
| - LOG(LS_WARNING) << "Not enough network adapters for test.";
|
| - return;
|
| - }
|
| -
|
| - SocketAddress ext_addr1(int_addr);
|
| - SocketAddress ext_addr2;
|
| - // Find an available IP with matching family. The test breaks if int_addr
|
| - // can't talk to ip, so check for connectivity as well.
|
| - for (std::vector<Network*>::iterator it = networks.begin();
|
| - it != networks.end(); ++it) {
|
| - const IPAddress& ip = (*it)->GetBestIP();
|
| - if (ip.family() == int_addr.family() && TestConnectivity(int_addr, ip)) {
|
| - ext_addr2.SetIP(ip);
|
| - break;
|
| - }
|
| - }
|
| - if (ext_addr2.IsNil()) {
|
| - LOG(LS_WARNING) << "No available IP of same family as " << int_addr;
|
| - return;
|
| - }
|
| -
|
| - LOG(LS_INFO) << "selected ip " << ext_addr2.ipaddr();
|
| -
|
| - SocketAddress ext_addrs[4] = {
|
| - SocketAddress(ext_addr1),
|
| - SocketAddress(ext_addr2),
|
| - SocketAddress(ext_addr1),
|
| - SocketAddress(ext_addr2)
|
| - };
|
| -
|
| - std::unique_ptr<PhysicalSocketServer> int_pss(new PhysicalSocketServer());
|
| - std::unique_ptr<PhysicalSocketServer> ext_pss(new PhysicalSocketServer());
|
| -
|
| - TestBindings(int_pss.get(), int_addr, ext_pss.get(), ext_addrs);
|
| - TestFilters(int_pss.get(), int_addr, ext_pss.get(), ext_addrs);
|
| -}
|
| -
|
| -TEST(NatTest, TestPhysicalIPv4) {
|
| - TestPhysicalInternal(SocketAddress("127.0.0.1", 0));
|
| -}
|
| -
|
| -TEST(NatTest, TestPhysicalIPv6) {
|
| - if (HasIPv6Enabled()) {
|
| - TestPhysicalInternal(SocketAddress("::1", 0));
|
| - } else {
|
| - LOG(LS_WARNING) << "No IPv6, skipping";
|
| - }
|
| -}
|
| -
|
| -namespace {
|
| -
|
| -class TestVirtualSocketServer : public VirtualSocketServer {
|
| - public:
|
| - // Expose this publicly
|
| - IPAddress GetNextIP(int af) { return VirtualSocketServer::GetNextIP(af); }
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -void TestVirtualInternal(int family) {
|
| - std::unique_ptr<TestVirtualSocketServer> int_vss(
|
| - new TestVirtualSocketServer());
|
| - std::unique_ptr<TestVirtualSocketServer> ext_vss(
|
| - new TestVirtualSocketServer());
|
| -
|
| - SocketAddress int_addr;
|
| - SocketAddress ext_addrs[4];
|
| - int_addr.SetIP(int_vss->GetNextIP(family));
|
| - ext_addrs[0].SetIP(ext_vss->GetNextIP(int_addr.family()));
|
| - ext_addrs[1].SetIP(ext_vss->GetNextIP(int_addr.family()));
|
| - ext_addrs[2].SetIP(ext_addrs[0].ipaddr());
|
| - ext_addrs[3].SetIP(ext_addrs[1].ipaddr());
|
| -
|
| - TestBindings(int_vss.get(), int_addr, ext_vss.get(), ext_addrs);
|
| - TestFilters(int_vss.get(), int_addr, ext_vss.get(), ext_addrs);
|
| -}
|
| -
|
| -TEST(NatTest, TestVirtualIPv4) {
|
| - TestVirtualInternal(AF_INET);
|
| -}
|
| -
|
| -TEST(NatTest, TestVirtualIPv6) {
|
| - if (HasIPv6Enabled()) {
|
| - TestVirtualInternal(AF_INET6);
|
| - } else {
|
| - LOG(LS_WARNING) << "No IPv6, skipping";
|
| - }
|
| -}
|
| -
|
| -class NatTcpTest : public testing::Test, public sigslot::has_slots<> {
|
| - public:
|
| - NatTcpTest()
|
| - : int_addr_("192.168.0.1", 0),
|
| - ext_addr_("10.0.0.1", 0),
|
| - connected_(false),
|
| - int_vss_(new TestVirtualSocketServer()),
|
| - ext_vss_(new TestVirtualSocketServer()),
|
| - int_thread_(new Thread(int_vss_.get())),
|
| - ext_thread_(new Thread(ext_vss_.get())),
|
| - nat_(new NATServer(NAT_OPEN_CONE,
|
| - int_vss_.get(),
|
| - int_addr_,
|
| - int_addr_,
|
| - ext_vss_.get(),
|
| - ext_addr_)),
|
| - natsf_(new NATSocketFactory(int_vss_.get(),
|
| - nat_->internal_udp_address(),
|
| - nat_->internal_tcp_address())) {
|
| - int_thread_->Start();
|
| - ext_thread_->Start();
|
| - }
|
| -
|
| - void OnConnectEvent(AsyncSocket* socket) {
|
| - connected_ = true;
|
| - }
|
| -
|
| - void OnAcceptEvent(AsyncSocket* socket) {
|
| - accepted_.reset(server_->Accept(nullptr));
|
| - }
|
| -
|
| - void OnCloseEvent(AsyncSocket* socket, int error) {
|
| - }
|
| -
|
| - void ConnectEvents() {
|
| - server_->SignalReadEvent.connect(this, &NatTcpTest::OnAcceptEvent);
|
| - client_->SignalConnectEvent.connect(this, &NatTcpTest::OnConnectEvent);
|
| - }
|
| -
|
| - SocketAddress int_addr_;
|
| - SocketAddress ext_addr_;
|
| - bool connected_;
|
| - std::unique_ptr<TestVirtualSocketServer> int_vss_;
|
| - std::unique_ptr<TestVirtualSocketServer> ext_vss_;
|
| - std::unique_ptr<Thread> int_thread_;
|
| - std::unique_ptr<Thread> ext_thread_;
|
| - std::unique_ptr<NATServer> nat_;
|
| - std::unique_ptr<NATSocketFactory> natsf_;
|
| - std::unique_ptr<AsyncSocket> client_;
|
| - std::unique_ptr<AsyncSocket> server_;
|
| - std::unique_ptr<AsyncSocket> accepted_;
|
| -};
|
| -
|
| -TEST_F(NatTcpTest, DISABLED_TestConnectOut) {
|
| - server_.reset(ext_vss_->CreateAsyncSocket(SOCK_STREAM));
|
| - server_->Bind(ext_addr_);
|
| - server_->Listen(5);
|
| -
|
| - client_.reset(natsf_->CreateAsyncSocket(SOCK_STREAM));
|
| - EXPECT_GE(0, client_->Bind(int_addr_));
|
| - EXPECT_GE(0, client_->Connect(server_->GetLocalAddress()));
|
| -
|
| - ConnectEvents();
|
| -
|
| - EXPECT_TRUE_WAIT(connected_, 1000);
|
| - EXPECT_EQ(client_->GetRemoteAddress(), server_->GetLocalAddress());
|
| - EXPECT_EQ(accepted_->GetRemoteAddress().ipaddr(), ext_addr_.ipaddr());
|
| -
|
| - std::unique_ptr<rtc::TestClient> in(CreateTCPTestClient(client_.release()));
|
| - std::unique_ptr<rtc::TestClient> out(
|
| - CreateTCPTestClient(accepted_.release()));
|
| -
|
| - const char* buf = "test_packet";
|
| - size_t len = strlen(buf);
|
| -
|
| - in->Send(buf, len);
|
| - SocketAddress trans_addr;
|
| - EXPECT_TRUE(out->CheckNextPacket(buf, len, &trans_addr));
|
| -
|
| - out->Send(buf, len);
|
| - EXPECT_TRUE(in->CheckNextPacket(buf, len, &trans_addr));
|
| -}
|
| -// #endif
|
|
|