blob: 978a30aefe98fc67e36379e57ffe59cfa0910de9 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:261/*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Yves Gerey3e707812018-11-28 15:47:4911#include <string.h>
Jonas Olssona4d87372019-07-05 17:08:3312
Taylor Brandstetter0c7e9f52015-12-29 22:14:5213#include <algorithm>
Per Kd07900c2023-11-17 09:18:2514#include <cstddef>
jbauch555604a2016-04-26 10:13:2215#include <memory>
henrike@webrtc.orgf0488722014-05-13 18:00:2616#include <string>
Yves Gerey3e707812018-11-28 15:47:4917#include <vector>
henrike@webrtc.orgf0488722014-05-13 18:00:2618
Karl Wiberg918f50c2018-07-05 09:40:3319#include "absl/memory/memory.h"
Per Kd07900c2023-11-17 09:18:2520#include "api/units/time_delta.h"
Steve Anton10542f22019-01-11 17:11:0021#include "rtc_base/async_packet_socket.h"
Steve Anton10542f22019-01-11 17:11:0022#include "rtc_base/async_tcp_socket.h"
23#include "rtc_base/async_udp_socket.h"
Per Kd07900c2023-11-17 09:18:2524#include "rtc_base/event.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3125#include "rtc_base/gunit.h"
Steve Anton10542f22019-01-11 17:11:0026#include "rtc_base/ip_address.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3127#include "rtc_base/logging.h"
Steve Anton10542f22019-01-11 17:11:0028#include "rtc_base/nat_server.h"
29#include "rtc_base/nat_socket_factory.h"
30#include "rtc_base/nat_types.h"
31#include "rtc_base/net_helpers.h"
Mirko Bonadei0d8b79e2023-07-27 06:55:4932#include "rtc_base/net_test_helpers.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3133#include "rtc_base/network.h"
Steve Anton10542f22019-01-11 17:11:0034#include "rtc_base/physical_socket_server.h"
Niels Möllerd0b88792021-08-12 08:32:3035#include "rtc_base/socket.h"
Steve Anton10542f22019-01-11 17:11:0036#include "rtc_base/socket_address.h"
37#include "rtc_base/socket_factory.h"
38#include "rtc_base/socket_server.h"
39#include "rtc_base/test_client.h"
Yves Gerey3e707812018-11-28 15:47:4940#include "rtc_base/third_party/sigslot/sigslot.h"
41#include "rtc_base/thread.h"
Steve Anton10542f22019-01-11 17:11:0042#include "rtc_base/virtual_socket_server.h"
Yves Gerey3e707812018-11-28 15:47:4943#include "test/gtest.h"
Jonas Orelandc06fe8b2022-03-28 12:58:2644#include "test/scoped_key_value_config.h"
henrike@webrtc.orgf0488722014-05-13 18:00:2645
Mirko Bonadeie10b1632018-12-11 17:43:4046namespace rtc {
47namespace {
henrike@webrtc.orgf0488722014-05-13 18:00:2648
Yves Gerey665174f2018-06-19 13:03:0549bool CheckReceive(TestClient* client,
50 bool should_receive,
51 const char* buf,
52 size_t size) {
53 return (should_receive) ? client->CheckNextPacket(buf, size, 0)
54 : client->CheckNoPacket();
henrike@webrtc.orgf0488722014-05-13 18:00:2655}
56
Yves Gerey665174f2018-06-19 13:03:0557TestClient* CreateTestClient(SocketFactory* factory,
58 const SocketAddress& local_addr) {
nisse32f25052017-05-08 08:57:1859 return new TestClient(
Karl Wiberg918f50c2018-07-05 09:40:3360 absl::WrapUnique(AsyncUDPSocket::Create(factory, local_addr)));
henrike@webrtc.orgf0488722014-05-13 18:00:2661}
62
Niels Möllerd0b88792021-08-12 08:32:3063TestClient* CreateTCPTestClient(Socket* socket) {
Niels Möllerd30ece12021-10-19 08:11:0264 return new TestClient(std::make_unique<AsyncTCPSocket>(socket));
deadbeefc5d0d952015-07-16 17:22:2165}
66
henrike@webrtc.orgf0488722014-05-13 18:00:2667// Tests that when sending from internal_addr to external_addrs through the
68// NAT type specified by nat_type, all external addrs receive the sent packet
69// and, if exp_same is true, all use the same mapped-address on the NAT.
Yves Gerey665174f2018-06-19 13:03:0570void TestSend(SocketServer* internal,
71 const SocketAddress& internal_addr,
72 SocketServer* external,
73 const SocketAddress external_addrs[4],
74 NATType nat_type,
75 bool exp_same) {
henrike@webrtc.orgf0488722014-05-13 18:00:2676 Thread th_int(internal);
77 Thread th_ext(external);
78
henrike@webrtc.orgf0488722014-05-13 18:00:2679 th_int.Start();
80 th_ext.Start();
81
Per Ka8cd2ba2023-12-13 07:10:0682 SocketAddress server_addr = internal_addr;
83 server_addr.SetPort(0); // Auto-select a port
84 NATServer* nat =
85 new NATServer(nat_type, th_int, internal, server_addr, server_addr,
86 th_ext, external, external_addrs[0]);
87 NATSocketFactory* natsf = new NATSocketFactory(
88 internal, nat->internal_udp_address(), nat->internal_tcp_address());
89
Per Kd07900c2023-11-17 09:18:2590 TestClient* in;
91 th_int.BlockingCall([&] { in = CreateTestClient(natsf, internal_addr); });
92
93 TestClient* out[4];
94 th_ext.BlockingCall([&] {
95 for (int i = 0; i < 4; i++)
96 out[i] = CreateTestClient(external, external_addrs[i]);
97 });
98
henrike@webrtc.orgf0488722014-05-13 18:00:2699 const char* buf = "filter_test";
100 size_t len = strlen(buf);
101
Per Kd07900c2023-11-17 09:18:25102 th_int.BlockingCall([&] { in->SendTo(buf, len, out[0]->address()); });
henrike@webrtc.orgf0488722014-05-13 18:00:26103 SocketAddress trans_addr;
Per Kd07900c2023-11-17 09:18:25104 th_ext.BlockingCall(
105 [&] { EXPECT_TRUE(out[0]->CheckNextPacket(buf, len, &trans_addr)); });
henrike@webrtc.orgf0488722014-05-13 18:00:26106
107 for (int i = 1; i < 4; i++) {
Per Kd07900c2023-11-17 09:18:25108 th_int.BlockingCall([&] { in->SendTo(buf, len, out[i]->address()); });
henrike@webrtc.orgf0488722014-05-13 18:00:26109 SocketAddress trans_addr2;
Per Kd07900c2023-11-17 09:18:25110 th_ext.BlockingCall([&] {
111 EXPECT_TRUE(out[i]->CheckNextPacket(buf, len, &trans_addr2));
112 bool are_same = (trans_addr == trans_addr2);
113 ASSERT_EQ(are_same, exp_same) << "same translated address";
114 ASSERT_NE(AF_UNSPEC, trans_addr.family());
115 ASSERT_NE(AF_UNSPEC, trans_addr2.family());
116 });
henrike@webrtc.orgf0488722014-05-13 18:00:26117 }
118
119 th_int.Stop();
120 th_ext.Stop();
121
122 delete nat;
123 delete natsf;
124 delete in;
125 for (int i = 0; i < 4; i++)
126 delete out[i];
127}
128
129// Tests that when sending from external_addrs to internal_addr, the packet
130// is delivered according to the specified filter_ip and filter_port rules.
Yves Gerey665174f2018-06-19 13:03:05131void TestRecv(SocketServer* internal,
132 const SocketAddress& internal_addr,
133 SocketServer* external,
134 const SocketAddress external_addrs[4],
135 NATType nat_type,
136 bool filter_ip,
137 bool filter_port) {
henrike@webrtc.orgf0488722014-05-13 18:00:26138 Thread th_int(internal);
139 Thread th_ext(external);
140
141 SocketAddress server_addr = internal_addr;
142 server_addr.SetPort(0); // Auto-select a port
henrike@webrtc.orgf0488722014-05-13 18:00:26143 th_int.Start();
144 th_ext.Start();
Per Ka8cd2ba2023-12-13 07:10:06145 NATServer* nat =
146 new NATServer(nat_type, th_int, internal, server_addr, server_addr,
147 th_ext, external, external_addrs[0]);
148 NATSocketFactory* natsf = new NATSocketFactory(
149 internal, nat->internal_udp_address(), nat->internal_tcp_address());
henrike@webrtc.orgf0488722014-05-13 18:00:26150
Per Kd07900c2023-11-17 09:18:25151 TestClient* in = nullptr;
152 th_int.BlockingCall([&] { in = CreateTestClient(natsf, internal_addr); });
153
154 TestClient* out[4];
155 th_ext.BlockingCall([&] {
156 for (int i = 0; i < 4; i++)
157 out[i] = CreateTestClient(external, external_addrs[i]);
158 });
159
henrike@webrtc.orgf0488722014-05-13 18:00:26160 const char* buf = "filter_test";
161 size_t len = strlen(buf);
162
Per Kd07900c2023-11-17 09:18:25163 th_int.BlockingCall([&] { in->SendTo(buf, len, out[0]->address()); });
henrike@webrtc.orgf0488722014-05-13 18:00:26164 SocketAddress trans_addr;
Per Kd07900c2023-11-17 09:18:25165 th_ext.BlockingCall(
166 [&] { EXPECT_TRUE(out[0]->CheckNextPacket(buf, len, &trans_addr)); });
henrike@webrtc.orgf0488722014-05-13 18:00:26167
Per Kd07900c2023-11-17 09:18:25168 th_ext.BlockingCall([&] { out[1]->SendTo(buf, len, trans_addr); });
169 th_int.BlockingCall(
170 [&] { EXPECT_TRUE(CheckReceive(in, !filter_ip, buf, len)); });
171 th_ext.BlockingCall([&] { out[2]->SendTo(buf, len, trans_addr); });
henrike@webrtc.orgf0488722014-05-13 18:00:26172
Per Kd07900c2023-11-17 09:18:25173 th_int.BlockingCall(
174 [&] { EXPECT_TRUE(CheckReceive(in, !filter_port, buf, len)); });
henrike@webrtc.orgf0488722014-05-13 18:00:26175
Per Kd07900c2023-11-17 09:18:25176 th_ext.BlockingCall([&] { out[3]->SendTo(buf, len, trans_addr); });
177
178 th_int.BlockingCall([&] {
179 EXPECT_TRUE(CheckReceive(in, !filter_ip && !filter_port, buf, len));
180 });
henrike@webrtc.orgf0488722014-05-13 18:00:26181
182 th_int.Stop();
183 th_ext.Stop();
184
185 delete nat;
186 delete natsf;
187 delete in;
188 for (int i = 0; i < 4; i++)
189 delete out[i];
190}
191
192// Tests that NATServer allocates bindings properly.
Yves Gerey665174f2018-06-19 13:03:05193void TestBindings(SocketServer* internal,
194 const SocketAddress& internal_addr,
195 SocketServer* external,
196 const SocketAddress external_addrs[4]) {
197 TestSend(internal, internal_addr, external, external_addrs, NAT_OPEN_CONE,
198 true);
henrike@webrtc.orgf0488722014-05-13 18:00:26199 TestSend(internal, internal_addr, external, external_addrs,
200 NAT_ADDR_RESTRICTED, true);
201 TestSend(internal, internal_addr, external, external_addrs,
202 NAT_PORT_RESTRICTED, true);
Yves Gerey665174f2018-06-19 13:03:05203 TestSend(internal, internal_addr, external, external_addrs, NAT_SYMMETRIC,
204 false);
henrike@webrtc.orgf0488722014-05-13 18:00:26205}
206
207// Tests that NATServer filters packets properly.
Yves Gerey665174f2018-06-19 13:03:05208void TestFilters(SocketServer* internal,
209 const SocketAddress& internal_addr,
210 SocketServer* external,
211 const SocketAddress external_addrs[4]) {
212 TestRecv(internal, internal_addr, external, external_addrs, NAT_OPEN_CONE,
213 false, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26214 TestRecv(internal, internal_addr, external, external_addrs,
215 NAT_ADDR_RESTRICTED, true, false);
216 TestRecv(internal, internal_addr, external, external_addrs,
217 NAT_PORT_RESTRICTED, true, true);
Yves Gerey665174f2018-06-19 13:03:05218 TestRecv(internal, internal_addr, external, external_addrs, NAT_SYMMETRIC,
219 true, true);
henrike@webrtc.orgf0488722014-05-13 18:00:26220}
221
222bool TestConnectivity(const SocketAddress& src, const IPAddress& dst) {
223 // The physical NAT tests require connectivity to the selected ip from the
224 // internal address used for the NAT. Things like firewalls can break that, so
225 // check to see if it's worth even trying with this ip.
jbauch555604a2016-04-26 10:13:22226 std::unique_ptr<PhysicalSocketServer> pss(new PhysicalSocketServer());
Niels Möllerd0b88792021-08-12 08:32:30227 std::unique_ptr<Socket> client(pss->CreateSocket(src.family(), SOCK_DGRAM));
228 std::unique_ptr<Socket> server(pss->CreateSocket(src.family(), SOCK_DGRAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26229 if (client->Bind(SocketAddress(src.ipaddr(), 0)) != 0 ||
230 server->Bind(SocketAddress(dst, 0)) != 0) {
231 return false;
232 }
233 const char* buf = "hello other socket";
234 size_t len = strlen(buf);
235 int sent = client->SendTo(buf, len, server->GetLocalAddress());
Per K056782c2024-01-30 11:32:05236
henrike@webrtc.orgf0488722014-05-13 18:00:26237 Thread::Current()->SleepMs(100);
Per K056782c2024-01-30 11:32:05238 rtc::Buffer payload;
239 Socket::ReceiveBuffer receive_buffer(payload);
240 int received = server->RecvFrom(receive_buffer);
241 return received == sent && ::memcmp(buf, payload.data(), len) == 0;
henrike@webrtc.orgf0488722014-05-13 18:00:26242}
243
244void TestPhysicalInternal(const SocketAddress& int_addr) {
Jonas Orelandc06fe8b2022-03-28 12:58:26245 webrtc::test::ScopedKeyValueConfig field_trials;
Niels Möller83830f32022-05-20 07:12:57246 rtc::AutoThread main_thread;
Niels Mölleraa373162021-09-28 14:09:07247 PhysicalSocketServer socket_server;
Jonas Orelandc06fe8b2022-03-28 12:58:26248 BasicNetworkManager network_manager(nullptr, &socket_server, &field_trials);
henrike@webrtc.orgf0488722014-05-13 18:00:26249 network_manager.StartUpdating();
250 // Process pending messages so the network list is updated.
251 Thread::Current()->ProcessMessages(0);
252
Niels Möller22211442022-04-07 09:43:28253 std::vector<const Network*> networks = network_manager.GetNetworks();
Taylor Brandstetter0c7e9f52015-12-29 22:14:52254 networks.erase(std::remove_if(networks.begin(), networks.end(),
Niels Möllere0c6bdf2022-03-24 14:18:02255 [](const rtc::Network* network) {
Taylor Brandstetter0c7e9f52015-12-29 22:14:52256 return rtc::kDefaultNetworkIgnoreMask &
257 network->type();
258 }),
259 networks.end());
henrike@webrtc.orgf0488722014-05-13 18:00:26260 if (networks.empty()) {
Mirko Bonadei675513b2017-11-09 10:09:25261 RTC_LOG(LS_WARNING) << "Not enough network adapters for test.";
henrike@webrtc.orgf0488722014-05-13 18:00:26262 return;
263 }
264
265 SocketAddress ext_addr1(int_addr);
266 SocketAddress ext_addr2;
267 // Find an available IP with matching family. The test breaks if int_addr
268 // can't talk to ip, so check for connectivity as well.
Niels Möllerd959f3a2022-04-19 09:29:19269 for (const Network* const network : networks) {
270 const IPAddress& ip = network->GetBestIP();
henrike@webrtc.orgf0488722014-05-13 18:00:26271 if (ip.family() == int_addr.family() && TestConnectivity(int_addr, ip)) {
272 ext_addr2.SetIP(ip);
273 break;
274 }
275 }
276 if (ext_addr2.IsNil()) {
Jonas Olssonabbe8412018-04-03 11:40:05277 RTC_LOG(LS_WARNING) << "No available IP of same family as "
278 << int_addr.ToString();
henrike@webrtc.orgf0488722014-05-13 18:00:26279 return;
280 }
281
Jonas Olssonabbe8412018-04-03 11:40:05282 RTC_LOG(LS_INFO) << "selected ip " << ext_addr2.ipaddr().ToString();
henrike@webrtc.orgf0488722014-05-13 18:00:26283
284 SocketAddress ext_addrs[4] = {
Yves Gerey665174f2018-06-19 13:03:05285 SocketAddress(ext_addr1), SocketAddress(ext_addr2),
286 SocketAddress(ext_addr1), SocketAddress(ext_addr2)};
henrike@webrtc.orgf0488722014-05-13 18:00:26287
jbauch555604a2016-04-26 10:13:22288 std::unique_ptr<PhysicalSocketServer> int_pss(new PhysicalSocketServer());
289 std::unique_ptr<PhysicalSocketServer> ext_pss(new PhysicalSocketServer());
henrike@webrtc.orgf0488722014-05-13 18:00:26290
291 TestBindings(int_pss.get(), int_addr, ext_pss.get(), ext_addrs);
292 TestFilters(int_pss.get(), int_addr, ext_pss.get(), ext_addrs);
293}
294
henrike@webrtc.orgc732a3e2014-10-09 22:08:15295TEST(NatTest, TestPhysicalIPv4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26296 TestPhysicalInternal(SocketAddress("127.0.0.1", 0));
297}
298
henrike@webrtc.orgc732a3e2014-10-09 22:08:15299TEST(NatTest, TestPhysicalIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26300 if (HasIPv6Enabled()) {
301 TestPhysicalInternal(SocketAddress("::1", 0));
302 } else {
Mirko Bonadei675513b2017-11-09 10:09:25303 RTC_LOG(LS_WARNING) << "No IPv6, skipping";
henrike@webrtc.orgf0488722014-05-13 18:00:26304 }
305}
306
Guo-wei Shiehbe508a12015-04-06 19:48:47307namespace {
308
henrike@webrtc.orgf0488722014-05-13 18:00:26309class TestVirtualSocketServer : public VirtualSocketServer {
310 public:
henrike@webrtc.orgf0488722014-05-13 18:00:26311 // Expose this publicly
312 IPAddress GetNextIP(int af) { return VirtualSocketServer::GetNextIP(af); }
henrike@webrtc.orgf0488722014-05-13 18:00:26313};
314
Guo-wei Shiehbe508a12015-04-06 19:48:47315} // namespace
316
henrike@webrtc.orgf0488722014-05-13 18:00:26317void TestVirtualInternal(int family) {
Niels Möller83830f32022-05-20 07:12:57318 rtc::AutoThread main_thread;
jbauch555604a2016-04-26 10:13:22319 std::unique_ptr<TestVirtualSocketServer> int_vss(
deadbeef98e186c2017-05-17 01:00:06320 new TestVirtualSocketServer());
jbauch555604a2016-04-26 10:13:22321 std::unique_ptr<TestVirtualSocketServer> ext_vss(
deadbeef98e186c2017-05-17 01:00:06322 new TestVirtualSocketServer());
henrike@webrtc.orgf0488722014-05-13 18:00:26323
324 SocketAddress int_addr;
325 SocketAddress ext_addrs[4];
326 int_addr.SetIP(int_vss->GetNextIP(family));
327 ext_addrs[0].SetIP(ext_vss->GetNextIP(int_addr.family()));
328 ext_addrs[1].SetIP(ext_vss->GetNextIP(int_addr.family()));
329 ext_addrs[2].SetIP(ext_addrs[0].ipaddr());
330 ext_addrs[3].SetIP(ext_addrs[1].ipaddr());
331
332 TestBindings(int_vss.get(), int_addr, ext_vss.get(), ext_addrs);
333 TestFilters(int_vss.get(), int_addr, ext_vss.get(), ext_addrs);
334}
335
henrike@webrtc.orgc732a3e2014-10-09 22:08:15336TEST(NatTest, TestVirtualIPv4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26337 TestVirtualInternal(AF_INET);
338}
339
henrike@webrtc.orgc732a3e2014-10-09 22:08:15340TEST(NatTest, TestVirtualIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26341 if (HasIPv6Enabled()) {
342 TestVirtualInternal(AF_INET6);
343 } else {
Mirko Bonadei675513b2017-11-09 10:09:25344 RTC_LOG(LS_WARNING) << "No IPv6, skipping";
henrike@webrtc.orgf0488722014-05-13 18:00:26345 }
346}
347
Mirko Bonadei6a489f22019-04-09 13:11:12348class NatTcpTest : public ::testing::Test, public sigslot::has_slots<> {
henrike@webrtc.orgf0488722014-05-13 18:00:26349 public:
deadbeefc5d0d952015-07-16 17:22:21350 NatTcpTest()
351 : int_addr_("192.168.0.1", 0),
352 ext_addr_("10.0.0.1", 0),
353 connected_(false),
deadbeef98e186c2017-05-17 01:00:06354 int_vss_(new TestVirtualSocketServer()),
355 ext_vss_(new TestVirtualSocketServer()),
deadbeefc5d0d952015-07-16 17:22:21356 int_thread_(new Thread(int_vss_.get())),
357 ext_thread_(new Thread(ext_vss_.get())),
deadbeef98e186c2017-05-17 01:00:06358 nat_(new NATServer(NAT_OPEN_CONE,
Per Ka8cd2ba2023-12-13 07:10:06359 *int_thread_,
deadbeef98e186c2017-05-17 01:00:06360 int_vss_.get(),
361 int_addr_,
362 int_addr_,
Per Ka8cd2ba2023-12-13 07:10:06363 *ext_thread_,
deadbeef98e186c2017-05-17 01:00:06364 ext_vss_.get(),
365 ext_addr_)),
deadbeefc5d0d952015-07-16 17:22:21366 natsf_(new NATSocketFactory(int_vss_.get(),
367 nat_->internal_udp_address(),
368 nat_->internal_tcp_address())) {
369 int_thread_->Start();
370 ext_thread_->Start();
henrike@webrtc.orgf0488722014-05-13 18:00:26371 }
deadbeefc5d0d952015-07-16 17:22:21372
Niels Möllerd0b88792021-08-12 08:32:30373 void OnConnectEvent(Socket* socket) { connected_ = true; }
deadbeefc5d0d952015-07-16 17:22:21374
Niels Möllerd0b88792021-08-12 08:32:30375 void OnAcceptEvent(Socket* socket) {
deadbeef37f5ecf2017-02-27 22:06:41376 accepted_.reset(server_->Accept(nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26377 }
deadbeefc5d0d952015-07-16 17:22:21378
Niels Möllerd0b88792021-08-12 08:32:30379 void OnCloseEvent(Socket* socket, int error) {}
deadbeefc5d0d952015-07-16 17:22:21380
henrike@webrtc.orgf0488722014-05-13 18:00:26381 void ConnectEvents() {
382 server_->SignalReadEvent.connect(this, &NatTcpTest::OnAcceptEvent);
383 client_->SignalConnectEvent.connect(this, &NatTcpTest::OnConnectEvent);
384 }
deadbeefc5d0d952015-07-16 17:22:21385
386 SocketAddress int_addr_;
387 SocketAddress ext_addr_;
henrike@webrtc.orgf0488722014-05-13 18:00:26388 bool connected_;
jbauch555604a2016-04-26 10:13:22389 std::unique_ptr<TestVirtualSocketServer> int_vss_;
390 std::unique_ptr<TestVirtualSocketServer> ext_vss_;
391 std::unique_ptr<Thread> int_thread_;
392 std::unique_ptr<Thread> ext_thread_;
393 std::unique_ptr<NATServer> nat_;
394 std::unique_ptr<NATSocketFactory> natsf_;
Niels Möllerd0b88792021-08-12 08:32:30395 std::unique_ptr<Socket> client_;
396 std::unique_ptr<Socket> server_;
397 std::unique_ptr<Socket> accepted_;
henrike@webrtc.orgf0488722014-05-13 18:00:26398};
399
magjed65eb1c32015-07-22 13:28:26400TEST_F(NatTcpTest, DISABLED_TestConnectOut) {
Niels Möllerd0b88792021-08-12 08:32:30401 server_.reset(ext_vss_->CreateSocket(AF_INET, SOCK_STREAM));
deadbeefc5d0d952015-07-16 17:22:21402 server_->Bind(ext_addr_);
henrike@webrtc.orgf0488722014-05-13 18:00:26403 server_->Listen(5);
404
Niels Möllerd0b88792021-08-12 08:32:30405 client_.reset(natsf_->CreateSocket(AF_INET, SOCK_STREAM));
deadbeefc5d0d952015-07-16 17:22:21406 EXPECT_GE(0, client_->Bind(int_addr_));
henrike@webrtc.orgf0488722014-05-13 18:00:26407 EXPECT_GE(0, client_->Connect(server_->GetLocalAddress()));
408
henrike@webrtc.orgf0488722014-05-13 18:00:26409 ConnectEvents();
410
411 EXPECT_TRUE_WAIT(connected_, 1000);
412 EXPECT_EQ(client_->GetRemoteAddress(), server_->GetLocalAddress());
deadbeefc5d0d952015-07-16 17:22:21413 EXPECT_EQ(accepted_->GetRemoteAddress().ipaddr(), ext_addr_.ipaddr());
henrike@webrtc.orgf0488722014-05-13 18:00:26414
jbauch555604a2016-04-26 10:13:22415 std::unique_ptr<rtc::TestClient> in(CreateTCPTestClient(client_.release()));
416 std::unique_ptr<rtc::TestClient> out(
deadbeefc5d0d952015-07-16 17:22:21417 CreateTCPTestClient(accepted_.release()));
418
419 const char* buf = "test_packet";
420 size_t len = strlen(buf);
421
422 in->Send(buf, len);
423 SocketAddress trans_addr;
424 EXPECT_TRUE(out->CheckNextPacket(buf, len, &trans_addr));
425
426 out->Send(buf, len);
427 EXPECT_TRUE(in->CheckNextPacket(buf, len, &trans_addr));
henrike@webrtc.orgf0488722014-05-13 18:00:26428}
Mirko Bonadeie10b1632018-12-11 17:43:40429
430} // namespace
431} // namespace rtc