blob: 67585b1fcd45cc7febf21ce65a9517ad40c6c880 [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"
Danil Chapovalovf1361652022-09-02 15:40:26 +020025#include "api/units/time_delta.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020026#include "rtc_base/arraysize.h"
Steve Anton10542f22019-01-11 09:11:00 -080027#include "rtc_base/async_packet_socket.h"
Steve Anton10542f22019-01-11 09:11:00 -080028#include "rtc_base/async_udp_socket.h"
29#include "rtc_base/fake_clock.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020030#include "rtc_base/gunit.h"
Steve Anton10542f22019-01-11 09:11:00 -080031#include "rtc_base/ip_address.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020032#include "rtc_base/logging.h"
Yves Gerey3e707812018-11-28 16:47:49 +010033#include "rtc_base/socket.h"
Steve Anton10542f22019-01-11 09:11:00 -080034#include "rtc_base/socket_address.h"
Danil Chapovalovf1361652022-09-02 15:40:26 +020035#include "rtc_base/task_utils/repeating_task.h"
Steve Anton10542f22019-01-11 09:11:00 -080036#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
Danil Chapovalovf1361652022-09-02 15:40:26 +020047using ::webrtc::RepeatingTaskHandle;
48using ::webrtc::TimeDelta;
49using ::webrtc::testing::SSE_CLOSE;
50using ::webrtc::testing::SSE_ERROR;
51using ::webrtc::testing::SSE_OPEN;
52using ::webrtc::testing::SSE_READ;
53using ::webrtc::testing::SSE_WRITE;
54using ::webrtc::testing::StreamSink;
kwibergd0d81482017-04-18 03:18:22 -070055
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000056// Sends at a constant rate but with random packet sizes.
Danil Chapovalovf1361652022-09-02 15:40:26 +020057struct Sender {
Niels Möllerd0b88792021-08-12 10:32:30 +020058 Sender(Thread* th, Socket* s, uint32_t rt)
Peter Boström0c4e06b2015-10-07 12:23:21 +020059 : thread(th),
Mirko Bonadei317a1f02019-09-17 17:06:18 +020060 socket(std::make_unique<AsyncUDPSocket>(s)),
Peter Boström0c4e06b2015-10-07 12:23:21 +020061 rate(rt),
62 count(0) {
Honghai Zhang82d78622016-05-06 11:29:15 -070063 last_send = rtc::TimeMillis();
Danil Chapovalovf1361652022-09-02 15:40:26 +020064
65 periodic = RepeatingTaskHandle::DelayedStart(thread, NextDelay(), [this] {
66 int64_t cur_time = rtc::TimeMillis();
67 int64_t delay = cur_time - last_send;
68 uint32_t size =
69 std::clamp<uint32_t>(rate * delay / 1000, sizeof(uint32_t), 4096);
70 count += size;
71 memcpy(dummy, &cur_time, sizeof(cur_time));
72 socket->Send(dummy, size, options);
73
74 last_send = cur_time;
75 return NextDelay();
76 });
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000077 }
78
Danil Chapovalovf1361652022-09-02 15:40:26 +020079 TimeDelta NextDelay() {
80 int size = (rand() % 4096) + 1;
81 return TimeDelta::Seconds(1) * size / rate;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000082 }
83
84 Thread* thread;
jbauch555604a2016-04-26 03:13:22 -070085 std::unique_ptr<AsyncUDPSocket> socket;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000086 rtc::PacketOptions options;
Danil Chapovalovf1361652022-09-02 15:40:26 +020087 RepeatingTaskHandle periodic;
Peter Boström0c4e06b2015-10-07 12:23:21 +020088 uint32_t rate; // bytes per second
89 uint32_t count;
Honghai Zhang82d78622016-05-06 11:29:15 -070090 int64_t last_send;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000091 char dummy[4096];
92};
93
Danil Chapovalovf1361652022-09-02 15:40:26 +020094struct Receiver : public sigslot::has_slots<> {
Niels Möllerd0b88792021-08-12 10:32:30 +020095 Receiver(Thread* th, Socket* s, uint32_t bw)
Peter Boström0c4e06b2015-10-07 12:23:21 +020096 : thread(th),
Mirko Bonadei317a1f02019-09-17 17:06:18 +020097 socket(std::make_unique<AsyncUDPSocket>(s)),
Peter Boström0c4e06b2015-10-07 12:23:21 +020098 bandwidth(bw),
Peter Boström0c4e06b2015-10-07 12:23:21 +020099 count(0),
100 sec_count(0),
101 sum(0),
102 sum_sq(0),
103 samples(0) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000104 socket->SignalReadPacket.connect(this, &Receiver::OnReadPacket);
Danil Chapovalovf1361652022-09-02 15:40:26 +0200105 periodic = RepeatingTaskHandle::DelayedStart(
106 thread, TimeDelta::Seconds(1), [this] {
107 // It is always possible for us to receive more than expected because
108 // packets can be further delayed in delivery.
109 if (bandwidth > 0) {
110 EXPECT_LE(sec_count, 5 * bandwidth / 4);
111 }
112 sec_count = 0;
113 return TimeDelta::Seconds(1);
114 });
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000115 }
116
Danil Chapovalovf1361652022-09-02 15:40:26 +0200117 ~Receiver() override { periodic.Stop(); }
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
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000138 Thread* thread;
jbauch555604a2016-04-26 03:13:22 -0700139 std::unique_ptr<AsyncUDPSocket> socket;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200140 uint32_t bandwidth;
Danil Chapovalovf1361652022-09-02 15:40:26 +0200141 RepeatingTaskHandle periodic;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000142 size_t count;
143 size_t sec_count;
144 double sum;
145 double sum_sq;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200146 uint32_t samples;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000147};
148
deadbeef22e08142017-06-12 14:30:28 -0700149// Note: This test uses a fake clock in addition to a virtual network.
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200150class VirtualSocketServerTest : public ::testing::Test {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000151 public:
deadbeef37f5ecf2017-02-27 14:06:41 -0800152 VirtualSocketServerTest()
deadbeef22e08142017-06-12 14:30:28 -0700153 : ss_(&fake_clock_),
154 thread_(&ss_),
deadbeef37f5ecf2017-02-27 14:06:41 -0800155 kIPv4AnyAddress(IPAddress(INADDR_ANY), 0),
156 kIPv6AnyAddress(IPAddress(in6addr_any), 0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000157
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000158 void CheckPortIncrementalization(const SocketAddress& post,
159 const SocketAddress& pre) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000160 EXPECT_EQ(post.port(), pre.port() + 1);
161 IPAddress post_ip = post.ipaddr();
162 IPAddress pre_ip = pre.ipaddr();
163 EXPECT_EQ(pre_ip.family(), post_ip.family());
164 if (post_ip.family() == AF_INET) {
165 in_addr pre_ipv4 = pre_ip.ipv4_address();
166 in_addr post_ipv4 = post_ip.ipv4_address();
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000167 EXPECT_EQ(post_ipv4.s_addr, pre_ipv4.s_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000168 } else if (post_ip.family() == AF_INET6) {
169 in6_addr post_ip6 = post_ip.ipv6_address();
170 in6_addr pre_ip6 = pre_ip.ipv6_address();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200171 uint32_t* post_as_ints = reinterpret_cast<uint32_t*>(&post_ip6.s6_addr);
172 uint32_t* pre_as_ints = reinterpret_cast<uint32_t*>(&pre_ip6.s6_addr);
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000173 EXPECT_EQ(post_as_ints[3], pre_as_ints[3]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000174 }
175 }
176
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700177 // Test a client can bind to the any address, and all sent packets will have
Niels Möller84d15952021-09-01 10:50:34 +0200178 // the default source address. Also, it can receive packets sent to the
179 // default address.
180 void TestDefaultSourceAddress(const IPAddress& default_address) {
181 ss_.SetDefaultSourceAddress(default_address);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700182
183 // Create client1 bound to the any address.
Niels Möller84d15952021-09-01 10:50:34 +0200184 Socket* socket = ss_.CreateSocket(default_address.family(), SOCK_DGRAM);
185 socket->Bind(EmptySocketAddressWithFamily(default_address.family()));
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700186 SocketAddress client1_any_addr = socket->GetLocalAddress();
187 EXPECT_TRUE(client1_any_addr.IsAnyIP());
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200188 auto client1 = std::make_unique<TestClient>(
189 std::make_unique<AsyncUDPSocket>(socket), &fake_clock_);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700190
Niels Möller84d15952021-09-01 10:50:34 +0200191 // Create client2 bound to the address route.
192 Socket* socket2 = ss_.CreateSocket(default_address.family(), SOCK_DGRAM);
193 socket2->Bind(SocketAddress(default_address, 0));
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700194 SocketAddress client2_addr = socket2->GetLocalAddress();
195 EXPECT_FALSE(client2_addr.IsAnyIP());
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200196 auto client2 = std::make_unique<TestClient>(
197 std::make_unique<AsyncUDPSocket>(socket2), &fake_clock_);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700198
Niels Möller84d15952021-09-01 10:50:34 +0200199 // Client1 sends to client2, client2 should see the default address as
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700200 // client1's address.
201 SocketAddress client1_addr;
202 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
203 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
204 EXPECT_EQ(client1_addr,
Niels Möller84d15952021-09-01 10:50:34 +0200205 SocketAddress(default_address, client1_any_addr.port()));
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700206
Niels Möller84d15952021-09-01 10:50:34 +0200207 // Client2 can send back to client1's default address.
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700208 EXPECT_EQ(3, client2->SendTo("foo", 3, client1_addr));
209 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
210 }
211
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000212 void BasicTest(const SocketAddress& initial_addr) {
Niels Möllerd0b88792021-08-12 10:32:30 +0200213 Socket* socket = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000214 socket->Bind(initial_addr);
215 SocketAddress server_addr = socket->GetLocalAddress();
216 // Make sure VSS didn't switch families on us.
217 EXPECT_EQ(server_addr.family(), initial_addr.family());
218
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200219 auto client1 = std::make_unique<TestClient>(
220 std::make_unique<AsyncUDPSocket>(socket), &fake_clock_);
Niels Möllerd0b88792021-08-12 10:32:30 +0200221 Socket* socket2 = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200222 auto client2 = std::make_unique<TestClient>(
223 std::make_unique<AsyncUDPSocket>(socket2), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000224
225 SocketAddress client2_addr;
226 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
227 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
228
229 SocketAddress client1_addr;
230 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
231 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
232 EXPECT_EQ(client1_addr, server_addr);
233
234 SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family());
235 for (int i = 0; i < 10; i++) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200236 client2 = std::make_unique<TestClient>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200237 absl::WrapUnique(AsyncUDPSocket::Create(&ss_, empty)), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000238
239 SocketAddress next_client2_addr;
240 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
241 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr));
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000242 CheckPortIncrementalization(next_client2_addr, client2_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000243 // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1);
244
245 SocketAddress server_addr2;
246 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr));
247 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2));
248 EXPECT_EQ(server_addr2, server_addr);
249
250 client2_addr = next_client2_addr;
251 }
252 }
253
254 // initial_addr should be made from either INADDR_ANY or in6addr_any.
255 void ConnectTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700256 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000257 SocketAddress accept_addr;
258 const SocketAddress kEmptyAddr =
259 EmptySocketAddressWithFamily(initial_addr.family());
260
261 // Create client
Niels Möllerd0b88792021-08-12 10:32:30 +0200262 std::unique_ptr<Socket> client =
263 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700264 sink.Monitor(client.get());
Niels Möllerd0b88792021-08-12 10:32:30 +0200265 EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000266 EXPECT_TRUE(client->GetLocalAddress().IsNil());
267
268 // Create server
Niels Möllerd0b88792021-08-12 10:32:30 +0200269 std::unique_ptr<Socket> server =
270 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700271 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000272 EXPECT_NE(0, server->Listen(5)); // Bind required
273 EXPECT_EQ(0, server->Bind(initial_addr));
274 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
275 EXPECT_EQ(0, server->Listen(5));
Niels Möllerd0b88792021-08-12 10:32:30 +0200276 EXPECT_EQ(server->GetState(), Socket::CS_CONNECTING);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000277
278 // No pending server connections
nisse32f25052017-05-08 01:57:18 -0700279 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800280 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000281 EXPECT_EQ(AF_UNSPEC, accept_addr.family());
282
283 // Attempt connect to listening socket
284 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
Yves Gerey665174f2018-06-19 15:03:05 +0200285 EXPECT_NE(client->GetLocalAddress(), kEmptyAddr); // Implicit Bind
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000286 EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family()); // Implicit Bind
287 EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress());
288
289 // Client is connecting
Niels Möllerd0b88792021-08-12 10:32:30 +0200290 EXPECT_EQ(client->GetState(), Socket::CS_CONNECTING);
nisse32f25052017-05-08 01:57:18 -0700291 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
292 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000293
nisse32f25052017-05-08 01:57:18 -0700294 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000295
296 // Client still connecting
Niels Möllerd0b88792021-08-12 10:32:30 +0200297 EXPECT_EQ(client->GetState(), Socket::CS_CONNECTING);
nisse32f25052017-05-08 01:57:18 -0700298 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
299 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000300
301 // Server has pending connection
nisse32f25052017-05-08 01:57:18 -0700302 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
Karl Wiberg918f50c2018-07-05 11:40:33 +0200303 std::unique_ptr<Socket> accepted =
304 absl::WrapUnique(server->Accept(&accept_addr));
deadbeef37f5ecf2017-02-27 14:06:41 -0800305 EXPECT_TRUE(nullptr != accepted);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000306 EXPECT_NE(accept_addr, kEmptyAddr);
307 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr);
308
Niels Möllerd0b88792021-08-12 10:32:30 +0200309 EXPECT_EQ(accepted->GetState(), Socket::CS_CONNECTED);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000310 EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress());
311 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress());
312
nisse32f25052017-05-08 01:57:18 -0700313 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000314
315 // Client has connected
Niels Möllerd0b88792021-08-12 10:32:30 +0200316 EXPECT_EQ(client->GetState(), Socket::CS_CONNECTED);
nisse32f25052017-05-08 01:57:18 -0700317 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
318 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000319 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
320 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
321 }
322
323 void ConnectToNonListenerTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700324 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000325 SocketAddress accept_addr;
326 const SocketAddress nil_addr;
327 const SocketAddress empty_addr =
328 EmptySocketAddressWithFamily(initial_addr.family());
329
330 // Create client
Niels Möllerd0b88792021-08-12 10:32:30 +0200331 std::unique_ptr<Socket> client =
332 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700333 sink.Monitor(client.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000334
335 // Create server
Niels Möllerd0b88792021-08-12 10:32:30 +0200336 std::unique_ptr<Socket> server =
337 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700338 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000339 EXPECT_EQ(0, server->Bind(initial_addr));
340 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
341 // Attempt connect to non-listening socket
342 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
343
nisse32f25052017-05-08 01:57:18 -0700344 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000345
346 // No pending server connections
nisse32f25052017-05-08 01:57:18 -0700347 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800348 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000349 EXPECT_EQ(accept_addr, nil_addr);
350
351 // Connection failed
Niels Möllerd0b88792021-08-12 10:32:30 +0200352 EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
nisse32f25052017-05-08 01:57:18 -0700353 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
354 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000355 EXPECT_EQ(client->GetRemoteAddress(), nil_addr);
356 }
357
358 void CloseDuringConnectTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700359 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000360 SocketAddress accept_addr;
361 const SocketAddress empty_addr =
362 EmptySocketAddressWithFamily(initial_addr.family());
363
364 // Create client and server
Niels Möllerd0b88792021-08-12 10:32:30 +0200365 std::unique_ptr<Socket> client(
366 ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000367 sink.Monitor(client.get());
Niels Möllerd0b88792021-08-12 10:32:30 +0200368 std::unique_ptr<Socket> server(
369 ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000370 sink.Monitor(server.get());
371
372 // Initiate connect
373 EXPECT_EQ(0, server->Bind(initial_addr));
374 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
375
376 EXPECT_EQ(0, server->Listen(5));
377 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
378
379 // Server close before socket enters accept queue
kwibergd0d81482017-04-18 03:18:22 -0700380 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000381 server->Close();
382
nisse32f25052017-05-08 01:57:18 -0700383 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000384
385 // Result: connection failed
Niels Möllerd0b88792021-08-12 10:32:30 +0200386 EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700387 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000388
Niels Möllerd0b88792021-08-12 10:32:30 +0200389 server.reset(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000390 sink.Monitor(server.get());
391
392 // Initiate connect
393 EXPECT_EQ(0, server->Bind(initial_addr));
394 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
395
396 EXPECT_EQ(0, server->Listen(5));
397 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
398
nisse32f25052017-05-08 01:57:18 -0700399 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000400
401 // Server close while socket is in accept queue
kwibergd0d81482017-04-18 03:18:22 -0700402 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000403 server->Close();
404
nisse32f25052017-05-08 01:57:18 -0700405 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000406
407 // Result: connection failed
Niels Möllerd0b88792021-08-12 10:32:30 +0200408 EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700409 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000410
411 // New server
Niels Möllerd0b88792021-08-12 10:32:30 +0200412 server.reset(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000413 sink.Monitor(server.get());
414
415 // Initiate connect
416 EXPECT_EQ(0, server->Bind(initial_addr));
417 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
418
419 EXPECT_EQ(0, server->Listen(5));
420 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
421
nisse32f25052017-05-08 01:57:18 -0700422 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000423
424 // Server accepts connection
kwibergd0d81482017-04-18 03:18:22 -0700425 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
Niels Möllerd0b88792021-08-12 10:32:30 +0200426 std::unique_ptr<Socket> accepted(server->Accept(&accept_addr));
deadbeef37f5ecf2017-02-27 14:06:41 -0800427 ASSERT_TRUE(nullptr != accepted.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000428 sink.Monitor(accepted.get());
429
430 // Client closes before connection complets
Niels Möllerd0b88792021-08-12 10:32:30 +0200431 EXPECT_EQ(accepted->GetState(), Socket::CS_CONNECTED);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000432
433 // Connected message has not been processed yet.
Niels Möllerd0b88792021-08-12 10:32:30 +0200434 EXPECT_EQ(client->GetState(), Socket::CS_CONNECTING);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000435 client->Close();
436
nisse32f25052017-05-08 01:57:18 -0700437 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000438
439 // Result: accepted socket closes
Niels Möllerd0b88792021-08-12 10:32:30 +0200440 EXPECT_EQ(accepted->GetState(), Socket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700441 EXPECT_TRUE(sink.Check(accepted.get(), SSE_CLOSE));
442 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000443 }
444
445 void CloseTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700446 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000447 const SocketAddress kEmptyAddr;
448
449 // Create clients
Niels Möllerd0b88792021-08-12 10:32:30 +0200450 std::unique_ptr<Socket> a =
451 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700452 sink.Monitor(a.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000453 a->Bind(initial_addr);
454 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
455
Niels Möllerd0b88792021-08-12 10:32:30 +0200456 std::unique_ptr<Socket> b =
457 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000458 sink.Monitor(b.get());
459 b->Bind(initial_addr);
460 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
461
462 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
463 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
464
nisse32f25052017-05-08 01:57:18 -0700465 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000466
nisse32f25052017-05-08 01:57:18 -0700467 EXPECT_TRUE(sink.Check(a.get(), SSE_OPEN));
Niels Möllerd0b88792021-08-12 10:32:30 +0200468 EXPECT_EQ(a->GetState(), Socket::CS_CONNECTED);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000469 EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress());
470
kwibergd0d81482017-04-18 03:18:22 -0700471 EXPECT_TRUE(sink.Check(b.get(), SSE_OPEN));
Niels Möllerd0b88792021-08-12 10:32:30 +0200472 EXPECT_EQ(b->GetState(), Socket::CS_CONNECTED);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000473 EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress());
474
475 EXPECT_EQ(1, a->Send("a", 1));
476 b->Close();
477 EXPECT_EQ(1, a->Send("b", 1));
478
nisse32f25052017-05-08 01:57:18 -0700479 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000480
481 char buffer[10];
kwibergd0d81482017-04-18 03:18:22 -0700482 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
Stefan Holmer9131efd2016-05-23 18:19:26 +0200483 EXPECT_EQ(-1, b->Recv(buffer, 10, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000484
nisse32f25052017-05-08 01:57:18 -0700485 EXPECT_TRUE(sink.Check(a.get(), SSE_CLOSE));
Niels Möllerd0b88792021-08-12 10:32:30 +0200486 EXPECT_EQ(a->GetState(), Socket::CS_CLOSED);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000487 EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr);
488
489 // No signal for Closer
kwibergd0d81482017-04-18 03:18:22 -0700490 EXPECT_FALSE(sink.Check(b.get(), SSE_CLOSE));
Niels Möllerd0b88792021-08-12 10:32:30 +0200491 EXPECT_EQ(b->GetState(), Socket::CS_CLOSED);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000492 EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr);
493 }
494
495 void TcpSendTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700496 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000497 const SocketAddress kEmptyAddr;
498
499 // Connect two sockets
Niels Möllerd0b88792021-08-12 10:32:30 +0200500 std::unique_ptr<Socket> a =
501 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700502 sink.Monitor(a.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000503 a->Bind(initial_addr);
504 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
505
Niels Möllerd0b88792021-08-12 10:32:30 +0200506 std::unique_ptr<Socket> b =
507 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700508 sink.Monitor(b.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000509 b->Bind(initial_addr);
510 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
511
512 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
513 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
514
nisse32f25052017-05-08 01:57:18 -0700515 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000516
517 const size_t kBufferSize = 2000;
nisse32f25052017-05-08 01:57:18 -0700518 ss_.set_send_buffer_capacity(kBufferSize);
519 ss_.set_recv_buffer_capacity(kBufferSize);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000520
521 const size_t kDataSize = 5000;
522 char send_buffer[kDataSize], recv_buffer[kDataSize];
523 for (size_t i = 0; i < kDataSize; ++i)
524 send_buffer[i] = static_cast<char>(i % 256);
525 memset(recv_buffer, 0, sizeof(recv_buffer));
526 size_t send_pos = 0, recv_pos = 0;
527
528 // Can't send more than send buffer in one write
529 int result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
530 EXPECT_EQ(static_cast<int>(kBufferSize), result);
531 send_pos += result;
532
nisse32f25052017-05-08 01:57:18 -0700533 ss_.ProcessMessagesUntilIdle();
534 EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE));
535 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000536
537 // Receive buffer is already filled, fill send buffer again
538 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
539 EXPECT_EQ(static_cast<int>(kBufferSize), result);
540 send_pos += result;
541
nisse32f25052017-05-08 01:57:18 -0700542 ss_.ProcessMessagesUntilIdle();
543 EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE));
544 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000545
546 // No more room in send or receive buffer
547 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
548 EXPECT_EQ(-1, result);
549 EXPECT_TRUE(a->IsBlocking());
550
551 // Read a subset of the data
Stefan Holmer9131efd2016-05-23 18:19:26 +0200552 result = b->Recv(recv_buffer + recv_pos, 500, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000553 EXPECT_EQ(500, result);
554 recv_pos += result;
555
nisse32f25052017-05-08 01:57:18 -0700556 ss_.ProcessMessagesUntilIdle();
557 EXPECT_TRUE(sink.Check(a.get(), SSE_WRITE));
558 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000559
560 // Room for more on the sending side
561 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
562 EXPECT_EQ(500, result);
563 send_pos += result;
564
565 // Empty the recv buffer
566 while (true) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200567 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000568 if (result < 0) {
569 EXPECT_EQ(-1, result);
570 EXPECT_TRUE(b->IsBlocking());
571 break;
572 }
573 recv_pos += result;
574 }
575
nisse32f25052017-05-08 01:57:18 -0700576 ss_.ProcessMessagesUntilIdle();
577 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000578
579 // Continue to 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
590 // Send last of the data
591 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
592 EXPECT_EQ(500, result);
593 send_pos += result;
594
nisse32f25052017-05-08 01:57:18 -0700595 ss_.ProcessMessagesUntilIdle();
596 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000597
598 // Receive the last of the data
599 while (true) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200600 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000601 if (result < 0) {
602 EXPECT_EQ(-1, result);
603 EXPECT_TRUE(b->IsBlocking());
604 break;
605 }
606 recv_pos += result;
607 }
608
nisse32f25052017-05-08 01:57:18 -0700609 ss_.ProcessMessagesUntilIdle();
610 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000611
612 // The received data matches the sent data
613 EXPECT_EQ(kDataSize, send_pos);
614 EXPECT_EQ(kDataSize, recv_pos);
615 EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize));
616 }
617
618 void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) {
619 const SocketAddress kEmptyAddr;
620
621 // Connect two sockets
Niels Möllerd0b88792021-08-12 10:32:30 +0200622 std::unique_ptr<Socket> a =
623 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
624 std::unique_ptr<Socket> b =
625 absl::WrapUnique(ss_.CreateSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000626 a->Bind(initial_addr);
627 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
628
629 b->Bind(initial_addr);
630 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
631
632 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
633 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -0700634 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000635
636 // First, deliver all packets in 0 ms.
Yves Gerey665174f2018-06-19 15:03:05 +0200637 char buffer[2] = {0, 0};
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000638 const char cNumPackets = 10;
639 for (char i = 0; i < cNumPackets; ++i) {
640 buffer[0] = '0' + i;
641 EXPECT_EQ(1, a->Send(buffer, 1));
642 }
643
nisse32f25052017-05-08 01:57:18 -0700644 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000645
646 for (char i = 0; i < cNumPackets; ++i) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200647 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000648 EXPECT_EQ(static_cast<char>('0' + i), buffer[0]);
649 }
650
651 // Next, deliver packets at random intervals
Peter Boström0c4e06b2015-10-07 12:23:21 +0200652 const uint32_t mean = 50;
653 const uint32_t stddev = 50;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000654
nisse32f25052017-05-08 01:57:18 -0700655 ss_.set_delay_mean(mean);
656 ss_.set_delay_stddev(stddev);
657 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000658
659 for (char i = 0; i < cNumPackets; ++i) {
660 buffer[0] = 'A' + i;
661 EXPECT_EQ(1, a->Send(buffer, 1));
662 }
663
nisse32f25052017-05-08 01:57:18 -0700664 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000665
666 for (char i = 0; i < cNumPackets; ++i) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200667 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000668 EXPECT_EQ(static_cast<char>('A' + i), buffer[0]);
669 }
670 }
671
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000672 // It is important that initial_addr's port has to be 0 such that the
673 // incremental port behavior could ensure the 2 Binds result in different
674 // address.
675 void BandwidthTest(const SocketAddress& initial_addr) {
Niels Möllerd0b88792021-08-12 10:32:30 +0200676 Socket* send_socket = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
677 Socket* recv_socket = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000678 ASSERT_EQ(0, send_socket->Bind(initial_addr));
679 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
680 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
681 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000682 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
683
Peter Boström0c4e06b2015-10-07 12:23:21 +0200684 uint32_t bandwidth = 64 * 1024;
nisse32f25052017-05-08 01:57:18 -0700685 ss_.set_bandwidth(bandwidth);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000686
687 Thread* pthMain = Thread::Current();
688 Sender sender(pthMain, send_socket, 80 * 1024);
689 Receiver receiver(pthMain, recv_socket, bandwidth);
690
deadbeef22e08142017-06-12 14:30:28 -0700691 // Allow the sender to run for 5 (simulated) seconds, then be stopped for 5
692 // seconds.
693 SIMULATED_WAIT(false, 5000, fake_clock_);
Danil Chapovalovf1361652022-09-02 15:40:26 +0200694 sender.periodic.Stop();
deadbeef22e08142017-06-12 14:30:28 -0700695 SIMULATED_WAIT(false, 5000, fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000696
deadbeef22e08142017-06-12 14:30:28 -0700697 // Ensure the observed bandwidth fell within a reasonable margin of error.
698 EXPECT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4);
699 EXPECT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000700
nisse32f25052017-05-08 01:57:18 -0700701 ss_.set_bandwidth(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000702 }
703
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000704 // It is important that initial_addr's port has to be 0 such that the
705 // incremental port behavior could ensure the 2 Binds result in different
706 // address.
707 void DelayTest(const SocketAddress& initial_addr) {
deadbeef37f5ecf2017-02-27 14:06:41 -0800708 time_t seed = ::time(nullptr);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100709 RTC_LOG(LS_VERBOSE) << "seed = " << seed;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000710 srand(static_cast<unsigned int>(seed));
711
Peter Boström0c4e06b2015-10-07 12:23:21 +0200712 const uint32_t mean = 2000;
713 const uint32_t stddev = 500;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000714
nisse32f25052017-05-08 01:57:18 -0700715 ss_.set_delay_mean(mean);
716 ss_.set_delay_stddev(stddev);
717 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000718
Niels Möllerd0b88792021-08-12 10:32:30 +0200719 Socket* send_socket = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
720 Socket* recv_socket = ss_.CreateSocket(initial_addr.family(), SOCK_DGRAM);
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000721 ASSERT_EQ(0, send_socket->Bind(initial_addr));
722 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
723 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
724 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000725 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
726
727 Thread* pthMain = Thread::Current();
728 // Avg packet size is 2K, so at 200KB/s for 10s, we should see about
729 // 1000 packets, which is necessary to get a good distribution.
730 Sender sender(pthMain, send_socket, 100 * 2 * 1024);
731 Receiver receiver(pthMain, recv_socket, 0);
732
deadbeef22e08142017-06-12 14:30:28 -0700733 // Simulate 10 seconds of packets being sent, then check the observed delay
734 // distribution.
735 SIMULATED_WAIT(false, 10000, fake_clock_);
Danil Chapovalovf1361652022-09-02 15:40:26 +0200736 sender.periodic.Stop();
737 receiver.periodic.Stop();
nisse32f25052017-05-08 01:57:18 -0700738 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000739
740 const double sample_mean = receiver.sum / receiver.samples;
741 double num =
742 receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum;
743 double den = receiver.samples * (receiver.samples - 1);
744 const double sample_stddev = sqrt(num / den);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100745 RTC_LOG(LS_VERBOSE) << "mean=" << sample_mean
746 << " stddev=" << sample_stddev;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000747
748 EXPECT_LE(500u, receiver.samples);
749 // We initially used a 0.1 fudge factor, but on the build machine, we
750 // have seen the value differ by as much as 0.13.
751 EXPECT_NEAR(mean, sample_mean, 0.15 * mean);
752 EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev);
753
nisse32f25052017-05-08 01:57:18 -0700754 ss_.set_delay_mean(0);
755 ss_.set_delay_stddev(0);
756 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000757 }
758
759 // Test cross-family communication between a client bound to client_addr and a
760 // server bound to server_addr. shouldSucceed indicates if communication is
761 // expected to work or not.
762 void CrossFamilyConnectionTest(const SocketAddress& client_addr,
763 const SocketAddress& server_addr,
764 bool shouldSucceed) {
kwibergd0d81482017-04-18 03:18:22 -0700765 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000766 SocketAddress accept_address;
767 const SocketAddress kEmptyAddr;
768
769 // Client gets a IPv4 address
Niels Möllerd0b88792021-08-12 10:32:30 +0200770 std::unique_ptr<Socket> client =
771 absl::WrapUnique(ss_.CreateSocket(client_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700772 sink.Monitor(client.get());
Niels Möllerd0b88792021-08-12 10:32:30 +0200773 EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000774 EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr);
775 client->Bind(client_addr);
776
777 // Server gets a non-mapped non-any IPv6 address.
778 // IPv4 sockets should not be able to connect to this.
Niels Möllerd0b88792021-08-12 10:32:30 +0200779 std::unique_ptr<Socket> server =
780 absl::WrapUnique(ss_.CreateSocket(server_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700781 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000782 server->Bind(server_addr);
783 server->Listen(5);
784
785 if (shouldSucceed) {
786 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -0700787 ss_.ProcessMessagesUntilIdle();
788 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
789 std::unique_ptr<Socket> accepted =
Karl Wiberg918f50c2018-07-05 11:40:33 +0200790 absl::WrapUnique(server->Accept(&accept_address));
deadbeef37f5ecf2017-02-27 14:06:41 -0800791 EXPECT_TRUE(nullptr != accepted);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000792 EXPECT_NE(kEmptyAddr, accept_address);
nisse32f25052017-05-08 01:57:18 -0700793 ss_.ProcessMessagesUntilIdle();
794 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000795 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
796 } else {
797 // Check that the connection failed.
798 EXPECT_EQ(-1, client->Connect(server->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -0700799 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000800
nisse32f25052017-05-08 01:57:18 -0700801 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800802 EXPECT_TRUE(nullptr == server->Accept(&accept_address));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000803 EXPECT_EQ(accept_address, kEmptyAddr);
Niels Möllerd0b88792021-08-12 10:32:30 +0200804 EXPECT_EQ(client->GetState(), Socket::CS_CLOSED);
nisse32f25052017-05-08 01:57:18 -0700805 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000806 EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr);
807 }
808 }
809
810 // Test cross-family datagram sending between a client bound to client_addr
811 // and a server bound to server_addr. shouldSucceed indicates if sending is
jlmiller@webrtc.orgec499be2015-02-07 22:37:59 +0000812 // expected to succeed or not.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000813 void CrossFamilyDatagramTest(const SocketAddress& client_addr,
814 const SocketAddress& server_addr,
815 bool shouldSucceed) {
Niels Möllerd0b88792021-08-12 10:32:30 +0200816 Socket* socket = ss_.CreateSocket(AF_INET, SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000817 socket->Bind(server_addr);
818 SocketAddress bound_server_addr = socket->GetLocalAddress();
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200819 auto client1 = std::make_unique<TestClient>(
820 std::make_unique<AsyncUDPSocket>(socket), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000821
Niels Möllerd0b88792021-08-12 10:32:30 +0200822 Socket* socket2 = ss_.CreateSocket(AF_INET, SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000823 socket2->Bind(client_addr);
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200824 auto client2 = std::make_unique<TestClient>(
825 std::make_unique<AsyncUDPSocket>(socket2), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000826 SocketAddress client2_addr;
827
828 if (shouldSucceed) {
829 EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr));
830 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
831 SocketAddress client1_addr;
832 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
833 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
834 EXPECT_EQ(client1_addr, bound_server_addr);
835 } else {
836 EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr));
jlmiller@webrtc.orgec499be2015-02-07 22:37:59 +0000837 EXPECT_TRUE(client1->CheckNoPacket());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000838 }
839 }
840
841 protected:
deadbeef22e08142017-06-12 14:30:28 -0700842 rtc::ScopedFakeClock fake_clock_;
nisse32f25052017-05-08 01:57:18 -0700843 VirtualSocketServer ss_;
nisse7eaa4ea2017-05-08 05:25:41 -0700844 AutoSocketServerThread thread_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000845 const SocketAddress kIPv4AnyAddress;
846 const SocketAddress kIPv6AnyAddress;
847};
848
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000849TEST_F(VirtualSocketServerTest, basic_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000850 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000);
851 BasicTest(ipv4_test_addr);
852}
853
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000854TEST_F(VirtualSocketServerTest, basic_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000855 SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 5000);
856 BasicTest(ipv6_test_addr);
857}
858
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700859TEST_F(VirtualSocketServerTest, TestDefaultRoute_v4) {
860 IPAddress ipv4_default_addr(0x01020304);
Niels Möller84d15952021-09-01 10:50:34 +0200861 TestDefaultSourceAddress(ipv4_default_addr);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700862}
863
864TEST_F(VirtualSocketServerTest, TestDefaultRoute_v6) {
865 IPAddress ipv6_default_addr;
866 EXPECT_TRUE(
867 IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ipv6_default_addr));
Niels Möller84d15952021-09-01 10:50:34 +0200868 TestDefaultSourceAddress(ipv6_default_addr);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700869}
870
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000871TEST_F(VirtualSocketServerTest, connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000872 ConnectTest(kIPv4AnyAddress);
873}
874
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000875TEST_F(VirtualSocketServerTest, connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000876 ConnectTest(kIPv6AnyAddress);
877}
878
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000879TEST_F(VirtualSocketServerTest, connect_to_non_listener_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000880 ConnectToNonListenerTest(kIPv4AnyAddress);
881}
882
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000883TEST_F(VirtualSocketServerTest, connect_to_non_listener_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000884 ConnectToNonListenerTest(kIPv6AnyAddress);
885}
886
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000887TEST_F(VirtualSocketServerTest, close_during_connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000888 CloseDuringConnectTest(kIPv4AnyAddress);
889}
890
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000891TEST_F(VirtualSocketServerTest, close_during_connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000892 CloseDuringConnectTest(kIPv6AnyAddress);
893}
894
895TEST_F(VirtualSocketServerTest, close_v4) {
896 CloseTest(kIPv4AnyAddress);
897}
898
899TEST_F(VirtualSocketServerTest, close_v6) {
900 CloseTest(kIPv6AnyAddress);
901}
902
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000903TEST_F(VirtualSocketServerTest, tcp_send_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000904 TcpSendTest(kIPv4AnyAddress);
905}
906
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000907TEST_F(VirtualSocketServerTest, tcp_send_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000908 TcpSendTest(kIPv6AnyAddress);
909}
910
911TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v4) {
912 TcpSendsPacketsInOrderTest(kIPv4AnyAddress);
913}
914
915TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v6) {
916 TcpSendsPacketsInOrderTest(kIPv6AnyAddress);
917}
918
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000919TEST_F(VirtualSocketServerTest, bandwidth_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000920 BandwidthTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000921}
922
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000923TEST_F(VirtualSocketServerTest, bandwidth_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000924 BandwidthTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000925}
926
deadbeef22e08142017-06-12 14:30:28 -0700927TEST_F(VirtualSocketServerTest, delay_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000928 DelayTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000929}
930
deadbeef22e08142017-06-12 14:30:28 -0700931TEST_F(VirtualSocketServerTest, delay_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000932 DelayTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000933}
934
935// Works, receiving socket sees 127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000936TEST_F(VirtualSocketServerTest, CanConnectFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000937 CrossFamilyConnectionTest(SocketAddress("::ffff:127.0.0.2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200938 SocketAddress("0.0.0.0", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000939}
940
941// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000942TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000943 CrossFamilyConnectionTest(SocketAddress("::2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200944 SocketAddress("0.0.0.0", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000945}
946
947// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000948TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000949 CrossFamilyConnectionTest(SocketAddress("::2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200950 SocketAddress("::ffff:127.0.0.1", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000951}
952
953// Works. receiving socket sees ::ffff:127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000954TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000955 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200956 SocketAddress("::", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000957}
958
959// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000960TEST_F(VirtualSocketServerTest, CantConnectFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000961 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200962 SocketAddress("::1", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000963}
964
965// Works. Receiving socket sees ::ffff:127.0.0.1.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000966TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000967 CrossFamilyConnectionTest(SocketAddress("127.0.0.1", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200968 SocketAddress("::ffff:127.0.0.2", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000969}
970
971// Works, receiving socket sees a result from GetNextIP.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000972TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000973 CrossFamilyConnectionTest(SocketAddress("::", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200974 SocketAddress("0.0.0.0", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000975}
976
977// Works, receiving socket sees whatever GetNextIP gave the client.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000978TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000979 CrossFamilyConnectionTest(SocketAddress("0.0.0.0", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200980 SocketAddress("::", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000981}
982
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000983TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000984 CrossFamilyDatagramTest(SocketAddress("0.0.0.0", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200985 SocketAddress("::", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000986}
987
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000988TEST_F(VirtualSocketServerTest, CanSendDatagramFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000989 CrossFamilyDatagramTest(SocketAddress("::ffff:127.0.0.1", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200990 SocketAddress("0.0.0.0", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000991}
992
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000993TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000994 CrossFamilyDatagramTest(SocketAddress("::2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200995 SocketAddress("0.0.0.0", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000996}
997
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000998TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000999 CrossFamilyDatagramTest(SocketAddress("::2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001000 SocketAddress("::ffff:127.0.0.1", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001001}
1002
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001003TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001004 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001005 SocketAddress("::", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001006}
1007
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001008TEST_F(VirtualSocketServerTest, CantSendDatagramFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001009 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001010 SocketAddress("::1", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001011}
1012
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001013TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001014 CrossFamilyDatagramTest(SocketAddress("127.0.0.1", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001015 SocketAddress("::ffff:127.0.0.2", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001016}
1017
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001018TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001019 CrossFamilyDatagramTest(SocketAddress("::", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001020 SocketAddress("0.0.0.0", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001021}
1022
Taylor Brandstettere7536412016-09-09 13:16:15 -07001023TEST_F(VirtualSocketServerTest, SetSendingBlockedWithUdpSocket) {
Niels Möllerd0b88792021-08-12 10:32:30 +02001024 Socket* socket1 = ss_.CreateSocket(kIPv4AnyAddress.family(), SOCK_DGRAM);
1025 std::unique_ptr<Socket> socket2 =
1026 absl::WrapUnique(ss_.CreateSocket(kIPv4AnyAddress.family(), SOCK_DGRAM));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001027 socket1->Bind(kIPv4AnyAddress);
1028 socket2->Bind(kIPv4AnyAddress);
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001029 auto client1 = std::make_unique<TestClient>(
1030 std::make_unique<AsyncUDPSocket>(socket1), &fake_clock_);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001031
nisse32f25052017-05-08 01:57:18 -07001032 ss_.SetSendingBlocked(true);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001033 EXPECT_EQ(-1, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1034 EXPECT_TRUE(socket1->IsBlocking());
1035 EXPECT_EQ(0, client1->ready_to_send_count());
1036
nisse32f25052017-05-08 01:57:18 -07001037 ss_.SetSendingBlocked(false);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001038 EXPECT_EQ(1, client1->ready_to_send_count());
1039 EXPECT_EQ(3, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1040}
1041
1042TEST_F(VirtualSocketServerTest, SetSendingBlockedWithTcpSocket) {
1043 constexpr size_t kBufferSize = 1024;
nisse32f25052017-05-08 01:57:18 -07001044 ss_.set_send_buffer_capacity(kBufferSize);
1045 ss_.set_recv_buffer_capacity(kBufferSize);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001046
kwibergd0d81482017-04-18 03:18:22 -07001047 StreamSink sink;
Niels Möllerd0b88792021-08-12 10:32:30 +02001048 std::unique_ptr<Socket> socket1 =
1049 absl::WrapUnique(ss_.CreateSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
1050 std::unique_ptr<Socket> socket2 =
1051 absl::WrapUnique(ss_.CreateSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -07001052 sink.Monitor(socket1.get());
1053 sink.Monitor(socket2.get());
Taylor Brandstettere7536412016-09-09 13:16:15 -07001054 socket1->Bind(kIPv4AnyAddress);
1055 socket2->Bind(kIPv4AnyAddress);
1056
1057 // Connect sockets.
1058 EXPECT_EQ(0, socket1->Connect(socket2->GetLocalAddress()));
1059 EXPECT_EQ(0, socket2->Connect(socket1->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -07001060 ss_.ProcessMessagesUntilIdle();
Taylor Brandstettere7536412016-09-09 13:16:15 -07001061
1062 char data[kBufferSize] = {};
1063
1064 // First Send call will fill the send buffer but not send anything.
nisse32f25052017-05-08 01:57:18 -07001065 ss_.SetSendingBlocked(true);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001066 EXPECT_EQ(static_cast<int>(kBufferSize), socket1->Send(data, kBufferSize));
nisse32f25052017-05-08 01:57:18 -07001067 ss_.ProcessMessagesUntilIdle();
1068 EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
1069 EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001070 EXPECT_FALSE(socket1->IsBlocking());
1071
1072 // Since the send buffer is full, next Send will result in EWOULDBLOCK.
1073 EXPECT_EQ(-1, socket1->Send(data, kBufferSize));
nisse32f25052017-05-08 01:57:18 -07001074 EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
1075 EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001076 EXPECT_TRUE(socket1->IsBlocking());
1077
1078 // When sending is unblocked, the buffered data should be sent and
1079 // SignalWriteEvent should fire.
nisse32f25052017-05-08 01:57:18 -07001080 ss_.SetSendingBlocked(false);
1081 ss_.ProcessMessagesUntilIdle();
1082 EXPECT_TRUE(sink.Check(socket1.get(), SSE_WRITE));
1083 EXPECT_TRUE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001084}
1085
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001086TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02001087 const uint32_t kTestMean[] = {10, 100, 333, 1000};
Yves Gerey665174f2018-06-19 15:03:05 +02001088 const double kTestDev[] = {0.25, 0.1, 0.01};
Taylor Brandstettere7536412016-09-09 13:16:15 -07001089 // TODO(deadbeef): The current code only works for 1000 data points or more.
Peter Boström0c4e06b2015-10-07 12:23:21 +02001090 const uint32_t kTestSamples[] = {/*10, 100,*/ 1000};
tfarina5237aaf2015-11-10 23:44:30 -08001091 for (size_t midx = 0; midx < arraysize(kTestMean); ++midx) {
1092 for (size_t didx = 0; didx < arraysize(kTestDev); ++didx) {
1093 for (size_t sidx = 0; sidx < arraysize(kTestSamples); ++sidx) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001094 ASSERT_LT(0u, kTestSamples[sidx]);
Peter Boström0c4e06b2015-10-07 12:23:21 +02001095 const uint32_t kStdDev =
1096 static_cast<uint32_t>(kTestDev[didx] * kTestMean[midx]);
Niels Möller983627c2021-02-09 15:12:28 +01001097 std::unique_ptr<VirtualSocketServer::Function> f =
Yves Gerey665174f2018-06-19 15:03:05 +02001098 VirtualSocketServer::CreateDistribution(kTestMean[midx], kStdDev,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001099 kTestSamples[sidx]);
Niels Möller983627c2021-02-09 15:12:28 +01001100 ASSERT_TRUE(nullptr != f.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001101 ASSERT_EQ(kTestSamples[sidx], f->size());
1102 double sum = 0;
Peter Boström0c4e06b2015-10-07 12:23:21 +02001103 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001104 sum += (*f)[i].second;
1105 }
1106 const double mean = sum / f->size();
1107 double sum_sq_dev = 0;
Peter Boström0c4e06b2015-10-07 12:23:21 +02001108 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001109 double dev = (*f)[i].second - mean;
1110 sum_sq_dev += dev * dev;
1111 }
1112 const double stddev = sqrt(sum_sq_dev / f->size());
1113 EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx])
Yves Gerey665174f2018-06-19 15:03:05 +02001114 << "M=" << kTestMean[midx] << " SD=" << kStdDev
1115 << " N=" << kTestSamples[sidx];
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001116 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev)
Yves Gerey665174f2018-06-19 15:03:05 +02001117 << "M=" << kTestMean[midx] << " SD=" << kStdDev
1118 << " N=" << kTestSamples[sidx];
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001119 }
1120 }
1121 }
1122}
Mirko Bonadeie10b1632018-12-11 18:43:40 +01001123
1124} // namespace
1125} // namespace rtc