Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(13)

Unified Diff: webrtc/base/nat_unittest.cc

Issue 2877023002: Move webrtc/{base => rtc_base} (Closed)
Patch Set: update presubmit.py and DEPS include rules Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/base/mod_ops_unittest.cc ('k') | webrtc/base/natserver.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « webrtc/base/mod_ops_unittest.cc ('k') | webrtc/base/natserver.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698