blob: b8847489a32cb9176980ad030d7879b8f8855760 [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
30// Sends at a constant rate but with random packet sizes.
31struct Sender : public MessageHandler {
Peter Boström0c4e06b2015-10-07 12:23:21 +020032 Sender(Thread* th, AsyncSocket* s, uint32_t rt)
33 : thread(th),
34 socket(new AsyncUDPSocket(s)),
35 done(false),
36 rate(rt),
37 count(0) {
Honghai Zhang82d78622016-05-06 11:29:15 -070038 last_send = rtc::TimeMillis();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070039 thread->PostDelayed(RTC_FROM_HERE, NextDelay(), this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000040 }
41
Peter Boström0c4e06b2015-10-07 12:23:21 +020042 uint32_t NextDelay() {
43 uint32_t size = (rand() % 4096) + 1;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000044 return 1000 * size / rate;
45 }
46
47 void OnMessage(Message* pmsg) {
48 ASSERT_EQ(1u, pmsg->message_id);
49
50 if (done)
51 return;
52
Honghai Zhang82d78622016-05-06 11:29:15 -070053 int64_t cur_time = rtc::TimeMillis();
54 int64_t delay = cur_time - last_send;
55 uint32_t size = static_cast<uint32_t>(rate * delay / 1000);
Peter Boström0c4e06b2015-10-07 12:23:21 +020056 size = std::min<uint32_t>(size, 4096);
57 size = std::max<uint32_t>(size, sizeof(uint32_t));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000058
59 count += size;
60 memcpy(dummy, &cur_time, sizeof(cur_time));
61 socket->Send(dummy, size, options);
62
63 last_send = cur_time;
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070064 thread->PostDelayed(RTC_FROM_HERE, NextDelay(), this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000065 }
66
67 Thread* thread;
jbauch555604a2016-04-26 03:13:22 -070068 std::unique_ptr<AsyncUDPSocket> socket;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000069 rtc::PacketOptions options;
70 bool done;
Peter Boström0c4e06b2015-10-07 12:23:21 +020071 uint32_t rate; // bytes per second
72 uint32_t count;
Honghai Zhang82d78622016-05-06 11:29:15 -070073 int64_t last_send;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000074 char dummy[4096];
75};
76
77struct Receiver : public MessageHandler, public sigslot::has_slots<> {
Peter Boström0c4e06b2015-10-07 12:23:21 +020078 Receiver(Thread* th, AsyncSocket* s, uint32_t bw)
79 : thread(th),
80 socket(new AsyncUDPSocket(s)),
81 bandwidth(bw),
82 done(false),
83 count(0),
84 sec_count(0),
85 sum(0),
86 sum_sq(0),
87 samples(0) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000088 socket->SignalReadPacket.connect(this, &Receiver::OnReadPacket);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070089 thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000090 }
91
92 ~Receiver() {
93 thread->Clear(this);
94 }
95
96 void OnReadPacket(AsyncPacketSocket* s, const char* data, size_t size,
97 const SocketAddress& remote_addr,
98 const PacketTime& packet_time) {
99 ASSERT_EQ(socket.get(), s);
100 ASSERT_GE(size, 4U);
101
102 count += size;
103 sec_count += size;
104
Peter Boström0c4e06b2015-10-07 12:23:21 +0200105 uint32_t send_time = *reinterpret_cast<const uint32_t*>(data);
Honghai Zhang82d78622016-05-06 11:29:15 -0700106 uint32_t recv_time = rtc::TimeMillis();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200107 uint32_t delay = recv_time - send_time;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000108 sum += delay;
109 sum_sq += delay * delay;
110 samples += 1;
111 }
112
113 void OnMessage(Message* pmsg) {
114 ASSERT_EQ(1u, pmsg->message_id);
115
116 if (done)
117 return;
118
119 // It is always possible for us to receive more than expected because
120 // packets can be further delayed in delivery.
121 if (bandwidth > 0)
122 ASSERT_TRUE(sec_count <= 5 * bandwidth / 4);
123 sec_count = 0;
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700124 thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000125 }
126
127 Thread* thread;
jbauch555604a2016-04-26 03:13:22 -0700128 std::unique_ptr<AsyncUDPSocket> socket;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200129 uint32_t bandwidth;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000130 bool done;
131 size_t count;
132 size_t sec_count;
133 double sum;
134 double sum_sq;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200135 uint32_t samples;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000136};
137
138class VirtualSocketServerTest : public testing::Test {
139 public:
deadbeef37f5ecf2017-02-27 14:06:41 -0800140 VirtualSocketServerTest()
141 : ss_(new VirtualSocketServer(nullptr)),
142 kIPv4AnyAddress(IPAddress(INADDR_ANY), 0),
143 kIPv6AnyAddress(IPAddress(in6addr_any), 0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000144
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000145 void CheckPortIncrementalization(const SocketAddress& post,
146 const SocketAddress& pre) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000147 EXPECT_EQ(post.port(), pre.port() + 1);
148 IPAddress post_ip = post.ipaddr();
149 IPAddress pre_ip = pre.ipaddr();
150 EXPECT_EQ(pre_ip.family(), post_ip.family());
151 if (post_ip.family() == AF_INET) {
152 in_addr pre_ipv4 = pre_ip.ipv4_address();
153 in_addr post_ipv4 = post_ip.ipv4_address();
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000154 EXPECT_EQ(post_ipv4.s_addr, pre_ipv4.s_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000155 } else if (post_ip.family() == AF_INET6) {
156 in6_addr post_ip6 = post_ip.ipv6_address();
157 in6_addr pre_ip6 = pre_ip.ipv6_address();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200158 uint32_t* post_as_ints = reinterpret_cast<uint32_t*>(&post_ip6.s6_addr);
159 uint32_t* pre_as_ints = reinterpret_cast<uint32_t*>(&pre_ip6.s6_addr);
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000160 EXPECT_EQ(post_as_ints[3], pre_as_ints[3]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000161 }
162 }
163
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700164 // Test a client can bind to the any address, and all sent packets will have
165 // the default route as the source address. Also, it can receive packets sent
166 // to the default route.
167 void TestDefaultRoute(const IPAddress& default_route) {
168 ss_->SetDefaultRoute(default_route);
169
170 // Create client1 bound to the any address.
171 AsyncSocket* socket =
172 ss_->CreateAsyncSocket(default_route.family(), SOCK_DGRAM);
173 socket->Bind(EmptySocketAddressWithFamily(default_route.family()));
174 SocketAddress client1_any_addr = socket->GetLocalAddress();
175 EXPECT_TRUE(client1_any_addr.IsAnyIP());
176 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket));
177
178 // Create client2 bound to the default route.
179 AsyncSocket* socket2 =
180 ss_->CreateAsyncSocket(default_route.family(), SOCK_DGRAM);
181 socket2->Bind(SocketAddress(default_route, 0));
182 SocketAddress client2_addr = socket2->GetLocalAddress();
183 EXPECT_FALSE(client2_addr.IsAnyIP());
184 TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2));
185
186 // Client1 sends to client2, client2 should see the default route as
187 // client1's address.
188 SocketAddress client1_addr;
189 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
190 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
191 EXPECT_EQ(client1_addr,
192 SocketAddress(default_route, client1_any_addr.port()));
193
194 // Client2 can send back to client1's default route address.
195 EXPECT_EQ(3, client2->SendTo("foo", 3, client1_addr));
196 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
197 }
198
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000199 void BasicTest(const SocketAddress& initial_addr) {
200 AsyncSocket* socket = ss_->CreateAsyncSocket(initial_addr.family(),
201 SOCK_DGRAM);
202 socket->Bind(initial_addr);
203 SocketAddress server_addr = socket->GetLocalAddress();
204 // Make sure VSS didn't switch families on us.
205 EXPECT_EQ(server_addr.family(), initial_addr.family());
206
207 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket));
208 AsyncSocket* socket2 =
209 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
210 TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2));
211
212 SocketAddress client2_addr;
213 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
214 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
215
216 SocketAddress client1_addr;
217 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
218 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
219 EXPECT_EQ(client1_addr, server_addr);
220
221 SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family());
222 for (int i = 0; i < 10; i++) {
223 client2 = new TestClient(AsyncUDPSocket::Create(ss_, empty));
224
225 SocketAddress next_client2_addr;
226 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
227 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr));
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000228 CheckPortIncrementalization(next_client2_addr, client2_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000229 // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1);
230
231 SocketAddress server_addr2;
232 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr));
233 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2));
234 EXPECT_EQ(server_addr2, server_addr);
235
236 client2_addr = next_client2_addr;
237 }
238 }
239
240 // initial_addr should be made from either INADDR_ANY or in6addr_any.
241 void ConnectTest(const SocketAddress& initial_addr) {
242 testing::StreamSink sink;
243 SocketAddress accept_addr;
244 const SocketAddress kEmptyAddr =
245 EmptySocketAddressWithFamily(initial_addr.family());
246
247 // Create client
248 AsyncSocket* client = ss_->CreateAsyncSocket(initial_addr.family(),
249 SOCK_STREAM);
250 sink.Monitor(client);
251 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
252 EXPECT_TRUE(client->GetLocalAddress().IsNil());
253
254 // Create server
255 AsyncSocket* server = ss_->CreateAsyncSocket(initial_addr.family(),
256 SOCK_STREAM);
257 sink.Monitor(server);
258 EXPECT_NE(0, server->Listen(5)); // Bind required
259 EXPECT_EQ(0, server->Bind(initial_addr));
260 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
261 EXPECT_EQ(0, server->Listen(5));
262 EXPECT_EQ(server->GetState(), AsyncSocket::CS_CONNECTING);
263
264 // No pending server connections
265 EXPECT_FALSE(sink.Check(server, testing::SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800266 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000267 EXPECT_EQ(AF_UNSPEC, accept_addr.family());
268
269 // Attempt connect to listening socket
270 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
271 EXPECT_NE(client->GetLocalAddress(), kEmptyAddr); // Implicit Bind
272 EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family()); // Implicit Bind
273 EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress());
274
275 // Client is connecting
276 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
277 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN));
278 EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE));
279
280 ss_->ProcessMessagesUntilIdle();
281
282 // Client still connecting
283 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
284 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN));
285 EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE));
286
287 // Server has pending connection
288 EXPECT_TRUE(sink.Check(server, testing::SSE_READ));
289 Socket* accepted = server->Accept(&accept_addr);
deadbeef37f5ecf2017-02-27 14:06:41 -0800290 EXPECT_TRUE(nullptr != accepted);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000291 EXPECT_NE(accept_addr, kEmptyAddr);
292 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr);
293
294 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED);
295 EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress());
296 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress());
297
298 ss_->ProcessMessagesUntilIdle();
299
300 // Client has connected
301 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTED);
302 EXPECT_TRUE(sink.Check(client, testing::SSE_OPEN));
303 EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE));
304 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
305 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
306 }
307
308 void ConnectToNonListenerTest(const SocketAddress& initial_addr) {
309 testing::StreamSink sink;
310 SocketAddress accept_addr;
311 const SocketAddress nil_addr;
312 const SocketAddress empty_addr =
313 EmptySocketAddressWithFamily(initial_addr.family());
314
315 // Create client
316 AsyncSocket* client = ss_->CreateAsyncSocket(initial_addr.family(),
317 SOCK_STREAM);
318 sink.Monitor(client);
319
320 // Create server
321 AsyncSocket* server = ss_->CreateAsyncSocket(initial_addr.family(),
322 SOCK_STREAM);
323 sink.Monitor(server);
324 EXPECT_EQ(0, server->Bind(initial_addr));
325 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
326 // Attempt connect to non-listening socket
327 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
328
329 ss_->ProcessMessagesUntilIdle();
330
331 // No pending server connections
332 EXPECT_FALSE(sink.Check(server, testing::SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800333 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000334 EXPECT_EQ(accept_addr, nil_addr);
335
336 // Connection failed
337 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
338 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN));
339 EXPECT_TRUE(sink.Check(client, testing::SSE_ERROR));
340 EXPECT_EQ(client->GetRemoteAddress(), nil_addr);
341 }
342
343 void CloseDuringConnectTest(const SocketAddress& initial_addr) {
344 testing::StreamSink sink;
345 SocketAddress accept_addr;
346 const SocketAddress empty_addr =
347 EmptySocketAddressWithFamily(initial_addr.family());
348
349 // Create client and server
jbauch555604a2016-04-26 03:13:22 -0700350 std::unique_ptr<AsyncSocket> client(
351 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000352 sink.Monitor(client.get());
jbauch555604a2016-04-26 03:13:22 -0700353 std::unique_ptr<AsyncSocket> server(
354 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000355 sink.Monitor(server.get());
356
357 // Initiate connect
358 EXPECT_EQ(0, server->Bind(initial_addr));
359 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
360
361 EXPECT_EQ(0, server->Listen(5));
362 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
363
364 // Server close before socket enters accept queue
365 EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ));
366 server->Close();
367
368 ss_->ProcessMessagesUntilIdle();
369
370 // Result: connection failed
371 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
372 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR));
373
374 server.reset(ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
375 sink.Monitor(server.get());
376
377 // Initiate connect
378 EXPECT_EQ(0, server->Bind(initial_addr));
379 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
380
381 EXPECT_EQ(0, server->Listen(5));
382 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
383
384 ss_->ProcessMessagesUntilIdle();
385
386 // Server close while socket is in accept queue
387 EXPECT_TRUE(sink.Check(server.get(), testing::SSE_READ));
388 server->Close();
389
390 ss_->ProcessMessagesUntilIdle();
391
392 // Result: connection failed
393 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
394 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR));
395
396 // New server
397 server.reset(ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
398 sink.Monitor(server.get());
399
400 // Initiate connect
401 EXPECT_EQ(0, server->Bind(initial_addr));
402 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
403
404 EXPECT_EQ(0, server->Listen(5));
405 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
406
407 ss_->ProcessMessagesUntilIdle();
408
409 // Server accepts connection
410 EXPECT_TRUE(sink.Check(server.get(), testing::SSE_READ));
jbauch555604a2016-04-26 03:13:22 -0700411 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
deadbeef37f5ecf2017-02-27 14:06:41 -0800412 ASSERT_TRUE(nullptr != accepted.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000413 sink.Monitor(accepted.get());
414
415 // Client closes before connection complets
416 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED);
417
418 // Connected message has not been processed yet.
419 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
420 client->Close();
421
422 ss_->ProcessMessagesUntilIdle();
423
424 // Result: accepted socket closes
425 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CLOSED);
426 EXPECT_TRUE(sink.Check(accepted.get(), testing::SSE_CLOSE));
427 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE));
428 }
429
430 void CloseTest(const SocketAddress& initial_addr) {
431 testing::StreamSink sink;
432 const SocketAddress kEmptyAddr;
433
434 // Create clients
435 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM);
436 sink.Monitor(a);
437 a->Bind(initial_addr);
438 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
439
jbauch555604a2016-04-26 03:13:22 -0700440 std::unique_ptr<AsyncSocket> b(
441 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000442 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));
Stefan Holmer9131efd2016-05-23 18:19:26 +0200467 EXPECT_EQ(-1, b->Recv(buffer, 10, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000468
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
Stefan Holmer9131efd2016-05-23 18:19:26 +0200534 result = b->Recv(recv_buffer + recv_pos, 500, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000535 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) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200549 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000550 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) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200563 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000564 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) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200582 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000583 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) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200629 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000630 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) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200649 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000650 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) {
deadbeef37f5ecf2017-02-27 14:06:41 -0800689 time_t seed = ::time(nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000690 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);
deadbeef37f5ecf2017-02-27 14:06:41 -0800769 EXPECT_TRUE(nullptr != accepted);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000770 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));
deadbeef37f5ecf2017-02-27 14:06:41 -0800780 EXPECT_TRUE(nullptr == server->Accept(&accept_address));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000781 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 }
deadbeef37f5ecf2017-02-27 14:06:41 -0800821 virtual void TearDown() { Thread::Current()->set_socketserver(nullptr); }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000822
823 VirtualSocketServer* ss_;
824 const SocketAddress kIPv4AnyAddress;
825 const SocketAddress kIPv6AnyAddress;
826};
827
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000828TEST_F(VirtualSocketServerTest, basic_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000829 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000);
830 BasicTest(ipv4_test_addr);
831}
832
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000833TEST_F(VirtualSocketServerTest, basic_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000834 SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 5000);
835 BasicTest(ipv6_test_addr);
836}
837
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700838TEST_F(VirtualSocketServerTest, TestDefaultRoute_v4) {
839 IPAddress ipv4_default_addr(0x01020304);
840 TestDefaultRoute(ipv4_default_addr);
841}
842
843TEST_F(VirtualSocketServerTest, TestDefaultRoute_v6) {
844 IPAddress ipv6_default_addr;
845 EXPECT_TRUE(
846 IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ipv6_default_addr));
847 TestDefaultRoute(ipv6_default_addr);
848}
849
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000850TEST_F(VirtualSocketServerTest, connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000851 ConnectTest(kIPv4AnyAddress);
852}
853
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000854TEST_F(VirtualSocketServerTest, connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000855 ConnectTest(kIPv6AnyAddress);
856}
857
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000858TEST_F(VirtualSocketServerTest, connect_to_non_listener_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000859 ConnectToNonListenerTest(kIPv4AnyAddress);
860}
861
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000862TEST_F(VirtualSocketServerTest, connect_to_non_listener_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000863 ConnectToNonListenerTest(kIPv6AnyAddress);
864}
865
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000866TEST_F(VirtualSocketServerTest, close_during_connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000867 CloseDuringConnectTest(kIPv4AnyAddress);
868}
869
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000870TEST_F(VirtualSocketServerTest, close_during_connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000871 CloseDuringConnectTest(kIPv6AnyAddress);
872}
873
874TEST_F(VirtualSocketServerTest, close_v4) {
875 CloseTest(kIPv4AnyAddress);
876}
877
878TEST_F(VirtualSocketServerTest, close_v6) {
879 CloseTest(kIPv6AnyAddress);
880}
881
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000882TEST_F(VirtualSocketServerTest, tcp_send_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000883 TcpSendTest(kIPv4AnyAddress);
884}
885
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000886TEST_F(VirtualSocketServerTest, tcp_send_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000887 TcpSendTest(kIPv6AnyAddress);
888}
889
890TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v4) {
891 TcpSendsPacketsInOrderTest(kIPv4AnyAddress);
892}
893
894TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v6) {
895 TcpSendsPacketsInOrderTest(kIPv6AnyAddress);
896}
897
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000898TEST_F(VirtualSocketServerTest, bandwidth_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000899 BandwidthTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000900}
901
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000902TEST_F(VirtualSocketServerTest, bandwidth_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000903 BandwidthTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000904}
905
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000906TEST_F(VirtualSocketServerTest, delay_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000907 DelayTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000908}
909
910// See: https://code.google.com/p/webrtc/issues/detail?id=2409
911TEST_F(VirtualSocketServerTest, DISABLED_delay_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000912 DelayTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000913}
914
915// Works, receiving socket sees 127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000916TEST_F(VirtualSocketServerTest, CanConnectFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000917 CrossFamilyConnectionTest(SocketAddress("::ffff:127.0.0.2", 0),
918 SocketAddress("0.0.0.0", 5000),
919 true);
920}
921
922// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000923TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000924 CrossFamilyConnectionTest(SocketAddress("::2", 0),
925 SocketAddress("0.0.0.0", 5000),
926 false);
927}
928
929// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000930TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000931 CrossFamilyConnectionTest(SocketAddress("::2", 0),
932 SocketAddress("::ffff:127.0.0.1", 5000),
933 false);
934}
935
936// Works. receiving socket sees ::ffff:127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000937TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000938 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
939 SocketAddress("::", 5000),
940 true);
941}
942
943// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000944TEST_F(VirtualSocketServerTest, CantConnectFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000945 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
946 SocketAddress("::1", 5000),
947 false);
948}
949
950// Works. Receiving socket sees ::ffff:127.0.0.1.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000951TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000952 CrossFamilyConnectionTest(SocketAddress("127.0.0.1", 0),
953 SocketAddress("::ffff:127.0.0.2", 5000),
954 true);
955}
956
957// Works, receiving socket sees a result from GetNextIP.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000958TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000959 CrossFamilyConnectionTest(SocketAddress("::", 0),
960 SocketAddress("0.0.0.0", 5000),
961 true);
962}
963
964// Works, receiving socket sees whatever GetNextIP gave the client.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000965TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000966 CrossFamilyConnectionTest(SocketAddress("0.0.0.0", 0),
967 SocketAddress("::", 5000),
968 true);
969}
970
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000971TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000972 CrossFamilyDatagramTest(SocketAddress("0.0.0.0", 0),
973 SocketAddress("::", 5000),
974 true);
975}
976
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000977TEST_F(VirtualSocketServerTest, CanSendDatagramFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000978 CrossFamilyDatagramTest(SocketAddress("::ffff:127.0.0.1", 0),
979 SocketAddress("0.0.0.0", 5000),
980 true);
981}
982
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000983TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000984 CrossFamilyDatagramTest(SocketAddress("::2", 0),
985 SocketAddress("0.0.0.0", 5000),
986 false);
987}
988
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000989TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000990 CrossFamilyDatagramTest(SocketAddress("::2", 0),
991 SocketAddress("::ffff:127.0.0.1", 5000),
992 false);
993}
994
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000995TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000996 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
997 SocketAddress("::", 5000),
998 true);
999}
1000
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001001TEST_F(VirtualSocketServerTest, CantSendDatagramFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001002 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
1003 SocketAddress("::1", 5000),
1004 false);
1005}
1006
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001007TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001008 CrossFamilyDatagramTest(SocketAddress("127.0.0.1", 0),
1009 SocketAddress("::ffff:127.0.0.2", 5000),
1010 true);
1011}
1012
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001013TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001014 CrossFamilyDatagramTest(SocketAddress("::", 0),
1015 SocketAddress("0.0.0.0", 5000),
1016 true);
1017}
1018
Taylor Brandstettere7536412016-09-09 13:16:15 -07001019TEST_F(VirtualSocketServerTest, SetSendingBlockedWithUdpSocket) {
1020 AsyncSocket* socket1 =
1021 ss_->CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM);
1022 AsyncSocket* socket2 =
1023 ss_->CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM);
1024 socket1->Bind(kIPv4AnyAddress);
1025 socket2->Bind(kIPv4AnyAddress);
1026 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket1));
1027
1028 ss_->SetSendingBlocked(true);
1029 EXPECT_EQ(-1, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1030 EXPECT_TRUE(socket1->IsBlocking());
1031 EXPECT_EQ(0, client1->ready_to_send_count());
1032
1033 ss_->SetSendingBlocked(false);
1034 EXPECT_EQ(1, client1->ready_to_send_count());
1035 EXPECT_EQ(3, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1036}
1037
1038TEST_F(VirtualSocketServerTest, SetSendingBlockedWithTcpSocket) {
1039 constexpr size_t kBufferSize = 1024;
1040 ss_->set_send_buffer_capacity(kBufferSize);
1041 ss_->set_recv_buffer_capacity(kBufferSize);
1042
1043 testing::StreamSink sink;
1044 AsyncSocket* socket1 =
1045 ss_->CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM);
1046 AsyncSocket* socket2 =
1047 ss_->CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM);
1048 sink.Monitor(socket1);
1049 sink.Monitor(socket2);
1050 socket1->Bind(kIPv4AnyAddress);
1051 socket2->Bind(kIPv4AnyAddress);
1052
1053 // Connect sockets.
1054 EXPECT_EQ(0, socket1->Connect(socket2->GetLocalAddress()));
1055 EXPECT_EQ(0, socket2->Connect(socket1->GetLocalAddress()));
1056 ss_->ProcessMessagesUntilIdle();
1057
1058 char data[kBufferSize] = {};
1059
1060 // First Send call will fill the send buffer but not send anything.
1061 ss_->SetSendingBlocked(true);
1062 EXPECT_EQ(static_cast<int>(kBufferSize), socket1->Send(data, kBufferSize));
1063 ss_->ProcessMessagesUntilIdle();
1064 EXPECT_FALSE(sink.Check(socket1, testing::SSE_WRITE));
1065 EXPECT_FALSE(sink.Check(socket2, testing::SSE_READ));
1066 EXPECT_FALSE(socket1->IsBlocking());
1067
1068 // Since the send buffer is full, next Send will result in EWOULDBLOCK.
1069 EXPECT_EQ(-1, socket1->Send(data, kBufferSize));
1070 EXPECT_FALSE(sink.Check(socket1, testing::SSE_WRITE));
1071 EXPECT_FALSE(sink.Check(socket2, testing::SSE_READ));
1072 EXPECT_TRUE(socket1->IsBlocking());
1073
1074 // When sending is unblocked, the buffered data should be sent and
1075 // SignalWriteEvent should fire.
1076 ss_->SetSendingBlocked(false);
1077 ss_->ProcessMessagesUntilIdle();
1078 EXPECT_TRUE(sink.Check(socket1, testing::SSE_WRITE));
1079 EXPECT_TRUE(sink.Check(socket2, testing::SSE_READ));
1080}
1081
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001082TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02001083 const uint32_t kTestMean[] = {10, 100, 333, 1000};
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001084 const double kTestDev[] = { 0.25, 0.1, 0.01 };
Taylor Brandstettere7536412016-09-09 13:16:15 -07001085 // TODO(deadbeef): The current code only works for 1000 data points or more.
Peter Boström0c4e06b2015-10-07 12:23:21 +02001086 const uint32_t kTestSamples[] = {/*10, 100,*/ 1000};
tfarina5237aaf2015-11-10 23:44:30 -08001087 for (size_t midx = 0; midx < arraysize(kTestMean); ++midx) {
1088 for (size_t didx = 0; didx < arraysize(kTestDev); ++didx) {
1089 for (size_t sidx = 0; sidx < arraysize(kTestSamples); ++sidx) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001090 ASSERT_LT(0u, kTestSamples[sidx]);
Peter Boström0c4e06b2015-10-07 12:23:21 +02001091 const uint32_t kStdDev =
1092 static_cast<uint32_t>(kTestDev[didx] * kTestMean[midx]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001093 VirtualSocketServer::Function* f =
1094 VirtualSocketServer::CreateDistribution(kTestMean[midx],
1095 kStdDev,
1096 kTestSamples[sidx]);
deadbeef37f5ecf2017-02-27 14:06:41 -08001097 ASSERT_TRUE(nullptr != f);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001098 ASSERT_EQ(kTestSamples[sidx], f->size());
1099 double sum = 0;
Peter Boström0c4e06b2015-10-07 12:23:21 +02001100 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001101 sum += (*f)[i].second;
1102 }
1103 const double mean = sum / f->size();
1104 double sum_sq_dev = 0;
Peter Boström0c4e06b2015-10-07 12:23:21 +02001105 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001106 double dev = (*f)[i].second - mean;
1107 sum_sq_dev += dev * dev;
1108 }
1109 const double stddev = sqrt(sum_sq_dev / f->size());
1110 EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx])
1111 << "M=" << kTestMean[midx]
1112 << " SD=" << kStdDev
1113 << " N=" << kTestSamples[sidx];
1114 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev)
1115 << "M=" << kTestMean[midx]
1116 << " SD=" << kStdDev
1117 << " N=" << kTestSamples[sidx];
1118 delete f;
1119 }
1120 }
1121 }
1122}