blob: e2f1d05f16f446fdaf4b95c36074978cff47606f [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
2 * Copyright 2006 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
11#include <math.h>
12#include <time.h>
13#if defined(WEBRTC_POSIX)
14#include <netinet/in.h>
15#endif
16
jbauch555604a2016-04-26 03:13:22 -070017#include <memory>
18
tfarina5237aaf2015-11-10 23:44:30 -080019#include "webrtc/base/arraysize.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000020#include "webrtc/base/logging.h"
21#include "webrtc/base/gunit.h"
22#include "webrtc/base/testclient.h"
23#include "webrtc/base/testutils.h"
24#include "webrtc/base/thread.h"
25#include "webrtc/base/timeutils.h"
26#include "webrtc/base/virtualsocketserver.h"
27
28using namespace rtc;
29
kwibergd0d81482017-04-18 03:18:22 -070030using webrtc::testing::SSE_CLOSE;
31using webrtc::testing::SSE_ERROR;
32using webrtc::testing::SSE_OPEN;
33using webrtc::testing::SSE_READ;
34using webrtc::testing::SSE_WRITE;
35using webrtc::testing::StreamSink;
36
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000037// Sends at a constant rate but with random packet sizes.
38struct Sender : public MessageHandler {
Peter Boström0c4e06b2015-10-07 12:23:21 +020039 Sender(Thread* th, AsyncSocket* s, uint32_t rt)
40 : thread(th),
41 socket(new AsyncUDPSocket(s)),
42 done(false),
43 rate(rt),
44 count(0) {
Honghai Zhang82d78622016-05-06 11:29:15 -070045 last_send = rtc::TimeMillis();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070046 thread->PostDelayed(RTC_FROM_HERE, NextDelay(), this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000047 }
48
Peter Boström0c4e06b2015-10-07 12:23:21 +020049 uint32_t NextDelay() {
50 uint32_t size = (rand() % 4096) + 1;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000051 return 1000 * size / rate;
52 }
53
54 void OnMessage(Message* pmsg) {
55 ASSERT_EQ(1u, pmsg->message_id);
56
57 if (done)
58 return;
59
Honghai Zhang82d78622016-05-06 11:29:15 -070060 int64_t cur_time = rtc::TimeMillis();
61 int64_t delay = cur_time - last_send;
62 uint32_t size = static_cast<uint32_t>(rate * delay / 1000);
Peter Boström0c4e06b2015-10-07 12:23:21 +020063 size = std::min<uint32_t>(size, 4096);
64 size = std::max<uint32_t>(size, sizeof(uint32_t));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000065
66 count += size;
67 memcpy(dummy, &cur_time, sizeof(cur_time));
68 socket->Send(dummy, size, options);
69
70 last_send = cur_time;
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070071 thread->PostDelayed(RTC_FROM_HERE, NextDelay(), this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000072 }
73
74 Thread* thread;
jbauch555604a2016-04-26 03:13:22 -070075 std::unique_ptr<AsyncUDPSocket> socket;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000076 rtc::PacketOptions options;
77 bool done;
Peter Boström0c4e06b2015-10-07 12:23:21 +020078 uint32_t rate; // bytes per second
79 uint32_t count;
Honghai Zhang82d78622016-05-06 11:29:15 -070080 int64_t last_send;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000081 char dummy[4096];
82};
83
84struct Receiver : public MessageHandler, public sigslot::has_slots<> {
Peter Boström0c4e06b2015-10-07 12:23:21 +020085 Receiver(Thread* th, AsyncSocket* s, uint32_t bw)
86 : thread(th),
87 socket(new AsyncUDPSocket(s)),
88 bandwidth(bw),
89 done(false),
90 count(0),
91 sec_count(0),
92 sum(0),
93 sum_sq(0),
94 samples(0) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000095 socket->SignalReadPacket.connect(this, &Receiver::OnReadPacket);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070096 thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000097 }
98
99 ~Receiver() {
100 thread->Clear(this);
101 }
102
103 void OnReadPacket(AsyncPacketSocket* s, const char* data, size_t size,
104 const SocketAddress& remote_addr,
105 const PacketTime& packet_time) {
106 ASSERT_EQ(socket.get(), s);
107 ASSERT_GE(size, 4U);
108
109 count += size;
110 sec_count += size;
111
Peter Boström0c4e06b2015-10-07 12:23:21 +0200112 uint32_t send_time = *reinterpret_cast<const uint32_t*>(data);
Honghai Zhang82d78622016-05-06 11:29:15 -0700113 uint32_t recv_time = rtc::TimeMillis();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200114 uint32_t delay = recv_time - send_time;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000115 sum += delay;
116 sum_sq += delay * delay;
117 samples += 1;
118 }
119
120 void OnMessage(Message* pmsg) {
121 ASSERT_EQ(1u, pmsg->message_id);
122
123 if (done)
124 return;
125
126 // It is always possible for us to receive more than expected because
127 // packets can be further delayed in delivery.
128 if (bandwidth > 0)
129 ASSERT_TRUE(sec_count <= 5 * bandwidth / 4);
130 sec_count = 0;
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700131 thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000132 }
133
134 Thread* thread;
jbauch555604a2016-04-26 03:13:22 -0700135 std::unique_ptr<AsyncUDPSocket> socket;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200136 uint32_t bandwidth;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000137 bool done;
138 size_t count;
139 size_t sec_count;
140 double sum;
141 double sum_sq;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200142 uint32_t samples;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000143};
144
145class VirtualSocketServerTest : public testing::Test {
146 public:
deadbeef37f5ecf2017-02-27 14:06:41 -0800147 VirtualSocketServerTest()
148 : ss_(new VirtualSocketServer(nullptr)),
149 kIPv4AnyAddress(IPAddress(INADDR_ANY), 0),
150 kIPv6AnyAddress(IPAddress(in6addr_any), 0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000151
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000152 void CheckPortIncrementalization(const SocketAddress& post,
153 const SocketAddress& pre) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000154 EXPECT_EQ(post.port(), pre.port() + 1);
155 IPAddress post_ip = post.ipaddr();
156 IPAddress pre_ip = pre.ipaddr();
157 EXPECT_EQ(pre_ip.family(), post_ip.family());
158 if (post_ip.family() == AF_INET) {
159 in_addr pre_ipv4 = pre_ip.ipv4_address();
160 in_addr post_ipv4 = post_ip.ipv4_address();
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000161 EXPECT_EQ(post_ipv4.s_addr, pre_ipv4.s_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000162 } else if (post_ip.family() == AF_INET6) {
163 in6_addr post_ip6 = post_ip.ipv6_address();
164 in6_addr pre_ip6 = pre_ip.ipv6_address();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200165 uint32_t* post_as_ints = reinterpret_cast<uint32_t*>(&post_ip6.s6_addr);
166 uint32_t* pre_as_ints = reinterpret_cast<uint32_t*>(&pre_ip6.s6_addr);
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000167 EXPECT_EQ(post_as_ints[3], pre_as_ints[3]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000168 }
169 }
170
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700171 // Test a client can bind to the any address, and all sent packets will have
172 // the default route as the source address. Also, it can receive packets sent
173 // to the default route.
174 void TestDefaultRoute(const IPAddress& default_route) {
175 ss_->SetDefaultRoute(default_route);
176
177 // Create client1 bound to the any address.
178 AsyncSocket* socket =
179 ss_->CreateAsyncSocket(default_route.family(), SOCK_DGRAM);
180 socket->Bind(EmptySocketAddressWithFamily(default_route.family()));
181 SocketAddress client1_any_addr = socket->GetLocalAddress();
182 EXPECT_TRUE(client1_any_addr.IsAnyIP());
183 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket));
184
185 // Create client2 bound to the default route.
186 AsyncSocket* socket2 =
187 ss_->CreateAsyncSocket(default_route.family(), SOCK_DGRAM);
188 socket2->Bind(SocketAddress(default_route, 0));
189 SocketAddress client2_addr = socket2->GetLocalAddress();
190 EXPECT_FALSE(client2_addr.IsAnyIP());
191 TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2));
192
193 // Client1 sends to client2, client2 should see the default route as
194 // client1's address.
195 SocketAddress client1_addr;
196 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
197 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
198 EXPECT_EQ(client1_addr,
199 SocketAddress(default_route, client1_any_addr.port()));
200
201 // Client2 can send back to client1's default route address.
202 EXPECT_EQ(3, client2->SendTo("foo", 3, client1_addr));
203 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
204 }
205
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000206 void BasicTest(const SocketAddress& initial_addr) {
207 AsyncSocket* socket = ss_->CreateAsyncSocket(initial_addr.family(),
208 SOCK_DGRAM);
209 socket->Bind(initial_addr);
210 SocketAddress server_addr = socket->GetLocalAddress();
211 // Make sure VSS didn't switch families on us.
212 EXPECT_EQ(server_addr.family(), initial_addr.family());
213
214 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket));
215 AsyncSocket* socket2 =
216 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
217 TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2));
218
219 SocketAddress client2_addr;
220 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
221 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
222
223 SocketAddress client1_addr;
224 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
225 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
226 EXPECT_EQ(client1_addr, server_addr);
227
228 SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family());
229 for (int i = 0; i < 10; i++) {
230 client2 = new TestClient(AsyncUDPSocket::Create(ss_, empty));
231
232 SocketAddress next_client2_addr;
233 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
234 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr));
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000235 CheckPortIncrementalization(next_client2_addr, client2_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000236 // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1);
237
238 SocketAddress server_addr2;
239 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr));
240 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2));
241 EXPECT_EQ(server_addr2, server_addr);
242
243 client2_addr = next_client2_addr;
244 }
245 }
246
247 // initial_addr should be made from either INADDR_ANY or in6addr_any.
248 void ConnectTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700249 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000250 SocketAddress accept_addr;
251 const SocketAddress kEmptyAddr =
252 EmptySocketAddressWithFamily(initial_addr.family());
253
254 // Create client
255 AsyncSocket* client = ss_->CreateAsyncSocket(initial_addr.family(),
256 SOCK_STREAM);
257 sink.Monitor(client);
258 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
259 EXPECT_TRUE(client->GetLocalAddress().IsNil());
260
261 // Create server
262 AsyncSocket* server = ss_->CreateAsyncSocket(initial_addr.family(),
263 SOCK_STREAM);
264 sink.Monitor(server);
265 EXPECT_NE(0, server->Listen(5)); // Bind required
266 EXPECT_EQ(0, server->Bind(initial_addr));
267 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
268 EXPECT_EQ(0, server->Listen(5));
269 EXPECT_EQ(server->GetState(), AsyncSocket::CS_CONNECTING);
270
271 // No pending server connections
kwibergd0d81482017-04-18 03:18:22 -0700272 EXPECT_FALSE(sink.Check(server, SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800273 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000274 EXPECT_EQ(AF_UNSPEC, accept_addr.family());
275
276 // Attempt connect to listening socket
277 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
278 EXPECT_NE(client->GetLocalAddress(), kEmptyAddr); // Implicit Bind
279 EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family()); // Implicit Bind
280 EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress());
281
282 // Client is connecting
283 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
kwibergd0d81482017-04-18 03:18:22 -0700284 EXPECT_FALSE(sink.Check(client, SSE_OPEN));
285 EXPECT_FALSE(sink.Check(client, SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000286
287 ss_->ProcessMessagesUntilIdle();
288
289 // Client still connecting
290 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
kwibergd0d81482017-04-18 03:18:22 -0700291 EXPECT_FALSE(sink.Check(client, SSE_OPEN));
292 EXPECT_FALSE(sink.Check(client, SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000293
294 // Server has pending connection
kwibergd0d81482017-04-18 03:18:22 -0700295 EXPECT_TRUE(sink.Check(server, SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000296 Socket* accepted = server->Accept(&accept_addr);
deadbeef37f5ecf2017-02-27 14:06:41 -0800297 EXPECT_TRUE(nullptr != accepted);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000298 EXPECT_NE(accept_addr, kEmptyAddr);
299 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr);
300
301 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED);
302 EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress());
303 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress());
304
305 ss_->ProcessMessagesUntilIdle();
306
307 // Client has connected
308 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTED);
kwibergd0d81482017-04-18 03:18:22 -0700309 EXPECT_TRUE(sink.Check(client, SSE_OPEN));
310 EXPECT_FALSE(sink.Check(client, SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000311 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
312 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
313 }
314
315 void ConnectToNonListenerTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700316 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000317 SocketAddress accept_addr;
318 const SocketAddress nil_addr;
319 const SocketAddress empty_addr =
320 EmptySocketAddressWithFamily(initial_addr.family());
321
322 // Create client
323 AsyncSocket* client = ss_->CreateAsyncSocket(initial_addr.family(),
324 SOCK_STREAM);
325 sink.Monitor(client);
326
327 // Create server
328 AsyncSocket* server = ss_->CreateAsyncSocket(initial_addr.family(),
329 SOCK_STREAM);
330 sink.Monitor(server);
331 EXPECT_EQ(0, server->Bind(initial_addr));
332 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
333 // Attempt connect to non-listening socket
334 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
335
336 ss_->ProcessMessagesUntilIdle();
337
338 // No pending server connections
kwibergd0d81482017-04-18 03:18:22 -0700339 EXPECT_FALSE(sink.Check(server, SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800340 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000341 EXPECT_EQ(accept_addr, nil_addr);
342
343 // Connection failed
344 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700345 EXPECT_FALSE(sink.Check(client, SSE_OPEN));
346 EXPECT_TRUE(sink.Check(client, SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000347 EXPECT_EQ(client->GetRemoteAddress(), nil_addr);
348 }
349
350 void CloseDuringConnectTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700351 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000352 SocketAddress accept_addr;
353 const SocketAddress empty_addr =
354 EmptySocketAddressWithFamily(initial_addr.family());
355
356 // Create client and server
jbauch555604a2016-04-26 03:13:22 -0700357 std::unique_ptr<AsyncSocket> client(
358 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000359 sink.Monitor(client.get());
jbauch555604a2016-04-26 03:13:22 -0700360 std::unique_ptr<AsyncSocket> server(
361 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000362 sink.Monitor(server.get());
363
364 // Initiate connect
365 EXPECT_EQ(0, server->Bind(initial_addr));
366 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
367
368 EXPECT_EQ(0, server->Listen(5));
369 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
370
371 // Server close before socket enters accept queue
kwibergd0d81482017-04-18 03:18:22 -0700372 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000373 server->Close();
374
375 ss_->ProcessMessagesUntilIdle();
376
377 // Result: connection failed
378 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700379 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000380
381 server.reset(ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
382 sink.Monitor(server.get());
383
384 // Initiate connect
385 EXPECT_EQ(0, server->Bind(initial_addr));
386 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
387
388 EXPECT_EQ(0, server->Listen(5));
389 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
390
391 ss_->ProcessMessagesUntilIdle();
392
393 // Server close while socket is in accept queue
kwibergd0d81482017-04-18 03:18:22 -0700394 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000395 server->Close();
396
397 ss_->ProcessMessagesUntilIdle();
398
399 // Result: connection failed
400 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700401 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000402
403 // New server
404 server.reset(ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
405 sink.Monitor(server.get());
406
407 // Initiate connect
408 EXPECT_EQ(0, server->Bind(initial_addr));
409 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
410
411 EXPECT_EQ(0, server->Listen(5));
412 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
413
414 ss_->ProcessMessagesUntilIdle();
415
416 // Server accepts connection
kwibergd0d81482017-04-18 03:18:22 -0700417 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
jbauch555604a2016-04-26 03:13:22 -0700418 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
deadbeef37f5ecf2017-02-27 14:06:41 -0800419 ASSERT_TRUE(nullptr != accepted.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000420 sink.Monitor(accepted.get());
421
422 // Client closes before connection complets
423 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED);
424
425 // Connected message has not been processed yet.
426 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
427 client->Close();
428
429 ss_->ProcessMessagesUntilIdle();
430
431 // Result: accepted socket closes
432 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700433 EXPECT_TRUE(sink.Check(accepted.get(), SSE_CLOSE));
434 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000435 }
436
437 void CloseTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700438 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000439 const SocketAddress kEmptyAddr;
440
441 // Create clients
442 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM);
443 sink.Monitor(a);
444 a->Bind(initial_addr);
445 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
446
jbauch555604a2016-04-26 03:13:22 -0700447 std::unique_ptr<AsyncSocket> b(
448 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000449 sink.Monitor(b.get());
450 b->Bind(initial_addr);
451 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
452
453 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
454 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
455
456 ss_->ProcessMessagesUntilIdle();
457
kwibergd0d81482017-04-18 03:18:22 -0700458 EXPECT_TRUE(sink.Check(a, SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000459 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CONNECTED);
460 EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress());
461
kwibergd0d81482017-04-18 03:18:22 -0700462 EXPECT_TRUE(sink.Check(b.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000463 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CONNECTED);
464 EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress());
465
466 EXPECT_EQ(1, a->Send("a", 1));
467 b->Close();
468 EXPECT_EQ(1, a->Send("b", 1));
469
470 ss_->ProcessMessagesUntilIdle();
471
472 char buffer[10];
kwibergd0d81482017-04-18 03:18:22 -0700473 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
Stefan Holmer9131efd2016-05-23 18:19:26 +0200474 EXPECT_EQ(-1, b->Recv(buffer, 10, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000475
kwibergd0d81482017-04-18 03:18:22 -0700476 EXPECT_TRUE(sink.Check(a, SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000477 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CLOSED);
478 EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr);
479
480 // No signal for Closer
kwibergd0d81482017-04-18 03:18:22 -0700481 EXPECT_FALSE(sink.Check(b.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000482 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CLOSED);
483 EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr);
484 }
485
486 void TcpSendTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700487 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000488 const SocketAddress kEmptyAddr;
489
490 // Connect two sockets
491 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM);
492 sink.Monitor(a);
493 a->Bind(initial_addr);
494 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
495
496 AsyncSocket* b = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM);
497 sink.Monitor(b);
498 b->Bind(initial_addr);
499 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
500
501 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
502 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
503
504 ss_->ProcessMessagesUntilIdle();
505
506 const size_t kBufferSize = 2000;
507 ss_->set_send_buffer_capacity(kBufferSize);
508 ss_->set_recv_buffer_capacity(kBufferSize);
509
510 const size_t kDataSize = 5000;
511 char send_buffer[kDataSize], recv_buffer[kDataSize];
512 for (size_t i = 0; i < kDataSize; ++i)
513 send_buffer[i] = static_cast<char>(i % 256);
514 memset(recv_buffer, 0, sizeof(recv_buffer));
515 size_t send_pos = 0, recv_pos = 0;
516
517 // Can't send more than send buffer in one write
518 int result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
519 EXPECT_EQ(static_cast<int>(kBufferSize), result);
520 send_pos += result;
521
522 ss_->ProcessMessagesUntilIdle();
kwibergd0d81482017-04-18 03:18:22 -0700523 EXPECT_FALSE(sink.Check(a, SSE_WRITE));
524 EXPECT_TRUE(sink.Check(b, SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000525
526 // Receive buffer is already filled, fill send buffer again
527 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
528 EXPECT_EQ(static_cast<int>(kBufferSize), result);
529 send_pos += result;
530
531 ss_->ProcessMessagesUntilIdle();
kwibergd0d81482017-04-18 03:18:22 -0700532 EXPECT_FALSE(sink.Check(a, SSE_WRITE));
533 EXPECT_FALSE(sink.Check(b, SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000534
535 // No more room in send or receive buffer
536 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
537 EXPECT_EQ(-1, result);
538 EXPECT_TRUE(a->IsBlocking());
539
540 // Read a subset of the data
Stefan Holmer9131efd2016-05-23 18:19:26 +0200541 result = b->Recv(recv_buffer + recv_pos, 500, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000542 EXPECT_EQ(500, result);
543 recv_pos += result;
544
545 ss_->ProcessMessagesUntilIdle();
kwibergd0d81482017-04-18 03:18:22 -0700546 EXPECT_TRUE(sink.Check(a, SSE_WRITE));
547 EXPECT_TRUE(sink.Check(b, SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000548
549 // Room for more on the sending side
550 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
551 EXPECT_EQ(500, result);
552 send_pos += result;
553
554 // Empty the recv buffer
555 while (true) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200556 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000557 if (result < 0) {
558 EXPECT_EQ(-1, result);
559 EXPECT_TRUE(b->IsBlocking());
560 break;
561 }
562 recv_pos += result;
563 }
564
565 ss_->ProcessMessagesUntilIdle();
kwibergd0d81482017-04-18 03:18:22 -0700566 EXPECT_TRUE(sink.Check(b, SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000567
568 // Continue to empty the recv buffer
569 while (true) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200570 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000571 if (result < 0) {
572 EXPECT_EQ(-1, result);
573 EXPECT_TRUE(b->IsBlocking());
574 break;
575 }
576 recv_pos += result;
577 }
578
579 // Send last of the data
580 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
581 EXPECT_EQ(500, result);
582 send_pos += result;
583
584 ss_->ProcessMessagesUntilIdle();
kwibergd0d81482017-04-18 03:18:22 -0700585 EXPECT_TRUE(sink.Check(b, SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000586
587 // Receive the last of the data
588 while (true) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200589 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000590 if (result < 0) {
591 EXPECT_EQ(-1, result);
592 EXPECT_TRUE(b->IsBlocking());
593 break;
594 }
595 recv_pos += result;
596 }
597
598 ss_->ProcessMessagesUntilIdle();
kwibergd0d81482017-04-18 03:18:22 -0700599 EXPECT_FALSE(sink.Check(b, SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000600
601 // The received data matches the sent data
602 EXPECT_EQ(kDataSize, send_pos);
603 EXPECT_EQ(kDataSize, recv_pos);
604 EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize));
605 }
606
607 void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) {
608 const SocketAddress kEmptyAddr;
609
610 // Connect two sockets
611 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(),
612 SOCK_STREAM);
613 AsyncSocket* b = ss_->CreateAsyncSocket(initial_addr.family(),
614 SOCK_STREAM);
615 a->Bind(initial_addr);
616 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
617
618 b->Bind(initial_addr);
619 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
620
621 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
622 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
623 ss_->ProcessMessagesUntilIdle();
624
625 // First, deliver all packets in 0 ms.
626 char buffer[2] = { 0, 0 };
627 const char cNumPackets = 10;
628 for (char i = 0; i < cNumPackets; ++i) {
629 buffer[0] = '0' + i;
630 EXPECT_EQ(1, a->Send(buffer, 1));
631 }
632
633 ss_->ProcessMessagesUntilIdle();
634
635 for (char i = 0; i < cNumPackets; ++i) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200636 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000637 EXPECT_EQ(static_cast<char>('0' + i), buffer[0]);
638 }
639
640 // Next, deliver packets at random intervals
Peter Boström0c4e06b2015-10-07 12:23:21 +0200641 const uint32_t mean = 50;
642 const uint32_t stddev = 50;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000643
644 ss_->set_delay_mean(mean);
645 ss_->set_delay_stddev(stddev);
646 ss_->UpdateDelayDistribution();
647
648 for (char i = 0; i < cNumPackets; ++i) {
649 buffer[0] = 'A' + i;
650 EXPECT_EQ(1, a->Send(buffer, 1));
651 }
652
653 ss_->ProcessMessagesUntilIdle();
654
655 for (char i = 0; i < cNumPackets; ++i) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200656 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000657 EXPECT_EQ(static_cast<char>('A' + i), buffer[0]);
658 }
659 }
660
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000661 // It is important that initial_addr's port has to be 0 such that the
662 // incremental port behavior could ensure the 2 Binds result in different
663 // address.
664 void BandwidthTest(const SocketAddress& initial_addr) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000665 AsyncSocket* send_socket =
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000666 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000667 AsyncSocket* recv_socket =
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000668 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
669 ASSERT_EQ(0, send_socket->Bind(initial_addr));
670 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
671 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
672 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000673 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
674
Peter Boström0c4e06b2015-10-07 12:23:21 +0200675 uint32_t bandwidth = 64 * 1024;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000676 ss_->set_bandwidth(bandwidth);
677
678 Thread* pthMain = Thread::Current();
679 Sender sender(pthMain, send_socket, 80 * 1024);
680 Receiver receiver(pthMain, recv_socket, bandwidth);
681
682 pthMain->ProcessMessages(5000);
683 sender.done = true;
684 pthMain->ProcessMessages(5000);
685
686 ASSERT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4);
687 ASSERT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s
688
689 ss_->set_bandwidth(0);
690 }
691
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000692 // It is important that initial_addr's port has to be 0 such that the
693 // incremental port behavior could ensure the 2 Binds result in different
694 // address.
695 void DelayTest(const SocketAddress& initial_addr) {
deadbeef37f5ecf2017-02-27 14:06:41 -0800696 time_t seed = ::time(nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000697 LOG(LS_VERBOSE) << "seed = " << seed;
698 srand(static_cast<unsigned int>(seed));
699
Peter Boström0c4e06b2015-10-07 12:23:21 +0200700 const uint32_t mean = 2000;
701 const uint32_t stddev = 500;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000702
703 ss_->set_delay_mean(mean);
704 ss_->set_delay_stddev(stddev);
705 ss_->UpdateDelayDistribution();
706
707 AsyncSocket* send_socket =
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000708 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000709 AsyncSocket* recv_socket =
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000710 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
711 ASSERT_EQ(0, send_socket->Bind(initial_addr));
712 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
713 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
714 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000715 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
716
717 Thread* pthMain = Thread::Current();
718 // Avg packet size is 2K, so at 200KB/s for 10s, we should see about
719 // 1000 packets, which is necessary to get a good distribution.
720 Sender sender(pthMain, send_socket, 100 * 2 * 1024);
721 Receiver receiver(pthMain, recv_socket, 0);
722
723 pthMain->ProcessMessages(10000);
724 sender.done = receiver.done = true;
725 ss_->ProcessMessagesUntilIdle();
726
727 const double sample_mean = receiver.sum / receiver.samples;
728 double num =
729 receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum;
730 double den = receiver.samples * (receiver.samples - 1);
731 const double sample_stddev = sqrt(num / den);
732 LOG(LS_VERBOSE) << "mean=" << sample_mean << " stddev=" << sample_stddev;
733
734 EXPECT_LE(500u, receiver.samples);
735 // We initially used a 0.1 fudge factor, but on the build machine, we
736 // have seen the value differ by as much as 0.13.
737 EXPECT_NEAR(mean, sample_mean, 0.15 * mean);
738 EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev);
739
740 ss_->set_delay_mean(0);
741 ss_->set_delay_stddev(0);
742 ss_->UpdateDelayDistribution();
743 }
744
745 // Test cross-family communication between a client bound to client_addr and a
746 // server bound to server_addr. shouldSucceed indicates if communication is
747 // expected to work or not.
748 void CrossFamilyConnectionTest(const SocketAddress& client_addr,
749 const SocketAddress& server_addr,
750 bool shouldSucceed) {
kwibergd0d81482017-04-18 03:18:22 -0700751 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000752 SocketAddress accept_address;
753 const SocketAddress kEmptyAddr;
754
755 // Client gets a IPv4 address
756 AsyncSocket* client = ss_->CreateAsyncSocket(client_addr.family(),
757 SOCK_STREAM);
758 sink.Monitor(client);
759 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
760 EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr);
761 client->Bind(client_addr);
762
763 // Server gets a non-mapped non-any IPv6 address.
764 // IPv4 sockets should not be able to connect to this.
765 AsyncSocket* server = ss_->CreateAsyncSocket(server_addr.family(),
766 SOCK_STREAM);
767 sink.Monitor(server);
768 server->Bind(server_addr);
769 server->Listen(5);
770
771 if (shouldSucceed) {
772 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
773 ss_->ProcessMessagesUntilIdle();
kwibergd0d81482017-04-18 03:18:22 -0700774 EXPECT_TRUE(sink.Check(server, SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000775 Socket* accepted = server->Accept(&accept_address);
deadbeef37f5ecf2017-02-27 14:06:41 -0800776 EXPECT_TRUE(nullptr != accepted);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000777 EXPECT_NE(kEmptyAddr, accept_address);
778 ss_->ProcessMessagesUntilIdle();
kwibergd0d81482017-04-18 03:18:22 -0700779 EXPECT_TRUE(sink.Check(client, SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000780 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
781 } else {
782 // Check that the connection failed.
783 EXPECT_EQ(-1, client->Connect(server->GetLocalAddress()));
784 ss_->ProcessMessagesUntilIdle();
785
kwibergd0d81482017-04-18 03:18:22 -0700786 EXPECT_FALSE(sink.Check(server, SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800787 EXPECT_TRUE(nullptr == server->Accept(&accept_address));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000788 EXPECT_EQ(accept_address, kEmptyAddr);
789 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700790 EXPECT_FALSE(sink.Check(client, SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000791 EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr);
792 }
793 }
794
795 // Test cross-family datagram sending between a client bound to client_addr
796 // and a server bound to server_addr. shouldSucceed indicates if sending is
jlmiller@webrtc.orgec499be2015-02-07 22:37:59 +0000797 // expected to succeed or not.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000798 void CrossFamilyDatagramTest(const SocketAddress& client_addr,
799 const SocketAddress& server_addr,
800 bool shouldSucceed) {
801 AsyncSocket* socket = ss_->CreateAsyncSocket(SOCK_DGRAM);
802 socket->Bind(server_addr);
803 SocketAddress bound_server_addr = socket->GetLocalAddress();
804 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket));
805
806 AsyncSocket* socket2 = ss_->CreateAsyncSocket(SOCK_DGRAM);
807 socket2->Bind(client_addr);
808 TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2));
809 SocketAddress client2_addr;
810
811 if (shouldSucceed) {
812 EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr));
813 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
814 SocketAddress client1_addr;
815 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
816 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
817 EXPECT_EQ(client1_addr, bound_server_addr);
818 } else {
819 EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr));
jlmiller@webrtc.orgec499be2015-02-07 22:37:59 +0000820 EXPECT_TRUE(client1->CheckNoPacket());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000821 }
822 }
823
824 protected:
825 virtual void SetUp() {
826 Thread::Current()->set_socketserver(ss_);
827 }
deadbeef37f5ecf2017-02-27 14:06:41 -0800828 virtual void TearDown() { Thread::Current()->set_socketserver(nullptr); }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000829
830 VirtualSocketServer* ss_;
831 const SocketAddress kIPv4AnyAddress;
832 const SocketAddress kIPv6AnyAddress;
833};
834
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000835TEST_F(VirtualSocketServerTest, basic_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000836 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000);
837 BasicTest(ipv4_test_addr);
838}
839
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000840TEST_F(VirtualSocketServerTest, basic_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000841 SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 5000);
842 BasicTest(ipv6_test_addr);
843}
844
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700845TEST_F(VirtualSocketServerTest, TestDefaultRoute_v4) {
846 IPAddress ipv4_default_addr(0x01020304);
847 TestDefaultRoute(ipv4_default_addr);
848}
849
850TEST_F(VirtualSocketServerTest, TestDefaultRoute_v6) {
851 IPAddress ipv6_default_addr;
852 EXPECT_TRUE(
853 IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ipv6_default_addr));
854 TestDefaultRoute(ipv6_default_addr);
855}
856
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000857TEST_F(VirtualSocketServerTest, connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000858 ConnectTest(kIPv4AnyAddress);
859}
860
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000861TEST_F(VirtualSocketServerTest, connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000862 ConnectTest(kIPv6AnyAddress);
863}
864
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000865TEST_F(VirtualSocketServerTest, connect_to_non_listener_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000866 ConnectToNonListenerTest(kIPv4AnyAddress);
867}
868
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000869TEST_F(VirtualSocketServerTest, connect_to_non_listener_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000870 ConnectToNonListenerTest(kIPv6AnyAddress);
871}
872
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000873TEST_F(VirtualSocketServerTest, close_during_connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000874 CloseDuringConnectTest(kIPv4AnyAddress);
875}
876
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000877TEST_F(VirtualSocketServerTest, close_during_connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000878 CloseDuringConnectTest(kIPv6AnyAddress);
879}
880
881TEST_F(VirtualSocketServerTest, close_v4) {
882 CloseTest(kIPv4AnyAddress);
883}
884
885TEST_F(VirtualSocketServerTest, close_v6) {
886 CloseTest(kIPv6AnyAddress);
887}
888
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000889TEST_F(VirtualSocketServerTest, tcp_send_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000890 TcpSendTest(kIPv4AnyAddress);
891}
892
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000893TEST_F(VirtualSocketServerTest, tcp_send_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000894 TcpSendTest(kIPv6AnyAddress);
895}
896
897TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v4) {
898 TcpSendsPacketsInOrderTest(kIPv4AnyAddress);
899}
900
901TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v6) {
902 TcpSendsPacketsInOrderTest(kIPv6AnyAddress);
903}
904
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000905TEST_F(VirtualSocketServerTest, bandwidth_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000906 BandwidthTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000907}
908
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000909TEST_F(VirtualSocketServerTest, bandwidth_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000910 BandwidthTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000911}
912
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000913TEST_F(VirtualSocketServerTest, delay_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000914 DelayTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000915}
916
917// See: https://code.google.com/p/webrtc/issues/detail?id=2409
918TEST_F(VirtualSocketServerTest, DISABLED_delay_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000919 DelayTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000920}
921
922// Works, receiving socket sees 127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000923TEST_F(VirtualSocketServerTest, CanConnectFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000924 CrossFamilyConnectionTest(SocketAddress("::ffff:127.0.0.2", 0),
925 SocketAddress("0.0.0.0", 5000),
926 true);
927}
928
929// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000930TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000931 CrossFamilyConnectionTest(SocketAddress("::2", 0),
932 SocketAddress("0.0.0.0", 5000),
933 false);
934}
935
936// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000937TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000938 CrossFamilyConnectionTest(SocketAddress("::2", 0),
939 SocketAddress("::ffff:127.0.0.1", 5000),
940 false);
941}
942
943// Works. receiving socket sees ::ffff:127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000944TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000945 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
946 SocketAddress("::", 5000),
947 true);
948}
949
950// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000951TEST_F(VirtualSocketServerTest, CantConnectFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000952 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
953 SocketAddress("::1", 5000),
954 false);
955}
956
957// Works. Receiving socket sees ::ffff:127.0.0.1.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000958TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000959 CrossFamilyConnectionTest(SocketAddress("127.0.0.1", 0),
960 SocketAddress("::ffff:127.0.0.2", 5000),
961 true);
962}
963
964// Works, receiving socket sees a result from GetNextIP.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000965TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000966 CrossFamilyConnectionTest(SocketAddress("::", 0),
967 SocketAddress("0.0.0.0", 5000),
968 true);
969}
970
971// Works, receiving socket sees whatever GetNextIP gave the client.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000972TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000973 CrossFamilyConnectionTest(SocketAddress("0.0.0.0", 0),
974 SocketAddress("::", 5000),
975 true);
976}
977
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000978TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000979 CrossFamilyDatagramTest(SocketAddress("0.0.0.0", 0),
980 SocketAddress("::", 5000),
981 true);
982}
983
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000984TEST_F(VirtualSocketServerTest, CanSendDatagramFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000985 CrossFamilyDatagramTest(SocketAddress("::ffff:127.0.0.1", 0),
986 SocketAddress("0.0.0.0", 5000),
987 true);
988}
989
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000990TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000991 CrossFamilyDatagramTest(SocketAddress("::2", 0),
992 SocketAddress("0.0.0.0", 5000),
993 false);
994}
995
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000996TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000997 CrossFamilyDatagramTest(SocketAddress("::2", 0),
998 SocketAddress("::ffff:127.0.0.1", 5000),
999 false);
1000}
1001
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001002TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001003 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
1004 SocketAddress("::", 5000),
1005 true);
1006}
1007
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001008TEST_F(VirtualSocketServerTest, CantSendDatagramFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001009 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
1010 SocketAddress("::1", 5000),
1011 false);
1012}
1013
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001014TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001015 CrossFamilyDatagramTest(SocketAddress("127.0.0.1", 0),
1016 SocketAddress("::ffff:127.0.0.2", 5000),
1017 true);
1018}
1019
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001020TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001021 CrossFamilyDatagramTest(SocketAddress("::", 0),
1022 SocketAddress("0.0.0.0", 5000),
1023 true);
1024}
1025
Taylor Brandstettere7536412016-09-09 13:16:15 -07001026TEST_F(VirtualSocketServerTest, SetSendingBlockedWithUdpSocket) {
1027 AsyncSocket* socket1 =
1028 ss_->CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM);
1029 AsyncSocket* socket2 =
1030 ss_->CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM);
1031 socket1->Bind(kIPv4AnyAddress);
1032 socket2->Bind(kIPv4AnyAddress);
1033 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket1));
1034
1035 ss_->SetSendingBlocked(true);
1036 EXPECT_EQ(-1, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1037 EXPECT_TRUE(socket1->IsBlocking());
1038 EXPECT_EQ(0, client1->ready_to_send_count());
1039
1040 ss_->SetSendingBlocked(false);
1041 EXPECT_EQ(1, client1->ready_to_send_count());
1042 EXPECT_EQ(3, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1043}
1044
1045TEST_F(VirtualSocketServerTest, SetSendingBlockedWithTcpSocket) {
1046 constexpr size_t kBufferSize = 1024;
1047 ss_->set_send_buffer_capacity(kBufferSize);
1048 ss_->set_recv_buffer_capacity(kBufferSize);
1049
kwibergd0d81482017-04-18 03:18:22 -07001050 StreamSink sink;
Taylor Brandstettere7536412016-09-09 13:16:15 -07001051 AsyncSocket* socket1 =
1052 ss_->CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM);
1053 AsyncSocket* socket2 =
1054 ss_->CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM);
1055 sink.Monitor(socket1);
1056 sink.Monitor(socket2);
1057 socket1->Bind(kIPv4AnyAddress);
1058 socket2->Bind(kIPv4AnyAddress);
1059
1060 // Connect sockets.
1061 EXPECT_EQ(0, socket1->Connect(socket2->GetLocalAddress()));
1062 EXPECT_EQ(0, socket2->Connect(socket1->GetLocalAddress()));
1063 ss_->ProcessMessagesUntilIdle();
1064
1065 char data[kBufferSize] = {};
1066
1067 // First Send call will fill the send buffer but not send anything.
1068 ss_->SetSendingBlocked(true);
1069 EXPECT_EQ(static_cast<int>(kBufferSize), socket1->Send(data, kBufferSize));
1070 ss_->ProcessMessagesUntilIdle();
kwibergd0d81482017-04-18 03:18:22 -07001071 EXPECT_FALSE(sink.Check(socket1, SSE_WRITE));
1072 EXPECT_FALSE(sink.Check(socket2, SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001073 EXPECT_FALSE(socket1->IsBlocking());
1074
1075 // Since the send buffer is full, next Send will result in EWOULDBLOCK.
1076 EXPECT_EQ(-1, socket1->Send(data, kBufferSize));
kwibergd0d81482017-04-18 03:18:22 -07001077 EXPECT_FALSE(sink.Check(socket1, SSE_WRITE));
1078 EXPECT_FALSE(sink.Check(socket2, SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001079 EXPECT_TRUE(socket1->IsBlocking());
1080
1081 // When sending is unblocked, the buffered data should be sent and
1082 // SignalWriteEvent should fire.
1083 ss_->SetSendingBlocked(false);
1084 ss_->ProcessMessagesUntilIdle();
kwibergd0d81482017-04-18 03:18:22 -07001085 EXPECT_TRUE(sink.Check(socket1, SSE_WRITE));
1086 EXPECT_TRUE(sink.Check(socket2, SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001087}
1088
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001089TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02001090 const uint32_t kTestMean[] = {10, 100, 333, 1000};
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001091 const double kTestDev[] = { 0.25, 0.1, 0.01 };
Taylor Brandstettere7536412016-09-09 13:16:15 -07001092 // TODO(deadbeef): The current code only works for 1000 data points or more.
Peter Boström0c4e06b2015-10-07 12:23:21 +02001093 const uint32_t kTestSamples[] = {/*10, 100,*/ 1000};
tfarina5237aaf2015-11-10 23:44:30 -08001094 for (size_t midx = 0; midx < arraysize(kTestMean); ++midx) {
1095 for (size_t didx = 0; didx < arraysize(kTestDev); ++didx) {
1096 for (size_t sidx = 0; sidx < arraysize(kTestSamples); ++sidx) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001097 ASSERT_LT(0u, kTestSamples[sidx]);
Peter Boström0c4e06b2015-10-07 12:23:21 +02001098 const uint32_t kStdDev =
1099 static_cast<uint32_t>(kTestDev[didx] * kTestMean[midx]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001100 VirtualSocketServer::Function* f =
1101 VirtualSocketServer::CreateDistribution(kTestMean[midx],
1102 kStdDev,
1103 kTestSamples[sidx]);
deadbeef37f5ecf2017-02-27 14:06:41 -08001104 ASSERT_TRUE(nullptr != f);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001105 ASSERT_EQ(kTestSamples[sidx], f->size());
1106 double sum = 0;
Peter Boström0c4e06b2015-10-07 12:23:21 +02001107 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001108 sum += (*f)[i].second;
1109 }
1110 const double mean = sum / f->size();
1111 double sum_sq_dev = 0;
Peter Boström0c4e06b2015-10-07 12:23:21 +02001112 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001113 double dev = (*f)[i].second - mean;
1114 sum_sq_dev += dev * dev;
1115 }
1116 const double stddev = sqrt(sum_sq_dev / f->size());
1117 EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx])
1118 << "M=" << kTestMean[midx]
1119 << " SD=" << kStdDev
1120 << " N=" << kTestSamples[sidx];
1121 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev)
1122 << "M=" << kTestMean[midx]
1123 << " SD=" << kStdDev
1124 << " N=" << kTestSamples[sidx];
1125 delete f;
1126 }
1127 }
1128 }
1129}