OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include <string> | 11 #include <string> |
12 | 12 |
13 #include "webrtc/base/gunit.h" | 13 #include "webrtc/base/gunit.h" |
14 #include "webrtc/base/logging.h" | 14 #include "webrtc/base/logging.h" |
15 #include "webrtc/base/natserver.h" | 15 #include "webrtc/base/natserver.h" |
16 #include "webrtc/base/natsocketfactory.h" | 16 #include "webrtc/base/natsocketfactory.h" |
17 #include "webrtc/base/nethelpers.h" | 17 #include "webrtc/base/nethelpers.h" |
18 #include "webrtc/base/network.h" | 18 #include "webrtc/base/network.h" |
19 #include "webrtc/base/physicalsocketserver.h" | 19 #include "webrtc/base/physicalsocketserver.h" |
20 #include "webrtc/base/testclient.h" | 20 #include "webrtc/base/testclient.h" |
| 21 #include "webrtc/base/testclient.h" |
| 22 #include "webrtc/base/asynctcpsocket.h" |
21 #include "webrtc/base/virtualsocketserver.h" | 23 #include "webrtc/base/virtualsocketserver.h" |
22 #include "webrtc/test/testsupport/gtest_disable.h" | 24 #include "webrtc/test/testsupport/gtest_disable.h" |
23 | 25 |
24 using namespace rtc; | 26 using namespace rtc; |
25 | 27 |
26 bool CheckReceive( | 28 bool CheckReceive( |
27 TestClient* client, bool should_receive, const char* buf, size_t size) { | 29 TestClient* client, bool should_receive, const char* buf, size_t size) { |
28 return (should_receive) ? | 30 return (should_receive) ? |
29 client->CheckNextPacket(buf, size, 0) : | 31 client->CheckNextPacket(buf, size, 0) : |
30 client->CheckNoPacket(); | 32 client->CheckNoPacket(); |
31 } | 33 } |
32 | 34 |
33 TestClient* CreateTestClient( | 35 TestClient* CreateTestClient( |
34 SocketFactory* factory, const SocketAddress& local_addr) { | 36 SocketFactory* factory, const SocketAddress& local_addr) { |
35 AsyncUDPSocket* socket = AsyncUDPSocket::Create(factory, local_addr); | 37 AsyncUDPSocket* socket = AsyncUDPSocket::Create(factory, local_addr); |
36 return new TestClient(socket); | 38 return new TestClient(socket); |
37 } | 39 } |
38 | 40 |
| 41 TestClient* CreateTCPTestClient(AsyncSocket* socket) { |
| 42 AsyncTCPSocket* packet_socket = new AsyncTCPSocket(socket, false); |
| 43 return new TestClient(packet_socket); |
| 44 } |
| 45 |
39 // Tests that when sending from internal_addr to external_addrs through the | 46 // Tests that when sending from internal_addr to external_addrs through the |
40 // NAT type specified by nat_type, all external addrs receive the sent packet | 47 // NAT type specified by nat_type, all external addrs receive the sent packet |
41 // and, if exp_same is true, all use the same mapped-address on the NAT. | 48 // and, if exp_same is true, all use the same mapped-address on the NAT. |
42 void TestSend( | 49 void TestSend( |
43 SocketServer* internal, const SocketAddress& internal_addr, | 50 SocketServer* internal, const SocketAddress& internal_addr, |
44 SocketServer* external, const SocketAddress external_addrs[4], | 51 SocketServer* external, const SocketAddress external_addrs[4], |
45 NATType nat_type, bool exp_same) { | 52 NATType nat_type, bool exp_same) { |
46 Thread th_int(internal); | 53 Thread th_int(internal); |
47 Thread th_ext(external); | 54 Thread th_ext(external); |
48 | 55 |
49 SocketAddress server_addr = internal_addr; | 56 SocketAddress server_addr = internal_addr; |
50 server_addr.SetPort(0); // Auto-select a port | 57 server_addr.SetPort(0); // Auto-select a port |
51 NATServer* nat = new NATServer( | 58 NATServer* nat = new NATServer(nat_type, internal, server_addr, server_addr, |
52 nat_type, internal, server_addr, external, external_addrs[0]); | 59 external, external_addrs[0]); |
53 NATSocketFactory* natsf = new NATSocketFactory(internal, | 60 NATSocketFactory* natsf = new NATSocketFactory(internal, |
54 nat->internal_address()); | 61 nat->internal_udp_address(), |
| 62 nat->internal_tcp_address()); |
55 | 63 |
56 TestClient* in = CreateTestClient(natsf, internal_addr); | 64 TestClient* in = CreateTestClient(natsf, internal_addr); |
57 TestClient* out[4]; | 65 TestClient* out[4]; |
58 for (int i = 0; i < 4; i++) | 66 for (int i = 0; i < 4; i++) |
59 out[i] = CreateTestClient(external, external_addrs[i]); | 67 out[i] = CreateTestClient(external, external_addrs[i]); |
60 | 68 |
61 th_int.Start(); | 69 th_int.Start(); |
62 th_ext.Start(); | 70 th_ext.Start(); |
63 | 71 |
64 const char* buf = "filter_test"; | 72 const char* buf = "filter_test"; |
(...skipping 27 matching lines...) Expand all Loading... |
92 // is delivered according to the specified filter_ip and filter_port rules. | 100 // is delivered according to the specified filter_ip and filter_port rules. |
93 void TestRecv( | 101 void TestRecv( |
94 SocketServer* internal, const SocketAddress& internal_addr, | 102 SocketServer* internal, const SocketAddress& internal_addr, |
95 SocketServer* external, const SocketAddress external_addrs[4], | 103 SocketServer* external, const SocketAddress external_addrs[4], |
96 NATType nat_type, bool filter_ip, bool filter_port) { | 104 NATType nat_type, bool filter_ip, bool filter_port) { |
97 Thread th_int(internal); | 105 Thread th_int(internal); |
98 Thread th_ext(external); | 106 Thread th_ext(external); |
99 | 107 |
100 SocketAddress server_addr = internal_addr; | 108 SocketAddress server_addr = internal_addr; |
101 server_addr.SetPort(0); // Auto-select a port | 109 server_addr.SetPort(0); // Auto-select a port |
102 NATServer* nat = new NATServer( | 110 NATServer* nat = new NATServer(nat_type, internal, server_addr, server_addr, |
103 nat_type, internal, server_addr, external, external_addrs[0]); | 111 external, external_addrs[0]); |
104 NATSocketFactory* natsf = new NATSocketFactory(internal, | 112 NATSocketFactory* natsf = new NATSocketFactory(internal, |
105 nat->internal_address()); | 113 nat->internal_udp_address(), |
| 114 nat->internal_tcp_address()); |
106 | 115 |
107 TestClient* in = CreateTestClient(natsf, internal_addr); | 116 TestClient* in = CreateTestClient(natsf, internal_addr); |
108 TestClient* out[4]; | 117 TestClient* out[4]; |
109 for (int i = 0; i < 4; i++) | 118 for (int i = 0; i < 4; i++) |
110 out[i] = CreateTestClient(external, external_addrs[i]); | 119 out[i] = CreateTestClient(external, external_addrs[i]); |
111 | 120 |
112 th_int.Start(); | 121 th_int.Start(); |
113 th_ext.Start(); | 122 th_ext.Start(); |
114 | 123 |
115 const char* buf = "filter_test"; | 124 const char* buf = "filter_test"; |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 } | 297 } |
289 | 298 |
290 TEST(NatTest, TestVirtualIPv6) { | 299 TEST(NatTest, TestVirtualIPv6) { |
291 if (HasIPv6Enabled()) { | 300 if (HasIPv6Enabled()) { |
292 TestVirtualInternal(AF_INET6); | 301 TestVirtualInternal(AF_INET6); |
293 } else { | 302 } else { |
294 LOG(LS_WARNING) << "No IPv6, skipping"; | 303 LOG(LS_WARNING) << "No IPv6, skipping"; |
295 } | 304 } |
296 } | 305 } |
297 | 306 |
298 // TODO: Finish this test | |
299 class NatTcpTest : public testing::Test, public sigslot::has_slots<> { | 307 class NatTcpTest : public testing::Test, public sigslot::has_slots<> { |
300 public: | 308 public: |
301 NatTcpTest() : connected_(false) {} | 309 NatTcpTest() |
302 virtual void SetUp() { | 310 : int_addr_("192.168.0.1", 0), |
303 int_vss_ = new TestVirtualSocketServer(new PhysicalSocketServer()); | 311 ext_addr_("10.0.0.1", 0), |
304 ext_vss_ = new TestVirtualSocketServer(new PhysicalSocketServer()); | 312 connected_(false), |
305 nat_ = new NATServer(NAT_OPEN_CONE, int_vss_, SocketAddress(), | 313 int_pss_(new PhysicalSocketServer()), |
306 ext_vss_, SocketAddress()); | 314 ext_pss_(new PhysicalSocketServer()), |
307 natsf_ = new NATSocketFactory(int_vss_, nat_->internal_address()); | 315 int_vss_(new TestVirtualSocketServer(int_pss_)), |
| 316 ext_vss_(new TestVirtualSocketServer(ext_pss_)), |
| 317 int_thread_(new Thread(int_vss_.get())), |
| 318 ext_thread_(new Thread(ext_vss_.get())), |
| 319 nat_(new NATServer(NAT_OPEN_CONE, int_vss_.get(), int_addr_, int_addr_, |
| 320 ext_vss_.get(), ext_addr_)), |
| 321 natsf_(new NATSocketFactory(int_vss_.get(), |
| 322 nat_->internal_udp_address(), |
| 323 nat_->internal_tcp_address())) { |
| 324 int_thread_->Start(); |
| 325 ext_thread_->Start(); |
308 } | 326 } |
| 327 |
309 void OnConnectEvent(AsyncSocket* socket) { | 328 void OnConnectEvent(AsyncSocket* socket) { |
310 connected_ = true; | 329 connected_ = true; |
311 } | 330 } |
| 331 |
312 void OnAcceptEvent(AsyncSocket* socket) { | 332 void OnAcceptEvent(AsyncSocket* socket) { |
313 accepted_ = server_->Accept(NULL); | 333 accepted_.reset(server_->Accept(NULL)); |
314 } | 334 } |
| 335 |
315 void OnCloseEvent(AsyncSocket* socket, int error) { | 336 void OnCloseEvent(AsyncSocket* socket, int error) { |
316 } | 337 } |
| 338 |
317 void ConnectEvents() { | 339 void ConnectEvents() { |
318 server_->SignalReadEvent.connect(this, &NatTcpTest::OnAcceptEvent); | 340 server_->SignalReadEvent.connect(this, &NatTcpTest::OnAcceptEvent); |
319 client_->SignalConnectEvent.connect(this, &NatTcpTest::OnConnectEvent); | 341 client_->SignalConnectEvent.connect(this, &NatTcpTest::OnConnectEvent); |
320 } | 342 } |
321 TestVirtualSocketServer* int_vss_; | 343 |
322 TestVirtualSocketServer* ext_vss_; | 344 SocketAddress int_addr_; |
323 NATServer* nat_; | 345 SocketAddress ext_addr_; |
324 NATSocketFactory* natsf_; | |
325 AsyncSocket* client_; | |
326 AsyncSocket* server_; | |
327 AsyncSocket* accepted_; | |
328 bool connected_; | 346 bool connected_; |
| 347 PhysicalSocketServer* int_pss_; |
| 348 PhysicalSocketServer* ext_pss_; |
| 349 rtc::scoped_ptr<TestVirtualSocketServer> int_vss_; |
| 350 rtc::scoped_ptr<TestVirtualSocketServer> ext_vss_; |
| 351 rtc::scoped_ptr<Thread> int_thread_; |
| 352 rtc::scoped_ptr<Thread> ext_thread_; |
| 353 rtc::scoped_ptr<NATServer> nat_; |
| 354 rtc::scoped_ptr<NATSocketFactory> natsf_; |
| 355 rtc::scoped_ptr<AsyncSocket> client_; |
| 356 rtc::scoped_ptr<AsyncSocket> server_; |
| 357 rtc::scoped_ptr<AsyncSocket> accepted_; |
329 }; | 358 }; |
330 | 359 |
331 TEST_F(NatTcpTest, DISABLED_TestConnectOut) { | 360 TEST_F(NatTcpTest, TestConnectOut) { |
332 server_ = ext_vss_->CreateAsyncSocket(SOCK_STREAM); | 361 server_.reset(ext_vss_->CreateAsyncSocket(SOCK_STREAM)); |
333 server_->Bind(SocketAddress()); | 362 server_->Bind(ext_addr_); |
334 server_->Listen(5); | 363 server_->Listen(5); |
335 | 364 |
336 client_ = int_vss_->CreateAsyncSocket(SOCK_STREAM); | 365 client_.reset(natsf_->CreateAsyncSocket(SOCK_STREAM)); |
337 EXPECT_GE(0, client_->Bind(SocketAddress())); | 366 EXPECT_GE(0, client_->Bind(int_addr_)); |
338 EXPECT_GE(0, client_->Connect(server_->GetLocalAddress())); | 367 EXPECT_GE(0, client_->Connect(server_->GetLocalAddress())); |
339 | 368 |
340 | |
341 ConnectEvents(); | 369 ConnectEvents(); |
342 | 370 |
343 EXPECT_TRUE_WAIT(connected_, 1000); | 371 EXPECT_TRUE_WAIT(connected_, 1000); |
344 EXPECT_EQ(client_->GetRemoteAddress(), server_->GetLocalAddress()); | 372 EXPECT_EQ(client_->GetRemoteAddress(), server_->GetLocalAddress()); |
345 EXPECT_EQ(client_->GetRemoteAddress(), accepted_->GetLocalAddress()); | 373 EXPECT_EQ(accepted_->GetRemoteAddress().ipaddr(), ext_addr_.ipaddr()); |
346 EXPECT_EQ(client_->GetLocalAddress(), accepted_->GetRemoteAddress()); | |
347 | 374 |
348 client_->Close(); | 375 rtc::scoped_ptr<rtc::TestClient> in(CreateTCPTestClient(client_.release())); |
| 376 rtc::scoped_ptr<rtc::TestClient> out( |
| 377 CreateTCPTestClient(accepted_.release())); |
| 378 |
| 379 const char* buf = "test_packet"; |
| 380 size_t len = strlen(buf); |
| 381 |
| 382 in->Send(buf, len); |
| 383 SocketAddress trans_addr; |
| 384 EXPECT_TRUE(out->CheckNextPacket(buf, len, &trans_addr)); |
| 385 |
| 386 out->Send(buf, len); |
| 387 EXPECT_TRUE(in->CheckNextPacket(buf, len, &trans_addr)); |
349 } | 388 } |
350 //#endif | 389 // #endif |
OLD | NEW |