blob: 68ad23bd78c26e4e5b40493e43981696849abae2 [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
tfarina5237aaf2015-11-10 23:44:30 -080017#include "webrtc/base/arraysize.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000018#include "webrtc/base/logging.h"
19#include "webrtc/base/gunit.h"
20#include "webrtc/base/testclient.h"
21#include "webrtc/base/testutils.h"
22#include "webrtc/base/thread.h"
23#include "webrtc/base/timeutils.h"
24#include "webrtc/base/virtualsocketserver.h"
henrike@webrtc.orgfded02c2014-09-19 13:10:10 +000025#include "webrtc/test/testsupport/gtest_disable.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000026
27using namespace rtc;
28
29// Sends at a constant rate but with random packet sizes.
30struct Sender : public MessageHandler {
Peter Boström0c4e06b2015-10-07 12:23:21 +020031 Sender(Thread* th, AsyncSocket* s, uint32_t rt)
32 : thread(th),
33 socket(new AsyncUDPSocket(s)),
34 done(false),
35 rate(rt),
36 count(0) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000037 last_send = rtc::Time();
38 thread->PostDelayed(NextDelay(), this, 1);
39 }
40
Peter Boström0c4e06b2015-10-07 12:23:21 +020041 uint32_t NextDelay() {
42 uint32_t size = (rand() % 4096) + 1;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000043 return 1000 * size / rate;
44 }
45
46 void OnMessage(Message* pmsg) {
47 ASSERT_EQ(1u, pmsg->message_id);
48
49 if (done)
50 return;
51
Peter Boström0c4e06b2015-10-07 12:23:21 +020052 uint32_t cur_time = rtc::Time();
53 uint32_t delay = cur_time - last_send;
54 uint32_t size = rate * delay / 1000;
55 size = std::min<uint32_t>(size, 4096);
56 size = std::max<uint32_t>(size, sizeof(uint32_t));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000057
58 count += size;
59 memcpy(dummy, &cur_time, sizeof(cur_time));
60 socket->Send(dummy, size, options);
61
62 last_send = cur_time;
63 thread->PostDelayed(NextDelay(), this, 1);
64 }
65
66 Thread* thread;
67 scoped_ptr<AsyncUDPSocket> socket;
68 rtc::PacketOptions options;
69 bool done;
Peter Boström0c4e06b2015-10-07 12:23:21 +020070 uint32_t rate; // bytes per second
71 uint32_t count;
72 uint32_t last_send;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000073 char dummy[4096];
74};
75
76struct Receiver : public MessageHandler, public sigslot::has_slots<> {
Peter Boström0c4e06b2015-10-07 12:23:21 +020077 Receiver(Thread* th, AsyncSocket* s, uint32_t bw)
78 : thread(th),
79 socket(new AsyncUDPSocket(s)),
80 bandwidth(bw),
81 done(false),
82 count(0),
83 sec_count(0),
84 sum(0),
85 sum_sq(0),
86 samples(0) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000087 socket->SignalReadPacket.connect(this, &Receiver::OnReadPacket);
88 thread->PostDelayed(1000, this, 1);
89 }
90
91 ~Receiver() {
92 thread->Clear(this);
93 }
94
95 void OnReadPacket(AsyncPacketSocket* s, const char* data, size_t size,
96 const SocketAddress& remote_addr,
97 const PacketTime& packet_time) {
98 ASSERT_EQ(socket.get(), s);
99 ASSERT_GE(size, 4U);
100
101 count += size;
102 sec_count += size;
103
Peter Boström0c4e06b2015-10-07 12:23:21 +0200104 uint32_t send_time = *reinterpret_cast<const uint32_t*>(data);
105 uint32_t recv_time = rtc::Time();
106 uint32_t delay = recv_time - send_time;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000107 sum += delay;
108 sum_sq += delay * delay;
109 samples += 1;
110 }
111
112 void OnMessage(Message* pmsg) {
113 ASSERT_EQ(1u, pmsg->message_id);
114
115 if (done)
116 return;
117
118 // It is always possible for us to receive more than expected because
119 // packets can be further delayed in delivery.
120 if (bandwidth > 0)
121 ASSERT_TRUE(sec_count <= 5 * bandwidth / 4);
122 sec_count = 0;
123 thread->PostDelayed(1000, this, 1);
124 }
125
126 Thread* thread;
127 scoped_ptr<AsyncUDPSocket> socket;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200128 uint32_t bandwidth;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000129 bool done;
130 size_t count;
131 size_t sec_count;
132 double sum;
133 double sum_sq;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200134 uint32_t samples;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000135};
136
137class VirtualSocketServerTest : public testing::Test {
138 public:
139 VirtualSocketServerTest() : ss_(new VirtualSocketServer(NULL)),
140 kIPv4AnyAddress(IPAddress(INADDR_ANY), 0),
141 kIPv6AnyAddress(IPAddress(in6addr_any), 0) {
142 }
143
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000144 void CheckPortIncrementalization(const SocketAddress& post,
145 const SocketAddress& pre) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000146 EXPECT_EQ(post.port(), pre.port() + 1);
147 IPAddress post_ip = post.ipaddr();
148 IPAddress pre_ip = pre.ipaddr();
149 EXPECT_EQ(pre_ip.family(), post_ip.family());
150 if (post_ip.family() == AF_INET) {
151 in_addr pre_ipv4 = pre_ip.ipv4_address();
152 in_addr post_ipv4 = post_ip.ipv4_address();
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000153 EXPECT_EQ(post_ipv4.s_addr, pre_ipv4.s_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000154 } else if (post_ip.family() == AF_INET6) {
155 in6_addr post_ip6 = post_ip.ipv6_address();
156 in6_addr pre_ip6 = pre_ip.ipv6_address();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200157 uint32_t* post_as_ints = reinterpret_cast<uint32_t*>(&post_ip6.s6_addr);
158 uint32_t* pre_as_ints = reinterpret_cast<uint32_t*>(&pre_ip6.s6_addr);
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000159 EXPECT_EQ(post_as_ints[3], pre_as_ints[3]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000160 }
161 }
162
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700163 // Test a client can bind to the any address, and all sent packets will have
164 // the default route as the source address. Also, it can receive packets sent
165 // to the default route.
166 void TestDefaultRoute(const IPAddress& default_route) {
167 ss_->SetDefaultRoute(default_route);
168
169 // Create client1 bound to the any address.
170 AsyncSocket* socket =
171 ss_->CreateAsyncSocket(default_route.family(), SOCK_DGRAM);
172 socket->Bind(EmptySocketAddressWithFamily(default_route.family()));
173 SocketAddress client1_any_addr = socket->GetLocalAddress();
174 EXPECT_TRUE(client1_any_addr.IsAnyIP());
175 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket));
176
177 // Create client2 bound to the default route.
178 AsyncSocket* socket2 =
179 ss_->CreateAsyncSocket(default_route.family(), SOCK_DGRAM);
180 socket2->Bind(SocketAddress(default_route, 0));
181 SocketAddress client2_addr = socket2->GetLocalAddress();
182 EXPECT_FALSE(client2_addr.IsAnyIP());
183 TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2));
184
185 // Client1 sends to client2, client2 should see the default route as
186 // client1's address.
187 SocketAddress client1_addr;
188 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
189 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
190 EXPECT_EQ(client1_addr,
191 SocketAddress(default_route, client1_any_addr.port()));
192
193 // Client2 can send back to client1's default route address.
194 EXPECT_EQ(3, client2->SendTo("foo", 3, client1_addr));
195 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
196 }
197
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000198 void BasicTest(const SocketAddress& initial_addr) {
199 AsyncSocket* socket = ss_->CreateAsyncSocket(initial_addr.family(),
200 SOCK_DGRAM);
201 socket->Bind(initial_addr);
202 SocketAddress server_addr = socket->GetLocalAddress();
203 // Make sure VSS didn't switch families on us.
204 EXPECT_EQ(server_addr.family(), initial_addr.family());
205
206 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket));
207 AsyncSocket* socket2 =
208 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
209 TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2));
210
211 SocketAddress client2_addr;
212 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
213 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
214
215 SocketAddress client1_addr;
216 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
217 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
218 EXPECT_EQ(client1_addr, server_addr);
219
220 SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family());
221 for (int i = 0; i < 10; i++) {
222 client2 = new TestClient(AsyncUDPSocket::Create(ss_, empty));
223
224 SocketAddress next_client2_addr;
225 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
226 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr));
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000227 CheckPortIncrementalization(next_client2_addr, client2_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000228 // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1);
229
230 SocketAddress server_addr2;
231 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr));
232 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2));
233 EXPECT_EQ(server_addr2, server_addr);
234
235 client2_addr = next_client2_addr;
236 }
237 }
238
239 // initial_addr should be made from either INADDR_ANY or in6addr_any.
240 void ConnectTest(const SocketAddress& initial_addr) {
241 testing::StreamSink sink;
242 SocketAddress accept_addr;
243 const SocketAddress kEmptyAddr =
244 EmptySocketAddressWithFamily(initial_addr.family());
245
246 // Create client
247 AsyncSocket* client = ss_->CreateAsyncSocket(initial_addr.family(),
248 SOCK_STREAM);
249 sink.Monitor(client);
250 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
251 EXPECT_TRUE(client->GetLocalAddress().IsNil());
252
253 // Create server
254 AsyncSocket* server = ss_->CreateAsyncSocket(initial_addr.family(),
255 SOCK_STREAM);
256 sink.Monitor(server);
257 EXPECT_NE(0, server->Listen(5)); // Bind required
258 EXPECT_EQ(0, server->Bind(initial_addr));
259 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
260 EXPECT_EQ(0, server->Listen(5));
261 EXPECT_EQ(server->GetState(), AsyncSocket::CS_CONNECTING);
262
263 // No pending server connections
264 EXPECT_FALSE(sink.Check(server, testing::SSE_READ));
265 EXPECT_TRUE(NULL == server->Accept(&accept_addr));
266 EXPECT_EQ(AF_UNSPEC, accept_addr.family());
267
268 // Attempt connect to listening socket
269 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
270 EXPECT_NE(client->GetLocalAddress(), kEmptyAddr); // Implicit Bind
271 EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family()); // Implicit Bind
272 EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress());
273
274 // Client is connecting
275 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
276 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN));
277 EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE));
278
279 ss_->ProcessMessagesUntilIdle();
280
281 // Client still connecting
282 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
283 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN));
284 EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE));
285
286 // Server has pending connection
287 EXPECT_TRUE(sink.Check(server, testing::SSE_READ));
288 Socket* accepted = server->Accept(&accept_addr);
289 EXPECT_TRUE(NULL != accepted);
290 EXPECT_NE(accept_addr, kEmptyAddr);
291 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr);
292
293 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED);
294 EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress());
295 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress());
296
297 ss_->ProcessMessagesUntilIdle();
298
299 // Client has connected
300 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTED);
301 EXPECT_TRUE(sink.Check(client, testing::SSE_OPEN));
302 EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE));
303 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
304 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
305 }
306
307 void ConnectToNonListenerTest(const SocketAddress& initial_addr) {
308 testing::StreamSink sink;
309 SocketAddress accept_addr;
310 const SocketAddress nil_addr;
311 const SocketAddress empty_addr =
312 EmptySocketAddressWithFamily(initial_addr.family());
313
314 // Create client
315 AsyncSocket* client = ss_->CreateAsyncSocket(initial_addr.family(),
316 SOCK_STREAM);
317 sink.Monitor(client);
318
319 // Create server
320 AsyncSocket* server = ss_->CreateAsyncSocket(initial_addr.family(),
321 SOCK_STREAM);
322 sink.Monitor(server);
323 EXPECT_EQ(0, server->Bind(initial_addr));
324 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
325 // Attempt connect to non-listening socket
326 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
327
328 ss_->ProcessMessagesUntilIdle();
329
330 // No pending server connections
331 EXPECT_FALSE(sink.Check(server, testing::SSE_READ));
332 EXPECT_TRUE(NULL == server->Accept(&accept_addr));
333 EXPECT_EQ(accept_addr, nil_addr);
334
335 // Connection failed
336 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
337 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN));
338 EXPECT_TRUE(sink.Check(client, testing::SSE_ERROR));
339 EXPECT_EQ(client->GetRemoteAddress(), nil_addr);
340 }
341
342 void CloseDuringConnectTest(const SocketAddress& initial_addr) {
343 testing::StreamSink sink;
344 SocketAddress accept_addr;
345 const SocketAddress empty_addr =
346 EmptySocketAddressWithFamily(initial_addr.family());
347
348 // Create client and server
349 scoped_ptr<AsyncSocket> client(ss_->CreateAsyncSocket(initial_addr.family(),
350 SOCK_STREAM));
351 sink.Monitor(client.get());
352 scoped_ptr<AsyncSocket> server(ss_->CreateAsyncSocket(initial_addr.family(),
353 SOCK_STREAM));
354 sink.Monitor(server.get());
355
356 // Initiate connect
357 EXPECT_EQ(0, server->Bind(initial_addr));
358 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
359
360 EXPECT_EQ(0, server->Listen(5));
361 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
362
363 // Server close before socket enters accept queue
364 EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ));
365 server->Close();
366
367 ss_->ProcessMessagesUntilIdle();
368
369 // Result: connection failed
370 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
371 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR));
372
373 server.reset(ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
374 sink.Monitor(server.get());
375
376 // Initiate connect
377 EXPECT_EQ(0, server->Bind(initial_addr));
378 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
379
380 EXPECT_EQ(0, server->Listen(5));
381 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
382
383 ss_->ProcessMessagesUntilIdle();
384
385 // Server close while socket is in accept queue
386 EXPECT_TRUE(sink.Check(server.get(), testing::SSE_READ));
387 server->Close();
388
389 ss_->ProcessMessagesUntilIdle();
390
391 // Result: connection failed
392 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
393 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR));
394
395 // New server
396 server.reset(ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
397 sink.Monitor(server.get());
398
399 // Initiate connect
400 EXPECT_EQ(0, server->Bind(initial_addr));
401 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
402
403 EXPECT_EQ(0, server->Listen(5));
404 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
405
406 ss_->ProcessMessagesUntilIdle();
407
408 // Server accepts connection
409 EXPECT_TRUE(sink.Check(server.get(), testing::SSE_READ));
410 scoped_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
411 ASSERT_TRUE(NULL != accepted.get());
412 sink.Monitor(accepted.get());
413
414 // Client closes before connection complets
415 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED);
416
417 // Connected message has not been processed yet.
418 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
419 client->Close();
420
421 ss_->ProcessMessagesUntilIdle();
422
423 // Result: accepted socket closes
424 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CLOSED);
425 EXPECT_TRUE(sink.Check(accepted.get(), testing::SSE_CLOSE));
426 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE));
427 }
428
429 void CloseTest(const SocketAddress& initial_addr) {
430 testing::StreamSink sink;
431 const SocketAddress kEmptyAddr;
432
433 // Create clients
434 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM);
435 sink.Monitor(a);
436 a->Bind(initial_addr);
437 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
438
439
440 scoped_ptr<AsyncSocket> b(ss_->CreateAsyncSocket(initial_addr.family(),
441 SOCK_STREAM));
442 sink.Monitor(b.get());
443 b->Bind(initial_addr);
444 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
445
446 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
447 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
448
449 ss_->ProcessMessagesUntilIdle();
450
451 EXPECT_TRUE(sink.Check(a, testing::SSE_OPEN));
452 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CONNECTED);
453 EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress());
454
455 EXPECT_TRUE(sink.Check(b.get(), testing::SSE_OPEN));
456 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CONNECTED);
457 EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress());
458
459 EXPECT_EQ(1, a->Send("a", 1));
460 b->Close();
461 EXPECT_EQ(1, a->Send("b", 1));
462
463 ss_->ProcessMessagesUntilIdle();
464
465 char buffer[10];
466 EXPECT_FALSE(sink.Check(b.get(), testing::SSE_READ));
467 EXPECT_EQ(-1, b->Recv(buffer, 10));
468
469 EXPECT_TRUE(sink.Check(a, testing::SSE_CLOSE));
470 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CLOSED);
471 EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr);
472
473 // No signal for Closer
474 EXPECT_FALSE(sink.Check(b.get(), testing::SSE_CLOSE));
475 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CLOSED);
476 EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr);
477 }
478
479 void TcpSendTest(const SocketAddress& initial_addr) {
480 testing::StreamSink sink;
481 const SocketAddress kEmptyAddr;
482
483 // Connect two sockets
484 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM);
485 sink.Monitor(a);
486 a->Bind(initial_addr);
487 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
488
489 AsyncSocket* b = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM);
490 sink.Monitor(b);
491 b->Bind(initial_addr);
492 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
493
494 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
495 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
496
497 ss_->ProcessMessagesUntilIdle();
498
499 const size_t kBufferSize = 2000;
500 ss_->set_send_buffer_capacity(kBufferSize);
501 ss_->set_recv_buffer_capacity(kBufferSize);
502
503 const size_t kDataSize = 5000;
504 char send_buffer[kDataSize], recv_buffer[kDataSize];
505 for (size_t i = 0; i < kDataSize; ++i)
506 send_buffer[i] = static_cast<char>(i % 256);
507 memset(recv_buffer, 0, sizeof(recv_buffer));
508 size_t send_pos = 0, recv_pos = 0;
509
510 // Can't send more than send buffer in one write
511 int result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
512 EXPECT_EQ(static_cast<int>(kBufferSize), result);
513 send_pos += result;
514
515 ss_->ProcessMessagesUntilIdle();
516 EXPECT_FALSE(sink.Check(a, testing::SSE_WRITE));
517 EXPECT_TRUE(sink.Check(b, testing::SSE_READ));
518
519 // Receive buffer is already filled, fill send buffer again
520 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
521 EXPECT_EQ(static_cast<int>(kBufferSize), result);
522 send_pos += result;
523
524 ss_->ProcessMessagesUntilIdle();
525 EXPECT_FALSE(sink.Check(a, testing::SSE_WRITE));
526 EXPECT_FALSE(sink.Check(b, testing::SSE_READ));
527
528 // No more room in send or receive buffer
529 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
530 EXPECT_EQ(-1, result);
531 EXPECT_TRUE(a->IsBlocking());
532
533 // Read a subset of the data
534 result = b->Recv(recv_buffer + recv_pos, 500);
535 EXPECT_EQ(500, result);
536 recv_pos += result;
537
538 ss_->ProcessMessagesUntilIdle();
539 EXPECT_TRUE(sink.Check(a, testing::SSE_WRITE));
540 EXPECT_TRUE(sink.Check(b, testing::SSE_READ));
541
542 // Room for more on the sending side
543 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
544 EXPECT_EQ(500, result);
545 send_pos += result;
546
547 // Empty the recv buffer
548 while (true) {
549 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos);
550 if (result < 0) {
551 EXPECT_EQ(-1, result);
552 EXPECT_TRUE(b->IsBlocking());
553 break;
554 }
555 recv_pos += result;
556 }
557
558 ss_->ProcessMessagesUntilIdle();
559 EXPECT_TRUE(sink.Check(b, testing::SSE_READ));
560
561 // Continue to empty the recv buffer
562 while (true) {
563 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos);
564 if (result < 0) {
565 EXPECT_EQ(-1, result);
566 EXPECT_TRUE(b->IsBlocking());
567 break;
568 }
569 recv_pos += result;
570 }
571
572 // Send last of the data
573 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
574 EXPECT_EQ(500, result);
575 send_pos += result;
576
577 ss_->ProcessMessagesUntilIdle();
578 EXPECT_TRUE(sink.Check(b, testing::SSE_READ));
579
580 // Receive the last of the data
581 while (true) {
582 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos);
583 if (result < 0) {
584 EXPECT_EQ(-1, result);
585 EXPECT_TRUE(b->IsBlocking());
586 break;
587 }
588 recv_pos += result;
589 }
590
591 ss_->ProcessMessagesUntilIdle();
592 EXPECT_FALSE(sink.Check(b, testing::SSE_READ));
593
594 // The received data matches the sent data
595 EXPECT_EQ(kDataSize, send_pos);
596 EXPECT_EQ(kDataSize, recv_pos);
597 EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize));
598 }
599
600 void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) {
601 const SocketAddress kEmptyAddr;
602
603 // Connect two sockets
604 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(),
605 SOCK_STREAM);
606 AsyncSocket* b = ss_->CreateAsyncSocket(initial_addr.family(),
607 SOCK_STREAM);
608 a->Bind(initial_addr);
609 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
610
611 b->Bind(initial_addr);
612 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
613
614 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
615 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
616 ss_->ProcessMessagesUntilIdle();
617
618 // First, deliver all packets in 0 ms.
619 char buffer[2] = { 0, 0 };
620 const char cNumPackets = 10;
621 for (char i = 0; i < cNumPackets; ++i) {
622 buffer[0] = '0' + i;
623 EXPECT_EQ(1, a->Send(buffer, 1));
624 }
625
626 ss_->ProcessMessagesUntilIdle();
627
628 for (char i = 0; i < cNumPackets; ++i) {
629 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer)));
630 EXPECT_EQ(static_cast<char>('0' + i), buffer[0]);
631 }
632
633 // Next, deliver packets at random intervals
Peter Boström0c4e06b2015-10-07 12:23:21 +0200634 const uint32_t mean = 50;
635 const uint32_t stddev = 50;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000636
637 ss_->set_delay_mean(mean);
638 ss_->set_delay_stddev(stddev);
639 ss_->UpdateDelayDistribution();
640
641 for (char i = 0; i < cNumPackets; ++i) {
642 buffer[0] = 'A' + i;
643 EXPECT_EQ(1, a->Send(buffer, 1));
644 }
645
646 ss_->ProcessMessagesUntilIdle();
647
648 for (char i = 0; i < cNumPackets; ++i) {
649 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer)));
650 EXPECT_EQ(static_cast<char>('A' + i), buffer[0]);
651 }
652 }
653
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000654 // It is important that initial_addr's port has to be 0 such that the
655 // incremental port behavior could ensure the 2 Binds result in different
656 // address.
657 void BandwidthTest(const SocketAddress& initial_addr) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000658 AsyncSocket* send_socket =
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000659 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000660 AsyncSocket* recv_socket =
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000661 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
662 ASSERT_EQ(0, send_socket->Bind(initial_addr));
663 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
664 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
665 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000666 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
667
Peter Boström0c4e06b2015-10-07 12:23:21 +0200668 uint32_t bandwidth = 64 * 1024;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000669 ss_->set_bandwidth(bandwidth);
670
671 Thread* pthMain = Thread::Current();
672 Sender sender(pthMain, send_socket, 80 * 1024);
673 Receiver receiver(pthMain, recv_socket, bandwidth);
674
675 pthMain->ProcessMessages(5000);
676 sender.done = true;
677 pthMain->ProcessMessages(5000);
678
679 ASSERT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4);
680 ASSERT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s
681
682 ss_->set_bandwidth(0);
683 }
684
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000685 // It is important that initial_addr's port has to be 0 such that the
686 // incremental port behavior could ensure the 2 Binds result in different
687 // address.
688 void DelayTest(const SocketAddress& initial_addr) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000689 time_t seed = ::time(NULL);
690 LOG(LS_VERBOSE) << "seed = " << seed;
691 srand(static_cast<unsigned int>(seed));
692
Peter Boström0c4e06b2015-10-07 12:23:21 +0200693 const uint32_t mean = 2000;
694 const uint32_t stddev = 500;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000695
696 ss_->set_delay_mean(mean);
697 ss_->set_delay_stddev(stddev);
698 ss_->UpdateDelayDistribution();
699
700 AsyncSocket* send_socket =
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000701 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000702 AsyncSocket* recv_socket =
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000703 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
704 ASSERT_EQ(0, send_socket->Bind(initial_addr));
705 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
706 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
707 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000708 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
709
710 Thread* pthMain = Thread::Current();
711 // Avg packet size is 2K, so at 200KB/s for 10s, we should see about
712 // 1000 packets, which is necessary to get a good distribution.
713 Sender sender(pthMain, send_socket, 100 * 2 * 1024);
714 Receiver receiver(pthMain, recv_socket, 0);
715
716 pthMain->ProcessMessages(10000);
717 sender.done = receiver.done = true;
718 ss_->ProcessMessagesUntilIdle();
719
720 const double sample_mean = receiver.sum / receiver.samples;
721 double num =
722 receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum;
723 double den = receiver.samples * (receiver.samples - 1);
724 const double sample_stddev = sqrt(num / den);
725 LOG(LS_VERBOSE) << "mean=" << sample_mean << " stddev=" << sample_stddev;
726
727 EXPECT_LE(500u, receiver.samples);
728 // We initially used a 0.1 fudge factor, but on the build machine, we
729 // have seen the value differ by as much as 0.13.
730 EXPECT_NEAR(mean, sample_mean, 0.15 * mean);
731 EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev);
732
733 ss_->set_delay_mean(0);
734 ss_->set_delay_stddev(0);
735 ss_->UpdateDelayDistribution();
736 }
737
738 // Test cross-family communication between a client bound to client_addr and a
739 // server bound to server_addr. shouldSucceed indicates if communication is
740 // expected to work or not.
741 void CrossFamilyConnectionTest(const SocketAddress& client_addr,
742 const SocketAddress& server_addr,
743 bool shouldSucceed) {
744 testing::StreamSink sink;
745 SocketAddress accept_address;
746 const SocketAddress kEmptyAddr;
747
748 // Client gets a IPv4 address
749 AsyncSocket* client = ss_->CreateAsyncSocket(client_addr.family(),
750 SOCK_STREAM);
751 sink.Monitor(client);
752 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
753 EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr);
754 client->Bind(client_addr);
755
756 // Server gets a non-mapped non-any IPv6 address.
757 // IPv4 sockets should not be able to connect to this.
758 AsyncSocket* server = ss_->CreateAsyncSocket(server_addr.family(),
759 SOCK_STREAM);
760 sink.Monitor(server);
761 server->Bind(server_addr);
762 server->Listen(5);
763
764 if (shouldSucceed) {
765 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
766 ss_->ProcessMessagesUntilIdle();
767 EXPECT_TRUE(sink.Check(server, testing::SSE_READ));
768 Socket* accepted = server->Accept(&accept_address);
769 EXPECT_TRUE(NULL != accepted);
770 EXPECT_NE(kEmptyAddr, accept_address);
771 ss_->ProcessMessagesUntilIdle();
772 EXPECT_TRUE(sink.Check(client, testing::SSE_OPEN));
773 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
774 } else {
775 // Check that the connection failed.
776 EXPECT_EQ(-1, client->Connect(server->GetLocalAddress()));
777 ss_->ProcessMessagesUntilIdle();
778
779 EXPECT_FALSE(sink.Check(server, testing::SSE_READ));
780 EXPECT_TRUE(NULL == server->Accept(&accept_address));
781 EXPECT_EQ(accept_address, kEmptyAddr);
782 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
783 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN));
784 EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr);
785 }
786 }
787
788 // Test cross-family datagram sending between a client bound to client_addr
789 // and a server bound to server_addr. shouldSucceed indicates if sending is
jlmiller@webrtc.orgec499be2015-02-07 22:37:59 +0000790 // expected to succeed or not.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000791 void CrossFamilyDatagramTest(const SocketAddress& client_addr,
792 const SocketAddress& server_addr,
793 bool shouldSucceed) {
794 AsyncSocket* socket = ss_->CreateAsyncSocket(SOCK_DGRAM);
795 socket->Bind(server_addr);
796 SocketAddress bound_server_addr = socket->GetLocalAddress();
797 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket));
798
799 AsyncSocket* socket2 = ss_->CreateAsyncSocket(SOCK_DGRAM);
800 socket2->Bind(client_addr);
801 TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2));
802 SocketAddress client2_addr;
803
804 if (shouldSucceed) {
805 EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr));
806 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
807 SocketAddress client1_addr;
808 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
809 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
810 EXPECT_EQ(client1_addr, bound_server_addr);
811 } else {
812 EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr));
jlmiller@webrtc.orgec499be2015-02-07 22:37:59 +0000813 EXPECT_TRUE(client1->CheckNoPacket());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000814 }
815 }
816
817 protected:
818 virtual void SetUp() {
819 Thread::Current()->set_socketserver(ss_);
820 }
821 virtual void TearDown() {
822 Thread::Current()->set_socketserver(NULL);
823 }
824
825 VirtualSocketServer* ss_;
826 const SocketAddress kIPv4AnyAddress;
827 const SocketAddress kIPv6AnyAddress;
828};
829
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000830TEST_F(VirtualSocketServerTest, basic_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000831 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000);
832 BasicTest(ipv4_test_addr);
833}
834
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000835TEST_F(VirtualSocketServerTest, basic_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000836 SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 5000);
837 BasicTest(ipv6_test_addr);
838}
839
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700840TEST_F(VirtualSocketServerTest, TestDefaultRoute_v4) {
841 IPAddress ipv4_default_addr(0x01020304);
842 TestDefaultRoute(ipv4_default_addr);
843}
844
845TEST_F(VirtualSocketServerTest, TestDefaultRoute_v6) {
846 IPAddress ipv6_default_addr;
847 EXPECT_TRUE(
848 IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ipv6_default_addr));
849 TestDefaultRoute(ipv6_default_addr);
850}
851
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000852TEST_F(VirtualSocketServerTest, connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000853 ConnectTest(kIPv4AnyAddress);
854}
855
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000856TEST_F(VirtualSocketServerTest, connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000857 ConnectTest(kIPv6AnyAddress);
858}
859
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000860TEST_F(VirtualSocketServerTest, connect_to_non_listener_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000861 ConnectToNonListenerTest(kIPv4AnyAddress);
862}
863
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000864TEST_F(VirtualSocketServerTest, connect_to_non_listener_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000865 ConnectToNonListenerTest(kIPv6AnyAddress);
866}
867
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000868TEST_F(VirtualSocketServerTest, close_during_connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000869 CloseDuringConnectTest(kIPv4AnyAddress);
870}
871
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000872TEST_F(VirtualSocketServerTest, close_during_connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000873 CloseDuringConnectTest(kIPv6AnyAddress);
874}
875
876TEST_F(VirtualSocketServerTest, close_v4) {
877 CloseTest(kIPv4AnyAddress);
878}
879
880TEST_F(VirtualSocketServerTest, close_v6) {
881 CloseTest(kIPv6AnyAddress);
882}
883
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000884TEST_F(VirtualSocketServerTest, tcp_send_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000885 TcpSendTest(kIPv4AnyAddress);
886}
887
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000888TEST_F(VirtualSocketServerTest, tcp_send_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000889 TcpSendTest(kIPv6AnyAddress);
890}
891
892TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v4) {
893 TcpSendsPacketsInOrderTest(kIPv4AnyAddress);
894}
895
896TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v6) {
897 TcpSendsPacketsInOrderTest(kIPv6AnyAddress);
898}
899
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000900TEST_F(VirtualSocketServerTest, bandwidth_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000901 BandwidthTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000902}
903
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000904TEST_F(VirtualSocketServerTest, bandwidth_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000905 BandwidthTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000906}
907
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000908TEST_F(VirtualSocketServerTest, delay_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000909 DelayTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000910}
911
912// See: https://code.google.com/p/webrtc/issues/detail?id=2409
913TEST_F(VirtualSocketServerTest, DISABLED_delay_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000914 DelayTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000915}
916
917// Works, receiving socket sees 127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000918TEST_F(VirtualSocketServerTest, CanConnectFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000919 CrossFamilyConnectionTest(SocketAddress("::ffff:127.0.0.2", 0),
920 SocketAddress("0.0.0.0", 5000),
921 true);
922}
923
924// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000925TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000926 CrossFamilyConnectionTest(SocketAddress("::2", 0),
927 SocketAddress("0.0.0.0", 5000),
928 false);
929}
930
931// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000932TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000933 CrossFamilyConnectionTest(SocketAddress("::2", 0),
934 SocketAddress("::ffff:127.0.0.1", 5000),
935 false);
936}
937
938// Works. receiving socket sees ::ffff:127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000939TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000940 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
941 SocketAddress("::", 5000),
942 true);
943}
944
945// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000946TEST_F(VirtualSocketServerTest, CantConnectFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000947 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
948 SocketAddress("::1", 5000),
949 false);
950}
951
952// Works. Receiving socket sees ::ffff:127.0.0.1.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000953TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000954 CrossFamilyConnectionTest(SocketAddress("127.0.0.1", 0),
955 SocketAddress("::ffff:127.0.0.2", 5000),
956 true);
957}
958
959// Works, receiving socket sees a result from GetNextIP.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000960TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000961 CrossFamilyConnectionTest(SocketAddress("::", 0),
962 SocketAddress("0.0.0.0", 5000),
963 true);
964}
965
966// Works, receiving socket sees whatever GetNextIP gave the client.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000967TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000968 CrossFamilyConnectionTest(SocketAddress("0.0.0.0", 0),
969 SocketAddress("::", 5000),
970 true);
971}
972
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000973TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000974 CrossFamilyDatagramTest(SocketAddress("0.0.0.0", 0),
975 SocketAddress("::", 5000),
976 true);
977}
978
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000979TEST_F(VirtualSocketServerTest, CanSendDatagramFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000980 CrossFamilyDatagramTest(SocketAddress("::ffff:127.0.0.1", 0),
981 SocketAddress("0.0.0.0", 5000),
982 true);
983}
984
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000985TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000986 CrossFamilyDatagramTest(SocketAddress("::2", 0),
987 SocketAddress("0.0.0.0", 5000),
988 false);
989}
990
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000991TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000992 CrossFamilyDatagramTest(SocketAddress("::2", 0),
993 SocketAddress("::ffff:127.0.0.1", 5000),
994 false);
995}
996
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000997TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000998 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
999 SocketAddress("::", 5000),
1000 true);
1001}
1002
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001003TEST_F(VirtualSocketServerTest, CantSendDatagramFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001004 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
1005 SocketAddress("::1", 5000),
1006 false);
1007}
1008
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001009TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001010 CrossFamilyDatagramTest(SocketAddress("127.0.0.1", 0),
1011 SocketAddress("::ffff:127.0.0.2", 5000),
1012 true);
1013}
1014
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001015TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001016 CrossFamilyDatagramTest(SocketAddress("::", 0),
1017 SocketAddress("0.0.0.0", 5000),
1018 true);
1019}
1020
1021TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02001022 const uint32_t kTestMean[] = {10, 100, 333, 1000};
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001023 const double kTestDev[] = { 0.25, 0.1, 0.01 };
1024 // TODO: The current code only works for 1000 data points or more.
Peter Boström0c4e06b2015-10-07 12:23:21 +02001025 const uint32_t kTestSamples[] = {/*10, 100,*/ 1000};
tfarina5237aaf2015-11-10 23:44:30 -08001026 for (size_t midx = 0; midx < arraysize(kTestMean); ++midx) {
1027 for (size_t didx = 0; didx < arraysize(kTestDev); ++didx) {
1028 for (size_t sidx = 0; sidx < arraysize(kTestSamples); ++sidx) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001029 ASSERT_LT(0u, kTestSamples[sidx]);
Peter Boström0c4e06b2015-10-07 12:23:21 +02001030 const uint32_t kStdDev =
1031 static_cast<uint32_t>(kTestDev[didx] * kTestMean[midx]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001032 VirtualSocketServer::Function* f =
1033 VirtualSocketServer::CreateDistribution(kTestMean[midx],
1034 kStdDev,
1035 kTestSamples[sidx]);
1036 ASSERT_TRUE(NULL != f);
1037 ASSERT_EQ(kTestSamples[sidx], f->size());
1038 double sum = 0;
Peter Boström0c4e06b2015-10-07 12:23:21 +02001039 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001040 sum += (*f)[i].second;
1041 }
1042 const double mean = sum / f->size();
1043 double sum_sq_dev = 0;
Peter Boström0c4e06b2015-10-07 12:23:21 +02001044 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001045 double dev = (*f)[i].second - mean;
1046 sum_sq_dev += dev * dev;
1047 }
1048 const double stddev = sqrt(sum_sq_dev / f->size());
1049 EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx])
1050 << "M=" << kTestMean[midx]
1051 << " SD=" << kStdDev
1052 << " N=" << kTestSamples[sidx];
1053 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev)
1054 << "M=" << kTestMean[midx]
1055 << " SD=" << kStdDev
1056 << " N=" << kTestSamples[sidx];
1057 delete f;
1058 }
1059 }
1060 }
1061}