blob: b274b40857d63f4251d300ae1c6bd8e31cc88961 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
2 * Copyright 2006 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include <math.h>
Yves Gerey3e707812018-11-28 16:47:49 +010012#include <stdint.h>
13#include <stdlib.h>
14#include <string.h>
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000015#include <time.h>
16#if defined(WEBRTC_POSIX)
17#include <netinet/in.h>
18#endif
19
Yves Gerey3e707812018-11-28 16:47:49 +010020#include <algorithm>
jbauch555604a2016-04-26 03:13:22 -070021#include <memory>
Yves Gerey3e707812018-11-28 16:47:49 +010022#include <utility>
jbauch555604a2016-04-26 03:13:22 -070023
Karl Wiberg918f50c2018-07-05 11:40:33 +020024#include "absl/memory/memory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020025#include "rtc_base/arraysize.h"
Steve Anton10542f22019-01-11 09:11:00 -080026#include "rtc_base/async_packet_socket.h"
27#include "rtc_base/async_socket.h"
28#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"
Yves Gerey3e707812018-11-28 16:47:49 +010032#include "rtc_base/location.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020033#include "rtc_base/logging.h"
Steve Anton10542f22019-01-11 09:11:00 -080034#include "rtc_base/message_handler.h"
Yves Gerey3e707812018-11-28 16:47:49 +010035#include "rtc_base/socket.h"
Steve Anton10542f22019-01-11 09:11:00 -080036#include "rtc_base/socket_address.h"
37#include "rtc_base/test_client.h"
38#include "rtc_base/test_utils.h"
Yves Gerey3e707812018-11-28 16:47:49 +010039#include "rtc_base/third_party/sigslot/sigslot.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020040#include "rtc_base/thread.h"
Steve Anton10542f22019-01-11 09:11:00 -080041#include "rtc_base/time_utils.h"
42#include "rtc_base/virtual_socket_server.h"
Yves Gerey3e707812018-11-28 16:47:49 +010043#include "test/gtest.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000044
Mirko Bonadeie10b1632018-12-11 18:43:40 +010045namespace rtc {
46namespace {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000047
kwibergd0d81482017-04-18 03:18:22 -070048using webrtc::testing::SSE_CLOSE;
49using webrtc::testing::SSE_ERROR;
50using webrtc::testing::SSE_OPEN;
51using webrtc::testing::SSE_READ;
52using webrtc::testing::SSE_WRITE;
53using webrtc::testing::StreamSink;
54
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000055// Sends at a constant rate but with random packet sizes.
56struct Sender : public MessageHandler {
Peter Boström0c4e06b2015-10-07 12:23:21 +020057 Sender(Thread* th, AsyncSocket* s, uint32_t rt)
58 : thread(th),
Mirko Bonadei317a1f02019-09-17 17:06:18 +020059 socket(std::make_unique<AsyncUDPSocket>(s)),
Peter Boström0c4e06b2015-10-07 12:23:21 +020060 done(false),
61 rate(rt),
62 count(0) {
Honghai Zhang82d78622016-05-06 11:29:15 -070063 last_send = rtc::TimeMillis();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070064 thread->PostDelayed(RTC_FROM_HERE, NextDelay(), this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000065 }
66
Peter Boström0c4e06b2015-10-07 12:23:21 +020067 uint32_t NextDelay() {
68 uint32_t size = (rand() % 4096) + 1;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000069 return 1000 * size / rate;
70 }
71
Steve Anton9de3aac2017-10-24 10:08:26 -070072 void OnMessage(Message* pmsg) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000073 ASSERT_EQ(1u, pmsg->message_id);
74
75 if (done)
76 return;
77
Honghai Zhang82d78622016-05-06 11:29:15 -070078 int64_t cur_time = rtc::TimeMillis();
79 int64_t delay = cur_time - last_send;
80 uint32_t size = static_cast<uint32_t>(rate * delay / 1000);
Peter Boström0c4e06b2015-10-07 12:23:21 +020081 size = std::min<uint32_t>(size, 4096);
82 size = std::max<uint32_t>(size, sizeof(uint32_t));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000083
84 count += size;
85 memcpy(dummy, &cur_time, sizeof(cur_time));
86 socket->Send(dummy, size, options);
87
88 last_send = cur_time;
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070089 thread->PostDelayed(RTC_FROM_HERE, NextDelay(), this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000090 }
91
92 Thread* thread;
jbauch555604a2016-04-26 03:13:22 -070093 std::unique_ptr<AsyncUDPSocket> socket;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000094 rtc::PacketOptions options;
95 bool done;
Peter Boström0c4e06b2015-10-07 12:23:21 +020096 uint32_t rate; // bytes per second
97 uint32_t count;
Honghai Zhang82d78622016-05-06 11:29:15 -070098 int64_t last_send;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000099 char dummy[4096];
100};
101
102struct Receiver : public MessageHandler, public sigslot::has_slots<> {
Peter Boström0c4e06b2015-10-07 12:23:21 +0200103 Receiver(Thread* th, AsyncSocket* s, uint32_t bw)
104 : thread(th),
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200105 socket(std::make_unique<AsyncUDPSocket>(s)),
Peter Boström0c4e06b2015-10-07 12:23:21 +0200106 bandwidth(bw),
107 done(false),
108 count(0),
109 sec_count(0),
110 sum(0),
111 sum_sq(0),
112 samples(0) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000113 socket->SignalReadPacket.connect(this, &Receiver::OnReadPacket);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700114 thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000115 }
116
Steve Anton9de3aac2017-10-24 10:08:26 -0700117 ~Receiver() override { thread->Clear(this); }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000118
Yves Gerey665174f2018-06-19 15:03:05 +0200119 void OnReadPacket(AsyncPacketSocket* s,
120 const char* data,
121 size_t size,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000122 const SocketAddress& remote_addr,
Niels Möllere6933812018-11-05 13:01:41 +0100123 const int64_t& /* packet_time_us */) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000124 ASSERT_EQ(socket.get(), s);
125 ASSERT_GE(size, 4U);
126
127 count += size;
128 sec_count += size;
129
Peter Boström0c4e06b2015-10-07 12:23:21 +0200130 uint32_t send_time = *reinterpret_cast<const uint32_t*>(data);
Honghai Zhang82d78622016-05-06 11:29:15 -0700131 uint32_t recv_time = rtc::TimeMillis();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200132 uint32_t delay = recv_time - send_time;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000133 sum += delay;
134 sum_sq += delay * delay;
135 samples += 1;
136 }
137
Steve Anton9de3aac2017-10-24 10:08:26 -0700138 void OnMessage(Message* pmsg) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000139 ASSERT_EQ(1u, pmsg->message_id);
140
141 if (done)
142 return;
143
144 // It is always possible for us to receive more than expected because
145 // packets can be further delayed in delivery.
146 if (bandwidth > 0)
147 ASSERT_TRUE(sec_count <= 5 * bandwidth / 4);
148 sec_count = 0;
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700149 thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000150 }
151
152 Thread* thread;
jbauch555604a2016-04-26 03:13:22 -0700153 std::unique_ptr<AsyncUDPSocket> socket;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200154 uint32_t bandwidth;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000155 bool done;
156 size_t count;
157 size_t sec_count;
158 double sum;
159 double sum_sq;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200160 uint32_t samples;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000161};
162
deadbeef22e08142017-06-12 14:30:28 -0700163// Note: This test uses a fake clock in addition to a virtual network.
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200164class VirtualSocketServerTest : public ::testing::Test {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000165 public:
deadbeef37f5ecf2017-02-27 14:06:41 -0800166 VirtualSocketServerTest()
deadbeef22e08142017-06-12 14:30:28 -0700167 : ss_(&fake_clock_),
168 thread_(&ss_),
deadbeef37f5ecf2017-02-27 14:06:41 -0800169 kIPv4AnyAddress(IPAddress(INADDR_ANY), 0),
170 kIPv6AnyAddress(IPAddress(in6addr_any), 0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000171
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000172 void CheckPortIncrementalization(const SocketAddress& post,
173 const SocketAddress& pre) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000174 EXPECT_EQ(post.port(), pre.port() + 1);
175 IPAddress post_ip = post.ipaddr();
176 IPAddress pre_ip = pre.ipaddr();
177 EXPECT_EQ(pre_ip.family(), post_ip.family());
178 if (post_ip.family() == AF_INET) {
179 in_addr pre_ipv4 = pre_ip.ipv4_address();
180 in_addr post_ipv4 = post_ip.ipv4_address();
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000181 EXPECT_EQ(post_ipv4.s_addr, pre_ipv4.s_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000182 } else if (post_ip.family() == AF_INET6) {
183 in6_addr post_ip6 = post_ip.ipv6_address();
184 in6_addr pre_ip6 = pre_ip.ipv6_address();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200185 uint32_t* post_as_ints = reinterpret_cast<uint32_t*>(&post_ip6.s6_addr);
186 uint32_t* pre_as_ints = reinterpret_cast<uint32_t*>(&pre_ip6.s6_addr);
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000187 EXPECT_EQ(post_as_ints[3], pre_as_ints[3]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000188 }
189 }
190
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700191 // Test a client can bind to the any address, and all sent packets will have
192 // the default route as the source address. Also, it can receive packets sent
193 // to the default route.
194 void TestDefaultRoute(const IPAddress& default_route) {
nisse32f25052017-05-08 01:57:18 -0700195 ss_.SetDefaultRoute(default_route);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700196
197 // Create client1 bound to the any address.
198 AsyncSocket* socket =
nisse32f25052017-05-08 01:57:18 -0700199 ss_.CreateAsyncSocket(default_route.family(), SOCK_DGRAM);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700200 socket->Bind(EmptySocketAddressWithFamily(default_route.family()));
201 SocketAddress client1_any_addr = socket->GetLocalAddress();
202 EXPECT_TRUE(client1_any_addr.IsAnyIP());
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200203 auto client1 = std::make_unique<TestClient>(
204 std::make_unique<AsyncUDPSocket>(socket), &fake_clock_);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700205
206 // Create client2 bound to the default route.
207 AsyncSocket* socket2 =
nisse32f25052017-05-08 01:57:18 -0700208 ss_.CreateAsyncSocket(default_route.family(), SOCK_DGRAM);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700209 socket2->Bind(SocketAddress(default_route, 0));
210 SocketAddress client2_addr = socket2->GetLocalAddress();
211 EXPECT_FALSE(client2_addr.IsAnyIP());
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200212 auto client2 = std::make_unique<TestClient>(
213 std::make_unique<AsyncUDPSocket>(socket2), &fake_clock_);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700214
215 // Client1 sends to client2, client2 should see the default route as
216 // client1's address.
217 SocketAddress client1_addr;
218 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
219 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
220 EXPECT_EQ(client1_addr,
221 SocketAddress(default_route, client1_any_addr.port()));
222
223 // Client2 can send back to client1's default route address.
224 EXPECT_EQ(3, client2->SendTo("foo", 3, client1_addr));
225 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
226 }
227
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000228 void BasicTest(const SocketAddress& initial_addr) {
nisse32f25052017-05-08 01:57:18 -0700229 AsyncSocket* socket =
230 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000231 socket->Bind(initial_addr);
232 SocketAddress server_addr = socket->GetLocalAddress();
233 // Make sure VSS didn't switch families on us.
234 EXPECT_EQ(server_addr.family(), initial_addr.family());
235
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200236 auto client1 = std::make_unique<TestClient>(
237 std::make_unique<AsyncUDPSocket>(socket), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000238 AsyncSocket* socket2 =
nisse32f25052017-05-08 01:57:18 -0700239 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200240 auto client2 = std::make_unique<TestClient>(
241 std::make_unique<AsyncUDPSocket>(socket2), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000242
243 SocketAddress client2_addr;
244 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
245 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
246
247 SocketAddress client1_addr;
248 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
249 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
250 EXPECT_EQ(client1_addr, server_addr);
251
252 SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family());
253 for (int i = 0; i < 10; i++) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200254 client2 = std::make_unique<TestClient>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200255 absl::WrapUnique(AsyncUDPSocket::Create(&ss_, empty)), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000256
257 SocketAddress next_client2_addr;
258 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
259 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr));
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000260 CheckPortIncrementalization(next_client2_addr, client2_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000261 // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1);
262
263 SocketAddress server_addr2;
264 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr));
265 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2));
266 EXPECT_EQ(server_addr2, server_addr);
267
268 client2_addr = next_client2_addr;
269 }
270 }
271
272 // initial_addr should be made from either INADDR_ANY or in6addr_any.
273 void ConnectTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700274 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000275 SocketAddress accept_addr;
276 const SocketAddress kEmptyAddr =
277 EmptySocketAddressWithFamily(initial_addr.family());
278
279 // Create client
Karl Wiberg918f50c2018-07-05 11:40:33 +0200280 std::unique_ptr<AsyncSocket> client = absl::WrapUnique(
281 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700282 sink.Monitor(client.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000283 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
284 EXPECT_TRUE(client->GetLocalAddress().IsNil());
285
286 // Create server
Karl Wiberg918f50c2018-07-05 11:40:33 +0200287 std::unique_ptr<AsyncSocket> server = absl::WrapUnique(
288 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700289 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000290 EXPECT_NE(0, server->Listen(5)); // Bind required
291 EXPECT_EQ(0, server->Bind(initial_addr));
292 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
293 EXPECT_EQ(0, server->Listen(5));
294 EXPECT_EQ(server->GetState(), AsyncSocket::CS_CONNECTING);
295
296 // No pending server connections
nisse32f25052017-05-08 01:57:18 -0700297 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800298 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000299 EXPECT_EQ(AF_UNSPEC, accept_addr.family());
300
301 // Attempt connect to listening socket
302 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
Yves Gerey665174f2018-06-19 15:03:05 +0200303 EXPECT_NE(client->GetLocalAddress(), kEmptyAddr); // Implicit Bind
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000304 EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family()); // Implicit Bind
305 EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress());
306
307 // Client is connecting
308 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
nisse32f25052017-05-08 01:57:18 -0700309 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
310 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000311
nisse32f25052017-05-08 01:57:18 -0700312 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000313
314 // Client still connecting
315 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
nisse32f25052017-05-08 01:57:18 -0700316 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
317 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000318
319 // Server has pending connection
nisse32f25052017-05-08 01:57:18 -0700320 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
Karl Wiberg918f50c2018-07-05 11:40:33 +0200321 std::unique_ptr<Socket> accepted =
322 absl::WrapUnique(server->Accept(&accept_addr));
deadbeef37f5ecf2017-02-27 14:06:41 -0800323 EXPECT_TRUE(nullptr != accepted);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000324 EXPECT_NE(accept_addr, kEmptyAddr);
325 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr);
326
327 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED);
328 EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress());
329 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress());
330
nisse32f25052017-05-08 01:57:18 -0700331 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000332
333 // Client has connected
334 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTED);
nisse32f25052017-05-08 01:57:18 -0700335 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
336 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000337 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
338 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
339 }
340
341 void ConnectToNonListenerTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700342 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000343 SocketAddress accept_addr;
344 const SocketAddress nil_addr;
345 const SocketAddress empty_addr =
346 EmptySocketAddressWithFamily(initial_addr.family());
347
348 // Create client
Karl Wiberg918f50c2018-07-05 11:40:33 +0200349 std::unique_ptr<AsyncSocket> client = absl::WrapUnique(
350 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700351 sink.Monitor(client.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000352
353 // Create server
Karl Wiberg918f50c2018-07-05 11:40:33 +0200354 std::unique_ptr<AsyncSocket> server = absl::WrapUnique(
355 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700356 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000357 EXPECT_EQ(0, server->Bind(initial_addr));
358 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
359 // Attempt connect to non-listening socket
360 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
361
nisse32f25052017-05-08 01:57:18 -0700362 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000363
364 // No pending server connections
nisse32f25052017-05-08 01:57:18 -0700365 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800366 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000367 EXPECT_EQ(accept_addr, nil_addr);
368
369 // Connection failed
370 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
nisse32f25052017-05-08 01:57:18 -0700371 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
372 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000373 EXPECT_EQ(client->GetRemoteAddress(), nil_addr);
374 }
375
376 void CloseDuringConnectTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700377 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000378 SocketAddress accept_addr;
379 const SocketAddress empty_addr =
380 EmptySocketAddressWithFamily(initial_addr.family());
381
382 // Create client and server
jbauch555604a2016-04-26 03:13:22 -0700383 std::unique_ptr<AsyncSocket> client(
nisse32f25052017-05-08 01:57:18 -0700384 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000385 sink.Monitor(client.get());
jbauch555604a2016-04-26 03:13:22 -0700386 std::unique_ptr<AsyncSocket> server(
nisse32f25052017-05-08 01:57:18 -0700387 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000388 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
397 // Server close before socket enters accept queue
kwibergd0d81482017-04-18 03:18:22 -0700398 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000399 server->Close();
400
nisse32f25052017-05-08 01:57:18 -0700401 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000402
403 // Result: connection failed
404 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700405 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000406
nisse32f25052017-05-08 01:57:18 -0700407 server.reset(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000408 sink.Monitor(server.get());
409
410 // Initiate connect
411 EXPECT_EQ(0, server->Bind(initial_addr));
412 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
413
414 EXPECT_EQ(0, server->Listen(5));
415 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
416
nisse32f25052017-05-08 01:57:18 -0700417 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000418
419 // Server close while socket is in accept queue
kwibergd0d81482017-04-18 03:18:22 -0700420 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000421 server->Close();
422
nisse32f25052017-05-08 01:57:18 -0700423 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000424
425 // Result: connection failed
426 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700427 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000428
429 // New server
nisse32f25052017-05-08 01:57:18 -0700430 server.reset(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000431 sink.Monitor(server.get());
432
433 // Initiate connect
434 EXPECT_EQ(0, server->Bind(initial_addr));
435 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
436
437 EXPECT_EQ(0, server->Listen(5));
438 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
439
nisse32f25052017-05-08 01:57:18 -0700440 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000441
442 // Server accepts connection
kwibergd0d81482017-04-18 03:18:22 -0700443 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
jbauch555604a2016-04-26 03:13:22 -0700444 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
deadbeef37f5ecf2017-02-27 14:06:41 -0800445 ASSERT_TRUE(nullptr != accepted.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000446 sink.Monitor(accepted.get());
447
448 // Client closes before connection complets
449 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED);
450
451 // Connected message has not been processed yet.
452 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
453 client->Close();
454
nisse32f25052017-05-08 01:57:18 -0700455 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000456
457 // Result: accepted socket closes
458 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700459 EXPECT_TRUE(sink.Check(accepted.get(), SSE_CLOSE));
460 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000461 }
462
463 void CloseTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700464 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000465 const SocketAddress kEmptyAddr;
466
467 // Create clients
Karl Wiberg918f50c2018-07-05 11:40:33 +0200468 std::unique_ptr<AsyncSocket> a = absl::WrapUnique(
469 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700470 sink.Monitor(a.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000471 a->Bind(initial_addr);
472 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
473
Karl Wiberg918f50c2018-07-05 11:40:33 +0200474 std::unique_ptr<AsyncSocket> b = absl::WrapUnique(
475 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000476 sink.Monitor(b.get());
477 b->Bind(initial_addr);
478 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
479
480 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
481 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
482
nisse32f25052017-05-08 01:57:18 -0700483 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000484
nisse32f25052017-05-08 01:57:18 -0700485 EXPECT_TRUE(sink.Check(a.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000486 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CONNECTED);
487 EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress());
488
kwibergd0d81482017-04-18 03:18:22 -0700489 EXPECT_TRUE(sink.Check(b.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000490 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CONNECTED);
491 EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress());
492
493 EXPECT_EQ(1, a->Send("a", 1));
494 b->Close();
495 EXPECT_EQ(1, a->Send("b", 1));
496
nisse32f25052017-05-08 01:57:18 -0700497 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000498
499 char buffer[10];
kwibergd0d81482017-04-18 03:18:22 -0700500 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
Stefan Holmer9131efd2016-05-23 18:19:26 +0200501 EXPECT_EQ(-1, b->Recv(buffer, 10, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000502
nisse32f25052017-05-08 01:57:18 -0700503 EXPECT_TRUE(sink.Check(a.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000504 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CLOSED);
505 EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr);
506
507 // No signal for Closer
kwibergd0d81482017-04-18 03:18:22 -0700508 EXPECT_FALSE(sink.Check(b.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000509 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CLOSED);
510 EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr);
511 }
512
513 void TcpSendTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700514 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000515 const SocketAddress kEmptyAddr;
516
517 // Connect two sockets
Karl Wiberg918f50c2018-07-05 11:40:33 +0200518 std::unique_ptr<AsyncSocket> a = absl::WrapUnique(
519 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700520 sink.Monitor(a.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000521 a->Bind(initial_addr);
522 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
523
Karl Wiberg918f50c2018-07-05 11:40:33 +0200524 std::unique_ptr<AsyncSocket> b = absl::WrapUnique(
525 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700526 sink.Monitor(b.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000527 b->Bind(initial_addr);
528 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
529
530 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
531 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
532
nisse32f25052017-05-08 01:57:18 -0700533 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000534
535 const size_t kBufferSize = 2000;
nisse32f25052017-05-08 01:57:18 -0700536 ss_.set_send_buffer_capacity(kBufferSize);
537 ss_.set_recv_buffer_capacity(kBufferSize);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000538
539 const size_t kDataSize = 5000;
540 char send_buffer[kDataSize], recv_buffer[kDataSize];
541 for (size_t i = 0; i < kDataSize; ++i)
542 send_buffer[i] = static_cast<char>(i % 256);
543 memset(recv_buffer, 0, sizeof(recv_buffer));
544 size_t send_pos = 0, recv_pos = 0;
545
546 // Can't send more than send buffer in one write
547 int result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
548 EXPECT_EQ(static_cast<int>(kBufferSize), result);
549 send_pos += result;
550
nisse32f25052017-05-08 01:57:18 -0700551 ss_.ProcessMessagesUntilIdle();
552 EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE));
553 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000554
555 // Receive buffer is already filled, fill send buffer again
556 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
557 EXPECT_EQ(static_cast<int>(kBufferSize), result);
558 send_pos += result;
559
nisse32f25052017-05-08 01:57:18 -0700560 ss_.ProcessMessagesUntilIdle();
561 EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE));
562 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000563
564 // No more room in send or receive buffer
565 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
566 EXPECT_EQ(-1, result);
567 EXPECT_TRUE(a->IsBlocking());
568
569 // Read a subset of the data
Stefan Holmer9131efd2016-05-23 18:19:26 +0200570 result = b->Recv(recv_buffer + recv_pos, 500, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000571 EXPECT_EQ(500, result);
572 recv_pos += result;
573
nisse32f25052017-05-08 01:57:18 -0700574 ss_.ProcessMessagesUntilIdle();
575 EXPECT_TRUE(sink.Check(a.get(), SSE_WRITE));
576 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000577
578 // Room for more on the sending side
579 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
580 EXPECT_EQ(500, result);
581 send_pos += result;
582
583 // Empty the recv buffer
584 while (true) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200585 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000586 if (result < 0) {
587 EXPECT_EQ(-1, result);
588 EXPECT_TRUE(b->IsBlocking());
589 break;
590 }
591 recv_pos += result;
592 }
593
nisse32f25052017-05-08 01:57:18 -0700594 ss_.ProcessMessagesUntilIdle();
595 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000596
597 // Continue to empty the recv buffer
598 while (true) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200599 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000600 if (result < 0) {
601 EXPECT_EQ(-1, result);
602 EXPECT_TRUE(b->IsBlocking());
603 break;
604 }
605 recv_pos += result;
606 }
607
608 // Send last of the data
609 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
610 EXPECT_EQ(500, result);
611 send_pos += result;
612
nisse32f25052017-05-08 01:57:18 -0700613 ss_.ProcessMessagesUntilIdle();
614 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000615
616 // Receive the last of the data
617 while (true) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200618 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000619 if (result < 0) {
620 EXPECT_EQ(-1, result);
621 EXPECT_TRUE(b->IsBlocking());
622 break;
623 }
624 recv_pos += result;
625 }
626
nisse32f25052017-05-08 01:57:18 -0700627 ss_.ProcessMessagesUntilIdle();
628 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000629
630 // The received data matches the sent data
631 EXPECT_EQ(kDataSize, send_pos);
632 EXPECT_EQ(kDataSize, recv_pos);
633 EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize));
634 }
635
636 void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) {
637 const SocketAddress kEmptyAddr;
638
639 // Connect two sockets
Karl Wiberg918f50c2018-07-05 11:40:33 +0200640 std::unique_ptr<AsyncSocket> a = absl::WrapUnique(
641 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
642 std::unique_ptr<AsyncSocket> b = absl::WrapUnique(
643 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000644 a->Bind(initial_addr);
645 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
646
647 b->Bind(initial_addr);
648 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
649
650 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
651 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -0700652 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000653
654 // First, deliver all packets in 0 ms.
Yves Gerey665174f2018-06-19 15:03:05 +0200655 char buffer[2] = {0, 0};
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000656 const char cNumPackets = 10;
657 for (char i = 0; i < cNumPackets; ++i) {
658 buffer[0] = '0' + i;
659 EXPECT_EQ(1, a->Send(buffer, 1));
660 }
661
nisse32f25052017-05-08 01:57:18 -0700662 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000663
664 for (char i = 0; i < cNumPackets; ++i) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200665 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000666 EXPECT_EQ(static_cast<char>('0' + i), buffer[0]);
667 }
668
669 // Next, deliver packets at random intervals
Peter Boström0c4e06b2015-10-07 12:23:21 +0200670 const uint32_t mean = 50;
671 const uint32_t stddev = 50;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000672
nisse32f25052017-05-08 01:57:18 -0700673 ss_.set_delay_mean(mean);
674 ss_.set_delay_stddev(stddev);
675 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000676
677 for (char i = 0; i < cNumPackets; ++i) {
678 buffer[0] = 'A' + i;
679 EXPECT_EQ(1, a->Send(buffer, 1));
680 }
681
nisse32f25052017-05-08 01:57:18 -0700682 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000683
684 for (char i = 0; i < cNumPackets; ++i) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200685 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000686 EXPECT_EQ(static_cast<char>('A' + i), buffer[0]);
687 }
688 }
689
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000690 // It is important that initial_addr's port has to be 0 such that the
691 // incremental port behavior could ensure the 2 Binds result in different
692 // address.
693 void BandwidthTest(const SocketAddress& initial_addr) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000694 AsyncSocket* send_socket =
nisse32f25052017-05-08 01:57:18 -0700695 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000696 AsyncSocket* recv_socket =
nisse32f25052017-05-08 01:57:18 -0700697 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000698 ASSERT_EQ(0, send_socket->Bind(initial_addr));
699 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
700 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
701 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000702 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
703
Peter Boström0c4e06b2015-10-07 12:23:21 +0200704 uint32_t bandwidth = 64 * 1024;
nisse32f25052017-05-08 01:57:18 -0700705 ss_.set_bandwidth(bandwidth);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000706
707 Thread* pthMain = Thread::Current();
708 Sender sender(pthMain, send_socket, 80 * 1024);
709 Receiver receiver(pthMain, recv_socket, bandwidth);
710
deadbeef22e08142017-06-12 14:30:28 -0700711 // Allow the sender to run for 5 (simulated) seconds, then be stopped for 5
712 // seconds.
713 SIMULATED_WAIT(false, 5000, fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000714 sender.done = true;
deadbeef22e08142017-06-12 14:30:28 -0700715 SIMULATED_WAIT(false, 5000, fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000716
deadbeef22e08142017-06-12 14:30:28 -0700717 // Ensure the observed bandwidth fell within a reasonable margin of error.
718 EXPECT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4);
719 EXPECT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000720
nisse32f25052017-05-08 01:57:18 -0700721 ss_.set_bandwidth(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000722 }
723
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000724 // It is important that initial_addr's port has to be 0 such that the
725 // incremental port behavior could ensure the 2 Binds result in different
726 // address.
727 void DelayTest(const SocketAddress& initial_addr) {
deadbeef37f5ecf2017-02-27 14:06:41 -0800728 time_t seed = ::time(nullptr);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100729 RTC_LOG(LS_VERBOSE) << "seed = " << seed;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000730 srand(static_cast<unsigned int>(seed));
731
Peter Boström0c4e06b2015-10-07 12:23:21 +0200732 const uint32_t mean = 2000;
733 const uint32_t stddev = 500;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000734
nisse32f25052017-05-08 01:57:18 -0700735 ss_.set_delay_mean(mean);
736 ss_.set_delay_stddev(stddev);
737 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000738
739 AsyncSocket* send_socket =
nisse32f25052017-05-08 01:57:18 -0700740 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000741 AsyncSocket* recv_socket =
nisse32f25052017-05-08 01:57:18 -0700742 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000743 ASSERT_EQ(0, send_socket->Bind(initial_addr));
744 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
745 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
746 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000747 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
748
749 Thread* pthMain = Thread::Current();
750 // Avg packet size is 2K, so at 200KB/s for 10s, we should see about
751 // 1000 packets, which is necessary to get a good distribution.
752 Sender sender(pthMain, send_socket, 100 * 2 * 1024);
753 Receiver receiver(pthMain, recv_socket, 0);
754
deadbeef22e08142017-06-12 14:30:28 -0700755 // Simulate 10 seconds of packets being sent, then check the observed delay
756 // distribution.
757 SIMULATED_WAIT(false, 10000, fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000758 sender.done = receiver.done = true;
nisse32f25052017-05-08 01:57:18 -0700759 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000760
761 const double sample_mean = receiver.sum / receiver.samples;
762 double num =
763 receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum;
764 double den = receiver.samples * (receiver.samples - 1);
765 const double sample_stddev = sqrt(num / den);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100766 RTC_LOG(LS_VERBOSE) << "mean=" << sample_mean
767 << " stddev=" << sample_stddev;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000768
769 EXPECT_LE(500u, receiver.samples);
770 // We initially used a 0.1 fudge factor, but on the build machine, we
771 // have seen the value differ by as much as 0.13.
772 EXPECT_NEAR(mean, sample_mean, 0.15 * mean);
773 EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev);
774
nisse32f25052017-05-08 01:57:18 -0700775 ss_.set_delay_mean(0);
776 ss_.set_delay_stddev(0);
777 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000778 }
779
780 // Test cross-family communication between a client bound to client_addr and a
781 // server bound to server_addr. shouldSucceed indicates if communication is
782 // expected to work or not.
783 void CrossFamilyConnectionTest(const SocketAddress& client_addr,
784 const SocketAddress& server_addr,
785 bool shouldSucceed) {
kwibergd0d81482017-04-18 03:18:22 -0700786 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000787 SocketAddress accept_address;
788 const SocketAddress kEmptyAddr;
789
790 // Client gets a IPv4 address
Karl Wiberg918f50c2018-07-05 11:40:33 +0200791 std::unique_ptr<AsyncSocket> client = absl::WrapUnique(
792 ss_.CreateAsyncSocket(client_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700793 sink.Monitor(client.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000794 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
795 EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr);
796 client->Bind(client_addr);
797
798 // Server gets a non-mapped non-any IPv6 address.
799 // IPv4 sockets should not be able to connect to this.
Karl Wiberg918f50c2018-07-05 11:40:33 +0200800 std::unique_ptr<AsyncSocket> server = absl::WrapUnique(
801 ss_.CreateAsyncSocket(server_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700802 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000803 server->Bind(server_addr);
804 server->Listen(5);
805
806 if (shouldSucceed) {
807 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -0700808 ss_.ProcessMessagesUntilIdle();
809 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
810 std::unique_ptr<Socket> accepted =
Karl Wiberg918f50c2018-07-05 11:40:33 +0200811 absl::WrapUnique(server->Accept(&accept_address));
deadbeef37f5ecf2017-02-27 14:06:41 -0800812 EXPECT_TRUE(nullptr != accepted);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000813 EXPECT_NE(kEmptyAddr, accept_address);
nisse32f25052017-05-08 01:57:18 -0700814 ss_.ProcessMessagesUntilIdle();
815 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000816 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
817 } else {
818 // Check that the connection failed.
819 EXPECT_EQ(-1, client->Connect(server->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -0700820 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000821
nisse32f25052017-05-08 01:57:18 -0700822 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800823 EXPECT_TRUE(nullptr == server->Accept(&accept_address));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000824 EXPECT_EQ(accept_address, kEmptyAddr);
825 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
nisse32f25052017-05-08 01:57:18 -0700826 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000827 EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr);
828 }
829 }
830
831 // Test cross-family datagram sending between a client bound to client_addr
832 // and a server bound to server_addr. shouldSucceed indicates if sending is
jlmiller@webrtc.orgec499be2015-02-07 22:37:59 +0000833 // expected to succeed or not.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000834 void CrossFamilyDatagramTest(const SocketAddress& client_addr,
835 const SocketAddress& server_addr,
836 bool shouldSucceed) {
Steve Anton31e5bf52018-05-07 10:42:55 -0700837 AsyncSocket* socket = ss_.CreateAsyncSocket(AF_INET, SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000838 socket->Bind(server_addr);
839 SocketAddress bound_server_addr = socket->GetLocalAddress();
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200840 auto client1 = std::make_unique<TestClient>(
841 std::make_unique<AsyncUDPSocket>(socket), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000842
Steve Anton31e5bf52018-05-07 10:42:55 -0700843 AsyncSocket* socket2 = ss_.CreateAsyncSocket(AF_INET, SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000844 socket2->Bind(client_addr);
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200845 auto client2 = std::make_unique<TestClient>(
846 std::make_unique<AsyncUDPSocket>(socket2), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000847 SocketAddress client2_addr;
848
849 if (shouldSucceed) {
850 EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr));
851 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
852 SocketAddress client1_addr;
853 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
854 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
855 EXPECT_EQ(client1_addr, bound_server_addr);
856 } else {
857 EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr));
jlmiller@webrtc.orgec499be2015-02-07 22:37:59 +0000858 EXPECT_TRUE(client1->CheckNoPacket());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000859 }
860 }
861
862 protected:
deadbeef22e08142017-06-12 14:30:28 -0700863 rtc::ScopedFakeClock fake_clock_;
nisse32f25052017-05-08 01:57:18 -0700864 VirtualSocketServer ss_;
nisse7eaa4ea2017-05-08 05:25:41 -0700865 AutoSocketServerThread thread_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000866 const SocketAddress kIPv4AnyAddress;
867 const SocketAddress kIPv6AnyAddress;
868};
869
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000870TEST_F(VirtualSocketServerTest, basic_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000871 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000);
872 BasicTest(ipv4_test_addr);
873}
874
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000875TEST_F(VirtualSocketServerTest, basic_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000876 SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 5000);
877 BasicTest(ipv6_test_addr);
878}
879
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700880TEST_F(VirtualSocketServerTest, TestDefaultRoute_v4) {
881 IPAddress ipv4_default_addr(0x01020304);
882 TestDefaultRoute(ipv4_default_addr);
883}
884
885TEST_F(VirtualSocketServerTest, TestDefaultRoute_v6) {
886 IPAddress ipv6_default_addr;
887 EXPECT_TRUE(
888 IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ipv6_default_addr));
889 TestDefaultRoute(ipv6_default_addr);
890}
891
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000892TEST_F(VirtualSocketServerTest, connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000893 ConnectTest(kIPv4AnyAddress);
894}
895
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000896TEST_F(VirtualSocketServerTest, connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000897 ConnectTest(kIPv6AnyAddress);
898}
899
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000900TEST_F(VirtualSocketServerTest, connect_to_non_listener_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000901 ConnectToNonListenerTest(kIPv4AnyAddress);
902}
903
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000904TEST_F(VirtualSocketServerTest, connect_to_non_listener_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000905 ConnectToNonListenerTest(kIPv6AnyAddress);
906}
907
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000908TEST_F(VirtualSocketServerTest, close_during_connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000909 CloseDuringConnectTest(kIPv4AnyAddress);
910}
911
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000912TEST_F(VirtualSocketServerTest, close_during_connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000913 CloseDuringConnectTest(kIPv6AnyAddress);
914}
915
916TEST_F(VirtualSocketServerTest, close_v4) {
917 CloseTest(kIPv4AnyAddress);
918}
919
920TEST_F(VirtualSocketServerTest, close_v6) {
921 CloseTest(kIPv6AnyAddress);
922}
923
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000924TEST_F(VirtualSocketServerTest, tcp_send_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000925 TcpSendTest(kIPv4AnyAddress);
926}
927
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000928TEST_F(VirtualSocketServerTest, tcp_send_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000929 TcpSendTest(kIPv6AnyAddress);
930}
931
932TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v4) {
933 TcpSendsPacketsInOrderTest(kIPv4AnyAddress);
934}
935
936TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v6) {
937 TcpSendsPacketsInOrderTest(kIPv6AnyAddress);
938}
939
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000940TEST_F(VirtualSocketServerTest, bandwidth_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000941 BandwidthTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000942}
943
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000944TEST_F(VirtualSocketServerTest, bandwidth_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000945 BandwidthTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000946}
947
deadbeef22e08142017-06-12 14:30:28 -0700948TEST_F(VirtualSocketServerTest, delay_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000949 DelayTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000950}
951
deadbeef22e08142017-06-12 14:30:28 -0700952TEST_F(VirtualSocketServerTest, delay_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000953 DelayTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000954}
955
956// Works, receiving socket sees 127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000957TEST_F(VirtualSocketServerTest, CanConnectFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000958 CrossFamilyConnectionTest(SocketAddress("::ffff:127.0.0.2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200959 SocketAddress("0.0.0.0", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000960}
961
962// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000963TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000964 CrossFamilyConnectionTest(SocketAddress("::2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200965 SocketAddress("0.0.0.0", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000966}
967
968// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000969TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000970 CrossFamilyConnectionTest(SocketAddress("::2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200971 SocketAddress("::ffff:127.0.0.1", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000972}
973
974// Works. receiving socket sees ::ffff:127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000975TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000976 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200977 SocketAddress("::", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000978}
979
980// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000981TEST_F(VirtualSocketServerTest, CantConnectFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000982 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200983 SocketAddress("::1", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000984}
985
986// Works. Receiving socket sees ::ffff:127.0.0.1.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000987TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000988 CrossFamilyConnectionTest(SocketAddress("127.0.0.1", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200989 SocketAddress("::ffff:127.0.0.2", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000990}
991
992// Works, receiving socket sees a result from GetNextIP.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000993TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000994 CrossFamilyConnectionTest(SocketAddress("::", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200995 SocketAddress("0.0.0.0", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000996}
997
998// Works, receiving socket sees whatever GetNextIP gave the client.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000999TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001000 CrossFamilyConnectionTest(SocketAddress("0.0.0.0", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001001 SocketAddress("::", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001002}
1003
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001004TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001005 CrossFamilyDatagramTest(SocketAddress("0.0.0.0", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001006 SocketAddress("::", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001007}
1008
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001009TEST_F(VirtualSocketServerTest, CanSendDatagramFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001010 CrossFamilyDatagramTest(SocketAddress("::ffff:127.0.0.1", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001011 SocketAddress("0.0.0.0", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001012}
1013
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001014TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001015 CrossFamilyDatagramTest(SocketAddress("::2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001016 SocketAddress("0.0.0.0", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001017}
1018
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001019TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001020 CrossFamilyDatagramTest(SocketAddress("::2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001021 SocketAddress("::ffff:127.0.0.1", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001022}
1023
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001024TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001025 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001026 SocketAddress("::", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001027}
1028
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001029TEST_F(VirtualSocketServerTest, CantSendDatagramFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001030 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001031 SocketAddress("::1", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001032}
1033
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001034TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001035 CrossFamilyDatagramTest(SocketAddress("127.0.0.1", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001036 SocketAddress("::ffff:127.0.0.2", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001037}
1038
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001039TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001040 CrossFamilyDatagramTest(SocketAddress("::", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001041 SocketAddress("0.0.0.0", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001042}
1043
Taylor Brandstettere7536412016-09-09 13:16:15 -07001044TEST_F(VirtualSocketServerTest, SetSendingBlockedWithUdpSocket) {
1045 AsyncSocket* socket1 =
nisse32f25052017-05-08 01:57:18 -07001046 ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM);
Karl Wiberg918f50c2018-07-05 11:40:33 +02001047 std::unique_ptr<AsyncSocket> socket2 = absl::WrapUnique(
1048 ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001049 socket1->Bind(kIPv4AnyAddress);
1050 socket2->Bind(kIPv4AnyAddress);
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001051 auto client1 = std::make_unique<TestClient>(
1052 std::make_unique<AsyncUDPSocket>(socket1), &fake_clock_);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001053
nisse32f25052017-05-08 01:57:18 -07001054 ss_.SetSendingBlocked(true);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001055 EXPECT_EQ(-1, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1056 EXPECT_TRUE(socket1->IsBlocking());
1057 EXPECT_EQ(0, client1->ready_to_send_count());
1058
nisse32f25052017-05-08 01:57:18 -07001059 ss_.SetSendingBlocked(false);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001060 EXPECT_EQ(1, client1->ready_to_send_count());
1061 EXPECT_EQ(3, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1062}
1063
1064TEST_F(VirtualSocketServerTest, SetSendingBlockedWithTcpSocket) {
1065 constexpr size_t kBufferSize = 1024;
nisse32f25052017-05-08 01:57:18 -07001066 ss_.set_send_buffer_capacity(kBufferSize);
1067 ss_.set_recv_buffer_capacity(kBufferSize);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001068
kwibergd0d81482017-04-18 03:18:22 -07001069 StreamSink sink;
Karl Wiberg918f50c2018-07-05 11:40:33 +02001070 std::unique_ptr<AsyncSocket> socket1 = absl::WrapUnique(
1071 ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
1072 std::unique_ptr<AsyncSocket> socket2 = absl::WrapUnique(
1073 ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -07001074 sink.Monitor(socket1.get());
1075 sink.Monitor(socket2.get());
Taylor Brandstettere7536412016-09-09 13:16:15 -07001076 socket1->Bind(kIPv4AnyAddress);
1077 socket2->Bind(kIPv4AnyAddress);
1078
1079 // Connect sockets.
1080 EXPECT_EQ(0, socket1->Connect(socket2->GetLocalAddress()));
1081 EXPECT_EQ(0, socket2->Connect(socket1->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -07001082 ss_.ProcessMessagesUntilIdle();
Taylor Brandstettere7536412016-09-09 13:16:15 -07001083
1084 char data[kBufferSize] = {};
1085
1086 // First Send call will fill the send buffer but not send anything.
nisse32f25052017-05-08 01:57:18 -07001087 ss_.SetSendingBlocked(true);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001088 EXPECT_EQ(static_cast<int>(kBufferSize), socket1->Send(data, kBufferSize));
nisse32f25052017-05-08 01:57:18 -07001089 ss_.ProcessMessagesUntilIdle();
1090 EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
1091 EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001092 EXPECT_FALSE(socket1->IsBlocking());
1093
1094 // Since the send buffer is full, next Send will result in EWOULDBLOCK.
1095 EXPECT_EQ(-1, socket1->Send(data, kBufferSize));
nisse32f25052017-05-08 01:57:18 -07001096 EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
1097 EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001098 EXPECT_TRUE(socket1->IsBlocking());
1099
1100 // When sending is unblocked, the buffered data should be sent and
1101 // SignalWriteEvent should fire.
nisse32f25052017-05-08 01:57:18 -07001102 ss_.SetSendingBlocked(false);
1103 ss_.ProcessMessagesUntilIdle();
1104 EXPECT_TRUE(sink.Check(socket1.get(), SSE_WRITE));
1105 EXPECT_TRUE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001106}
1107
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001108TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02001109 const uint32_t kTestMean[] = {10, 100, 333, 1000};
Yves Gerey665174f2018-06-19 15:03:05 +02001110 const double kTestDev[] = {0.25, 0.1, 0.01};
Taylor Brandstettere7536412016-09-09 13:16:15 -07001111 // TODO(deadbeef): The current code only works for 1000 data points or more.
Peter Boström0c4e06b2015-10-07 12:23:21 +02001112 const uint32_t kTestSamples[] = {/*10, 100,*/ 1000};
tfarina5237aaf2015-11-10 23:44:30 -08001113 for (size_t midx = 0; midx < arraysize(kTestMean); ++midx) {
1114 for (size_t didx = 0; didx < arraysize(kTestDev); ++didx) {
1115 for (size_t sidx = 0; sidx < arraysize(kTestSamples); ++sidx) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001116 ASSERT_LT(0u, kTestSamples[sidx]);
Peter Boström0c4e06b2015-10-07 12:23:21 +02001117 const uint32_t kStdDev =
1118 static_cast<uint32_t>(kTestDev[didx] * kTestMean[midx]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001119 VirtualSocketServer::Function* f =
Yves Gerey665174f2018-06-19 15:03:05 +02001120 VirtualSocketServer::CreateDistribution(kTestMean[midx], kStdDev,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001121 kTestSamples[sidx]);
deadbeef37f5ecf2017-02-27 14:06:41 -08001122 ASSERT_TRUE(nullptr != f);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001123 ASSERT_EQ(kTestSamples[sidx], f->size());
1124 double sum = 0;
Peter Boström0c4e06b2015-10-07 12:23:21 +02001125 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001126 sum += (*f)[i].second;
1127 }
1128 const double mean = sum / f->size();
1129 double sum_sq_dev = 0;
Peter Boström0c4e06b2015-10-07 12:23:21 +02001130 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001131 double dev = (*f)[i].second - mean;
1132 sum_sq_dev += dev * dev;
1133 }
1134 const double stddev = sqrt(sum_sq_dev / f->size());
1135 EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx])
Yves Gerey665174f2018-06-19 15:03:05 +02001136 << "M=" << kTestMean[midx] << " SD=" << kStdDev
1137 << " N=" << kTestSamples[sidx];
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001138 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev)
Yves Gerey665174f2018-06-19 15:03:05 +02001139 << "M=" << kTestMean[midx] << " SD=" << kStdDev
1140 << " N=" << kTestSamples[sidx];
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001141 delete f;
1142 }
1143 }
1144 }
1145}
Mirko Bonadeie10b1632018-12-11 18:43:40 +01001146
1147} // namespace
1148} // namespace rtc