blob: 2c3403396926f3b27b4519c70f94c2965b2f7cd9 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
2 * Copyright 2006 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include <math.h>
Yves Gerey3e707812018-11-28 16:47:49 +010012#include <stdint.h>
13#include <stdlib.h>
14#include <string.h>
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000015#include <time.h>
16#if defined(WEBRTC_POSIX)
17#include <netinet/in.h>
18#endif
19
Yves Gerey3e707812018-11-28 16:47:49 +010020#include <algorithm>
jbauch555604a2016-04-26 03:13:22 -070021#include <memory>
Yves Gerey3e707812018-11-28 16:47:49 +010022#include <utility>
jbauch555604a2016-04-26 03:13:22 -070023
Karl Wiberg918f50c2018-07-05 11:40:33 +020024#include "absl/memory/memory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020025#include "rtc_base/arraysize.h"
Steve Anton10542f22019-01-11 09:11:00 -080026#include "rtc_base/async_packet_socket.h"
Steve Anton10542f22019-01-11 09:11:00 -080027#include "rtc_base/async_udp_socket.h"
28#include "rtc_base/fake_clock.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020029#include "rtc_base/gunit.h"
Steve Anton10542f22019-01-11 09:11:00 -080030#include "rtc_base/ip_address.h"
Yves Gerey3e707812018-11-28 16:47:49 +010031#include "rtc_base/location.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020032#include "rtc_base/logging.h"
Steve Anton10542f22019-01-11 09:11:00 -080033#include "rtc_base/message_handler.h"
Yves Gerey3e707812018-11-28 16:47:49 +010034#include "rtc_base/socket.h"
Steve Anton10542f22019-01-11 09:11:00 -080035#include "rtc_base/socket_address.h"
36#include "rtc_base/test_client.h"
37#include "rtc_base/test_utils.h"
Yves Gerey3e707812018-11-28 16:47:49 +010038#include "rtc_base/third_party/sigslot/sigslot.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020039#include "rtc_base/thread.h"
Steve Anton10542f22019-01-11 09:11:00 -080040#include "rtc_base/time_utils.h"
41#include "rtc_base/virtual_socket_server.h"
Yves Gerey3e707812018-11-28 16:47:49 +010042#include "test/gtest.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000043
Mirko Bonadeie10b1632018-12-11 18:43:40 +010044namespace rtc {
45namespace {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000046
kwibergd0d81482017-04-18 03:18:22 -070047using webrtc::testing::SSE_CLOSE;
48using webrtc::testing::SSE_ERROR;
49using webrtc::testing::SSE_OPEN;
50using webrtc::testing::SSE_READ;
51using webrtc::testing::SSE_WRITE;
52using webrtc::testing::StreamSink;
53
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000054// Sends at a constant rate but with random packet sizes.
Tomas Gunnarssonabdb4702020-09-05 18:43:36 +020055struct Sender : public MessageHandlerAutoCleanup {
Niels Möllerd0b88792021-08-12 10:32:30 +020056 Sender(Thread* th, Socket* s, uint32_t rt)
Peter Boström0c4e06b2015-10-07 12:23:21 +020057 : thread(th),
Mirko Bonadei317a1f02019-09-17 17:06:18 +020058 socket(std::make_unique<AsyncUDPSocket>(s)),
Peter Boström0c4e06b2015-10-07 12:23:21 +020059 done(false),
60 rate(rt),
61 count(0) {
Honghai Zhang82d78622016-05-06 11:29:15 -070062 last_send = rtc::TimeMillis();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070063 thread->PostDelayed(RTC_FROM_HERE, NextDelay(), this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000064 }
65
Peter Boström0c4e06b2015-10-07 12:23:21 +020066 uint32_t NextDelay() {
67 uint32_t size = (rand() % 4096) + 1;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000068 return 1000 * size / rate;
69 }
70
Steve Anton9de3aac2017-10-24 10:08:26 -070071 void OnMessage(Message* pmsg) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000072 ASSERT_EQ(1u, pmsg->message_id);
73
74 if (done)
75 return;
76
Honghai Zhang82d78622016-05-06 11:29:15 -070077 int64_t cur_time = rtc::TimeMillis();
78 int64_t delay = cur_time - last_send;
79 uint32_t size = static_cast<uint32_t>(rate * delay / 1000);
Peter Boström0c4e06b2015-10-07 12:23:21 +020080 size = std::min<uint32_t>(size, 4096);
81 size = std::max<uint32_t>(size, sizeof(uint32_t));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000082
83 count += size;
84 memcpy(dummy, &cur_time, sizeof(cur_time));
85 socket->Send(dummy, size, options);
86
87 last_send = cur_time;
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070088 thread->PostDelayed(RTC_FROM_HERE, NextDelay(), this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000089 }
90
91 Thread* thread;
jbauch555604a2016-04-26 03:13:22 -070092 std::unique_ptr<AsyncUDPSocket> socket;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000093 rtc::PacketOptions options;
94 bool done;
Peter Boström0c4e06b2015-10-07 12:23:21 +020095 uint32_t rate; // bytes per second
96 uint32_t count;
Honghai Zhang82d78622016-05-06 11:29:15 -070097 int64_t last_send;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000098 char dummy[4096];
99};
100
Tomas Gunnarssonabdb4702020-09-05 18:43:36 +0200101struct Receiver : public MessageHandlerAutoCleanup,
102 public sigslot::has_slots<> {
Niels Möllerd0b88792021-08-12 10:32:30 +0200103 Receiver(Thread* th, Socket* s, uint32_t bw)
Peter Boström0c4e06b2015-10-07 12:23:21 +0200104 : thread(th),
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200105 socket(std::make_unique<AsyncUDPSocket>(s)),
Peter Boström0c4e06b2015-10-07 12:23:21 +0200106 bandwidth(bw),
107 done(false),
108 count(0),
109 sec_count(0),
110 sum(0),
111 sum_sq(0),
112 samples(0) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000113 socket->SignalReadPacket.connect(this, &Receiver::OnReadPacket);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700114 thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000115 }
116
Steve Anton9de3aac2017-10-24 10:08:26 -0700117 ~Receiver() override { thread->Clear(this); }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000118
Yves Gerey665174f2018-06-19 15:03:05 +0200119 void OnReadPacket(AsyncPacketSocket* s,
120 const char* data,
121 size_t size,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000122 const SocketAddress& remote_addr,
Niels Möllere6933812018-11-05 13:01:41 +0100123 const int64_t& /* packet_time_us */) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000124 ASSERT_EQ(socket.get(), s);
125 ASSERT_GE(size, 4U);
126
127 count += size;
128 sec_count += size;
129
Peter Boström0c4e06b2015-10-07 12:23:21 +0200130 uint32_t send_time = *reinterpret_cast<const uint32_t*>(data);
Honghai Zhang82d78622016-05-06 11:29:15 -0700131 uint32_t recv_time = rtc::TimeMillis();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200132 uint32_t delay = recv_time - send_time;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000133 sum += delay;
134 sum_sq += delay * delay;
135 samples += 1;
136 }
137
Steve Anton9de3aac2017-10-24 10:08:26 -0700138 void OnMessage(Message* pmsg) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000139 ASSERT_EQ(1u, pmsg->message_id);
140
141 if (done)
142 return;
143
144 // It is always possible for us to receive more than expected because
145 // packets can be further delayed in delivery.
146 if (bandwidth > 0)
147 ASSERT_TRUE(sec_count <= 5 * bandwidth / 4);
148 sec_count = 0;
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700149 thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000150 }
151
152 Thread* thread;
jbauch555604a2016-04-26 03:13:22 -0700153 std::unique_ptr<AsyncUDPSocket> socket;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200154 uint32_t bandwidth;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000155 bool done;
156 size_t count;
157 size_t sec_count;
158 double sum;
159 double sum_sq;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200160 uint32_t samples;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000161};
162
deadbeef22e08142017-06-12 14:30:28 -0700163// Note: This test uses a fake clock in addition to a virtual network.
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200164class VirtualSocketServerTest : public ::testing::Test {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000165 public:
deadbeef37f5ecf2017-02-27 14:06:41 -0800166 VirtualSocketServerTest()
deadbeef22e08142017-06-12 14:30:28 -0700167 : ss_(&fake_clock_),
168 thread_(&ss_),
deadbeef37f5ecf2017-02-27 14:06:41 -0800169 kIPv4AnyAddress(IPAddress(INADDR_ANY), 0),
170 kIPv6AnyAddress(IPAddress(in6addr_any), 0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000171
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000172 void CheckPortIncrementalization(const SocketAddress& post,
173 const SocketAddress& pre) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000174 EXPECT_EQ(post.port(), pre.port() + 1);
175 IPAddress post_ip = post.ipaddr();
176 IPAddress pre_ip = pre.ipaddr();
177 EXPECT_EQ(pre_ip.family(), post_ip.family());
178 if (post_ip.family() == AF_INET) {
179 in_addr pre_ipv4 = pre_ip.ipv4_address();
180 in_addr post_ipv4 = post_ip.ipv4_address();
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000181 EXPECT_EQ(post_ipv4.s_addr, pre_ipv4.s_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000182 } else if (post_ip.family() == AF_INET6) {
183 in6_addr post_ip6 = post_ip.ipv6_address();
184 in6_addr pre_ip6 = pre_ip.ipv6_address();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200185 uint32_t* post_as_ints = reinterpret_cast<uint32_t*>(&post_ip6.s6_addr);
186 uint32_t* pre_as_ints = reinterpret_cast<uint32_t*>(&pre_ip6.s6_addr);
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000187 EXPECT_EQ(post_as_ints[3], pre_as_ints[3]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000188 }
189 }
190
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700191 // Test a client can bind to the any address, and all sent packets will have
Niels Möller84d15952021-09-01 10:50:34 +0200192 // the default source address. Also, it can receive packets sent to the
193 // default address.
194 void TestDefaultSourceAddress(const IPAddress& default_address) {
195 ss_.SetDefaultSourceAddress(default_address);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700196
197 // Create client1 bound to the any address.
Niels Möller84d15952021-09-01 10:50:34 +0200198 Socket* socket = ss_.CreateSocket(default_address.family(), SOCK_DGRAM);
199 socket->Bind(EmptySocketAddressWithFamily(default_address.family()));
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700200 SocketAddress client1_any_addr = socket->GetLocalAddress();
201 EXPECT_TRUE(client1_any_addr.IsAnyIP());
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200202 auto client1 = std::make_unique<TestClient>(
203 std::make_unique<AsyncUDPSocket>(socket), &fake_clock_);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700204
Niels Möller84d15952021-09-01 10:50:34 +0200205 // Create client2 bound to the address route.
206 Socket* socket2 = ss_.CreateSocket(default_address.family(), SOCK_DGRAM);
207 socket2->Bind(SocketAddress(default_address, 0));
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700208 SocketAddress client2_addr = socket2->GetLocalAddress();
209 EXPECT_FALSE(client2_addr.IsAnyIP());
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200210 auto client2 = std::make_unique<TestClient>(
211 std::make_unique<AsyncUDPSocket>(socket2), &fake_clock_);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700212
Niels Möller84d15952021-09-01 10:50:34 +0200213 // Client1 sends to client2, client2 should see the default address as
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700214 // client1's address.
215 SocketAddress client1_addr;
216 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
217 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
218 EXPECT_EQ(client1_addr,
Niels Möller84d15952021-09-01 10:50:34 +0200219 SocketAddress(default_address, client1_any_addr.port()));
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700220
Niels Möller84d15952021-09-01 10:50:34 +0200221 // Client2 can send back to client1's default address.
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700222 EXPECT_EQ(3, client2->SendTo("foo", 3, client1_addr));
223 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
224 }
225
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000226 void BasicTest(const SocketAddress& initial_addr) {
Niels Möllerd0b88792021-08-12 10:32:30 +0200227 Socket* socket = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000228 socket->Bind(initial_addr);
229 SocketAddress server_addr = socket->GetLocalAddress();
230 // Make sure VSS didn't switch families on us.
231 EXPECT_EQ(server_addr.family(), initial_addr.family());
232
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200233 auto client1 = std::make_unique<TestClient>(
234 std::make_unique<AsyncUDPSocket>(socket), &fake_clock_);
Niels Möllerd0b88792021-08-12 10:32:30 +0200235 Socket* socket2 = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200236 auto client2 = std::make_unique<TestClient>(
237 std::make_unique<AsyncUDPSocket>(socket2), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000238
239 SocketAddress client2_addr;
240 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
241 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
242
243 SocketAddress client1_addr;
244 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
245 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
246 EXPECT_EQ(client1_addr, server_addr);
247
248 SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family());
249 for (int i = 0; i < 10; i++) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200250 client2 = std::make_unique<TestClient>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200251 absl::WrapUnique(AsyncUDPSocket::Create(&ss_, empty)), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000252
253 SocketAddress next_client2_addr;
254 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
255 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr));
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000256 CheckPortIncrementalization(next_client2_addr, client2_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000257 // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1);
258
259 SocketAddress server_addr2;
260 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr));
261 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2));
262 EXPECT_EQ(server_addr2, server_addr);
263
264 client2_addr = next_client2_addr;
265 }
266 }
267
268 // initial_addr should be made from either INADDR_ANY or in6addr_any.
269 void ConnectTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700270 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000271 SocketAddress accept_addr;
272 const SocketAddress kEmptyAddr =
273 EmptySocketAddressWithFamily(initial_addr.family());
274
275 // Create client
Niels Möllerd0b88792021-08-12 10:32:30 +0200276 std::unique_ptr<Socket> client =
277 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700278 sink.Monitor(client.get());
Niels Möllerd0b88792021-08-12 10:32:30 +0200279 EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000280 EXPECT_TRUE(client->GetLocalAddress().IsNil());
281
282 // Create server
Niels Möllerd0b88792021-08-12 10:32:30 +0200283 std::unique_ptr<Socket> server =
284 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700285 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000286 EXPECT_NE(0, server->Listen(5)); // Bind required
287 EXPECT_EQ(0, server->Bind(initial_addr));
288 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
289 EXPECT_EQ(0, server->Listen(5));
Niels Möllerd0b88792021-08-12 10:32:30 +0200290 EXPECT_EQ(server->GetState(), Socket::CS_CONNECTING);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000291
292 // No pending server connections
nisse32f25052017-05-08 01:57:18 -0700293 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800294 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000295 EXPECT_EQ(AF_UNSPEC, accept_addr.family());
296
297 // Attempt connect to listening socket
298 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
Yves Gerey665174f2018-06-19 15:03:05 +0200299 EXPECT_NE(client->GetLocalAddress(), kEmptyAddr); // Implicit Bind
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000300 EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family()); // Implicit Bind
301 EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress());
302
303 // Client is connecting
Niels Möllerd0b88792021-08-12 10:32:30 +0200304 EXPECT_EQ(client->GetState(), Socket::CS_CONNECTING);
nisse32f25052017-05-08 01:57:18 -0700305 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
306 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000307
nisse32f25052017-05-08 01:57:18 -0700308 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000309
310 // Client still connecting
Niels Möllerd0b88792021-08-12 10:32:30 +0200311 EXPECT_EQ(client->GetState(), Socket::CS_CONNECTING);
nisse32f25052017-05-08 01:57:18 -0700312 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
313 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000314
315 // Server has pending connection
nisse32f25052017-05-08 01:57:18 -0700316 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
Karl Wiberg918f50c2018-07-05 11:40:33 +0200317 std::unique_ptr<Socket> accepted =
318 absl::WrapUnique(server->Accept(&accept_addr));
deadbeef37f5ecf2017-02-27 14:06:41 -0800319 EXPECT_TRUE(nullptr != accepted);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000320 EXPECT_NE(accept_addr, kEmptyAddr);
321 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr);
322
Niels Möllerd0b88792021-08-12 10:32:30 +0200323 EXPECT_EQ(accepted->GetState(), Socket::CS_CONNECTED);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000324 EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress());
325 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress());
326
nisse32f25052017-05-08 01:57:18 -0700327 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000328
329 // Client has connected
Niels Möllerd0b88792021-08-12 10:32:30 +0200330 EXPECT_EQ(client->GetState(), Socket::CS_CONNECTED);
nisse32f25052017-05-08 01:57:18 -0700331 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
332 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000333 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
334 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
335 }
336
337 void ConnectToNonListenerTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700338 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000339 SocketAddress accept_addr;
340 const SocketAddress nil_addr;
341 const SocketAddress empty_addr =
342 EmptySocketAddressWithFamily(initial_addr.family());
343
344 // Create client
Niels Möllerd0b88792021-08-12 10:32:30 +0200345 std::unique_ptr<Socket> client =
346 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700347 sink.Monitor(client.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000348
349 // Create server
Niels Möllerd0b88792021-08-12 10:32:30 +0200350 std::unique_ptr<Socket> server =
351 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700352 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000353 EXPECT_EQ(0, server->Bind(initial_addr));
354 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
355 // Attempt connect to non-listening socket
356 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
357
nisse32f25052017-05-08 01:57:18 -0700358 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000359
360 // No pending server connections
nisse32f25052017-05-08 01:57:18 -0700361 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800362 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000363 EXPECT_EQ(accept_addr, nil_addr);
364
365 // Connection failed
Niels Möllerd0b88792021-08-12 10:32:30 +0200366 EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
nisse32f25052017-05-08 01:57:18 -0700367 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
368 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000369 EXPECT_EQ(client->GetRemoteAddress(), nil_addr);
370 }
371
372 void CloseDuringConnectTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700373 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000374 SocketAddress accept_addr;
375 const SocketAddress empty_addr =
376 EmptySocketAddressWithFamily(initial_addr.family());
377
378 // Create client and server
Niels Möllerd0b88792021-08-12 10:32:30 +0200379 std::unique_ptr<Socket> client(
380 ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000381 sink.Monitor(client.get());
Niels Möllerd0b88792021-08-12 10:32:30 +0200382 std::unique_ptr<Socket> server(
383 ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000384 sink.Monitor(server.get());
385
386 // Initiate connect
387 EXPECT_EQ(0, server->Bind(initial_addr));
388 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
389
390 EXPECT_EQ(0, server->Listen(5));
391 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
392
393 // Server close before socket enters accept queue
kwibergd0d81482017-04-18 03:18:22 -0700394 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000395 server->Close();
396
nisse32f25052017-05-08 01:57:18 -0700397 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000398
399 // Result: connection failed
Niels Möllerd0b88792021-08-12 10:32:30 +0200400 EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700401 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000402
Niels Möllerd0b88792021-08-12 10:32:30 +0200403 server.reset(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000404 sink.Monitor(server.get());
405
406 // Initiate connect
407 EXPECT_EQ(0, server->Bind(initial_addr));
408 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
409
410 EXPECT_EQ(0, server->Listen(5));
411 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
412
nisse32f25052017-05-08 01:57:18 -0700413 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000414
415 // Server close while socket is in accept queue
kwibergd0d81482017-04-18 03:18:22 -0700416 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000417 server->Close();
418
nisse32f25052017-05-08 01:57:18 -0700419 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000420
421 // Result: connection failed
Niels Möllerd0b88792021-08-12 10:32:30 +0200422 EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700423 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000424
425 // New server
Niels Möllerd0b88792021-08-12 10:32:30 +0200426 server.reset(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000427 sink.Monitor(server.get());
428
429 // Initiate connect
430 EXPECT_EQ(0, server->Bind(initial_addr));
431 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
432
433 EXPECT_EQ(0, server->Listen(5));
434 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
435
nisse32f25052017-05-08 01:57:18 -0700436 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000437
438 // Server accepts connection
kwibergd0d81482017-04-18 03:18:22 -0700439 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
Niels Möllerd0b88792021-08-12 10:32:30 +0200440 std::unique_ptr<Socket> accepted(server->Accept(&accept_addr));
deadbeef37f5ecf2017-02-27 14:06:41 -0800441 ASSERT_TRUE(nullptr != accepted.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000442 sink.Monitor(accepted.get());
443
444 // Client closes before connection complets
Niels Möllerd0b88792021-08-12 10:32:30 +0200445 EXPECT_EQ(accepted->GetState(), Socket::CS_CONNECTED);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000446
447 // Connected message has not been processed yet.
Niels Möllerd0b88792021-08-12 10:32:30 +0200448 EXPECT_EQ(client->GetState(), Socket::CS_CONNECTING);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000449 client->Close();
450
nisse32f25052017-05-08 01:57:18 -0700451 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000452
453 // Result: accepted socket closes
Niels Möllerd0b88792021-08-12 10:32:30 +0200454 EXPECT_EQ(accepted->GetState(), Socket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700455 EXPECT_TRUE(sink.Check(accepted.get(), SSE_CLOSE));
456 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000457 }
458
459 void CloseTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700460 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000461 const SocketAddress kEmptyAddr;
462
463 // Create clients
Niels Möllerd0b88792021-08-12 10:32:30 +0200464 std::unique_ptr<Socket> a =
465 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700466 sink.Monitor(a.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000467 a->Bind(initial_addr);
468 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
469
Niels Möllerd0b88792021-08-12 10:32:30 +0200470 std::unique_ptr<Socket> b =
471 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000472 sink.Monitor(b.get());
473 b->Bind(initial_addr);
474 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
475
476 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
477 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
478
nisse32f25052017-05-08 01:57:18 -0700479 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000480
nisse32f25052017-05-08 01:57:18 -0700481 EXPECT_TRUE(sink.Check(a.get(), SSE_OPEN));
Niels Möllerd0b88792021-08-12 10:32:30 +0200482 EXPECT_EQ(a->GetState(), Socket::CS_CONNECTED);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000483 EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress());
484
kwibergd0d81482017-04-18 03:18:22 -0700485 EXPECT_TRUE(sink.Check(b.get(), SSE_OPEN));
Niels Möllerd0b88792021-08-12 10:32:30 +0200486 EXPECT_EQ(b->GetState(), Socket::CS_CONNECTED);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000487 EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress());
488
489 EXPECT_EQ(1, a->Send("a", 1));
490 b->Close();
491 EXPECT_EQ(1, a->Send("b", 1));
492
nisse32f25052017-05-08 01:57:18 -0700493 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000494
495 char buffer[10];
kwibergd0d81482017-04-18 03:18:22 -0700496 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
Stefan Holmer9131efd2016-05-23 18:19:26 +0200497 EXPECT_EQ(-1, b->Recv(buffer, 10, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000498
nisse32f25052017-05-08 01:57:18 -0700499 EXPECT_TRUE(sink.Check(a.get(), SSE_CLOSE));
Niels Möllerd0b88792021-08-12 10:32:30 +0200500 EXPECT_EQ(a->GetState(), Socket::CS_CLOSED);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000501 EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr);
502
503 // No signal for Closer
kwibergd0d81482017-04-18 03:18:22 -0700504 EXPECT_FALSE(sink.Check(b.get(), SSE_CLOSE));
Niels Möllerd0b88792021-08-12 10:32:30 +0200505 EXPECT_EQ(b->GetState(), Socket::CS_CLOSED);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000506 EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr);
507 }
508
509 void TcpSendTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700510 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000511 const SocketAddress kEmptyAddr;
512
513 // Connect two sockets
Niels Möllerd0b88792021-08-12 10:32:30 +0200514 std::unique_ptr<Socket> a =
515 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700516 sink.Monitor(a.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000517 a->Bind(initial_addr);
518 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
519
Niels Möllerd0b88792021-08-12 10:32:30 +0200520 std::unique_ptr<Socket> b =
521 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700522 sink.Monitor(b.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000523 b->Bind(initial_addr);
524 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
525
526 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
527 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
528
nisse32f25052017-05-08 01:57:18 -0700529 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000530
531 const size_t kBufferSize = 2000;
nisse32f25052017-05-08 01:57:18 -0700532 ss_.set_send_buffer_capacity(kBufferSize);
533 ss_.set_recv_buffer_capacity(kBufferSize);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000534
535 const size_t kDataSize = 5000;
536 char send_buffer[kDataSize], recv_buffer[kDataSize];
537 for (size_t i = 0; i < kDataSize; ++i)
538 send_buffer[i] = static_cast<char>(i % 256);
539 memset(recv_buffer, 0, sizeof(recv_buffer));
540 size_t send_pos = 0, recv_pos = 0;
541
542 // Can't send more than send buffer in one write
543 int result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
544 EXPECT_EQ(static_cast<int>(kBufferSize), result);
545 send_pos += result;
546
nisse32f25052017-05-08 01:57:18 -0700547 ss_.ProcessMessagesUntilIdle();
548 EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE));
549 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000550
551 // Receive buffer is already filled, fill send buffer again
552 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
553 EXPECT_EQ(static_cast<int>(kBufferSize), result);
554 send_pos += result;
555
nisse32f25052017-05-08 01:57:18 -0700556 ss_.ProcessMessagesUntilIdle();
557 EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE));
558 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000559
560 // No more room in send or receive buffer
561 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
562 EXPECT_EQ(-1, result);
563 EXPECT_TRUE(a->IsBlocking());
564
565 // Read a subset of the data
Stefan Holmer9131efd2016-05-23 18:19:26 +0200566 result = b->Recv(recv_buffer + recv_pos, 500, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000567 EXPECT_EQ(500, result);
568 recv_pos += result;
569
nisse32f25052017-05-08 01:57:18 -0700570 ss_.ProcessMessagesUntilIdle();
571 EXPECT_TRUE(sink.Check(a.get(), SSE_WRITE));
572 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000573
574 // Room for more on the sending side
575 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
576 EXPECT_EQ(500, result);
577 send_pos += result;
578
579 // Empty the recv buffer
580 while (true) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200581 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000582 if (result < 0) {
583 EXPECT_EQ(-1, result);
584 EXPECT_TRUE(b->IsBlocking());
585 break;
586 }
587 recv_pos += result;
588 }
589
nisse32f25052017-05-08 01:57:18 -0700590 ss_.ProcessMessagesUntilIdle();
591 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000592
593 // Continue to empty the recv buffer
594 while (true) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200595 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000596 if (result < 0) {
597 EXPECT_EQ(-1, result);
598 EXPECT_TRUE(b->IsBlocking());
599 break;
600 }
601 recv_pos += result;
602 }
603
604 // Send last of the data
605 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
606 EXPECT_EQ(500, result);
607 send_pos += result;
608
nisse32f25052017-05-08 01:57:18 -0700609 ss_.ProcessMessagesUntilIdle();
610 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000611
612 // Receive the last of the data
613 while (true) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200614 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000615 if (result < 0) {
616 EXPECT_EQ(-1, result);
617 EXPECT_TRUE(b->IsBlocking());
618 break;
619 }
620 recv_pos += result;
621 }
622
nisse32f25052017-05-08 01:57:18 -0700623 ss_.ProcessMessagesUntilIdle();
624 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000625
626 // The received data matches the sent data
627 EXPECT_EQ(kDataSize, send_pos);
628 EXPECT_EQ(kDataSize, recv_pos);
629 EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize));
630 }
631
632 void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) {
633 const SocketAddress kEmptyAddr;
634
635 // Connect two sockets
Niels Möllerd0b88792021-08-12 10:32:30 +0200636 std::unique_ptr<Socket> a =
637 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
638 std::unique_ptr<Socket> b =
639 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000640 a->Bind(initial_addr);
641 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
642
643 b->Bind(initial_addr);
644 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
645
646 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
647 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -0700648 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000649
650 // First, deliver all packets in 0 ms.
Yves Gerey665174f2018-06-19 15:03:05 +0200651 char buffer[2] = {0, 0};
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000652 const char cNumPackets = 10;
653 for (char i = 0; i < cNumPackets; ++i) {
654 buffer[0] = '0' + i;
655 EXPECT_EQ(1, a->Send(buffer, 1));
656 }
657
nisse32f25052017-05-08 01:57:18 -0700658 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000659
660 for (char i = 0; i < cNumPackets; ++i) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200661 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000662 EXPECT_EQ(static_cast<char>('0' + i), buffer[0]);
663 }
664
665 // Next, deliver packets at random intervals
Peter Boström0c4e06b2015-10-07 12:23:21 +0200666 const uint32_t mean = 50;
667 const uint32_t stddev = 50;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000668
nisse32f25052017-05-08 01:57:18 -0700669 ss_.set_delay_mean(mean);
670 ss_.set_delay_stddev(stddev);
671 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000672
673 for (char i = 0; i < cNumPackets; ++i) {
674 buffer[0] = 'A' + i;
675 EXPECT_EQ(1, a->Send(buffer, 1));
676 }
677
nisse32f25052017-05-08 01:57:18 -0700678 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000679
680 for (char i = 0; i < cNumPackets; ++i) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200681 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000682 EXPECT_EQ(static_cast<char>('A' + i), buffer[0]);
683 }
684 }
685
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000686 // It is important that initial_addr's port has to be 0 such that the
687 // incremental port behavior could ensure the 2 Binds result in different
688 // address.
689 void BandwidthTest(const SocketAddress& initial_addr) {
Niels Möllerd0b88792021-08-12 10:32:30 +0200690 Socket* send_socket = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
691 Socket* recv_socket = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000692 ASSERT_EQ(0, send_socket->Bind(initial_addr));
693 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
694 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
695 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000696 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
697
Peter Boström0c4e06b2015-10-07 12:23:21 +0200698 uint32_t bandwidth = 64 * 1024;
nisse32f25052017-05-08 01:57:18 -0700699 ss_.set_bandwidth(bandwidth);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000700
701 Thread* pthMain = Thread::Current();
702 Sender sender(pthMain, send_socket, 80 * 1024);
703 Receiver receiver(pthMain, recv_socket, bandwidth);
704
deadbeef22e08142017-06-12 14:30:28 -0700705 // Allow the sender to run for 5 (simulated) seconds, then be stopped for 5
706 // seconds.
707 SIMULATED_WAIT(false, 5000, fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000708 sender.done = true;
deadbeef22e08142017-06-12 14:30:28 -0700709 SIMULATED_WAIT(false, 5000, fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000710
deadbeef22e08142017-06-12 14:30:28 -0700711 // Ensure the observed bandwidth fell within a reasonable margin of error.
712 EXPECT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4);
713 EXPECT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000714
nisse32f25052017-05-08 01:57:18 -0700715 ss_.set_bandwidth(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000716 }
717
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000718 // It is important that initial_addr's port has to be 0 such that the
719 // incremental port behavior could ensure the 2 Binds result in different
720 // address.
721 void DelayTest(const SocketAddress& initial_addr) {
deadbeef37f5ecf2017-02-27 14:06:41 -0800722 time_t seed = ::time(nullptr);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100723 RTC_LOG(LS_VERBOSE) << "seed = " << seed;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000724 srand(static_cast<unsigned int>(seed));
725
Peter Boström0c4e06b2015-10-07 12:23:21 +0200726 const uint32_t mean = 2000;
727 const uint32_t stddev = 500;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000728
nisse32f25052017-05-08 01:57:18 -0700729 ss_.set_delay_mean(mean);
730 ss_.set_delay_stddev(stddev);
731 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000732
Niels Möllerd0b88792021-08-12 10:32:30 +0200733 Socket* send_socket = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
734 Socket* recv_socket = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000735 ASSERT_EQ(0, send_socket->Bind(initial_addr));
736 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
737 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
738 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000739 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
740
741 Thread* pthMain = Thread::Current();
742 // Avg packet size is 2K, so at 200KB/s for 10s, we should see about
743 // 1000 packets, which is necessary to get a good distribution.
744 Sender sender(pthMain, send_socket, 100 * 2 * 1024);
745 Receiver receiver(pthMain, recv_socket, 0);
746
deadbeef22e08142017-06-12 14:30:28 -0700747 // Simulate 10 seconds of packets being sent, then check the observed delay
748 // distribution.
749 SIMULATED_WAIT(false, 10000, fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000750 sender.done = receiver.done = true;
nisse32f25052017-05-08 01:57:18 -0700751 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000752
753 const double sample_mean = receiver.sum / receiver.samples;
754 double num =
755 receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum;
756 double den = receiver.samples * (receiver.samples - 1);
757 const double sample_stddev = sqrt(num / den);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100758 RTC_LOG(LS_VERBOSE) << "mean=" << sample_mean
759 << " stddev=" << sample_stddev;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000760
761 EXPECT_LE(500u, receiver.samples);
762 // We initially used a 0.1 fudge factor, but on the build machine, we
763 // have seen the value differ by as much as 0.13.
764 EXPECT_NEAR(mean, sample_mean, 0.15 * mean);
765 EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev);
766
nisse32f25052017-05-08 01:57:18 -0700767 ss_.set_delay_mean(0);
768 ss_.set_delay_stddev(0);
769 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000770 }
771
772 // Test cross-family communication between a client bound to client_addr and a
773 // server bound to server_addr. shouldSucceed indicates if communication is
774 // expected to work or not.
775 void CrossFamilyConnectionTest(const SocketAddress& client_addr,
776 const SocketAddress& server_addr,
777 bool shouldSucceed) {
kwibergd0d81482017-04-18 03:18:22 -0700778 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000779 SocketAddress accept_address;
780 const SocketAddress kEmptyAddr;
781
782 // Client gets a IPv4 address
Niels Möllerd0b88792021-08-12 10:32:30 +0200783 std::unique_ptr<Socket> client =
784 absl::WrapUnique(ss_.CreateSocket(client_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700785 sink.Monitor(client.get());
Niels Möllerd0b88792021-08-12 10:32:30 +0200786 EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000787 EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr);
788 client->Bind(client_addr);
789
790 // Server gets a non-mapped non-any IPv6 address.
791 // IPv4 sockets should not be able to connect to this.
Niels Möllerd0b88792021-08-12 10:32:30 +0200792 std::unique_ptr<Socket> server =
793 absl::WrapUnique(ss_.CreateSocket(server_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700794 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000795 server->Bind(server_addr);
796 server->Listen(5);
797
798 if (shouldSucceed) {
799 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -0700800 ss_.ProcessMessagesUntilIdle();
801 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
802 std::unique_ptr<Socket> accepted =
Karl Wiberg918f50c2018-07-05 11:40:33 +0200803 absl::WrapUnique(server->Accept(&accept_address));
deadbeef37f5ecf2017-02-27 14:06:41 -0800804 EXPECT_TRUE(nullptr != accepted);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000805 EXPECT_NE(kEmptyAddr, accept_address);
nisse32f25052017-05-08 01:57:18 -0700806 ss_.ProcessMessagesUntilIdle();
807 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000808 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
809 } else {
810 // Check that the connection failed.
811 EXPECT_EQ(-1, client->Connect(server->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -0700812 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000813
nisse32f25052017-05-08 01:57:18 -0700814 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800815 EXPECT_TRUE(nullptr == server->Accept(&accept_address));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000816 EXPECT_EQ(accept_address, kEmptyAddr);
Niels Möllerd0b88792021-08-12 10:32:30 +0200817 EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
nisse32f25052017-05-08 01:57:18 -0700818 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000819 EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr);
820 }
821 }
822
823 // Test cross-family datagram sending between a client bound to client_addr
824 // and a server bound to server_addr. shouldSucceed indicates if sending is
jlmiller@webrtc.orgec499be2015-02-07 22:37:59 +0000825 // expected to succeed or not.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000826 void CrossFamilyDatagramTest(const SocketAddress& client_addr,
827 const SocketAddress& server_addr,
828 bool shouldSucceed) {
Niels Möllerd0b88792021-08-12 10:32:30 +0200829 Socket* socket = ss_.CreateSocket(AF_INET, SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000830 socket->Bind(server_addr);
831 SocketAddress bound_server_addr = socket->GetLocalAddress();
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200832 auto client1 = std::make_unique<TestClient>(
833 std::make_unique<AsyncUDPSocket>(socket), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000834
Niels Möllerd0b88792021-08-12 10:32:30 +0200835 Socket* socket2 = ss_.CreateSocket(AF_INET, SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000836 socket2->Bind(client_addr);
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200837 auto client2 = std::make_unique<TestClient>(
838 std::make_unique<AsyncUDPSocket>(socket2), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000839 SocketAddress client2_addr;
840
841 if (shouldSucceed) {
842 EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr));
843 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
844 SocketAddress client1_addr;
845 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
846 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
847 EXPECT_EQ(client1_addr, bound_server_addr);
848 } else {
849 EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr));
jlmiller@webrtc.orgec499be2015-02-07 22:37:59 +0000850 EXPECT_TRUE(client1->CheckNoPacket());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000851 }
852 }
853
854 protected:
deadbeef22e08142017-06-12 14:30:28 -0700855 rtc::ScopedFakeClock fake_clock_;
nisse32f25052017-05-08 01:57:18 -0700856 VirtualSocketServer ss_;
nisse7eaa4ea2017-05-08 05:25:41 -0700857 AutoSocketServerThread thread_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000858 const SocketAddress kIPv4AnyAddress;
859 const SocketAddress kIPv6AnyAddress;
860};
861
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000862TEST_F(VirtualSocketServerTest, basic_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000863 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000);
864 BasicTest(ipv4_test_addr);
865}
866
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000867TEST_F(VirtualSocketServerTest, basic_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000868 SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 5000);
869 BasicTest(ipv6_test_addr);
870}
871
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700872TEST_F(VirtualSocketServerTest, TestDefaultRoute_v4) {
873 IPAddress ipv4_default_addr(0x01020304);
Niels Möller84d15952021-09-01 10:50:34 +0200874 TestDefaultSourceAddress(ipv4_default_addr);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700875}
876
877TEST_F(VirtualSocketServerTest, TestDefaultRoute_v6) {
878 IPAddress ipv6_default_addr;
879 EXPECT_TRUE(
880 IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ipv6_default_addr));
Niels Möller84d15952021-09-01 10:50:34 +0200881 TestDefaultSourceAddress(ipv6_default_addr);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700882}
883
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000884TEST_F(VirtualSocketServerTest, connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000885 ConnectTest(kIPv4AnyAddress);
886}
887
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000888TEST_F(VirtualSocketServerTest, connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000889 ConnectTest(kIPv6AnyAddress);
890}
891
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000892TEST_F(VirtualSocketServerTest, connect_to_non_listener_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000893 ConnectToNonListenerTest(kIPv4AnyAddress);
894}
895
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000896TEST_F(VirtualSocketServerTest, connect_to_non_listener_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000897 ConnectToNonListenerTest(kIPv6AnyAddress);
898}
899
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000900TEST_F(VirtualSocketServerTest, close_during_connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000901 CloseDuringConnectTest(kIPv4AnyAddress);
902}
903
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000904TEST_F(VirtualSocketServerTest, close_during_connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000905 CloseDuringConnectTest(kIPv6AnyAddress);
906}
907
908TEST_F(VirtualSocketServerTest, close_v4) {
909 CloseTest(kIPv4AnyAddress);
910}
911
912TEST_F(VirtualSocketServerTest, close_v6) {
913 CloseTest(kIPv6AnyAddress);
914}
915
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000916TEST_F(VirtualSocketServerTest, tcp_send_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000917 TcpSendTest(kIPv4AnyAddress);
918}
919
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000920TEST_F(VirtualSocketServerTest, tcp_send_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000921 TcpSendTest(kIPv6AnyAddress);
922}
923
924TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v4) {
925 TcpSendsPacketsInOrderTest(kIPv4AnyAddress);
926}
927
928TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v6) {
929 TcpSendsPacketsInOrderTest(kIPv6AnyAddress);
930}
931
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000932TEST_F(VirtualSocketServerTest, bandwidth_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000933 BandwidthTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000934}
935
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000936TEST_F(VirtualSocketServerTest, bandwidth_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000937 BandwidthTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000938}
939
deadbeef22e08142017-06-12 14:30:28 -0700940TEST_F(VirtualSocketServerTest, delay_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000941 DelayTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000942}
943
deadbeef22e08142017-06-12 14:30:28 -0700944TEST_F(VirtualSocketServerTest, delay_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000945 DelayTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000946}
947
948// Works, receiving socket sees 127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000949TEST_F(VirtualSocketServerTest, CanConnectFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000950 CrossFamilyConnectionTest(SocketAddress("::ffff:127.0.0.2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200951 SocketAddress("0.0.0.0", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000952}
953
954// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000955TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000956 CrossFamilyConnectionTest(SocketAddress("::2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200957 SocketAddress("0.0.0.0", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000958}
959
960// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000961TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000962 CrossFamilyConnectionTest(SocketAddress("::2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200963 SocketAddress("::ffff:127.0.0.1", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000964}
965
966// Works. receiving socket sees ::ffff:127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000967TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000968 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200969 SocketAddress("::", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000970}
971
972// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000973TEST_F(VirtualSocketServerTest, CantConnectFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000974 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200975 SocketAddress("::1", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000976}
977
978// Works. Receiving socket sees ::ffff:127.0.0.1.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000979TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000980 CrossFamilyConnectionTest(SocketAddress("127.0.0.1", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200981 SocketAddress("::ffff:127.0.0.2", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000982}
983
984// Works, receiving socket sees a result from GetNextIP.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000985TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000986 CrossFamilyConnectionTest(SocketAddress("::", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200987 SocketAddress("0.0.0.0", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000988}
989
990// Works, receiving socket sees whatever GetNextIP gave the client.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000991TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000992 CrossFamilyConnectionTest(SocketAddress("0.0.0.0", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200993 SocketAddress("::", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000994}
995
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000996TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000997 CrossFamilyDatagramTest(SocketAddress("0.0.0.0", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200998 SocketAddress("::", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000999}
1000
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001001TEST_F(VirtualSocketServerTest, CanSendDatagramFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001002 CrossFamilyDatagramTest(SocketAddress("::ffff:127.0.0.1", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001003 SocketAddress("0.0.0.0", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001004}
1005
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001006TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001007 CrossFamilyDatagramTest(SocketAddress("::2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001008 SocketAddress("0.0.0.0", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001009}
1010
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001011TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001012 CrossFamilyDatagramTest(SocketAddress("::2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001013 SocketAddress("::ffff:127.0.0.1", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001014}
1015
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001016TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001017 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001018 SocketAddress("::", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001019}
1020
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001021TEST_F(VirtualSocketServerTest, CantSendDatagramFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001022 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001023 SocketAddress("::1", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001024}
1025
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001026TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001027 CrossFamilyDatagramTest(SocketAddress("127.0.0.1", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001028 SocketAddress("::ffff:127.0.0.2", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001029}
1030
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001031TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001032 CrossFamilyDatagramTest(SocketAddress("::", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001033 SocketAddress("0.0.0.0", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001034}
1035
Taylor Brandstettere7536412016-09-09 13:16:15 -07001036TEST_F(VirtualSocketServerTest, SetSendingBlockedWithUdpSocket) {
Niels Möllerd0b88792021-08-12 10:32:30 +02001037 Socket* socket1 = ss_.CreateSocket(kIPv4AnyAddress.family(), SOCK_DGRAM);
1038 std::unique_ptr<Socket> socket2 =
1039 absl::WrapUnique(ss_.CreateSocket(kIPv4AnyAddress.family(), SOCK_DGRAM));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001040 socket1->Bind(kIPv4AnyAddress);
1041 socket2->Bind(kIPv4AnyAddress);
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001042 auto client1 = std::make_unique<TestClient>(
1043 std::make_unique<AsyncUDPSocket>(socket1), &fake_clock_);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001044
nisse32f25052017-05-08 01:57:18 -07001045 ss_.SetSendingBlocked(true);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001046 EXPECT_EQ(-1, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1047 EXPECT_TRUE(socket1->IsBlocking());
1048 EXPECT_EQ(0, client1->ready_to_send_count());
1049
nisse32f25052017-05-08 01:57:18 -07001050 ss_.SetSendingBlocked(false);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001051 EXPECT_EQ(1, client1->ready_to_send_count());
1052 EXPECT_EQ(3, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1053}
1054
1055TEST_F(VirtualSocketServerTest, SetSendingBlockedWithTcpSocket) {
1056 constexpr size_t kBufferSize = 1024;
nisse32f25052017-05-08 01:57:18 -07001057 ss_.set_send_buffer_capacity(kBufferSize);
1058 ss_.set_recv_buffer_capacity(kBufferSize);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001059
kwibergd0d81482017-04-18 03:18:22 -07001060 StreamSink sink;
Niels Möllerd0b88792021-08-12 10:32:30 +02001061 std::unique_ptr<Socket> socket1 =
1062 absl::WrapUnique(ss_.CreateSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
1063 std::unique_ptr<Socket> socket2 =
1064 absl::WrapUnique(ss_.CreateSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -07001065 sink.Monitor(socket1.get());
1066 sink.Monitor(socket2.get());
Taylor Brandstettere7536412016-09-09 13:16:15 -07001067 socket1->Bind(kIPv4AnyAddress);
1068 socket2->Bind(kIPv4AnyAddress);
1069
1070 // Connect sockets.
1071 EXPECT_EQ(0, socket1->Connect(socket2->GetLocalAddress()));
1072 EXPECT_EQ(0, socket2->Connect(socket1->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -07001073 ss_.ProcessMessagesUntilIdle();
Taylor Brandstettere7536412016-09-09 13:16:15 -07001074
1075 char data[kBufferSize] = {};
1076
1077 // First Send call will fill the send buffer but not send anything.
nisse32f25052017-05-08 01:57:18 -07001078 ss_.SetSendingBlocked(true);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001079 EXPECT_EQ(static_cast<int>(kBufferSize), socket1->Send(data, kBufferSize));
nisse32f25052017-05-08 01:57:18 -07001080 ss_.ProcessMessagesUntilIdle();
1081 EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
1082 EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001083 EXPECT_FALSE(socket1->IsBlocking());
1084
1085 // Since the send buffer is full, next Send will result in EWOULDBLOCK.
1086 EXPECT_EQ(-1, socket1->Send(data, kBufferSize));
nisse32f25052017-05-08 01:57:18 -07001087 EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
1088 EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001089 EXPECT_TRUE(socket1->IsBlocking());
1090
1091 // When sending is unblocked, the buffered data should be sent and
1092 // SignalWriteEvent should fire.
nisse32f25052017-05-08 01:57:18 -07001093 ss_.SetSendingBlocked(false);
1094 ss_.ProcessMessagesUntilIdle();
1095 EXPECT_TRUE(sink.Check(socket1.get(), SSE_WRITE));
1096 EXPECT_TRUE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001097}
1098
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001099TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02001100 const uint32_t kTestMean[] = {10, 100, 333, 1000};
Yves Gerey665174f2018-06-19 15:03:05 +02001101 const double kTestDev[] = {0.25, 0.1, 0.01};
Taylor Brandstettere7536412016-09-09 13:16:15 -07001102 // TODO(deadbeef): The current code only works for 1000 data points or more.
Peter Boström0c4e06b2015-10-07 12:23:21 +02001103 const uint32_t kTestSamples[] = {/*10, 100,*/ 1000};
tfarina5237aaf2015-11-10 23:44:30 -08001104 for (size_t midx = 0; midx < arraysize(kTestMean); ++midx) {
1105 for (size_t didx = 0; didx < arraysize(kTestDev); ++didx) {
1106 for (size_t sidx = 0; sidx < arraysize(kTestSamples); ++sidx) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001107 ASSERT_LT(0u, kTestSamples[sidx]);
Peter Boström0c4e06b2015-10-07 12:23:21 +02001108 const uint32_t kStdDev =
1109 static_cast<uint32_t>(kTestDev[didx] * kTestMean[midx]);
Niels Möller983627c2021-02-09 15:12:28 +01001110 std::unique_ptr<VirtualSocketServer::Function> f =
Yves Gerey665174f2018-06-19 15:03:05 +02001111 VirtualSocketServer::CreateDistribution(kTestMean[midx], kStdDev,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001112 kTestSamples[sidx]);
Niels Möller983627c2021-02-09 15:12:28 +01001113 ASSERT_TRUE(nullptr != f.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001114 ASSERT_EQ(kTestSamples[sidx], f->size());
1115 double sum = 0;
Peter Boström0c4e06b2015-10-07 12:23:21 +02001116 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001117 sum += (*f)[i].second;
1118 }
1119 const double mean = sum / f->size();
1120 double sum_sq_dev = 0;
Peter Boström0c4e06b2015-10-07 12:23:21 +02001121 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001122 double dev = (*f)[i].second - mean;
1123 sum_sq_dev += dev * dev;
1124 }
1125 const double stddev = sqrt(sum_sq_dev / f->size());
1126 EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx])
Yves Gerey665174f2018-06-19 15:03:05 +02001127 << "M=" << kTestMean[midx] << " SD=" << kStdDev
1128 << " N=" << kTestSamples[sidx];
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001129 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev)
Yves Gerey665174f2018-06-19 15:03:05 +02001130 << "M=" << kTestMean[midx] << " SD=" << kStdDev
1131 << " N=" << kTestSamples[sidx];
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001132 }
1133 }
1134 }
1135}
Mirko Bonadeie10b1632018-12-11 18:43:40 +01001136
1137} // namespace
1138} // namespace rtc