blob: 13e267e1cf187b988c739d4320cc314ad4e76609 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:261/*
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 15:47:4912#include <stdint.h>
13#include <stdlib.h>
14#include <string.h>
henrike@webrtc.orgf0488722014-05-13 18:00:2615#include <time.h>
Per Kc202f962023-12-14 12:09:0216
Yves Gerey3e707812018-11-28 15:47:4917#include <algorithm>
jbauch555604a2016-04-26 10:13:2218#include <memory>
19
Karl Wiberg918f50c2018-07-05 09:40:3320#include "absl/memory/memory.h"
Danil Chapovalovf1361652022-09-02 13:40:2621#include "api/units/time_delta.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3122#include "rtc_base/arraysize.h"
Steve Anton10542f22019-01-11 17:11:0023#include "rtc_base/async_packet_socket.h"
Steve Anton10542f22019-01-11 17:11:0024#include "rtc_base/async_udp_socket.h"
25#include "rtc_base/fake_clock.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3126#include "rtc_base/gunit.h"
Steve Anton10542f22019-01-11 17:11:0027#include "rtc_base/ip_address.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3128#include "rtc_base/logging.h"
Jeremy Leconte1bd331f2024-09-11 02:48:4129#include "rtc_base/net_helpers.h"
30#include "rtc_base/network/received_packet.h"
Yves Gerey3e707812018-11-28 15:47:4931#include "rtc_base/socket.h"
Steve Anton10542f22019-01-11 17:11:0032#include "rtc_base/socket_address.h"
Danil Chapovalovf1361652022-09-02 13:40:2633#include "rtc_base/task_utils/repeating_task.h"
Steve Anton10542f22019-01-11 17:11:0034#include "rtc_base/test_client.h"
35#include "rtc_base/test_utils.h"
Yves Gerey3e707812018-11-28 15:47:4936#include "rtc_base/third_party/sigslot/sigslot.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3137#include "rtc_base/thread.h"
Steve Anton10542f22019-01-11 17:11:0038#include "rtc_base/time_utils.h"
39#include "rtc_base/virtual_socket_server.h"
Yves Gerey3e707812018-11-28 15:47:4940#include "test/gtest.h"
henrike@webrtc.orgf0488722014-05-13 18:00:2641
Mirko Bonadeie10b1632018-12-11 17:43:4042namespace rtc {
43namespace {
henrike@webrtc.orgf0488722014-05-13 18:00:2644
Danil Chapovalovf1361652022-09-02 13:40:2645using ::webrtc::RepeatingTaskHandle;
46using ::webrtc::TimeDelta;
47using ::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;
kwibergd0d81482017-04-18 10:18:2253
henrike@webrtc.orgf0488722014-05-13 18:00:2654// Sends at a constant rate but with random packet sizes.
Danil Chapovalovf1361652022-09-02 13:40:2655struct Sender {
Niels Möllerd0b88792021-08-12 08:32:3056 Sender(Thread* th, Socket* s, uint32_t rt)
Peter Boström0c4e06b2015-10-07 10:23:2157 : thread(th),
Mirko Bonadei317a1f02019-09-17 15:06:1858 socket(std::make_unique<AsyncUDPSocket>(s)),
Peter Boström0c4e06b2015-10-07 10:23:2159 rate(rt),
60 count(0) {
Honghai Zhang82d78622016-05-06 18:29:1561 last_send = rtc::TimeMillis();
Danil Chapovalovf1361652022-09-02 13:40:2662
63 periodic = RepeatingTaskHandle::DelayedStart(thread, NextDelay(), [this] {
64 int64_t cur_time = rtc::TimeMillis();
65 int64_t delay = cur_time - last_send;
66 uint32_t size =
67 std::clamp<uint32_t>(rate * delay / 1000, sizeof(uint32_t), 4096);
68 count += size;
69 memcpy(dummy, &cur_time, sizeof(cur_time));
70 socket->Send(dummy, size, options);
71
72 last_send = cur_time;
73 return NextDelay();
74 });
henrike@webrtc.orgf0488722014-05-13 18:00:2675 }
76
Danil Chapovalovf1361652022-09-02 13:40:2677 TimeDelta NextDelay() {
78 int size = (rand() % 4096) + 1;
79 return TimeDelta::Seconds(1) * size / rate;
henrike@webrtc.orgf0488722014-05-13 18:00:2680 }
81
82 Thread* thread;
jbauch555604a2016-04-26 10:13:2283 std::unique_ptr<AsyncUDPSocket> socket;
henrike@webrtc.orgf0488722014-05-13 18:00:2684 rtc::PacketOptions options;
Danil Chapovalovf1361652022-09-02 13:40:2685 RepeatingTaskHandle periodic;
Peter Boström0c4e06b2015-10-07 10:23:2186 uint32_t rate; // bytes per second
87 uint32_t count;
Honghai Zhang82d78622016-05-06 18:29:1588 int64_t last_send;
henrike@webrtc.orgf0488722014-05-13 18:00:2689 char dummy[4096];
90};
91
Danil Chapovalovf1361652022-09-02 13:40:2692struct Receiver : public sigslot::has_slots<> {
Niels Möllerd0b88792021-08-12 08:32:3093 Receiver(Thread* th, Socket* s, uint32_t bw)
Peter Boström0c4e06b2015-10-07 10:23:2194 : thread(th),
Mirko Bonadei317a1f02019-09-17 15:06:1895 socket(std::make_unique<AsyncUDPSocket>(s)),
Peter Boström0c4e06b2015-10-07 10:23:2196 bandwidth(bw),
Peter Boström0c4e06b2015-10-07 10:23:2197 count(0),
98 sec_count(0),
99 sum(0),
100 sum_sq(0),
101 samples(0) {
Per Kc202f962023-12-14 12:09:02102 socket->RegisterReceivedPacketCallback(
103 [&](rtc::AsyncPacketSocket* socket, const rtc::ReceivedPacket& packet) {
104 OnReadPacket(socket, packet);
105 });
Danil Chapovalovf1361652022-09-02 13:40:26106 periodic = RepeatingTaskHandle::DelayedStart(
107 thread, TimeDelta::Seconds(1), [this] {
108 // It is always possible for us to receive more than expected because
109 // packets can be further delayed in delivery.
110 if (bandwidth > 0) {
111 EXPECT_LE(sec_count, 5 * bandwidth / 4);
112 }
113 sec_count = 0;
114 return TimeDelta::Seconds(1);
115 });
henrike@webrtc.orgf0488722014-05-13 18:00:26116 }
117
Danil Chapovalovf1361652022-09-02 13:40:26118 ~Receiver() override { periodic.Stop(); }
henrike@webrtc.orgf0488722014-05-13 18:00:26119
Per Kc202f962023-12-14 12:09:02120 void OnReadPacket(AsyncPacketSocket* s, const rtc::ReceivedPacket& packet) {
henrike@webrtc.orgf0488722014-05-13 18:00:26121 ASSERT_EQ(socket.get(), s);
Per Kc202f962023-12-14 12:09:02122 ASSERT_GE(packet.payload().size(), 4U);
henrike@webrtc.orgf0488722014-05-13 18:00:26123
Per Kc202f962023-12-14 12:09:02124 count += packet.payload().size();
125 sec_count += packet.payload().size();
henrike@webrtc.orgf0488722014-05-13 18:00:26126
Per Kc202f962023-12-14 12:09:02127 uint32_t send_time =
128 *reinterpret_cast<const uint32_t*>(packet.payload().data());
Honghai Zhang82d78622016-05-06 18:29:15129 uint32_t recv_time = rtc::TimeMillis();
Peter Boström0c4e06b2015-10-07 10:23:21130 uint32_t delay = recv_time - send_time;
henrike@webrtc.orgf0488722014-05-13 18:00:26131 sum += delay;
132 sum_sq += delay * delay;
133 samples += 1;
134 }
135
henrike@webrtc.orgf0488722014-05-13 18:00:26136 Thread* thread;
jbauch555604a2016-04-26 10:13:22137 std::unique_ptr<AsyncUDPSocket> socket;
Peter Boström0c4e06b2015-10-07 10:23:21138 uint32_t bandwidth;
Danil Chapovalovf1361652022-09-02 13:40:26139 RepeatingTaskHandle periodic;
henrike@webrtc.orgf0488722014-05-13 18:00:26140 size_t count;
141 size_t sec_count;
142 double sum;
143 double sum_sq;
Peter Boström0c4e06b2015-10-07 10:23:21144 uint32_t samples;
henrike@webrtc.orgf0488722014-05-13 18:00:26145};
146
deadbeef22e08142017-06-12 21:30:28147// Note: This test uses a fake clock in addition to a virtual network.
Mirko Bonadei6a489f22019-04-09 13:11:12148class VirtualSocketServerTest : public ::testing::Test {
henrike@webrtc.orgf0488722014-05-13 18:00:26149 public:
deadbeef37f5ecf2017-02-27 22:06:41150 VirtualSocketServerTest()
deadbeef22e08142017-06-12 21:30:28151 : ss_(&fake_clock_),
152 thread_(&ss_),
deadbeef37f5ecf2017-02-27 22:06:41153 kIPv4AnyAddress(IPAddress(INADDR_ANY), 0),
154 kIPv6AnyAddress(IPAddress(in6addr_any), 0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26155
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41156 void CheckPortIncrementalization(const SocketAddress& post,
157 const SocketAddress& pre) {
henrike@webrtc.orgf0488722014-05-13 18:00:26158 EXPECT_EQ(post.port(), pre.port() + 1);
159 IPAddress post_ip = post.ipaddr();
160 IPAddress pre_ip = pre.ipaddr();
161 EXPECT_EQ(pre_ip.family(), post_ip.family());
162 if (post_ip.family() == AF_INET) {
163 in_addr pre_ipv4 = pre_ip.ipv4_address();
164 in_addr post_ipv4 = post_ip.ipv4_address();
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41165 EXPECT_EQ(post_ipv4.s_addr, pre_ipv4.s_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26166 } else if (post_ip.family() == AF_INET6) {
167 in6_addr post_ip6 = post_ip.ipv6_address();
168 in6_addr pre_ip6 = pre_ip.ipv6_address();
Peter Boström0c4e06b2015-10-07 10:23:21169 uint32_t* post_as_ints = reinterpret_cast<uint32_t*>(&post_ip6.s6_addr);
170 uint32_t* pre_as_ints = reinterpret_cast<uint32_t*>(&pre_ip6.s6_addr);
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41171 EXPECT_EQ(post_as_ints[3], pre_as_ints[3]);
henrike@webrtc.orgf0488722014-05-13 18:00:26172 }
173 }
174
Guo-wei Shieh38f88932015-08-14 05:24:02175 // Test a client can bind to the any address, and all sent packets will have
Niels Möller84d15952021-09-01 08:50:34176 // the default source address. Also, it can receive packets sent to the
177 // default address.
178 void TestDefaultSourceAddress(const IPAddress& default_address) {
179 ss_.SetDefaultSourceAddress(default_address);
Guo-wei Shieh38f88932015-08-14 05:24:02180
181 // Create client1 bound to the any address.
Niels Möller84d15952021-09-01 08:50:34182 Socket* socket = ss_.CreateSocket(default_address.family(), SOCK_DGRAM);
183 socket->Bind(EmptySocketAddressWithFamily(default_address.family()));
Guo-wei Shieh38f88932015-08-14 05:24:02184 SocketAddress client1_any_addr = socket->GetLocalAddress();
185 EXPECT_TRUE(client1_any_addr.IsAnyIP());
Mirko Bonadei317a1f02019-09-17 15:06:18186 auto client1 = std::make_unique<TestClient>(
187 std::make_unique<AsyncUDPSocket>(socket), &fake_clock_);
Guo-wei Shieh38f88932015-08-14 05:24:02188
Niels Möller84d15952021-09-01 08:50:34189 // Create client2 bound to the address route.
190 Socket* socket2 = ss_.CreateSocket(default_address.family(), SOCK_DGRAM);
191 socket2->Bind(SocketAddress(default_address, 0));
Guo-wei Shieh38f88932015-08-14 05:24:02192 SocketAddress client2_addr = socket2->GetLocalAddress();
193 EXPECT_FALSE(client2_addr.IsAnyIP());
Mirko Bonadei317a1f02019-09-17 15:06:18194 auto client2 = std::make_unique<TestClient>(
195 std::make_unique<AsyncUDPSocket>(socket2), &fake_clock_);
Guo-wei Shieh38f88932015-08-14 05:24:02196
Niels Möller84d15952021-09-01 08:50:34197 // Client1 sends to client2, client2 should see the default address as
Guo-wei Shieh38f88932015-08-14 05:24:02198 // client1's address.
199 SocketAddress client1_addr;
200 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
201 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
202 EXPECT_EQ(client1_addr,
Niels Möller84d15952021-09-01 08:50:34203 SocketAddress(default_address, client1_any_addr.port()));
Guo-wei Shieh38f88932015-08-14 05:24:02204
Niels Möller84d15952021-09-01 08:50:34205 // Client2 can send back to client1's default address.
Guo-wei Shieh38f88932015-08-14 05:24:02206 EXPECT_EQ(3, client2->SendTo("foo", 3, client1_addr));
207 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
208 }
209
henrike@webrtc.orgf0488722014-05-13 18:00:26210 void BasicTest(const SocketAddress& initial_addr) {
Niels Möllerd0b88792021-08-12 08:32:30211 Socket* socket = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26212 socket->Bind(initial_addr);
213 SocketAddress server_addr = socket->GetLocalAddress();
214 // Make sure VSS didn't switch families on us.
215 EXPECT_EQ(server_addr.family(), initial_addr.family());
216
Mirko Bonadei317a1f02019-09-17 15:06:18217 auto client1 = std::make_unique<TestClient>(
218 std::make_unique<AsyncUDPSocket>(socket), &fake_clock_);
Niels Möllerd0b88792021-08-12 08:32:30219 Socket* socket2 = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
Mirko Bonadei317a1f02019-09-17 15:06:18220 auto client2 = std::make_unique<TestClient>(
221 std::make_unique<AsyncUDPSocket>(socket2), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26222
223 SocketAddress client2_addr;
224 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
225 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
226
227 SocketAddress client1_addr;
228 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
229 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
230 EXPECT_EQ(client1_addr, server_addr);
231
232 SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family());
233 for (int i = 0; i < 10; i++) {
Mirko Bonadei317a1f02019-09-17 15:06:18234 client2 = std::make_unique<TestClient>(
Karl Wiberg918f50c2018-07-05 09:40:33235 absl::WrapUnique(AsyncUDPSocket::Create(&ss_, empty)), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26236
237 SocketAddress next_client2_addr;
238 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
239 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr));
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41240 CheckPortIncrementalization(next_client2_addr, client2_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26241 // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1);
242
243 SocketAddress server_addr2;
244 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr));
245 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2));
246 EXPECT_EQ(server_addr2, server_addr);
247
248 client2_addr = next_client2_addr;
249 }
250 }
251
252 // initial_addr should be made from either INADDR_ANY or in6addr_any.
253 void ConnectTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 10:18:22254 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26255 SocketAddress accept_addr;
256 const SocketAddress kEmptyAddr =
257 EmptySocketAddressWithFamily(initial_addr.family());
258
259 // Create client
Niels Möllerd0b88792021-08-12 08:32:30260 std::unique_ptr<Socket> client =
261 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 08:57:18262 sink.Monitor(client.get());
Niels Möllerd0b88792021-08-12 08:32:30263 EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
henrike@webrtc.orgf0488722014-05-13 18:00:26264 EXPECT_TRUE(client->GetLocalAddress().IsNil());
265
266 // Create server
Niels Möllerd0b88792021-08-12 08:32:30267 std::unique_ptr<Socket> server =
268 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 08:57:18269 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26270 EXPECT_NE(0, server->Listen(5)); // Bind required
271 EXPECT_EQ(0, server->Bind(initial_addr));
272 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
273 EXPECT_EQ(0, server->Listen(5));
Niels Möllerd0b88792021-08-12 08:32:30274 EXPECT_EQ(server->GetState(), Socket::CS_CONNECTING);
henrike@webrtc.orgf0488722014-05-13 18:00:26275
276 // No pending server connections
nisse32f25052017-05-08 08:57:18277 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 22:06:41278 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
henrike@webrtc.orgf0488722014-05-13 18:00:26279 EXPECT_EQ(AF_UNSPEC, accept_addr.family());
280
281 // Attempt connect to listening socket
282 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
Yves Gerey665174f2018-06-19 13:03:05283 EXPECT_NE(client->GetLocalAddress(), kEmptyAddr); // Implicit Bind
henrike@webrtc.orgf0488722014-05-13 18:00:26284 EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family()); // Implicit Bind
285 EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress());
286
287 // Client is connecting
Niels Möllerd0b88792021-08-12 08:32:30288 EXPECT_EQ(client->GetState(), Socket::CS_CONNECTING);
nisse32f25052017-05-08 08:57:18289 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
290 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26291
nisse32f25052017-05-08 08:57:18292 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26293
294 // Client still connecting
Niels Möllerd0b88792021-08-12 08:32:30295 EXPECT_EQ(client->GetState(), Socket::CS_CONNECTING);
nisse32f25052017-05-08 08:57:18296 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
297 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26298
299 // Server has pending connection
nisse32f25052017-05-08 08:57:18300 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
Karl Wiberg918f50c2018-07-05 09:40:33301 std::unique_ptr<Socket> accepted =
302 absl::WrapUnique(server->Accept(&accept_addr));
deadbeef37f5ecf2017-02-27 22:06:41303 EXPECT_TRUE(nullptr != accepted);
henrike@webrtc.orgf0488722014-05-13 18:00:26304 EXPECT_NE(accept_addr, kEmptyAddr);
305 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr);
306
Niels Möllerd0b88792021-08-12 08:32:30307 EXPECT_EQ(accepted->GetState(), Socket::CS_CONNECTED);
henrike@webrtc.orgf0488722014-05-13 18:00:26308 EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress());
309 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress());
310
nisse32f25052017-05-08 08:57:18311 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26312
313 // Client has connected
Niels Möllerd0b88792021-08-12 08:32:30314 EXPECT_EQ(client->GetState(), Socket::CS_CONNECTED);
nisse32f25052017-05-08 08:57:18315 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
316 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26317 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
318 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
319 }
320
321 void ConnectToNonListenerTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 10:18:22322 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26323 SocketAddress accept_addr;
324 const SocketAddress nil_addr;
325 const SocketAddress empty_addr =
326 EmptySocketAddressWithFamily(initial_addr.family());
327
328 // Create client
Niels Möllerd0b88792021-08-12 08:32:30329 std::unique_ptr<Socket> client =
330 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 08:57:18331 sink.Monitor(client.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26332
333 // Create server
Niels Möllerd0b88792021-08-12 08:32:30334 std::unique_ptr<Socket> server =
335 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 08:57:18336 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26337 EXPECT_EQ(0, server->Bind(initial_addr));
338 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
339 // Attempt connect to non-listening socket
340 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
341
nisse32f25052017-05-08 08:57:18342 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26343
344 // No pending server connections
nisse32f25052017-05-08 08:57:18345 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 22:06:41346 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
henrike@webrtc.orgf0488722014-05-13 18:00:26347 EXPECT_EQ(accept_addr, nil_addr);
348
349 // Connection failed
Niels Möllerd0b88792021-08-12 08:32:30350 EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
nisse32f25052017-05-08 08:57:18351 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
352 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26353 EXPECT_EQ(client->GetRemoteAddress(), nil_addr);
354 }
355
356 void CloseDuringConnectTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 10:18:22357 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26358 SocketAddress accept_addr;
359 const SocketAddress empty_addr =
360 EmptySocketAddressWithFamily(initial_addr.family());
361
362 // Create client and server
Niels Möllerd0b88792021-08-12 08:32:30363 std::unique_ptr<Socket> client(
364 ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26365 sink.Monitor(client.get());
Niels Möllerd0b88792021-08-12 08:32:30366 std::unique_ptr<Socket> server(
367 ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26368 sink.Monitor(server.get());
369
370 // Initiate connect
371 EXPECT_EQ(0, server->Bind(initial_addr));
372 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
373
374 EXPECT_EQ(0, server->Listen(5));
375 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
376
377 // Server close before socket enters accept queue
kwibergd0d81482017-04-18 10:18:22378 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26379 server->Close();
380
nisse32f25052017-05-08 08:57:18381 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26382
383 // Result: connection failed
Niels Möllerd0b88792021-08-12 08:32:30384 EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
kwibergd0d81482017-04-18 10:18:22385 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26386
Niels Möllerd0b88792021-08-12 08:32:30387 server.reset(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26388 sink.Monitor(server.get());
389
390 // Initiate connect
391 EXPECT_EQ(0, server->Bind(initial_addr));
392 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
393
394 EXPECT_EQ(0, server->Listen(5));
395 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
396
nisse32f25052017-05-08 08:57:18397 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26398
399 // Server close while socket is in accept queue
kwibergd0d81482017-04-18 10:18:22400 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26401 server->Close();
402
nisse32f25052017-05-08 08:57:18403 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26404
405 // Result: connection failed
Niels Möllerd0b88792021-08-12 08:32:30406 EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
kwibergd0d81482017-04-18 10:18:22407 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26408
409 // New server
Niels Möllerd0b88792021-08-12 08:32:30410 server.reset(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26411 sink.Monitor(server.get());
412
413 // Initiate connect
414 EXPECT_EQ(0, server->Bind(initial_addr));
415 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
416
417 EXPECT_EQ(0, server->Listen(5));
418 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
419
nisse32f25052017-05-08 08:57:18420 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26421
422 // Server accepts connection
kwibergd0d81482017-04-18 10:18:22423 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
Niels Möllerd0b88792021-08-12 08:32:30424 std::unique_ptr<Socket> accepted(server->Accept(&accept_addr));
deadbeef37f5ecf2017-02-27 22:06:41425 ASSERT_TRUE(nullptr != accepted.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26426 sink.Monitor(accepted.get());
427
428 // Client closes before connection complets
Niels Möllerd0b88792021-08-12 08:32:30429 EXPECT_EQ(accepted->GetState(), Socket::CS_CONNECTED);
henrike@webrtc.orgf0488722014-05-13 18:00:26430
431 // Connected message has not been processed yet.
Niels Möllerd0b88792021-08-12 08:32:30432 EXPECT_EQ(client->GetState(), Socket::CS_CONNECTING);
henrike@webrtc.orgf0488722014-05-13 18:00:26433 client->Close();
434
nisse32f25052017-05-08 08:57:18435 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26436
437 // Result: accepted socket closes
Niels Möllerd0b88792021-08-12 08:32:30438 EXPECT_EQ(accepted->GetState(), Socket::CS_CLOSED);
kwibergd0d81482017-04-18 10:18:22439 EXPECT_TRUE(sink.Check(accepted.get(), SSE_CLOSE));
440 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26441 }
442
443 void CloseTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 10:18:22444 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26445 const SocketAddress kEmptyAddr;
446
447 // Create clients
Niels Möllerd0b88792021-08-12 08:32:30448 std::unique_ptr<Socket> a =
449 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 08:57:18450 sink.Monitor(a.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26451 a->Bind(initial_addr);
452 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
453
Niels Möllerd0b88792021-08-12 08:32:30454 std::unique_ptr<Socket> b =
455 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26456 sink.Monitor(b.get());
457 b->Bind(initial_addr);
458 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
459
460 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
461 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
462
nisse32f25052017-05-08 08:57:18463 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26464
nisse32f25052017-05-08 08:57:18465 EXPECT_TRUE(sink.Check(a.get(), SSE_OPEN));
Niels Möllerd0b88792021-08-12 08:32:30466 EXPECT_EQ(a->GetState(), Socket::CS_CONNECTED);
henrike@webrtc.orgf0488722014-05-13 18:00:26467 EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress());
468
kwibergd0d81482017-04-18 10:18:22469 EXPECT_TRUE(sink.Check(b.get(), SSE_OPEN));
Niels Möllerd0b88792021-08-12 08:32:30470 EXPECT_EQ(b->GetState(), Socket::CS_CONNECTED);
henrike@webrtc.orgf0488722014-05-13 18:00:26471 EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress());
472
473 EXPECT_EQ(1, a->Send("a", 1));
474 b->Close();
475 EXPECT_EQ(1, a->Send("b", 1));
476
nisse32f25052017-05-08 08:57:18477 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26478
479 char buffer[10];
kwibergd0d81482017-04-18 10:18:22480 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
Stefan Holmer9131efd2016-05-23 16:19:26481 EXPECT_EQ(-1, b->Recv(buffer, 10, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26482
nisse32f25052017-05-08 08:57:18483 EXPECT_TRUE(sink.Check(a.get(), SSE_CLOSE));
Niels Möllerd0b88792021-08-12 08:32:30484 EXPECT_EQ(a->GetState(), Socket::CS_CLOSED);
henrike@webrtc.orgf0488722014-05-13 18:00:26485 EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr);
486
487 // No signal for Closer
kwibergd0d81482017-04-18 10:18:22488 EXPECT_FALSE(sink.Check(b.get(), SSE_CLOSE));
Niels Möllerd0b88792021-08-12 08:32:30489 EXPECT_EQ(b->GetState(), Socket::CS_CLOSED);
henrike@webrtc.orgf0488722014-05-13 18:00:26490 EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr);
491 }
492
493 void TcpSendTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 10:18:22494 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26495 const SocketAddress kEmptyAddr;
496
497 // Connect two sockets
Niels Möllerd0b88792021-08-12 08:32:30498 std::unique_ptr<Socket> a =
499 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 08:57:18500 sink.Monitor(a.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26501 a->Bind(initial_addr);
502 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
503
Niels Möllerd0b88792021-08-12 08:32:30504 std::unique_ptr<Socket> b =
505 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 08:57:18506 sink.Monitor(b.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26507 b->Bind(initial_addr);
508 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
509
510 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
511 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
512
nisse32f25052017-05-08 08:57:18513 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26514
515 const size_t kBufferSize = 2000;
nisse32f25052017-05-08 08:57:18516 ss_.set_send_buffer_capacity(kBufferSize);
517 ss_.set_recv_buffer_capacity(kBufferSize);
henrike@webrtc.orgf0488722014-05-13 18:00:26518
519 const size_t kDataSize = 5000;
520 char send_buffer[kDataSize], recv_buffer[kDataSize];
521 for (size_t i = 0; i < kDataSize; ++i)
522 send_buffer[i] = static_cast<char>(i % 256);
523 memset(recv_buffer, 0, sizeof(recv_buffer));
524 size_t send_pos = 0, recv_pos = 0;
525
526 // Can't send more than send buffer in one write
527 int result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
528 EXPECT_EQ(static_cast<int>(kBufferSize), result);
529 send_pos += result;
530
nisse32f25052017-05-08 08:57:18531 ss_.ProcessMessagesUntilIdle();
532 EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE));
533 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26534
535 // Receive buffer is already filled, fill send buffer again
536 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
537 EXPECT_EQ(static_cast<int>(kBufferSize), result);
538 send_pos += result;
539
nisse32f25052017-05-08 08:57:18540 ss_.ProcessMessagesUntilIdle();
541 EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE));
542 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26543
544 // No more room in send or receive buffer
545 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
546 EXPECT_EQ(-1, result);
547 EXPECT_TRUE(a->IsBlocking());
548
549 // Read a subset of the data
Stefan Holmer9131efd2016-05-23 16:19:26550 result = b->Recv(recv_buffer + recv_pos, 500, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26551 EXPECT_EQ(500, result);
552 recv_pos += result;
553
nisse32f25052017-05-08 08:57:18554 ss_.ProcessMessagesUntilIdle();
555 EXPECT_TRUE(sink.Check(a.get(), SSE_WRITE));
556 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26557
558 // Room for more on the sending side
559 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
560 EXPECT_EQ(500, result);
561 send_pos += result;
562
563 // Empty the recv buffer
564 while (true) {
Stefan Holmer9131efd2016-05-23 16:19:26565 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26566 if (result < 0) {
567 EXPECT_EQ(-1, result);
568 EXPECT_TRUE(b->IsBlocking());
569 break;
570 }
571 recv_pos += result;
572 }
573
nisse32f25052017-05-08 08:57:18574 ss_.ProcessMessagesUntilIdle();
575 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26576
577 // Continue to empty the recv buffer
578 while (true) {
Stefan Holmer9131efd2016-05-23 16:19:26579 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26580 if (result < 0) {
581 EXPECT_EQ(-1, result);
582 EXPECT_TRUE(b->IsBlocking());
583 break;
584 }
585 recv_pos += result;
586 }
587
588 // Send last of the data
589 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
590 EXPECT_EQ(500, result);
591 send_pos += result;
592
nisse32f25052017-05-08 08:57:18593 ss_.ProcessMessagesUntilIdle();
594 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26595
596 // Receive the last of the data
597 while (true) {
Stefan Holmer9131efd2016-05-23 16:19:26598 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26599 if (result < 0) {
600 EXPECT_EQ(-1, result);
601 EXPECT_TRUE(b->IsBlocking());
602 break;
603 }
604 recv_pos += result;
605 }
606
nisse32f25052017-05-08 08:57:18607 ss_.ProcessMessagesUntilIdle();
608 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26609
610 // The received data matches the sent data
611 EXPECT_EQ(kDataSize, send_pos);
612 EXPECT_EQ(kDataSize, recv_pos);
613 EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize));
614 }
615
616 void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) {
617 const SocketAddress kEmptyAddr;
618
619 // Connect two sockets
Niels Möllerd0b88792021-08-12 08:32:30620 std::unique_ptr<Socket> a =
621 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
622 std::unique_ptr<Socket> b =
623 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26624 a->Bind(initial_addr);
625 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
626
627 b->Bind(initial_addr);
628 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
629
630 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
631 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
nisse32f25052017-05-08 08:57:18632 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26633
634 // First, deliver all packets in 0 ms.
Yves Gerey665174f2018-06-19 13:03:05635 char buffer[2] = {0, 0};
henrike@webrtc.orgf0488722014-05-13 18:00:26636 const char cNumPackets = 10;
637 for (char i = 0; i < cNumPackets; ++i) {
638 buffer[0] = '0' + i;
639 EXPECT_EQ(1, a->Send(buffer, 1));
640 }
641
nisse32f25052017-05-08 08:57:18642 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26643
644 for (char i = 0; i < cNumPackets; ++i) {
Stefan Holmer9131efd2016-05-23 16:19:26645 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26646 EXPECT_EQ(static_cast<char>('0' + i), buffer[0]);
647 }
648
649 // Next, deliver packets at random intervals
Peter Boström0c4e06b2015-10-07 10:23:21650 const uint32_t mean = 50;
651 const uint32_t stddev = 50;
henrike@webrtc.orgf0488722014-05-13 18:00:26652
nisse32f25052017-05-08 08:57:18653 ss_.set_delay_mean(mean);
654 ss_.set_delay_stddev(stddev);
655 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26656
657 for (char i = 0; i < cNumPackets; ++i) {
658 buffer[0] = 'A' + i;
659 EXPECT_EQ(1, a->Send(buffer, 1));
660 }
661
nisse32f25052017-05-08 08:57:18662 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26663
664 for (char i = 0; i < cNumPackets; ++i) {
Stefan Holmer9131efd2016-05-23 16:19:26665 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26666 EXPECT_EQ(static_cast<char>('A' + i), buffer[0]);
667 }
668 }
669
guoweis@webrtc.orgf358aea2015-02-18 18:44:01670 // It is important that initial_addr's port has to be 0 such that the
671 // incremental port behavior could ensure the 2 Binds result in different
672 // address.
673 void BandwidthTest(const SocketAddress& initial_addr) {
Niels Möllerd0b88792021-08-12 08:32:30674 Socket* send_socket = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
675 Socket* recv_socket = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
guoweis@webrtc.orgf358aea2015-02-18 18:44:01676 ASSERT_EQ(0, send_socket->Bind(initial_addr));
677 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
678 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
679 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26680 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
681
Peter Boström0c4e06b2015-10-07 10:23:21682 uint32_t bandwidth = 64 * 1024;
nisse32f25052017-05-08 08:57:18683 ss_.set_bandwidth(bandwidth);
henrike@webrtc.orgf0488722014-05-13 18:00:26684
685 Thread* pthMain = Thread::Current();
686 Sender sender(pthMain, send_socket, 80 * 1024);
687 Receiver receiver(pthMain, recv_socket, bandwidth);
688
deadbeef22e08142017-06-12 21:30:28689 // Allow the sender to run for 5 (simulated) seconds, then be stopped for 5
690 // seconds.
691 SIMULATED_WAIT(false, 5000, fake_clock_);
Danil Chapovalovf1361652022-09-02 13:40:26692 sender.periodic.Stop();
deadbeef22e08142017-06-12 21:30:28693 SIMULATED_WAIT(false, 5000, fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26694
deadbeef22e08142017-06-12 21:30:28695 // Ensure the observed bandwidth fell within a reasonable margin of error.
696 EXPECT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4);
697 EXPECT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s
henrike@webrtc.orgf0488722014-05-13 18:00:26698
nisse32f25052017-05-08 08:57:18699 ss_.set_bandwidth(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26700 }
701
guoweis@webrtc.orgf358aea2015-02-18 18:44:01702 // It is important that initial_addr's port has to be 0 such that the
703 // incremental port behavior could ensure the 2 Binds result in different
704 // address.
705 void DelayTest(const SocketAddress& initial_addr) {
deadbeef37f5ecf2017-02-27 22:06:41706 time_t seed = ::time(nullptr);
Mirko Bonadei675513b2017-11-09 10:09:25707 RTC_LOG(LS_VERBOSE) << "seed = " << seed;
henrike@webrtc.orgf0488722014-05-13 18:00:26708 srand(static_cast<unsigned int>(seed));
709
Peter Boström0c4e06b2015-10-07 10:23:21710 const uint32_t mean = 2000;
711 const uint32_t stddev = 500;
henrike@webrtc.orgf0488722014-05-13 18:00:26712
nisse32f25052017-05-08 08:57:18713 ss_.set_delay_mean(mean);
714 ss_.set_delay_stddev(stddev);
715 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26716
Niels Möllerd0b88792021-08-12 08:32:30717 Socket* send_socket = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
718 Socket* recv_socket = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
guoweis@webrtc.orgf358aea2015-02-18 18:44:01719 ASSERT_EQ(0, send_socket->Bind(initial_addr));
720 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
721 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
722 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26723 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
724
725 Thread* pthMain = Thread::Current();
726 // Avg packet size is 2K, so at 200KB/s for 10s, we should see about
727 // 1000 packets, which is necessary to get a good distribution.
728 Sender sender(pthMain, send_socket, 100 * 2 * 1024);
729 Receiver receiver(pthMain, recv_socket, 0);
730
deadbeef22e08142017-06-12 21:30:28731 // Simulate 10 seconds of packets being sent, then check the observed delay
732 // distribution.
733 SIMULATED_WAIT(false, 10000, fake_clock_);
Danil Chapovalovf1361652022-09-02 13:40:26734 sender.periodic.Stop();
735 receiver.periodic.Stop();
nisse32f25052017-05-08 08:57:18736 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26737
738 const double sample_mean = receiver.sum / receiver.samples;
739 double num =
740 receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum;
741 double den = receiver.samples * (receiver.samples - 1);
742 const double sample_stddev = sqrt(num / den);
Mirko Bonadei675513b2017-11-09 10:09:25743 RTC_LOG(LS_VERBOSE) << "mean=" << sample_mean
744 << " stddev=" << sample_stddev;
henrike@webrtc.orgf0488722014-05-13 18:00:26745
746 EXPECT_LE(500u, receiver.samples);
747 // We initially used a 0.1 fudge factor, but on the build machine, we
748 // have seen the value differ by as much as 0.13.
749 EXPECT_NEAR(mean, sample_mean, 0.15 * mean);
750 EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev);
751
nisse32f25052017-05-08 08:57:18752 ss_.set_delay_mean(0);
753 ss_.set_delay_stddev(0);
754 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26755 }
756
757 // Test cross-family communication between a client bound to client_addr and a
758 // server bound to server_addr. shouldSucceed indicates if communication is
759 // expected to work or not.
760 void CrossFamilyConnectionTest(const SocketAddress& client_addr,
761 const SocketAddress& server_addr,
762 bool shouldSucceed) {
kwibergd0d81482017-04-18 10:18:22763 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26764 SocketAddress accept_address;
765 const SocketAddress kEmptyAddr;
766
767 // Client gets a IPv4 address
Niels Möllerd0b88792021-08-12 08:32:30768 std::unique_ptr<Socket> client =
769 absl::WrapUnique(ss_.CreateSocket(client_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 08:57:18770 sink.Monitor(client.get());
Niels Möllerd0b88792021-08-12 08:32:30771 EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
henrike@webrtc.orgf0488722014-05-13 18:00:26772 EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr);
773 client->Bind(client_addr);
774
775 // Server gets a non-mapped non-any IPv6 address.
776 // IPv4 sockets should not be able to connect to this.
Niels Möllerd0b88792021-08-12 08:32:30777 std::unique_ptr<Socket> server =
778 absl::WrapUnique(ss_.CreateSocket(server_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 08:57:18779 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26780 server->Bind(server_addr);
781 server->Listen(5);
782
783 if (shouldSucceed) {
784 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
nisse32f25052017-05-08 08:57:18785 ss_.ProcessMessagesUntilIdle();
786 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
787 std::unique_ptr<Socket> accepted =
Karl Wiberg918f50c2018-07-05 09:40:33788 absl::WrapUnique(server->Accept(&accept_address));
deadbeef37f5ecf2017-02-27 22:06:41789 EXPECT_TRUE(nullptr != accepted);
henrike@webrtc.orgf0488722014-05-13 18:00:26790 EXPECT_NE(kEmptyAddr, accept_address);
nisse32f25052017-05-08 08:57:18791 ss_.ProcessMessagesUntilIdle();
792 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26793 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
794 } else {
795 // Check that the connection failed.
796 EXPECT_EQ(-1, client->Connect(server->GetLocalAddress()));
nisse32f25052017-05-08 08:57:18797 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26798
nisse32f25052017-05-08 08:57:18799 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 22:06:41800 EXPECT_TRUE(nullptr == server->Accept(&accept_address));
henrike@webrtc.orgf0488722014-05-13 18:00:26801 EXPECT_EQ(accept_address, kEmptyAddr);
Niels Möllerd0b88792021-08-12 08:32:30802 EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
nisse32f25052017-05-08 08:57:18803 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26804 EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr);
805 }
806 }
807
808 // Test cross-family datagram sending between a client bound to client_addr
809 // and a server bound to server_addr. shouldSucceed indicates if sending is
jlmiller@webrtc.orgec499be2015-02-07 22:37:59810 // expected to succeed or not.
henrike@webrtc.orgf0488722014-05-13 18:00:26811 void CrossFamilyDatagramTest(const SocketAddress& client_addr,
812 const SocketAddress& server_addr,
813 bool shouldSucceed) {
Niels Möllerd0b88792021-08-12 08:32:30814 Socket* socket = ss_.CreateSocket(AF_INET, SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26815 socket->Bind(server_addr);
816 SocketAddress bound_server_addr = socket->GetLocalAddress();
Mirko Bonadei317a1f02019-09-17 15:06:18817 auto client1 = std::make_unique<TestClient>(
818 std::make_unique<AsyncUDPSocket>(socket), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26819
Niels Möllerd0b88792021-08-12 08:32:30820 Socket* socket2 = ss_.CreateSocket(AF_INET, SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26821 socket2->Bind(client_addr);
Mirko Bonadei317a1f02019-09-17 15:06:18822 auto client2 = std::make_unique<TestClient>(
823 std::make_unique<AsyncUDPSocket>(socket2), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26824 SocketAddress client2_addr;
825
826 if (shouldSucceed) {
827 EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr));
828 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
829 SocketAddress client1_addr;
830 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
831 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
832 EXPECT_EQ(client1_addr, bound_server_addr);
833 } else {
834 EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr));
jlmiller@webrtc.orgec499be2015-02-07 22:37:59835 EXPECT_TRUE(client1->CheckNoPacket());
henrike@webrtc.orgf0488722014-05-13 18:00:26836 }
837 }
838
839 protected:
deadbeef22e08142017-06-12 21:30:28840 rtc::ScopedFakeClock fake_clock_;
nisse32f25052017-05-08 08:57:18841 VirtualSocketServer ss_;
nisse7eaa4ea2017-05-08 12:25:41842 AutoSocketServerThread thread_;
henrike@webrtc.orgf0488722014-05-13 18:00:26843 const SocketAddress kIPv4AnyAddress;
844 const SocketAddress kIPv6AnyAddress;
845};
846
henrike@webrtc.orgc732a3e2014-10-09 22:08:15847TEST_F(VirtualSocketServerTest, basic_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26848 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000);
849 BasicTest(ipv4_test_addr);
850}
851
henrike@webrtc.orgc732a3e2014-10-09 22:08:15852TEST_F(VirtualSocketServerTest, basic_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26853 SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 5000);
854 BasicTest(ipv6_test_addr);
855}
856
Guo-wei Shieh38f88932015-08-14 05:24:02857TEST_F(VirtualSocketServerTest, TestDefaultRoute_v4) {
858 IPAddress ipv4_default_addr(0x01020304);
Niels Möller84d15952021-09-01 08:50:34859 TestDefaultSourceAddress(ipv4_default_addr);
Guo-wei Shieh38f88932015-08-14 05:24:02860}
861
862TEST_F(VirtualSocketServerTest, TestDefaultRoute_v6) {
863 IPAddress ipv6_default_addr;
864 EXPECT_TRUE(
865 IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ipv6_default_addr));
Niels Möller84d15952021-09-01 08:50:34866 TestDefaultSourceAddress(ipv6_default_addr);
Guo-wei Shieh38f88932015-08-14 05:24:02867}
868
henrike@webrtc.orgc732a3e2014-10-09 22:08:15869TEST_F(VirtualSocketServerTest, connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26870 ConnectTest(kIPv4AnyAddress);
871}
872
henrike@webrtc.orgc732a3e2014-10-09 22:08:15873TEST_F(VirtualSocketServerTest, connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26874 ConnectTest(kIPv6AnyAddress);
875}
876
henrike@webrtc.orgc732a3e2014-10-09 22:08:15877TEST_F(VirtualSocketServerTest, connect_to_non_listener_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26878 ConnectToNonListenerTest(kIPv4AnyAddress);
879}
880
henrike@webrtc.orgc732a3e2014-10-09 22:08:15881TEST_F(VirtualSocketServerTest, connect_to_non_listener_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26882 ConnectToNonListenerTest(kIPv6AnyAddress);
883}
884
henrike@webrtc.orgc732a3e2014-10-09 22:08:15885TEST_F(VirtualSocketServerTest, close_during_connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26886 CloseDuringConnectTest(kIPv4AnyAddress);
887}
888
henrike@webrtc.orgc732a3e2014-10-09 22:08:15889TEST_F(VirtualSocketServerTest, close_during_connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26890 CloseDuringConnectTest(kIPv6AnyAddress);
891}
892
893TEST_F(VirtualSocketServerTest, close_v4) {
894 CloseTest(kIPv4AnyAddress);
895}
896
897TEST_F(VirtualSocketServerTest, close_v6) {
898 CloseTest(kIPv6AnyAddress);
899}
900
henrike@webrtc.orgc732a3e2014-10-09 22:08:15901TEST_F(VirtualSocketServerTest, tcp_send_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26902 TcpSendTest(kIPv4AnyAddress);
903}
904
henrike@webrtc.orgc732a3e2014-10-09 22:08:15905TEST_F(VirtualSocketServerTest, tcp_send_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26906 TcpSendTest(kIPv6AnyAddress);
907}
908
909TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v4) {
910 TcpSendsPacketsInOrderTest(kIPv4AnyAddress);
911}
912
913TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v6) {
914 TcpSendsPacketsInOrderTest(kIPv6AnyAddress);
915}
916
henrike@webrtc.orgc732a3e2014-10-09 22:08:15917TEST_F(VirtualSocketServerTest, bandwidth_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01918 BandwidthTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26919}
920
henrike@webrtc.orgc732a3e2014-10-09 22:08:15921TEST_F(VirtualSocketServerTest, bandwidth_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01922 BandwidthTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26923}
924
deadbeef22e08142017-06-12 21:30:28925TEST_F(VirtualSocketServerTest, delay_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01926 DelayTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26927}
928
deadbeef22e08142017-06-12 21:30:28929TEST_F(VirtualSocketServerTest, delay_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01930 DelayTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26931}
932
933// Works, receiving socket sees 127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15934TEST_F(VirtualSocketServerTest, CanConnectFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26935 CrossFamilyConnectionTest(SocketAddress("::ffff:127.0.0.2", 0),
Yves Gerey665174f2018-06-19 13:03:05936 SocketAddress("0.0.0.0", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26937}
938
939// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15940TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26941 CrossFamilyConnectionTest(SocketAddress("::2", 0),
Yves Gerey665174f2018-06-19 13:03:05942 SocketAddress("0.0.0.0", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26943}
944
945// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15946TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26947 CrossFamilyConnectionTest(SocketAddress("::2", 0),
Yves Gerey665174f2018-06-19 13:03:05948 SocketAddress("::ffff:127.0.0.1", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26949}
950
951// Works. receiving socket sees ::ffff:127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15952TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26953 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
Yves Gerey665174f2018-06-19 13:03:05954 SocketAddress("::", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26955}
956
957// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15958TEST_F(VirtualSocketServerTest, CantConnectFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26959 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
Yves Gerey665174f2018-06-19 13:03:05960 SocketAddress("::1", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26961}
962
963// Works. Receiving socket sees ::ffff:127.0.0.1.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15964TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26965 CrossFamilyConnectionTest(SocketAddress("127.0.0.1", 0),
Yves Gerey665174f2018-06-19 13:03:05966 SocketAddress("::ffff:127.0.0.2", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26967}
968
969// Works, receiving socket sees a result from GetNextIP.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15970TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26971 CrossFamilyConnectionTest(SocketAddress("::", 0),
Yves Gerey665174f2018-06-19 13:03:05972 SocketAddress("0.0.0.0", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26973}
974
975// Works, receiving socket sees whatever GetNextIP gave the client.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15976TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26977 CrossFamilyConnectionTest(SocketAddress("0.0.0.0", 0),
Yves Gerey665174f2018-06-19 13:03:05978 SocketAddress("::", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26979}
980
henrike@webrtc.orgc732a3e2014-10-09 22:08:15981TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26982 CrossFamilyDatagramTest(SocketAddress("0.0.0.0", 0),
Yves Gerey665174f2018-06-19 13:03:05983 SocketAddress("::", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26984}
985
henrike@webrtc.orgc732a3e2014-10-09 22:08:15986TEST_F(VirtualSocketServerTest, CanSendDatagramFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26987 CrossFamilyDatagramTest(SocketAddress("::ffff:127.0.0.1", 0),
Yves Gerey665174f2018-06-19 13:03:05988 SocketAddress("0.0.0.0", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26989}
990
henrike@webrtc.orgc732a3e2014-10-09 22:08:15991TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26992 CrossFamilyDatagramTest(SocketAddress("::2", 0),
Yves Gerey665174f2018-06-19 13:03:05993 SocketAddress("0.0.0.0", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26994}
995
henrike@webrtc.orgc732a3e2014-10-09 22:08:15996TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26997 CrossFamilyDatagramTest(SocketAddress("::2", 0),
Yves Gerey665174f2018-06-19 13:03:05998 SocketAddress("::ffff:127.0.0.1", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26999}
1000
henrike@webrtc.orgc732a3e2014-10-09 22:08:151001TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:261002 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
Yves Gerey665174f2018-06-19 13:03:051003 SocketAddress("::", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:261004}
1005
henrike@webrtc.orgc732a3e2014-10-09 22:08:151006TEST_F(VirtualSocketServerTest, CantSendDatagramFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:261007 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
Yves Gerey665174f2018-06-19 13:03:051008 SocketAddress("::1", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:261009}
1010
henrike@webrtc.orgc732a3e2014-10-09 22:08:151011TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:261012 CrossFamilyDatagramTest(SocketAddress("127.0.0.1", 0),
Yves Gerey665174f2018-06-19 13:03:051013 SocketAddress("::ffff:127.0.0.2", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:261014}
1015
henrike@webrtc.orgc732a3e2014-10-09 22:08:151016TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:261017 CrossFamilyDatagramTest(SocketAddress("::", 0),
Yves Gerey665174f2018-06-19 13:03:051018 SocketAddress("0.0.0.0", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:261019}
1020
Taylor Brandstettere7536412016-09-09 20:16:151021TEST_F(VirtualSocketServerTest, SetSendingBlockedWithUdpSocket) {
Niels Möllerd0b88792021-08-12 08:32:301022 Socket* socket1 = ss_.CreateSocket(kIPv4AnyAddress.family(), SOCK_DGRAM);
1023 std::unique_ptr<Socket> socket2 =
1024 absl::WrapUnique(ss_.CreateSocket(kIPv4AnyAddress.family(), SOCK_DGRAM));
Taylor Brandstettere7536412016-09-09 20:16:151025 socket1->Bind(kIPv4AnyAddress);
1026 socket2->Bind(kIPv4AnyAddress);
Mirko Bonadei317a1f02019-09-17 15:06:181027 auto client1 = std::make_unique<TestClient>(
1028 std::make_unique<AsyncUDPSocket>(socket1), &fake_clock_);
Taylor Brandstettere7536412016-09-09 20:16:151029
nisse32f25052017-05-08 08:57:181030 ss_.SetSendingBlocked(true);
Taylor Brandstettere7536412016-09-09 20:16:151031 EXPECT_EQ(-1, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1032 EXPECT_TRUE(socket1->IsBlocking());
1033 EXPECT_EQ(0, client1->ready_to_send_count());
1034
nisse32f25052017-05-08 08:57:181035 ss_.SetSendingBlocked(false);
Taylor Brandstettere7536412016-09-09 20:16:151036 EXPECT_EQ(1, client1->ready_to_send_count());
1037 EXPECT_EQ(3, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1038}
1039
1040TEST_F(VirtualSocketServerTest, SetSendingBlockedWithTcpSocket) {
1041 constexpr size_t kBufferSize = 1024;
nisse32f25052017-05-08 08:57:181042 ss_.set_send_buffer_capacity(kBufferSize);
1043 ss_.set_recv_buffer_capacity(kBufferSize);
Taylor Brandstettere7536412016-09-09 20:16:151044
kwibergd0d81482017-04-18 10:18:221045 StreamSink sink;
Niels Möllerd0b88792021-08-12 08:32:301046 std::unique_ptr<Socket> socket1 =
1047 absl::WrapUnique(ss_.CreateSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
1048 std::unique_ptr<Socket> socket2 =
1049 absl::WrapUnique(ss_.CreateSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
nisse32f25052017-05-08 08:57:181050 sink.Monitor(socket1.get());
1051 sink.Monitor(socket2.get());
Taylor Brandstettere7536412016-09-09 20:16:151052 socket1->Bind(kIPv4AnyAddress);
1053 socket2->Bind(kIPv4AnyAddress);
1054
1055 // Connect sockets.
1056 EXPECT_EQ(0, socket1->Connect(socket2->GetLocalAddress()));
1057 EXPECT_EQ(0, socket2->Connect(socket1->GetLocalAddress()));
nisse32f25052017-05-08 08:57:181058 ss_.ProcessMessagesUntilIdle();
Taylor Brandstettere7536412016-09-09 20:16:151059
1060 char data[kBufferSize] = {};
1061
1062 // First Send call will fill the send buffer but not send anything.
nisse32f25052017-05-08 08:57:181063 ss_.SetSendingBlocked(true);
Taylor Brandstettere7536412016-09-09 20:16:151064 EXPECT_EQ(static_cast<int>(kBufferSize), socket1->Send(data, kBufferSize));
nisse32f25052017-05-08 08:57:181065 ss_.ProcessMessagesUntilIdle();
1066 EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
1067 EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 20:16:151068 EXPECT_FALSE(socket1->IsBlocking());
1069
1070 // Since the send buffer is full, next Send will result in EWOULDBLOCK.
1071 EXPECT_EQ(-1, socket1->Send(data, kBufferSize));
nisse32f25052017-05-08 08:57:181072 EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
1073 EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 20:16:151074 EXPECT_TRUE(socket1->IsBlocking());
1075
1076 // When sending is unblocked, the buffered data should be sent and
1077 // SignalWriteEvent should fire.
nisse32f25052017-05-08 08:57:181078 ss_.SetSendingBlocked(false);
1079 ss_.ProcessMessagesUntilIdle();
1080 EXPECT_TRUE(sink.Check(socket1.get(), SSE_WRITE));
1081 EXPECT_TRUE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 20:16:151082}
1083
henrike@webrtc.orgf0488722014-05-13 18:00:261084TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) {
Peter Boström0c4e06b2015-10-07 10:23:211085 const uint32_t kTestMean[] = {10, 100, 333, 1000};
Yves Gerey665174f2018-06-19 13:03:051086 const double kTestDev[] = {0.25, 0.1, 0.01};
Taylor Brandstettere7536412016-09-09 20:16:151087 // TODO(deadbeef): The current code only works for 1000 data points or more.
Peter Boström0c4e06b2015-10-07 10:23:211088 const uint32_t kTestSamples[] = {/*10, 100,*/ 1000};
tfarina5237aaf2015-11-11 07:44:301089 for (size_t midx = 0; midx < arraysize(kTestMean); ++midx) {
1090 for (size_t didx = 0; didx < arraysize(kTestDev); ++didx) {
1091 for (size_t sidx = 0; sidx < arraysize(kTestSamples); ++sidx) {
henrike@webrtc.orgf0488722014-05-13 18:00:261092 ASSERT_LT(0u, kTestSamples[sidx]);
Peter Boström0c4e06b2015-10-07 10:23:211093 const uint32_t kStdDev =
1094 static_cast<uint32_t>(kTestDev[didx] * kTestMean[midx]);
Niels Möller983627c2021-02-09 14:12:281095 std::unique_ptr<VirtualSocketServer::Function> f =
Yves Gerey665174f2018-06-19 13:03:051096 VirtualSocketServer::CreateDistribution(kTestMean[midx], kStdDev,
henrike@webrtc.orgf0488722014-05-13 18:00:261097 kTestSamples[sidx]);
Niels Möller983627c2021-02-09 14:12:281098 ASSERT_TRUE(nullptr != f.get());
henrike@webrtc.orgf0488722014-05-13 18:00:261099 ASSERT_EQ(kTestSamples[sidx], f->size());
1100 double sum = 0;
Peter Boström0c4e06b2015-10-07 10:23:211101 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:261102 sum += (*f)[i].second;
1103 }
1104 const double mean = sum / f->size();
1105 double sum_sq_dev = 0;
Peter Boström0c4e06b2015-10-07 10:23:211106 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:261107 double dev = (*f)[i].second - mean;
1108 sum_sq_dev += dev * dev;
1109 }
1110 const double stddev = sqrt(sum_sq_dev / f->size());
1111 EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx])
Yves Gerey665174f2018-06-19 13:03:051112 << "M=" << kTestMean[midx] << " SD=" << kStdDev
1113 << " N=" << kTestSamples[sidx];
henrike@webrtc.orgf0488722014-05-13 18:00:261114 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev)
Yves Gerey665174f2018-06-19 13:03:051115 << "M=" << kTestMean[midx] << " SD=" << kStdDev
1116 << " N=" << kTestSamples[sidx];
henrike@webrtc.orgf0488722014-05-13 18:00:261117 }
1118 }
1119 }
1120}
Mirko Bonadeie10b1632018-12-11 17:43:401121
1122} // namespace
1123} // namespace rtc