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

Side by Side Diff: webrtc/base/nat_unittest.cc

Issue 1215713003: Ensuring that UDP TURN servers are always used as STUN servers. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fixing compiler warning, and memory leak in NAT unit test Created 5 years, 5 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 unified diff | Download patch
« no previous file with comments | « no previous file | webrtc/base/natserver.h » ('j') | webrtc/base/natserver.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « no previous file | webrtc/base/natserver.h » ('j') | webrtc/base/natserver.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698