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