xref: /aosp_15_r20/external/webrtc/rtc_base/virtual_socket_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
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 <stdint.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include <time.h>
16 #if defined(WEBRTC_POSIX)
17 #include <netinet/in.h>
18 #endif
19 
20 #include <algorithm>
21 #include <memory>
22 #include <utility>
23 
24 #include "absl/memory/memory.h"
25 #include "api/units/time_delta.h"
26 #include "rtc_base/arraysize.h"
27 #include "rtc_base/async_packet_socket.h"
28 #include "rtc_base/async_udp_socket.h"
29 #include "rtc_base/fake_clock.h"
30 #include "rtc_base/gunit.h"
31 #include "rtc_base/ip_address.h"
32 #include "rtc_base/logging.h"
33 #include "rtc_base/socket.h"
34 #include "rtc_base/socket_address.h"
35 #include "rtc_base/task_utils/repeating_task.h"
36 #include "rtc_base/test_client.h"
37 #include "rtc_base/test_utils.h"
38 #include "rtc_base/third_party/sigslot/sigslot.h"
39 #include "rtc_base/thread.h"
40 #include "rtc_base/time_utils.h"
41 #include "rtc_base/virtual_socket_server.h"
42 #include "test/gtest.h"
43 
44 namespace rtc {
45 namespace {
46 
47 using ::webrtc::RepeatingTaskHandle;
48 using ::webrtc::TimeDelta;
49 using ::webrtc::testing::SSE_CLOSE;
50 using ::webrtc::testing::SSE_ERROR;
51 using ::webrtc::testing::SSE_OPEN;
52 using ::webrtc::testing::SSE_READ;
53 using ::webrtc::testing::SSE_WRITE;
54 using ::webrtc::testing::StreamSink;
55 
56 // Sends at a constant rate but with random packet sizes.
57 struct Sender {
Senderrtc::__anondf3520710111::Sender58   Sender(Thread* th, Socket* s, uint32_t rt)
59       : thread(th),
60         socket(std::make_unique<AsyncUDPSocket>(s)),
61         rate(rt),
62         count(0) {
63     last_send = rtc::TimeMillis();
64 
65     periodic = RepeatingTaskHandle::DelayedStart(thread, NextDelay(), [this] {
66       int64_t cur_time = rtc::TimeMillis();
67       int64_t delay = cur_time - last_send;
68       uint32_t size =
69           std::clamp<uint32_t>(rate * delay / 1000, sizeof(uint32_t), 4096);
70       count += size;
71       memcpy(dummy, &cur_time, sizeof(cur_time));
72       socket->Send(dummy, size, options);
73 
74       last_send = cur_time;
75       return NextDelay();
76     });
77   }
78 
NextDelayrtc::__anondf3520710111::Sender79   TimeDelta NextDelay() {
80     int size = (rand() % 4096) + 1;
81     return TimeDelta::Seconds(1) * size / rate;
82   }
83 
84   Thread* thread;
85   std::unique_ptr<AsyncUDPSocket> socket;
86   rtc::PacketOptions options;
87   RepeatingTaskHandle periodic;
88   uint32_t rate;  // bytes per second
89   uint32_t count;
90   int64_t last_send;
91   char dummy[4096];
92 };
93 
94 struct Receiver : public sigslot::has_slots<> {
Receiverrtc::__anondf3520710111::Receiver95   Receiver(Thread* th, Socket* s, uint32_t bw)
96       : thread(th),
97         socket(std::make_unique<AsyncUDPSocket>(s)),
98         bandwidth(bw),
99         count(0),
100         sec_count(0),
101         sum(0),
102         sum_sq(0),
103         samples(0) {
104     socket->SignalReadPacket.connect(this, &Receiver::OnReadPacket);
105     periodic = RepeatingTaskHandle::DelayedStart(
106         thread, TimeDelta::Seconds(1), [this] {
107           // It is always possible for us to receive more than expected because
108           // packets can be further delayed in delivery.
109           if (bandwidth > 0) {
110             EXPECT_LE(sec_count, 5 * bandwidth / 4);
111           }
112           sec_count = 0;
113           return TimeDelta::Seconds(1);
114         });
115   }
116 
~Receiverrtc::__anondf3520710111::Receiver117   ~Receiver() override { periodic.Stop(); }
118 
OnReadPacketrtc::__anondf3520710111::Receiver119   void OnReadPacket(AsyncPacketSocket* s,
120                     const char* data,
121                     size_t size,
122                     const SocketAddress& remote_addr,
123                     const int64_t& /* packet_time_us */) {
124     ASSERT_EQ(socket.get(), s);
125     ASSERT_GE(size, 4U);
126 
127     count += size;
128     sec_count += size;
129 
130     uint32_t send_time = *reinterpret_cast<const uint32_t*>(data);
131     uint32_t recv_time = rtc::TimeMillis();
132     uint32_t delay = recv_time - send_time;
133     sum += delay;
134     sum_sq += delay * delay;
135     samples += 1;
136   }
137 
138   Thread* thread;
139   std::unique_ptr<AsyncUDPSocket> socket;
140   uint32_t bandwidth;
141   RepeatingTaskHandle periodic;
142   size_t count;
143   size_t sec_count;
144   double sum;
145   double sum_sq;
146   uint32_t samples;
147 };
148 
149 // Note: This test uses a fake clock in addition to a virtual network.
150 class VirtualSocketServerTest : public ::testing::Test {
151  public:
VirtualSocketServerTest()152   VirtualSocketServerTest()
153       : ss_(&fake_clock_),
154         thread_(&ss_),
155         kIPv4AnyAddress(IPAddress(INADDR_ANY), 0),
156         kIPv6AnyAddress(IPAddress(in6addr_any), 0) {}
157 
CheckPortIncrementalization(const SocketAddress & post,const SocketAddress & pre)158   void CheckPortIncrementalization(const SocketAddress& post,
159                                    const SocketAddress& pre) {
160     EXPECT_EQ(post.port(), pre.port() + 1);
161     IPAddress post_ip = post.ipaddr();
162     IPAddress pre_ip = pre.ipaddr();
163     EXPECT_EQ(pre_ip.family(), post_ip.family());
164     if (post_ip.family() == AF_INET) {
165       in_addr pre_ipv4 = pre_ip.ipv4_address();
166       in_addr post_ipv4 = post_ip.ipv4_address();
167       EXPECT_EQ(post_ipv4.s_addr, pre_ipv4.s_addr);
168     } else if (post_ip.family() == AF_INET6) {
169       in6_addr post_ip6 = post_ip.ipv6_address();
170       in6_addr pre_ip6 = pre_ip.ipv6_address();
171       uint32_t* post_as_ints = reinterpret_cast<uint32_t*>(&post_ip6.s6_addr);
172       uint32_t* pre_as_ints = reinterpret_cast<uint32_t*>(&pre_ip6.s6_addr);
173       EXPECT_EQ(post_as_ints[3], pre_as_ints[3]);
174     }
175   }
176 
177   // Test a client can bind to the any address, and all sent packets will have
178   // the default source address. Also, it can receive packets sent to the
179   // default address.
TestDefaultSourceAddress(const IPAddress & default_address)180   void TestDefaultSourceAddress(const IPAddress& default_address) {
181     ss_.SetDefaultSourceAddress(default_address);
182 
183     // Create client1 bound to the any address.
184     Socket* socket = ss_.CreateSocket(default_address.family(), SOCK_DGRAM);
185     socket->Bind(EmptySocketAddressWithFamily(default_address.family()));
186     SocketAddress client1_any_addr = socket->GetLocalAddress();
187     EXPECT_TRUE(client1_any_addr.IsAnyIP());
188     auto client1 = std::make_unique<TestClient>(
189         std::make_unique<AsyncUDPSocket>(socket), &fake_clock_);
190 
191     // Create client2 bound to the address route.
192     Socket* socket2 = ss_.CreateSocket(default_address.family(), SOCK_DGRAM);
193     socket2->Bind(SocketAddress(default_address, 0));
194     SocketAddress client2_addr = socket2->GetLocalAddress();
195     EXPECT_FALSE(client2_addr.IsAnyIP());
196     auto client2 = std::make_unique<TestClient>(
197         std::make_unique<AsyncUDPSocket>(socket2), &fake_clock_);
198 
199     // Client1 sends to client2, client2 should see the default address as
200     // client1's address.
201     SocketAddress client1_addr;
202     EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
203     EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
204     EXPECT_EQ(client1_addr,
205               SocketAddress(default_address, client1_any_addr.port()));
206 
207     // Client2 can send back to client1's default address.
208     EXPECT_EQ(3, client2->SendTo("foo", 3, client1_addr));
209     EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
210   }
211 
BasicTest(const SocketAddress & initial_addr)212   void BasicTest(const SocketAddress& initial_addr) {
213     Socket* socket = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
214     socket->Bind(initial_addr);
215     SocketAddress server_addr = socket->GetLocalAddress();
216     // Make sure VSS didn't switch families on us.
217     EXPECT_EQ(server_addr.family(), initial_addr.family());
218 
219     auto client1 = std::make_unique<TestClient>(
220         std::make_unique<AsyncUDPSocket>(socket), &fake_clock_);
221     Socket* socket2 = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
222     auto client2 = std::make_unique<TestClient>(
223         std::make_unique<AsyncUDPSocket>(socket2), &fake_clock_);
224 
225     SocketAddress client2_addr;
226     EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
227     EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
228 
229     SocketAddress client1_addr;
230     EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
231     EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
232     EXPECT_EQ(client1_addr, server_addr);
233 
234     SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family());
235     for (int i = 0; i < 10; i++) {
236       client2 = std::make_unique<TestClient>(
237           absl::WrapUnique(AsyncUDPSocket::Create(&ss_, empty)), &fake_clock_);
238 
239       SocketAddress next_client2_addr;
240       EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
241       EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr));
242       CheckPortIncrementalization(next_client2_addr, client2_addr);
243       // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1);
244 
245       SocketAddress server_addr2;
246       EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr));
247       EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2));
248       EXPECT_EQ(server_addr2, server_addr);
249 
250       client2_addr = next_client2_addr;
251     }
252   }
253 
254   // initial_addr should be made from either INADDR_ANY or in6addr_any.
ConnectTest(const SocketAddress & initial_addr)255   void ConnectTest(const SocketAddress& initial_addr) {
256     StreamSink sink;
257     SocketAddress accept_addr;
258     const SocketAddress kEmptyAddr =
259         EmptySocketAddressWithFamily(initial_addr.family());
260 
261     // Create client
262     std::unique_ptr<Socket> client =
263         absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
264     sink.Monitor(client.get());
265     EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
266     EXPECT_TRUE(client->GetLocalAddress().IsNil());
267 
268     // Create server
269     std::unique_ptr<Socket> server =
270         absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
271     sink.Monitor(server.get());
272     EXPECT_NE(0, server->Listen(5));  // Bind required
273     EXPECT_EQ(0, server->Bind(initial_addr));
274     EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
275     EXPECT_EQ(0, server->Listen(5));
276     EXPECT_EQ(server->GetState(), Socket::CS_CONNECTING);
277 
278     // No pending server connections
279     EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
280     EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
281     EXPECT_EQ(AF_UNSPEC, accept_addr.family());
282 
283     // Attempt connect to listening socket
284     EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
285     EXPECT_NE(client->GetLocalAddress(), kEmptyAddr);          // Implicit Bind
286     EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family());  // Implicit Bind
287     EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress());
288 
289     // Client is connecting
290     EXPECT_EQ(client->GetState(), Socket::CS_CONNECTING);
291     EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
292     EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
293 
294     ss_.ProcessMessagesUntilIdle();
295 
296     // Client still connecting
297     EXPECT_EQ(client->GetState(), Socket::CS_CONNECTING);
298     EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
299     EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
300 
301     // Server has pending connection
302     EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
303     std::unique_ptr<Socket> accepted =
304         absl::WrapUnique(server->Accept(&accept_addr));
305     EXPECT_TRUE(nullptr != accepted);
306     EXPECT_NE(accept_addr, kEmptyAddr);
307     EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr);
308 
309     EXPECT_EQ(accepted->GetState(), Socket::CS_CONNECTED);
310     EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress());
311     EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress());
312 
313     ss_.ProcessMessagesUntilIdle();
314 
315     // Client has connected
316     EXPECT_EQ(client->GetState(), Socket::CS_CONNECTED);
317     EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
318     EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
319     EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
320     EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
321   }
322 
ConnectToNonListenerTest(const SocketAddress & initial_addr)323   void ConnectToNonListenerTest(const SocketAddress& initial_addr) {
324     StreamSink sink;
325     SocketAddress accept_addr;
326     const SocketAddress nil_addr;
327     const SocketAddress empty_addr =
328         EmptySocketAddressWithFamily(initial_addr.family());
329 
330     // Create client
331     std::unique_ptr<Socket> client =
332         absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
333     sink.Monitor(client.get());
334 
335     // Create server
336     std::unique_ptr<Socket> server =
337         absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
338     sink.Monitor(server.get());
339     EXPECT_EQ(0, server->Bind(initial_addr));
340     EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
341     // Attempt connect to non-listening socket
342     EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
343 
344     ss_.ProcessMessagesUntilIdle();
345 
346     // No pending server connections
347     EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
348     EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
349     EXPECT_EQ(accept_addr, nil_addr);
350 
351     // Connection failed
352     EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
353     EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
354     EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
355     EXPECT_EQ(client->GetRemoteAddress(), nil_addr);
356   }
357 
CloseDuringConnectTest(const SocketAddress & initial_addr)358   void CloseDuringConnectTest(const SocketAddress& initial_addr) {
359     StreamSink sink;
360     SocketAddress accept_addr;
361     const SocketAddress empty_addr =
362         EmptySocketAddressWithFamily(initial_addr.family());
363 
364     // Create client and server
365     std::unique_ptr<Socket> client(
366         ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
367     sink.Monitor(client.get());
368     std::unique_ptr<Socket> server(
369         ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
370     sink.Monitor(server.get());
371 
372     // Initiate connect
373     EXPECT_EQ(0, server->Bind(initial_addr));
374     EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
375 
376     EXPECT_EQ(0, server->Listen(5));
377     EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
378 
379     // Server close before socket enters accept queue
380     EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
381     server->Close();
382 
383     ss_.ProcessMessagesUntilIdle();
384 
385     // Result: connection failed
386     EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
387     EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
388 
389     server.reset(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
390     sink.Monitor(server.get());
391 
392     // Initiate connect
393     EXPECT_EQ(0, server->Bind(initial_addr));
394     EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
395 
396     EXPECT_EQ(0, server->Listen(5));
397     EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
398 
399     ss_.ProcessMessagesUntilIdle();
400 
401     // Server close while socket is in accept queue
402     EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
403     server->Close();
404 
405     ss_.ProcessMessagesUntilIdle();
406 
407     // Result: connection failed
408     EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
409     EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
410 
411     // New server
412     server.reset(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
413     sink.Monitor(server.get());
414 
415     // Initiate connect
416     EXPECT_EQ(0, server->Bind(initial_addr));
417     EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
418 
419     EXPECT_EQ(0, server->Listen(5));
420     EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
421 
422     ss_.ProcessMessagesUntilIdle();
423 
424     // Server accepts connection
425     EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
426     std::unique_ptr<Socket> accepted(server->Accept(&accept_addr));
427     ASSERT_TRUE(nullptr != accepted.get());
428     sink.Monitor(accepted.get());
429 
430     // Client closes before connection complets
431     EXPECT_EQ(accepted->GetState(), Socket::CS_CONNECTED);
432 
433     // Connected message has not been processed yet.
434     EXPECT_EQ(client->GetState(), Socket::CS_CONNECTING);
435     client->Close();
436 
437     ss_.ProcessMessagesUntilIdle();
438 
439     // Result: accepted socket closes
440     EXPECT_EQ(accepted->GetState(), Socket::CS_CLOSED);
441     EXPECT_TRUE(sink.Check(accepted.get(), SSE_CLOSE));
442     EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
443   }
444 
CloseTest(const SocketAddress & initial_addr)445   void CloseTest(const SocketAddress& initial_addr) {
446     StreamSink sink;
447     const SocketAddress kEmptyAddr;
448 
449     // Create clients
450     std::unique_ptr<Socket> a =
451         absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
452     sink.Monitor(a.get());
453     a->Bind(initial_addr);
454     EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
455 
456     std::unique_ptr<Socket> b =
457         absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
458     sink.Monitor(b.get());
459     b->Bind(initial_addr);
460     EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
461 
462     EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
463     EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
464 
465     ss_.ProcessMessagesUntilIdle();
466 
467     EXPECT_TRUE(sink.Check(a.get(), SSE_OPEN));
468     EXPECT_EQ(a->GetState(), Socket::CS_CONNECTED);
469     EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress());
470 
471     EXPECT_TRUE(sink.Check(b.get(), SSE_OPEN));
472     EXPECT_EQ(b->GetState(), Socket::CS_CONNECTED);
473     EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress());
474 
475     EXPECT_EQ(1, a->Send("a", 1));
476     b->Close();
477     EXPECT_EQ(1, a->Send("b", 1));
478 
479     ss_.ProcessMessagesUntilIdle();
480 
481     char buffer[10];
482     EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
483     EXPECT_EQ(-1, b->Recv(buffer, 10, nullptr));
484 
485     EXPECT_TRUE(sink.Check(a.get(), SSE_CLOSE));
486     EXPECT_EQ(a->GetState(), Socket::CS_CLOSED);
487     EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr);
488 
489     // No signal for Closer
490     EXPECT_FALSE(sink.Check(b.get(), SSE_CLOSE));
491     EXPECT_EQ(b->GetState(), Socket::CS_CLOSED);
492     EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr);
493   }
494 
TcpSendTest(const SocketAddress & initial_addr)495   void TcpSendTest(const SocketAddress& initial_addr) {
496     StreamSink sink;
497     const SocketAddress kEmptyAddr;
498 
499     // Connect two sockets
500     std::unique_ptr<Socket> a =
501         absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
502     sink.Monitor(a.get());
503     a->Bind(initial_addr);
504     EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
505 
506     std::unique_ptr<Socket> b =
507         absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
508     sink.Monitor(b.get());
509     b->Bind(initial_addr);
510     EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
511 
512     EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
513     EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
514 
515     ss_.ProcessMessagesUntilIdle();
516 
517     const size_t kBufferSize = 2000;
518     ss_.set_send_buffer_capacity(kBufferSize);
519     ss_.set_recv_buffer_capacity(kBufferSize);
520 
521     const size_t kDataSize = 5000;
522     char send_buffer[kDataSize], recv_buffer[kDataSize];
523     for (size_t i = 0; i < kDataSize; ++i)
524       send_buffer[i] = static_cast<char>(i % 256);
525     memset(recv_buffer, 0, sizeof(recv_buffer));
526     size_t send_pos = 0, recv_pos = 0;
527 
528     // Can't send more than send buffer in one write
529     int result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
530     EXPECT_EQ(static_cast<int>(kBufferSize), result);
531     send_pos += result;
532 
533     ss_.ProcessMessagesUntilIdle();
534     EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE));
535     EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
536 
537     // Receive buffer is already filled, fill send buffer again
538     result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
539     EXPECT_EQ(static_cast<int>(kBufferSize), result);
540     send_pos += result;
541 
542     ss_.ProcessMessagesUntilIdle();
543     EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE));
544     EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
545 
546     // No more room in send or receive buffer
547     result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
548     EXPECT_EQ(-1, result);
549     EXPECT_TRUE(a->IsBlocking());
550 
551     // Read a subset of the data
552     result = b->Recv(recv_buffer + recv_pos, 500, nullptr);
553     EXPECT_EQ(500, result);
554     recv_pos += result;
555 
556     ss_.ProcessMessagesUntilIdle();
557     EXPECT_TRUE(sink.Check(a.get(), SSE_WRITE));
558     EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
559 
560     // Room for more on the sending side
561     result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
562     EXPECT_EQ(500, result);
563     send_pos += result;
564 
565     // Empty the recv buffer
566     while (true) {
567       result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
568       if (result < 0) {
569         EXPECT_EQ(-1, result);
570         EXPECT_TRUE(b->IsBlocking());
571         break;
572       }
573       recv_pos += result;
574     }
575 
576     ss_.ProcessMessagesUntilIdle();
577     EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
578 
579     // Continue to empty the recv buffer
580     while (true) {
581       result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
582       if (result < 0) {
583         EXPECT_EQ(-1, result);
584         EXPECT_TRUE(b->IsBlocking());
585         break;
586       }
587       recv_pos += result;
588     }
589 
590     // Send last of the data
591     result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
592     EXPECT_EQ(500, result);
593     send_pos += result;
594 
595     ss_.ProcessMessagesUntilIdle();
596     EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
597 
598     // Receive the last of the data
599     while (true) {
600       result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
601       if (result < 0) {
602         EXPECT_EQ(-1, result);
603         EXPECT_TRUE(b->IsBlocking());
604         break;
605       }
606       recv_pos += result;
607     }
608 
609     ss_.ProcessMessagesUntilIdle();
610     EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
611 
612     // The received data matches the sent data
613     EXPECT_EQ(kDataSize, send_pos);
614     EXPECT_EQ(kDataSize, recv_pos);
615     EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize));
616   }
617 
TcpSendsPacketsInOrderTest(const SocketAddress & initial_addr)618   void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) {
619     const SocketAddress kEmptyAddr;
620 
621     // Connect two sockets
622     std::unique_ptr<Socket> a =
623         absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
624     std::unique_ptr<Socket> b =
625         absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
626     a->Bind(initial_addr);
627     EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
628 
629     b->Bind(initial_addr);
630     EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
631 
632     EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
633     EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
634     ss_.ProcessMessagesUntilIdle();
635 
636     // First, deliver all packets in 0 ms.
637     char buffer[2] = {0, 0};
638     const char cNumPackets = 10;
639     for (char i = 0; i < cNumPackets; ++i) {
640       buffer[0] = '0' + i;
641       EXPECT_EQ(1, a->Send(buffer, 1));
642     }
643 
644     ss_.ProcessMessagesUntilIdle();
645 
646     for (char i = 0; i < cNumPackets; ++i) {
647       EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
648       EXPECT_EQ(static_cast<char>('0' + i), buffer[0]);
649     }
650 
651     // Next, deliver packets at random intervals
652     const uint32_t mean = 50;
653     const uint32_t stddev = 50;
654 
655     ss_.set_delay_mean(mean);
656     ss_.set_delay_stddev(stddev);
657     ss_.UpdateDelayDistribution();
658 
659     for (char i = 0; i < cNumPackets; ++i) {
660       buffer[0] = 'A' + i;
661       EXPECT_EQ(1, a->Send(buffer, 1));
662     }
663 
664     ss_.ProcessMessagesUntilIdle();
665 
666     for (char i = 0; i < cNumPackets; ++i) {
667       EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
668       EXPECT_EQ(static_cast<char>('A' + i), buffer[0]);
669     }
670   }
671 
672   // It is important that initial_addr's port has to be 0 such that the
673   // incremental port behavior could ensure the 2 Binds result in different
674   // address.
BandwidthTest(const SocketAddress & initial_addr)675   void BandwidthTest(const SocketAddress& initial_addr) {
676     Socket* send_socket = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
677     Socket* recv_socket = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
678     ASSERT_EQ(0, send_socket->Bind(initial_addr));
679     ASSERT_EQ(0, recv_socket->Bind(initial_addr));
680     EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
681     EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
682     ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
683 
684     uint32_t bandwidth = 64 * 1024;
685     ss_.set_bandwidth(bandwidth);
686 
687     Thread* pthMain = Thread::Current();
688     Sender sender(pthMain, send_socket, 80 * 1024);
689     Receiver receiver(pthMain, recv_socket, bandwidth);
690 
691     // Allow the sender to run for 5 (simulated) seconds, then be stopped for 5
692     // seconds.
693     SIMULATED_WAIT(false, 5000, fake_clock_);
694     sender.periodic.Stop();
695     SIMULATED_WAIT(false, 5000, fake_clock_);
696 
697     // Ensure the observed bandwidth fell within a reasonable margin of error.
698     EXPECT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4);
699     EXPECT_TRUE(receiver.count <= 6 * bandwidth);  // queue could drain for 1s
700 
701     ss_.set_bandwidth(0);
702   }
703 
704   // It is important that initial_addr's port has to be 0 such that the
705   // incremental port behavior could ensure the 2 Binds result in different
706   // address.
DelayTest(const SocketAddress & initial_addr)707   void DelayTest(const SocketAddress& initial_addr) {
708     time_t seed = ::time(nullptr);
709     RTC_LOG(LS_VERBOSE) << "seed = " << seed;
710     srand(static_cast<unsigned int>(seed));
711 
712     const uint32_t mean = 2000;
713     const uint32_t stddev = 500;
714 
715     ss_.set_delay_mean(mean);
716     ss_.set_delay_stddev(stddev);
717     ss_.UpdateDelayDistribution();
718 
719     Socket* send_socket = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
720     Socket* recv_socket = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
721     ASSERT_EQ(0, send_socket->Bind(initial_addr));
722     ASSERT_EQ(0, recv_socket->Bind(initial_addr));
723     EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
724     EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
725     ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
726 
727     Thread* pthMain = Thread::Current();
728     // Avg packet size is 2K, so at 200KB/s for 10s, we should see about
729     // 1000 packets, which is necessary to get a good distribution.
730     Sender sender(pthMain, send_socket, 100 * 2 * 1024);
731     Receiver receiver(pthMain, recv_socket, 0);
732 
733     // Simulate 10 seconds of packets being sent, then check the observed delay
734     // distribution.
735     SIMULATED_WAIT(false, 10000, fake_clock_);
736     sender.periodic.Stop();
737     receiver.periodic.Stop();
738     ss_.ProcessMessagesUntilIdle();
739 
740     const double sample_mean = receiver.sum / receiver.samples;
741     double num =
742         receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum;
743     double den = receiver.samples * (receiver.samples - 1);
744     const double sample_stddev = sqrt(num / den);
745     RTC_LOG(LS_VERBOSE) << "mean=" << sample_mean
746                         << " stddev=" << sample_stddev;
747 
748     EXPECT_LE(500u, receiver.samples);
749     // We initially used a 0.1 fudge factor, but on the build machine, we
750     // have seen the value differ by as much as 0.13.
751     EXPECT_NEAR(mean, sample_mean, 0.15 * mean);
752     EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev);
753 
754     ss_.set_delay_mean(0);
755     ss_.set_delay_stddev(0);
756     ss_.UpdateDelayDistribution();
757   }
758 
759   // Test cross-family communication between a client bound to client_addr and a
760   // server bound to server_addr. shouldSucceed indicates if communication is
761   // expected to work or not.
CrossFamilyConnectionTest(const SocketAddress & client_addr,const SocketAddress & server_addr,bool shouldSucceed)762   void CrossFamilyConnectionTest(const SocketAddress& client_addr,
763                                  const SocketAddress& server_addr,
764                                  bool shouldSucceed) {
765     StreamSink sink;
766     SocketAddress accept_address;
767     const SocketAddress kEmptyAddr;
768 
769     // Client gets a IPv4 address
770     std::unique_ptr<Socket> client =
771         absl::WrapUnique(ss_.CreateSocket(client_addr.family(), SOCK_STREAM));
772     sink.Monitor(client.get());
773     EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
774     EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr);
775     client->Bind(client_addr);
776 
777     // Server gets a non-mapped non-any IPv6 address.
778     // IPv4 sockets should not be able to connect to this.
779     std::unique_ptr<Socket> server =
780         absl::WrapUnique(ss_.CreateSocket(server_addr.family(), SOCK_STREAM));
781     sink.Monitor(server.get());
782     server->Bind(server_addr);
783     server->Listen(5);
784 
785     if (shouldSucceed) {
786       EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
787       ss_.ProcessMessagesUntilIdle();
788       EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
789       std::unique_ptr<Socket> accepted =
790           absl::WrapUnique(server->Accept(&accept_address));
791       EXPECT_TRUE(nullptr != accepted);
792       EXPECT_NE(kEmptyAddr, accept_address);
793       ss_.ProcessMessagesUntilIdle();
794       EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
795       EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
796     } else {
797       // Check that the connection failed.
798       EXPECT_EQ(-1, client->Connect(server->GetLocalAddress()));
799       ss_.ProcessMessagesUntilIdle();
800 
801       EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
802       EXPECT_TRUE(nullptr == server->Accept(&accept_address));
803       EXPECT_EQ(accept_address, kEmptyAddr);
804       EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
805       EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
806       EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr);
807     }
808   }
809 
810   // Test cross-family datagram sending between a client bound to client_addr
811   // and a server bound to server_addr. shouldSucceed indicates if sending is
812   // expected to succeed or not.
CrossFamilyDatagramTest(const SocketAddress & client_addr,const SocketAddress & server_addr,bool shouldSucceed)813   void CrossFamilyDatagramTest(const SocketAddress& client_addr,
814                                const SocketAddress& server_addr,
815                                bool shouldSucceed) {
816     Socket* socket = ss_.CreateSocket(AF_INET, SOCK_DGRAM);
817     socket->Bind(server_addr);
818     SocketAddress bound_server_addr = socket->GetLocalAddress();
819     auto client1 = std::make_unique<TestClient>(
820         std::make_unique<AsyncUDPSocket>(socket), &fake_clock_);
821 
822     Socket* socket2 = ss_.CreateSocket(AF_INET, SOCK_DGRAM);
823     socket2->Bind(client_addr);
824     auto client2 = std::make_unique<TestClient>(
825         std::make_unique<AsyncUDPSocket>(socket2), &fake_clock_);
826     SocketAddress client2_addr;
827 
828     if (shouldSucceed) {
829       EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr));
830       EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
831       SocketAddress client1_addr;
832       EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
833       EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
834       EXPECT_EQ(client1_addr, bound_server_addr);
835     } else {
836       EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr));
837       EXPECT_TRUE(client1->CheckNoPacket());
838     }
839   }
840 
841  protected:
842   rtc::ScopedFakeClock fake_clock_;
843   VirtualSocketServer ss_;
844   AutoSocketServerThread thread_;
845   const SocketAddress kIPv4AnyAddress;
846   const SocketAddress kIPv6AnyAddress;
847 };
848 
TEST_F(VirtualSocketServerTest,basic_v4)849 TEST_F(VirtualSocketServerTest, basic_v4) {
850   SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000);
851   BasicTest(ipv4_test_addr);
852 }
853 
TEST_F(VirtualSocketServerTest,basic_v6)854 TEST_F(VirtualSocketServerTest, basic_v6) {
855   SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 5000);
856   BasicTest(ipv6_test_addr);
857 }
858 
TEST_F(VirtualSocketServerTest,TestDefaultRoute_v4)859 TEST_F(VirtualSocketServerTest, TestDefaultRoute_v4) {
860   IPAddress ipv4_default_addr(0x01020304);
861   TestDefaultSourceAddress(ipv4_default_addr);
862 }
863 
TEST_F(VirtualSocketServerTest,TestDefaultRoute_v6)864 TEST_F(VirtualSocketServerTest, TestDefaultRoute_v6) {
865   IPAddress ipv6_default_addr;
866   EXPECT_TRUE(
867       IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ipv6_default_addr));
868   TestDefaultSourceAddress(ipv6_default_addr);
869 }
870 
TEST_F(VirtualSocketServerTest,connect_v4)871 TEST_F(VirtualSocketServerTest, connect_v4) {
872   ConnectTest(kIPv4AnyAddress);
873 }
874 
TEST_F(VirtualSocketServerTest,connect_v6)875 TEST_F(VirtualSocketServerTest, connect_v6) {
876   ConnectTest(kIPv6AnyAddress);
877 }
878 
TEST_F(VirtualSocketServerTest,connect_to_non_listener_v4)879 TEST_F(VirtualSocketServerTest, connect_to_non_listener_v4) {
880   ConnectToNonListenerTest(kIPv4AnyAddress);
881 }
882 
TEST_F(VirtualSocketServerTest,connect_to_non_listener_v6)883 TEST_F(VirtualSocketServerTest, connect_to_non_listener_v6) {
884   ConnectToNonListenerTest(kIPv6AnyAddress);
885 }
886 
TEST_F(VirtualSocketServerTest,close_during_connect_v4)887 TEST_F(VirtualSocketServerTest, close_during_connect_v4) {
888   CloseDuringConnectTest(kIPv4AnyAddress);
889 }
890 
TEST_F(VirtualSocketServerTest,close_during_connect_v6)891 TEST_F(VirtualSocketServerTest, close_during_connect_v6) {
892   CloseDuringConnectTest(kIPv6AnyAddress);
893 }
894 
TEST_F(VirtualSocketServerTest,close_v4)895 TEST_F(VirtualSocketServerTest, close_v4) {
896   CloseTest(kIPv4AnyAddress);
897 }
898 
TEST_F(VirtualSocketServerTest,close_v6)899 TEST_F(VirtualSocketServerTest, close_v6) {
900   CloseTest(kIPv6AnyAddress);
901 }
902 
TEST_F(VirtualSocketServerTest,tcp_send_v4)903 TEST_F(VirtualSocketServerTest, tcp_send_v4) {
904   TcpSendTest(kIPv4AnyAddress);
905 }
906 
TEST_F(VirtualSocketServerTest,tcp_send_v6)907 TEST_F(VirtualSocketServerTest, tcp_send_v6) {
908   TcpSendTest(kIPv6AnyAddress);
909 }
910 
TEST_F(VirtualSocketServerTest,TcpSendsPacketsInOrder_v4)911 TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v4) {
912   TcpSendsPacketsInOrderTest(kIPv4AnyAddress);
913 }
914 
TEST_F(VirtualSocketServerTest,TcpSendsPacketsInOrder_v6)915 TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v6) {
916   TcpSendsPacketsInOrderTest(kIPv6AnyAddress);
917 }
918 
TEST_F(VirtualSocketServerTest,bandwidth_v4)919 TEST_F(VirtualSocketServerTest, bandwidth_v4) {
920   BandwidthTest(kIPv4AnyAddress);
921 }
922 
TEST_F(VirtualSocketServerTest,bandwidth_v6)923 TEST_F(VirtualSocketServerTest, bandwidth_v6) {
924   BandwidthTest(kIPv6AnyAddress);
925 }
926 
TEST_F(VirtualSocketServerTest,delay_v4)927 TEST_F(VirtualSocketServerTest, delay_v4) {
928   DelayTest(kIPv4AnyAddress);
929 }
930 
TEST_F(VirtualSocketServerTest,delay_v6)931 TEST_F(VirtualSocketServerTest, delay_v6) {
932   DelayTest(kIPv6AnyAddress);
933 }
934 
935 // Works, receiving socket sees 127.0.0.2.
TEST_F(VirtualSocketServerTest,CanConnectFromMappedIPv6ToIPv4Any)936 TEST_F(VirtualSocketServerTest, CanConnectFromMappedIPv6ToIPv4Any) {
937   CrossFamilyConnectionTest(SocketAddress("::ffff:127.0.0.2", 0),
938                             SocketAddress("0.0.0.0", 5000), true);
939 }
940 
941 // Fails.
TEST_F(VirtualSocketServerTest,CantConnectFromUnMappedIPv6ToIPv4Any)942 TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToIPv4Any) {
943   CrossFamilyConnectionTest(SocketAddress("::2", 0),
944                             SocketAddress("0.0.0.0", 5000), false);
945 }
946 
947 // Fails.
TEST_F(VirtualSocketServerTest,CantConnectFromUnMappedIPv6ToMappedIPv6)948 TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToMappedIPv6) {
949   CrossFamilyConnectionTest(SocketAddress("::2", 0),
950                             SocketAddress("::ffff:127.0.0.1", 5000), false);
951 }
952 
953 // Works. receiving socket sees ::ffff:127.0.0.2.
TEST_F(VirtualSocketServerTest,CanConnectFromIPv4ToIPv6Any)954 TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToIPv6Any) {
955   CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
956                             SocketAddress("::", 5000), true);
957 }
958 
959 // Fails.
TEST_F(VirtualSocketServerTest,CantConnectFromIPv4ToUnMappedIPv6)960 TEST_F(VirtualSocketServerTest, CantConnectFromIPv4ToUnMappedIPv6) {
961   CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
962                             SocketAddress("::1", 5000), false);
963 }
964 
965 // Works. Receiving socket sees ::ffff:127.0.0.1.
TEST_F(VirtualSocketServerTest,CanConnectFromIPv4ToMappedIPv6)966 TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToMappedIPv6) {
967   CrossFamilyConnectionTest(SocketAddress("127.0.0.1", 0),
968                             SocketAddress("::ffff:127.0.0.2", 5000), true);
969 }
970 
971 // Works, receiving socket sees a result from GetNextIP.
TEST_F(VirtualSocketServerTest,CanConnectFromUnboundIPv6ToIPv4Any)972 TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv6ToIPv4Any) {
973   CrossFamilyConnectionTest(SocketAddress("::", 0),
974                             SocketAddress("0.0.0.0", 5000), true);
975 }
976 
977 // Works, receiving socket sees whatever GetNextIP gave the client.
TEST_F(VirtualSocketServerTest,CanConnectFromUnboundIPv4ToIPv6Any)978 TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv4ToIPv6Any) {
979   CrossFamilyConnectionTest(SocketAddress("0.0.0.0", 0),
980                             SocketAddress("::", 5000), true);
981 }
982 
TEST_F(VirtualSocketServerTest,CanSendDatagramFromUnboundIPv4ToIPv6Any)983 TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv4ToIPv6Any) {
984   CrossFamilyDatagramTest(SocketAddress("0.0.0.0", 0),
985                           SocketAddress("::", 5000), true);
986 }
987 
TEST_F(VirtualSocketServerTest,CanSendDatagramFromMappedIPv6ToIPv4Any)988 TEST_F(VirtualSocketServerTest, CanSendDatagramFromMappedIPv6ToIPv4Any) {
989   CrossFamilyDatagramTest(SocketAddress("::ffff:127.0.0.1", 0),
990                           SocketAddress("0.0.0.0", 5000), true);
991 }
992 
TEST_F(VirtualSocketServerTest,CantSendDatagramFromUnMappedIPv6ToIPv4Any)993 TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToIPv4Any) {
994   CrossFamilyDatagramTest(SocketAddress("::2", 0),
995                           SocketAddress("0.0.0.0", 5000), false);
996 }
997 
TEST_F(VirtualSocketServerTest,CantSendDatagramFromUnMappedIPv6ToMappedIPv6)998 TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToMappedIPv6) {
999   CrossFamilyDatagramTest(SocketAddress("::2", 0),
1000                           SocketAddress("::ffff:127.0.0.1", 5000), false);
1001 }
1002 
TEST_F(VirtualSocketServerTest,CanSendDatagramFromIPv4ToIPv6Any)1003 TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToIPv6Any) {
1004   CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
1005                           SocketAddress("::", 5000), true);
1006 }
1007 
TEST_F(VirtualSocketServerTest,CantSendDatagramFromIPv4ToUnMappedIPv6)1008 TEST_F(VirtualSocketServerTest, CantSendDatagramFromIPv4ToUnMappedIPv6) {
1009   CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
1010                           SocketAddress("::1", 5000), false);
1011 }
1012 
TEST_F(VirtualSocketServerTest,CanSendDatagramFromIPv4ToMappedIPv6)1013 TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToMappedIPv6) {
1014   CrossFamilyDatagramTest(SocketAddress("127.0.0.1", 0),
1015                           SocketAddress("::ffff:127.0.0.2", 5000), true);
1016 }
1017 
TEST_F(VirtualSocketServerTest,CanSendDatagramFromUnboundIPv6ToIPv4Any)1018 TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) {
1019   CrossFamilyDatagramTest(SocketAddress("::", 0),
1020                           SocketAddress("0.0.0.0", 5000), true);
1021 }
1022 
TEST_F(VirtualSocketServerTest,SetSendingBlockedWithUdpSocket)1023 TEST_F(VirtualSocketServerTest, SetSendingBlockedWithUdpSocket) {
1024   Socket* socket1 = ss_.CreateSocket(kIPv4AnyAddress.family(), SOCK_DGRAM);
1025   std::unique_ptr<Socket> socket2 =
1026       absl::WrapUnique(ss_.CreateSocket(kIPv4AnyAddress.family(), SOCK_DGRAM));
1027   socket1->Bind(kIPv4AnyAddress);
1028   socket2->Bind(kIPv4AnyAddress);
1029   auto client1 = std::make_unique<TestClient>(
1030       std::make_unique<AsyncUDPSocket>(socket1), &fake_clock_);
1031 
1032   ss_.SetSendingBlocked(true);
1033   EXPECT_EQ(-1, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1034   EXPECT_TRUE(socket1->IsBlocking());
1035   EXPECT_EQ(0, client1->ready_to_send_count());
1036 
1037   ss_.SetSendingBlocked(false);
1038   EXPECT_EQ(1, client1->ready_to_send_count());
1039   EXPECT_EQ(3, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1040 }
1041 
TEST_F(VirtualSocketServerTest,SetSendingBlockedWithTcpSocket)1042 TEST_F(VirtualSocketServerTest, SetSendingBlockedWithTcpSocket) {
1043   constexpr size_t kBufferSize = 1024;
1044   ss_.set_send_buffer_capacity(kBufferSize);
1045   ss_.set_recv_buffer_capacity(kBufferSize);
1046 
1047   StreamSink sink;
1048   std::unique_ptr<Socket> socket1 =
1049       absl::WrapUnique(ss_.CreateSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
1050   std::unique_ptr<Socket> socket2 =
1051       absl::WrapUnique(ss_.CreateSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
1052   sink.Monitor(socket1.get());
1053   sink.Monitor(socket2.get());
1054   socket1->Bind(kIPv4AnyAddress);
1055   socket2->Bind(kIPv4AnyAddress);
1056 
1057   // Connect sockets.
1058   EXPECT_EQ(0, socket1->Connect(socket2->GetLocalAddress()));
1059   EXPECT_EQ(0, socket2->Connect(socket1->GetLocalAddress()));
1060   ss_.ProcessMessagesUntilIdle();
1061 
1062   char data[kBufferSize] = {};
1063 
1064   // First Send call will fill the send buffer but not send anything.
1065   ss_.SetSendingBlocked(true);
1066   EXPECT_EQ(static_cast<int>(kBufferSize), socket1->Send(data, kBufferSize));
1067   ss_.ProcessMessagesUntilIdle();
1068   EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
1069   EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
1070   EXPECT_FALSE(socket1->IsBlocking());
1071 
1072   // Since the send buffer is full, next Send will result in EWOULDBLOCK.
1073   EXPECT_EQ(-1, socket1->Send(data, kBufferSize));
1074   EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
1075   EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
1076   EXPECT_TRUE(socket1->IsBlocking());
1077 
1078   // When sending is unblocked, the buffered data should be sent and
1079   // SignalWriteEvent should fire.
1080   ss_.SetSendingBlocked(false);
1081   ss_.ProcessMessagesUntilIdle();
1082   EXPECT_TRUE(sink.Check(socket1.get(), SSE_WRITE));
1083   EXPECT_TRUE(sink.Check(socket2.get(), SSE_READ));
1084 }
1085 
TEST_F(VirtualSocketServerTest,CreatesStandardDistribution)1086 TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) {
1087   const uint32_t kTestMean[] = {10, 100, 333, 1000};
1088   const double kTestDev[] = {0.25, 0.1, 0.01};
1089   // TODO(deadbeef): The current code only works for 1000 data points or more.
1090   const uint32_t kTestSamples[] = {/*10, 100,*/ 1000};
1091   for (size_t midx = 0; midx < arraysize(kTestMean); ++midx) {
1092     for (size_t didx = 0; didx < arraysize(kTestDev); ++didx) {
1093       for (size_t sidx = 0; sidx < arraysize(kTestSamples); ++sidx) {
1094         ASSERT_LT(0u, kTestSamples[sidx]);
1095         const uint32_t kStdDev =
1096             static_cast<uint32_t>(kTestDev[didx] * kTestMean[midx]);
1097         std::unique_ptr<VirtualSocketServer::Function> f =
1098             VirtualSocketServer::CreateDistribution(kTestMean[midx], kStdDev,
1099                                                     kTestSamples[sidx]);
1100         ASSERT_TRUE(nullptr != f.get());
1101         ASSERT_EQ(kTestSamples[sidx], f->size());
1102         double sum = 0;
1103         for (uint32_t i = 0; i < f->size(); ++i) {
1104           sum += (*f)[i].second;
1105         }
1106         const double mean = sum / f->size();
1107         double sum_sq_dev = 0;
1108         for (uint32_t i = 0; i < f->size(); ++i) {
1109           double dev = (*f)[i].second - mean;
1110           sum_sq_dev += dev * dev;
1111         }
1112         const double stddev = sqrt(sum_sq_dev / f->size());
1113         EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx])
1114             << "M=" << kTestMean[midx] << " SD=" << kStdDev
1115             << " N=" << kTestSamples[sidx];
1116         EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev)
1117             << "M=" << kTestMean[midx] << " SD=" << kStdDev
1118             << " N=" << kTestSamples[sidx];
1119       }
1120     }
1121   }
1122 }
1123 
1124 }  // namespace
1125 }  // namespace rtc
1126