blob: ac0af08b3faa09de198be21fe80717a119c5aaac [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"
35#include "rtc_base/message_queue.h"
Yves Gerey3e707812018-11-28 16:47:49 +010036#include "rtc_base/socket.h"
Steve Anton10542f22019-01-11 09:11:00 -080037#include "rtc_base/socket_address.h"
38#include "rtc_base/test_client.h"
39#include "rtc_base/test_utils.h"
Yves Gerey3e707812018-11-28 16:47:49 +010040#include "rtc_base/third_party/sigslot/sigslot.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020041#include "rtc_base/thread.h"
Steve Anton10542f22019-01-11 09:11:00 -080042#include "rtc_base/time_utils.h"
43#include "rtc_base/virtual_socket_server.h"
Yves Gerey3e707812018-11-28 16:47:49 +010044#include "test/gtest.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000045
Mirko Bonadeie10b1632018-12-11 18:43:40 +010046namespace rtc {
47namespace {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000048
kwibergd0d81482017-04-18 03:18:22 -070049using 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;
55
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000056// Sends at a constant rate but with random packet sizes.
57struct Sender : public MessageHandler {
Peter Boström0c4e06b2015-10-07 12:23:21 +020058 Sender(Thread* th, AsyncSocket* s, uint32_t rt)
59 : thread(th),
Karl Wiberg918f50c2018-07-05 11:40:33 +020060 socket(absl::make_unique<AsyncUDPSocket>(s)),
Peter Boström0c4e06b2015-10-07 12:23:21 +020061 done(false),
62 rate(rt),
63 count(0) {
Honghai Zhang82d78622016-05-06 11:29:15 -070064 last_send = rtc::TimeMillis();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070065 thread->PostDelayed(RTC_FROM_HERE, NextDelay(), this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000066 }
67
Peter Boström0c4e06b2015-10-07 12:23:21 +020068 uint32_t NextDelay() {
69 uint32_t size = (rand() % 4096) + 1;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000070 return 1000 * size / rate;
71 }
72
Steve Anton9de3aac2017-10-24 10:08:26 -070073 void OnMessage(Message* pmsg) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000074 ASSERT_EQ(1u, pmsg->message_id);
75
76 if (done)
77 return;
78
Honghai Zhang82d78622016-05-06 11:29:15 -070079 int64_t cur_time = rtc::TimeMillis();
80 int64_t delay = cur_time - last_send;
81 uint32_t size = static_cast<uint32_t>(rate * delay / 1000);
Peter Boström0c4e06b2015-10-07 12:23:21 +020082 size = std::min<uint32_t>(size, 4096);
83 size = std::max<uint32_t>(size, sizeof(uint32_t));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000084
85 count += size;
86 memcpy(dummy, &cur_time, sizeof(cur_time));
87 socket->Send(dummy, size, options);
88
89 last_send = cur_time;
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070090 thread->PostDelayed(RTC_FROM_HERE, NextDelay(), this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000091 }
92
93 Thread* thread;
jbauch555604a2016-04-26 03:13:22 -070094 std::unique_ptr<AsyncUDPSocket> socket;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000095 rtc::PacketOptions options;
96 bool done;
Peter Boström0c4e06b2015-10-07 12:23:21 +020097 uint32_t rate; // bytes per second
98 uint32_t count;
Honghai Zhang82d78622016-05-06 11:29:15 -070099 int64_t last_send;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000100 char dummy[4096];
101};
102
103struct Receiver : public MessageHandler, public sigslot::has_slots<> {
Peter Boström0c4e06b2015-10-07 12:23:21 +0200104 Receiver(Thread* th, AsyncSocket* s, uint32_t bw)
105 : thread(th),
Karl Wiberg918f50c2018-07-05 11:40:33 +0200106 socket(absl::make_unique<AsyncUDPSocket>(s)),
Peter Boström0c4e06b2015-10-07 12:23:21 +0200107 bandwidth(bw),
108 done(false),
109 count(0),
110 sec_count(0),
111 sum(0),
112 sum_sq(0),
113 samples(0) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000114 socket->SignalReadPacket.connect(this, &Receiver::OnReadPacket);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700115 thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000116 }
117
Steve Anton9de3aac2017-10-24 10:08:26 -0700118 ~Receiver() override { thread->Clear(this); }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000119
Yves Gerey665174f2018-06-19 15:03:05 +0200120 void OnReadPacket(AsyncPacketSocket* s,
121 const char* data,
122 size_t size,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000123 const SocketAddress& remote_addr,
Niels Möllere6933812018-11-05 13:01:41 +0100124 const int64_t& /* packet_time_us */) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000125 ASSERT_EQ(socket.get(), s);
126 ASSERT_GE(size, 4U);
127
128 count += size;
129 sec_count += size;
130
Peter Boström0c4e06b2015-10-07 12:23:21 +0200131 uint32_t send_time = *reinterpret_cast<const uint32_t*>(data);
Honghai Zhang82d78622016-05-06 11:29:15 -0700132 uint32_t recv_time = rtc::TimeMillis();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200133 uint32_t delay = recv_time - send_time;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000134 sum += delay;
135 sum_sq += delay * delay;
136 samples += 1;
137 }
138
Steve Anton9de3aac2017-10-24 10:08:26 -0700139 void OnMessage(Message* pmsg) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000140 ASSERT_EQ(1u, pmsg->message_id);
141
142 if (done)
143 return;
144
145 // It is always possible for us to receive more than expected because
146 // packets can be further delayed in delivery.
147 if (bandwidth > 0)
148 ASSERT_TRUE(sec_count <= 5 * bandwidth / 4);
149 sec_count = 0;
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700150 thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000151 }
152
153 Thread* thread;
jbauch555604a2016-04-26 03:13:22 -0700154 std::unique_ptr<AsyncUDPSocket> socket;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200155 uint32_t bandwidth;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000156 bool done;
157 size_t count;
158 size_t sec_count;
159 double sum;
160 double sum_sq;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200161 uint32_t samples;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000162};
163
deadbeef22e08142017-06-12 14:30:28 -0700164// Note: This test uses a fake clock in addition to a virtual network.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000165class VirtualSocketServerTest : public testing::Test {
166 public:
deadbeef37f5ecf2017-02-27 14:06:41 -0800167 VirtualSocketServerTest()
deadbeef22e08142017-06-12 14:30:28 -0700168 : ss_(&fake_clock_),
169 thread_(&ss_),
deadbeef37f5ecf2017-02-27 14:06:41 -0800170 kIPv4AnyAddress(IPAddress(INADDR_ANY), 0),
171 kIPv6AnyAddress(IPAddress(in6addr_any), 0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000172
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000173 void CheckPortIncrementalization(const SocketAddress& post,
174 const SocketAddress& pre) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000175 EXPECT_EQ(post.port(), pre.port() + 1);
176 IPAddress post_ip = post.ipaddr();
177 IPAddress pre_ip = pre.ipaddr();
178 EXPECT_EQ(pre_ip.family(), post_ip.family());
179 if (post_ip.family() == AF_INET) {
180 in_addr pre_ipv4 = pre_ip.ipv4_address();
181 in_addr post_ipv4 = post_ip.ipv4_address();
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000182 EXPECT_EQ(post_ipv4.s_addr, pre_ipv4.s_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000183 } else if (post_ip.family() == AF_INET6) {
184 in6_addr post_ip6 = post_ip.ipv6_address();
185 in6_addr pre_ip6 = pre_ip.ipv6_address();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200186 uint32_t* post_as_ints = reinterpret_cast<uint32_t*>(&post_ip6.s6_addr);
187 uint32_t* pre_as_ints = reinterpret_cast<uint32_t*>(&pre_ip6.s6_addr);
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000188 EXPECT_EQ(post_as_ints[3], pre_as_ints[3]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000189 }
190 }
191
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700192 // Test a client can bind to the any address, and all sent packets will have
193 // the default route as the source address. Also, it can receive packets sent
194 // to the default route.
195 void TestDefaultRoute(const IPAddress& default_route) {
nisse32f25052017-05-08 01:57:18 -0700196 ss_.SetDefaultRoute(default_route);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700197
198 // Create client1 bound to the any address.
199 AsyncSocket* socket =
nisse32f25052017-05-08 01:57:18 -0700200 ss_.CreateAsyncSocket(default_route.family(), SOCK_DGRAM);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700201 socket->Bind(EmptySocketAddressWithFamily(default_route.family()));
202 SocketAddress client1_any_addr = socket->GetLocalAddress();
203 EXPECT_TRUE(client1_any_addr.IsAnyIP());
Karl Wiberg918f50c2018-07-05 11:40:33 +0200204 auto client1 = absl::make_unique<TestClient>(
205 absl::make_unique<AsyncUDPSocket>(socket), &fake_clock_);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700206
207 // Create client2 bound to the default route.
208 AsyncSocket* socket2 =
nisse32f25052017-05-08 01:57:18 -0700209 ss_.CreateAsyncSocket(default_route.family(), SOCK_DGRAM);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700210 socket2->Bind(SocketAddress(default_route, 0));
211 SocketAddress client2_addr = socket2->GetLocalAddress();
212 EXPECT_FALSE(client2_addr.IsAnyIP());
Karl Wiberg918f50c2018-07-05 11:40:33 +0200213 auto client2 = absl::make_unique<TestClient>(
214 absl::make_unique<AsyncUDPSocket>(socket2), &fake_clock_);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700215
216 // Client1 sends to client2, client2 should see the default route as
217 // client1's address.
218 SocketAddress client1_addr;
219 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
220 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
221 EXPECT_EQ(client1_addr,
222 SocketAddress(default_route, client1_any_addr.port()));
223
224 // Client2 can send back to client1's default route address.
225 EXPECT_EQ(3, client2->SendTo("foo", 3, client1_addr));
226 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
227 }
228
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000229 void BasicTest(const SocketAddress& initial_addr) {
nisse32f25052017-05-08 01:57:18 -0700230 AsyncSocket* socket =
231 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000232 socket->Bind(initial_addr);
233 SocketAddress server_addr = socket->GetLocalAddress();
234 // Make sure VSS didn't switch families on us.
235 EXPECT_EQ(server_addr.family(), initial_addr.family());
236
Karl Wiberg918f50c2018-07-05 11:40:33 +0200237 auto client1 = absl::make_unique<TestClient>(
238 absl::make_unique<AsyncUDPSocket>(socket), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000239 AsyncSocket* socket2 =
nisse32f25052017-05-08 01:57:18 -0700240 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
Karl Wiberg918f50c2018-07-05 11:40:33 +0200241 auto client2 = absl::make_unique<TestClient>(
242 absl::make_unique<AsyncUDPSocket>(socket2), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000243
244 SocketAddress client2_addr;
245 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
246 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
247
248 SocketAddress client1_addr;
249 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
250 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
251 EXPECT_EQ(client1_addr, server_addr);
252
253 SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family());
254 for (int i = 0; i < 10; i++) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200255 client2 = absl::make_unique<TestClient>(
256 absl::WrapUnique(AsyncUDPSocket::Create(&ss_, empty)), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000257
258 SocketAddress next_client2_addr;
259 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
260 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr));
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000261 CheckPortIncrementalization(next_client2_addr, client2_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000262 // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1);
263
264 SocketAddress server_addr2;
265 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr));
266 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2));
267 EXPECT_EQ(server_addr2, server_addr);
268
269 client2_addr = next_client2_addr;
270 }
271 }
272
273 // initial_addr should be made from either INADDR_ANY or in6addr_any.
274 void ConnectTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700275 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000276 SocketAddress accept_addr;
277 const SocketAddress kEmptyAddr =
278 EmptySocketAddressWithFamily(initial_addr.family());
279
280 // Create client
Karl Wiberg918f50c2018-07-05 11:40:33 +0200281 std::unique_ptr<AsyncSocket> client = absl::WrapUnique(
282 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700283 sink.Monitor(client.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000284 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
285 EXPECT_TRUE(client->GetLocalAddress().IsNil());
286
287 // Create server
Karl Wiberg918f50c2018-07-05 11:40:33 +0200288 std::unique_ptr<AsyncSocket> server = absl::WrapUnique(
289 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700290 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000291 EXPECT_NE(0, server->Listen(5)); // Bind required
292 EXPECT_EQ(0, server->Bind(initial_addr));
293 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
294 EXPECT_EQ(0, server->Listen(5));
295 EXPECT_EQ(server->GetState(), AsyncSocket::CS_CONNECTING);
296
297 // No pending server connections
nisse32f25052017-05-08 01:57:18 -0700298 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800299 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000300 EXPECT_EQ(AF_UNSPEC, accept_addr.family());
301
302 // Attempt connect to listening socket
303 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
Yves Gerey665174f2018-06-19 15:03:05 +0200304 EXPECT_NE(client->GetLocalAddress(), kEmptyAddr); // Implicit Bind
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000305 EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family()); // Implicit Bind
306 EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress());
307
308 // Client is connecting
309 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
nisse32f25052017-05-08 01:57:18 -0700310 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
311 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000312
nisse32f25052017-05-08 01:57:18 -0700313 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000314
315 // Client still connecting
316 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
nisse32f25052017-05-08 01:57:18 -0700317 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
318 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000319
320 // Server has pending connection
nisse32f25052017-05-08 01:57:18 -0700321 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
Karl Wiberg918f50c2018-07-05 11:40:33 +0200322 std::unique_ptr<Socket> accepted =
323 absl::WrapUnique(server->Accept(&accept_addr));
deadbeef37f5ecf2017-02-27 14:06:41 -0800324 EXPECT_TRUE(nullptr != accepted);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000325 EXPECT_NE(accept_addr, kEmptyAddr);
326 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr);
327
328 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED);
329 EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress());
330 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress());
331
nisse32f25052017-05-08 01:57:18 -0700332 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000333
334 // Client has connected
335 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTED);
nisse32f25052017-05-08 01:57:18 -0700336 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
337 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000338 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
339 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
340 }
341
342 void ConnectToNonListenerTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700343 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000344 SocketAddress accept_addr;
345 const SocketAddress nil_addr;
346 const SocketAddress empty_addr =
347 EmptySocketAddressWithFamily(initial_addr.family());
348
349 // Create client
Karl Wiberg918f50c2018-07-05 11:40:33 +0200350 std::unique_ptr<AsyncSocket> client = absl::WrapUnique(
351 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700352 sink.Monitor(client.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000353
354 // Create server
Karl Wiberg918f50c2018-07-05 11:40:33 +0200355 std::unique_ptr<AsyncSocket> server = absl::WrapUnique(
356 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700357 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000358 EXPECT_EQ(0, server->Bind(initial_addr));
359 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
360 // Attempt connect to non-listening socket
361 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
362
nisse32f25052017-05-08 01:57:18 -0700363 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000364
365 // No pending server connections
nisse32f25052017-05-08 01:57:18 -0700366 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800367 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000368 EXPECT_EQ(accept_addr, nil_addr);
369
370 // Connection failed
371 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
nisse32f25052017-05-08 01:57:18 -0700372 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
373 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000374 EXPECT_EQ(client->GetRemoteAddress(), nil_addr);
375 }
376
377 void CloseDuringConnectTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700378 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000379 SocketAddress accept_addr;
380 const SocketAddress empty_addr =
381 EmptySocketAddressWithFamily(initial_addr.family());
382
383 // Create client and server
jbauch555604a2016-04-26 03:13:22 -0700384 std::unique_ptr<AsyncSocket> client(
nisse32f25052017-05-08 01:57:18 -0700385 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000386 sink.Monitor(client.get());
jbauch555604a2016-04-26 03:13:22 -0700387 std::unique_ptr<AsyncSocket> server(
nisse32f25052017-05-08 01:57:18 -0700388 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000389 sink.Monitor(server.get());
390
391 // Initiate connect
392 EXPECT_EQ(0, server->Bind(initial_addr));
393 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
394
395 EXPECT_EQ(0, server->Listen(5));
396 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
397
398 // Server close before socket enters accept queue
kwibergd0d81482017-04-18 03:18:22 -0700399 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000400 server->Close();
401
nisse32f25052017-05-08 01:57:18 -0700402 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000403
404 // Result: connection failed
405 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700406 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000407
nisse32f25052017-05-08 01:57:18 -0700408 server.reset(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000409 sink.Monitor(server.get());
410
411 // Initiate connect
412 EXPECT_EQ(0, server->Bind(initial_addr));
413 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
414
415 EXPECT_EQ(0, server->Listen(5));
416 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
417
nisse32f25052017-05-08 01:57:18 -0700418 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000419
420 // Server close while socket is in accept queue
kwibergd0d81482017-04-18 03:18:22 -0700421 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000422 server->Close();
423
nisse32f25052017-05-08 01:57:18 -0700424 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000425
426 // Result: connection failed
427 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700428 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000429
430 // New server
nisse32f25052017-05-08 01:57:18 -0700431 server.reset(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000432 sink.Monitor(server.get());
433
434 // Initiate connect
435 EXPECT_EQ(0, server->Bind(initial_addr));
436 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
437
438 EXPECT_EQ(0, server->Listen(5));
439 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
440
nisse32f25052017-05-08 01:57:18 -0700441 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000442
443 // Server accepts connection
kwibergd0d81482017-04-18 03:18:22 -0700444 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
jbauch555604a2016-04-26 03:13:22 -0700445 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
deadbeef37f5ecf2017-02-27 14:06:41 -0800446 ASSERT_TRUE(nullptr != accepted.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000447 sink.Monitor(accepted.get());
448
449 // Client closes before connection complets
450 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED);
451
452 // Connected message has not been processed yet.
453 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
454 client->Close();
455
nisse32f25052017-05-08 01:57:18 -0700456 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000457
458 // Result: accepted socket closes
459 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700460 EXPECT_TRUE(sink.Check(accepted.get(), SSE_CLOSE));
461 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000462 }
463
464 void CloseTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700465 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000466 const SocketAddress kEmptyAddr;
467
468 // Create clients
Karl Wiberg918f50c2018-07-05 11:40:33 +0200469 std::unique_ptr<AsyncSocket> a = absl::WrapUnique(
470 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700471 sink.Monitor(a.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000472 a->Bind(initial_addr);
473 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
474
Karl Wiberg918f50c2018-07-05 11:40:33 +0200475 std::unique_ptr<AsyncSocket> b = absl::WrapUnique(
476 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000477 sink.Monitor(b.get());
478 b->Bind(initial_addr);
479 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
480
481 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
482 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
483
nisse32f25052017-05-08 01:57:18 -0700484 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000485
nisse32f25052017-05-08 01:57:18 -0700486 EXPECT_TRUE(sink.Check(a.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000487 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CONNECTED);
488 EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress());
489
kwibergd0d81482017-04-18 03:18:22 -0700490 EXPECT_TRUE(sink.Check(b.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000491 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CONNECTED);
492 EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress());
493
494 EXPECT_EQ(1, a->Send("a", 1));
495 b->Close();
496 EXPECT_EQ(1, a->Send("b", 1));
497
nisse32f25052017-05-08 01:57:18 -0700498 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000499
500 char buffer[10];
kwibergd0d81482017-04-18 03:18:22 -0700501 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
Stefan Holmer9131efd2016-05-23 18:19:26 +0200502 EXPECT_EQ(-1, b->Recv(buffer, 10, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000503
nisse32f25052017-05-08 01:57:18 -0700504 EXPECT_TRUE(sink.Check(a.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000505 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CLOSED);
506 EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr);
507
508 // No signal for Closer
kwibergd0d81482017-04-18 03:18:22 -0700509 EXPECT_FALSE(sink.Check(b.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000510 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CLOSED);
511 EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr);
512 }
513
514 void TcpSendTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700515 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000516 const SocketAddress kEmptyAddr;
517
518 // Connect two sockets
Karl Wiberg918f50c2018-07-05 11:40:33 +0200519 std::unique_ptr<AsyncSocket> a = absl::WrapUnique(
520 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700521 sink.Monitor(a.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000522 a->Bind(initial_addr);
523 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
524
Karl Wiberg918f50c2018-07-05 11:40:33 +0200525 std::unique_ptr<AsyncSocket> b = absl::WrapUnique(
526 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700527 sink.Monitor(b.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000528 b->Bind(initial_addr);
529 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
530
531 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
532 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
533
nisse32f25052017-05-08 01:57:18 -0700534 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000535
536 const size_t kBufferSize = 2000;
nisse32f25052017-05-08 01:57:18 -0700537 ss_.set_send_buffer_capacity(kBufferSize);
538 ss_.set_recv_buffer_capacity(kBufferSize);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000539
540 const size_t kDataSize = 5000;
541 char send_buffer[kDataSize], recv_buffer[kDataSize];
542 for (size_t i = 0; i < kDataSize; ++i)
543 send_buffer[i] = static_cast<char>(i % 256);
544 memset(recv_buffer, 0, sizeof(recv_buffer));
545 size_t send_pos = 0, recv_pos = 0;
546
547 // Can't send more than send buffer in one write
548 int result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
549 EXPECT_EQ(static_cast<int>(kBufferSize), result);
550 send_pos += result;
551
nisse32f25052017-05-08 01:57:18 -0700552 ss_.ProcessMessagesUntilIdle();
553 EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE));
554 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000555
556 // Receive buffer is already filled, fill send buffer again
557 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
558 EXPECT_EQ(static_cast<int>(kBufferSize), result);
559 send_pos += result;
560
nisse32f25052017-05-08 01:57:18 -0700561 ss_.ProcessMessagesUntilIdle();
562 EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE));
563 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000564
565 // No more room in send or receive buffer
566 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
567 EXPECT_EQ(-1, result);
568 EXPECT_TRUE(a->IsBlocking());
569
570 // Read a subset of the data
Stefan Holmer9131efd2016-05-23 18:19:26 +0200571 result = b->Recv(recv_buffer + recv_pos, 500, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000572 EXPECT_EQ(500, result);
573 recv_pos += result;
574
nisse32f25052017-05-08 01:57:18 -0700575 ss_.ProcessMessagesUntilIdle();
576 EXPECT_TRUE(sink.Check(a.get(), SSE_WRITE));
577 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000578
579 // Room for more on the sending side
580 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
581 EXPECT_EQ(500, result);
582 send_pos += result;
583
584 // Empty the recv buffer
585 while (true) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200586 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000587 if (result < 0) {
588 EXPECT_EQ(-1, result);
589 EXPECT_TRUE(b->IsBlocking());
590 break;
591 }
592 recv_pos += result;
593 }
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 // Continue to empty the recv buffer
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
609 // Send last of the data
610 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
611 EXPECT_EQ(500, result);
612 send_pos += result;
613
nisse32f25052017-05-08 01:57:18 -0700614 ss_.ProcessMessagesUntilIdle();
615 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000616
617 // Receive the last of the data
618 while (true) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200619 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000620 if (result < 0) {
621 EXPECT_EQ(-1, result);
622 EXPECT_TRUE(b->IsBlocking());
623 break;
624 }
625 recv_pos += result;
626 }
627
nisse32f25052017-05-08 01:57:18 -0700628 ss_.ProcessMessagesUntilIdle();
629 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000630
631 // The received data matches the sent data
632 EXPECT_EQ(kDataSize, send_pos);
633 EXPECT_EQ(kDataSize, recv_pos);
634 EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize));
635 }
636
637 void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) {
638 const SocketAddress kEmptyAddr;
639
640 // Connect two sockets
Karl Wiberg918f50c2018-07-05 11:40:33 +0200641 std::unique_ptr<AsyncSocket> a = absl::WrapUnique(
642 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
643 std::unique_ptr<AsyncSocket> b = absl::WrapUnique(
644 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000645 a->Bind(initial_addr);
646 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
647
648 b->Bind(initial_addr);
649 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
650
651 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
652 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -0700653 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000654
655 // First, deliver all packets in 0 ms.
Yves Gerey665174f2018-06-19 15:03:05 +0200656 char buffer[2] = {0, 0};
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000657 const char cNumPackets = 10;
658 for (char i = 0; i < cNumPackets; ++i) {
659 buffer[0] = '0' + i;
660 EXPECT_EQ(1, a->Send(buffer, 1));
661 }
662
nisse32f25052017-05-08 01:57:18 -0700663 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000664
665 for (char i = 0; i < cNumPackets; ++i) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200666 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000667 EXPECT_EQ(static_cast<char>('0' + i), buffer[0]);
668 }
669
670 // Next, deliver packets at random intervals
Peter Boström0c4e06b2015-10-07 12:23:21 +0200671 const uint32_t mean = 50;
672 const uint32_t stddev = 50;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000673
nisse32f25052017-05-08 01:57:18 -0700674 ss_.set_delay_mean(mean);
675 ss_.set_delay_stddev(stddev);
676 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000677
678 for (char i = 0; i < cNumPackets; ++i) {
679 buffer[0] = 'A' + i;
680 EXPECT_EQ(1, a->Send(buffer, 1));
681 }
682
nisse32f25052017-05-08 01:57:18 -0700683 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000684
685 for (char i = 0; i < cNumPackets; ++i) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200686 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000687 EXPECT_EQ(static_cast<char>('A' + i), buffer[0]);
688 }
689 }
690
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000691 // It is important that initial_addr's port has to be 0 such that the
692 // incremental port behavior could ensure the 2 Binds result in different
693 // address.
694 void BandwidthTest(const SocketAddress& initial_addr) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000695 AsyncSocket* send_socket =
nisse32f25052017-05-08 01:57:18 -0700696 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000697 AsyncSocket* recv_socket =
nisse32f25052017-05-08 01:57:18 -0700698 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000699 ASSERT_EQ(0, send_socket->Bind(initial_addr));
700 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
701 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
702 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000703 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
704
Peter Boström0c4e06b2015-10-07 12:23:21 +0200705 uint32_t bandwidth = 64 * 1024;
nisse32f25052017-05-08 01:57:18 -0700706 ss_.set_bandwidth(bandwidth);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000707
708 Thread* pthMain = Thread::Current();
709 Sender sender(pthMain, send_socket, 80 * 1024);
710 Receiver receiver(pthMain, recv_socket, bandwidth);
711
deadbeef22e08142017-06-12 14:30:28 -0700712 // Allow the sender to run for 5 (simulated) seconds, then be stopped for 5
713 // seconds.
714 SIMULATED_WAIT(false, 5000, fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000715 sender.done = true;
deadbeef22e08142017-06-12 14:30:28 -0700716 SIMULATED_WAIT(false, 5000, fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000717
deadbeef22e08142017-06-12 14:30:28 -0700718 // Ensure the observed bandwidth fell within a reasonable margin of error.
719 EXPECT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4);
720 EXPECT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000721
nisse32f25052017-05-08 01:57:18 -0700722 ss_.set_bandwidth(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000723 }
724
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000725 // It is important that initial_addr's port has to be 0 such that the
726 // incremental port behavior could ensure the 2 Binds result in different
727 // address.
728 void DelayTest(const SocketAddress& initial_addr) {
deadbeef37f5ecf2017-02-27 14:06:41 -0800729 time_t seed = ::time(nullptr);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100730 RTC_LOG(LS_VERBOSE) << "seed = " << seed;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000731 srand(static_cast<unsigned int>(seed));
732
Peter Boström0c4e06b2015-10-07 12:23:21 +0200733 const uint32_t mean = 2000;
734 const uint32_t stddev = 500;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000735
nisse32f25052017-05-08 01:57:18 -0700736 ss_.set_delay_mean(mean);
737 ss_.set_delay_stddev(stddev);
738 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000739
740 AsyncSocket* send_socket =
nisse32f25052017-05-08 01:57:18 -0700741 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000742 AsyncSocket* recv_socket =
nisse32f25052017-05-08 01:57:18 -0700743 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000744 ASSERT_EQ(0, send_socket->Bind(initial_addr));
745 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
746 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
747 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000748 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
749
750 Thread* pthMain = Thread::Current();
751 // Avg packet size is 2K, so at 200KB/s for 10s, we should see about
752 // 1000 packets, which is necessary to get a good distribution.
753 Sender sender(pthMain, send_socket, 100 * 2 * 1024);
754 Receiver receiver(pthMain, recv_socket, 0);
755
deadbeef22e08142017-06-12 14:30:28 -0700756 // Simulate 10 seconds of packets being sent, then check the observed delay
757 // distribution.
758 SIMULATED_WAIT(false, 10000, fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000759 sender.done = receiver.done = true;
nisse32f25052017-05-08 01:57:18 -0700760 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000761
762 const double sample_mean = receiver.sum / receiver.samples;
763 double num =
764 receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum;
765 double den = receiver.samples * (receiver.samples - 1);
766 const double sample_stddev = sqrt(num / den);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100767 RTC_LOG(LS_VERBOSE) << "mean=" << sample_mean
768 << " stddev=" << sample_stddev;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000769
770 EXPECT_LE(500u, receiver.samples);
771 // We initially used a 0.1 fudge factor, but on the build machine, we
772 // have seen the value differ by as much as 0.13.
773 EXPECT_NEAR(mean, sample_mean, 0.15 * mean);
774 EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev);
775
nisse32f25052017-05-08 01:57:18 -0700776 ss_.set_delay_mean(0);
777 ss_.set_delay_stddev(0);
778 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000779 }
780
781 // Test cross-family communication between a client bound to client_addr and a
782 // server bound to server_addr. shouldSucceed indicates if communication is
783 // expected to work or not.
784 void CrossFamilyConnectionTest(const SocketAddress& client_addr,
785 const SocketAddress& server_addr,
786 bool shouldSucceed) {
kwibergd0d81482017-04-18 03:18:22 -0700787 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000788 SocketAddress accept_address;
789 const SocketAddress kEmptyAddr;
790
791 // Client gets a IPv4 address
Karl Wiberg918f50c2018-07-05 11:40:33 +0200792 std::unique_ptr<AsyncSocket> client = absl::WrapUnique(
793 ss_.CreateAsyncSocket(client_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700794 sink.Monitor(client.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000795 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
796 EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr);
797 client->Bind(client_addr);
798
799 // Server gets a non-mapped non-any IPv6 address.
800 // IPv4 sockets should not be able to connect to this.
Karl Wiberg918f50c2018-07-05 11:40:33 +0200801 std::unique_ptr<AsyncSocket> server = absl::WrapUnique(
802 ss_.CreateAsyncSocket(server_addr.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -0700803 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000804 server->Bind(server_addr);
805 server->Listen(5);
806
807 if (shouldSucceed) {
808 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -0700809 ss_.ProcessMessagesUntilIdle();
810 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
811 std::unique_ptr<Socket> accepted =
Karl Wiberg918f50c2018-07-05 11:40:33 +0200812 absl::WrapUnique(server->Accept(&accept_address));
deadbeef37f5ecf2017-02-27 14:06:41 -0800813 EXPECT_TRUE(nullptr != accepted);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000814 EXPECT_NE(kEmptyAddr, accept_address);
nisse32f25052017-05-08 01:57:18 -0700815 ss_.ProcessMessagesUntilIdle();
816 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000817 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
818 } else {
819 // Check that the connection failed.
820 EXPECT_EQ(-1, client->Connect(server->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -0700821 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000822
nisse32f25052017-05-08 01:57:18 -0700823 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800824 EXPECT_TRUE(nullptr == server->Accept(&accept_address));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000825 EXPECT_EQ(accept_address, kEmptyAddr);
826 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
nisse32f25052017-05-08 01:57:18 -0700827 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000828 EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr);
829 }
830 }
831
832 // Test cross-family datagram sending between a client bound to client_addr
833 // and a server bound to server_addr. shouldSucceed indicates if sending is
jlmiller@webrtc.orgec499be2015-02-07 22:37:59 +0000834 // expected to succeed or not.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000835 void CrossFamilyDatagramTest(const SocketAddress& client_addr,
836 const SocketAddress& server_addr,
837 bool shouldSucceed) {
Steve Anton31e5bf52018-05-07 10:42:55 -0700838 AsyncSocket* socket = ss_.CreateAsyncSocket(AF_INET, SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000839 socket->Bind(server_addr);
840 SocketAddress bound_server_addr = socket->GetLocalAddress();
Karl Wiberg918f50c2018-07-05 11:40:33 +0200841 auto client1 = absl::make_unique<TestClient>(
842 absl::make_unique<AsyncUDPSocket>(socket), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000843
Steve Anton31e5bf52018-05-07 10:42:55 -0700844 AsyncSocket* socket2 = ss_.CreateAsyncSocket(AF_INET, SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000845 socket2->Bind(client_addr);
Karl Wiberg918f50c2018-07-05 11:40:33 +0200846 auto client2 = absl::make_unique<TestClient>(
847 absl::make_unique<AsyncUDPSocket>(socket2), &fake_clock_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000848 SocketAddress client2_addr;
849
850 if (shouldSucceed) {
851 EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr));
852 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
853 SocketAddress client1_addr;
854 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
855 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
856 EXPECT_EQ(client1_addr, bound_server_addr);
857 } else {
858 EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr));
jlmiller@webrtc.orgec499be2015-02-07 22:37:59 +0000859 EXPECT_TRUE(client1->CheckNoPacket());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000860 }
861 }
862
863 protected:
deadbeef22e08142017-06-12 14:30:28 -0700864 rtc::ScopedFakeClock fake_clock_;
nisse32f25052017-05-08 01:57:18 -0700865 VirtualSocketServer ss_;
nisse7eaa4ea2017-05-08 05:25:41 -0700866 AutoSocketServerThread thread_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000867 const SocketAddress kIPv4AnyAddress;
868 const SocketAddress kIPv6AnyAddress;
869};
870
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000871TEST_F(VirtualSocketServerTest, basic_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000872 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000);
873 BasicTest(ipv4_test_addr);
874}
875
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000876TEST_F(VirtualSocketServerTest, basic_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000877 SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 5000);
878 BasicTest(ipv6_test_addr);
879}
880
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700881TEST_F(VirtualSocketServerTest, TestDefaultRoute_v4) {
882 IPAddress ipv4_default_addr(0x01020304);
883 TestDefaultRoute(ipv4_default_addr);
884}
885
886TEST_F(VirtualSocketServerTest, TestDefaultRoute_v6) {
887 IPAddress ipv6_default_addr;
888 EXPECT_TRUE(
889 IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ipv6_default_addr));
890 TestDefaultRoute(ipv6_default_addr);
891}
892
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000893TEST_F(VirtualSocketServerTest, connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000894 ConnectTest(kIPv4AnyAddress);
895}
896
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000897TEST_F(VirtualSocketServerTest, connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000898 ConnectTest(kIPv6AnyAddress);
899}
900
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000901TEST_F(VirtualSocketServerTest, connect_to_non_listener_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000902 ConnectToNonListenerTest(kIPv4AnyAddress);
903}
904
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000905TEST_F(VirtualSocketServerTest, connect_to_non_listener_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000906 ConnectToNonListenerTest(kIPv6AnyAddress);
907}
908
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000909TEST_F(VirtualSocketServerTest, close_during_connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000910 CloseDuringConnectTest(kIPv4AnyAddress);
911}
912
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000913TEST_F(VirtualSocketServerTest, close_during_connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000914 CloseDuringConnectTest(kIPv6AnyAddress);
915}
916
917TEST_F(VirtualSocketServerTest, close_v4) {
918 CloseTest(kIPv4AnyAddress);
919}
920
921TEST_F(VirtualSocketServerTest, close_v6) {
922 CloseTest(kIPv6AnyAddress);
923}
924
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000925TEST_F(VirtualSocketServerTest, tcp_send_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000926 TcpSendTest(kIPv4AnyAddress);
927}
928
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000929TEST_F(VirtualSocketServerTest, tcp_send_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000930 TcpSendTest(kIPv6AnyAddress);
931}
932
933TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v4) {
934 TcpSendsPacketsInOrderTest(kIPv4AnyAddress);
935}
936
937TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v6) {
938 TcpSendsPacketsInOrderTest(kIPv6AnyAddress);
939}
940
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000941TEST_F(VirtualSocketServerTest, bandwidth_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000942 BandwidthTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000943}
944
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000945TEST_F(VirtualSocketServerTest, bandwidth_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000946 BandwidthTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000947}
948
deadbeef22e08142017-06-12 14:30:28 -0700949TEST_F(VirtualSocketServerTest, delay_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000950 DelayTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000951}
952
deadbeef22e08142017-06-12 14:30:28 -0700953TEST_F(VirtualSocketServerTest, delay_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000954 DelayTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000955}
956
957// Works, receiving socket sees 127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000958TEST_F(VirtualSocketServerTest, CanConnectFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000959 CrossFamilyConnectionTest(SocketAddress("::ffff:127.0.0.2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200960 SocketAddress("0.0.0.0", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000961}
962
963// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000964TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000965 CrossFamilyConnectionTest(SocketAddress("::2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200966 SocketAddress("0.0.0.0", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000967}
968
969// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000970TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000971 CrossFamilyConnectionTest(SocketAddress("::2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200972 SocketAddress("::ffff:127.0.0.1", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000973}
974
975// Works. receiving socket sees ::ffff:127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000976TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000977 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200978 SocketAddress("::", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000979}
980
981// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000982TEST_F(VirtualSocketServerTest, CantConnectFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000983 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200984 SocketAddress("::1", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000985}
986
987// Works. Receiving socket sees ::ffff:127.0.0.1.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000988TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000989 CrossFamilyConnectionTest(SocketAddress("127.0.0.1", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200990 SocketAddress("::ffff:127.0.0.2", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000991}
992
993// Works, receiving socket sees a result from GetNextIP.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000994TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000995 CrossFamilyConnectionTest(SocketAddress("::", 0),
Yves Gerey665174f2018-06-19 15:03:05 +0200996 SocketAddress("0.0.0.0", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000997}
998
999// Works, receiving socket sees whatever GetNextIP gave the client.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001000TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001001 CrossFamilyConnectionTest(SocketAddress("0.0.0.0", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001002 SocketAddress("::", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001003}
1004
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001005TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001006 CrossFamilyDatagramTest(SocketAddress("0.0.0.0", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001007 SocketAddress("::", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001008}
1009
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001010TEST_F(VirtualSocketServerTest, CanSendDatagramFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001011 CrossFamilyDatagramTest(SocketAddress("::ffff:127.0.0.1", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001012 SocketAddress("0.0.0.0", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001013}
1014
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001015TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001016 CrossFamilyDatagramTest(SocketAddress("::2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001017 SocketAddress("0.0.0.0", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001018}
1019
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001020TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001021 CrossFamilyDatagramTest(SocketAddress("::2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001022 SocketAddress("::ffff:127.0.0.1", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001023}
1024
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001025TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001026 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001027 SocketAddress("::", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001028}
1029
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001030TEST_F(VirtualSocketServerTest, CantSendDatagramFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001031 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001032 SocketAddress("::1", 5000), false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001033}
1034
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001035TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001036 CrossFamilyDatagramTest(SocketAddress("127.0.0.1", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001037 SocketAddress("::ffff:127.0.0.2", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001038}
1039
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001040TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001041 CrossFamilyDatagramTest(SocketAddress("::", 0),
Yves Gerey665174f2018-06-19 15:03:05 +02001042 SocketAddress("0.0.0.0", 5000), true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001043}
1044
Taylor Brandstettere7536412016-09-09 13:16:15 -07001045TEST_F(VirtualSocketServerTest, SetSendingBlockedWithUdpSocket) {
1046 AsyncSocket* socket1 =
nisse32f25052017-05-08 01:57:18 -07001047 ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM);
Karl Wiberg918f50c2018-07-05 11:40:33 +02001048 std::unique_ptr<AsyncSocket> socket2 = absl::WrapUnique(
1049 ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001050 socket1->Bind(kIPv4AnyAddress);
1051 socket2->Bind(kIPv4AnyAddress);
Karl Wiberg918f50c2018-07-05 11:40:33 +02001052 auto client1 = absl::make_unique<TestClient>(
1053 absl::make_unique<AsyncUDPSocket>(socket1), &fake_clock_);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001054
nisse32f25052017-05-08 01:57:18 -07001055 ss_.SetSendingBlocked(true);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001056 EXPECT_EQ(-1, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1057 EXPECT_TRUE(socket1->IsBlocking());
1058 EXPECT_EQ(0, client1->ready_to_send_count());
1059
nisse32f25052017-05-08 01:57:18 -07001060 ss_.SetSendingBlocked(false);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001061 EXPECT_EQ(1, client1->ready_to_send_count());
1062 EXPECT_EQ(3, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1063}
1064
1065TEST_F(VirtualSocketServerTest, SetSendingBlockedWithTcpSocket) {
1066 constexpr size_t kBufferSize = 1024;
nisse32f25052017-05-08 01:57:18 -07001067 ss_.set_send_buffer_capacity(kBufferSize);
1068 ss_.set_recv_buffer_capacity(kBufferSize);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001069
kwibergd0d81482017-04-18 03:18:22 -07001070 StreamSink sink;
Karl Wiberg918f50c2018-07-05 11:40:33 +02001071 std::unique_ptr<AsyncSocket> socket1 = absl::WrapUnique(
1072 ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
1073 std::unique_ptr<AsyncSocket> socket2 = absl::WrapUnique(
1074 ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
nisse32f25052017-05-08 01:57:18 -07001075 sink.Monitor(socket1.get());
1076 sink.Monitor(socket2.get());
Taylor Brandstettere7536412016-09-09 13:16:15 -07001077 socket1->Bind(kIPv4AnyAddress);
1078 socket2->Bind(kIPv4AnyAddress);
1079
1080 // Connect sockets.
1081 EXPECT_EQ(0, socket1->Connect(socket2->GetLocalAddress()));
1082 EXPECT_EQ(0, socket2->Connect(socket1->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -07001083 ss_.ProcessMessagesUntilIdle();
Taylor Brandstettere7536412016-09-09 13:16:15 -07001084
1085 char data[kBufferSize] = {};
1086
1087 // First Send call will fill the send buffer but not send anything.
nisse32f25052017-05-08 01:57:18 -07001088 ss_.SetSendingBlocked(true);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001089 EXPECT_EQ(static_cast<int>(kBufferSize), socket1->Send(data, kBufferSize));
nisse32f25052017-05-08 01:57:18 -07001090 ss_.ProcessMessagesUntilIdle();
1091 EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
1092 EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001093 EXPECT_FALSE(socket1->IsBlocking());
1094
1095 // Since the send buffer is full, next Send will result in EWOULDBLOCK.
1096 EXPECT_EQ(-1, socket1->Send(data, kBufferSize));
nisse32f25052017-05-08 01:57:18 -07001097 EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
1098 EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001099 EXPECT_TRUE(socket1->IsBlocking());
1100
1101 // When sending is unblocked, the buffered data should be sent and
1102 // SignalWriteEvent should fire.
nisse32f25052017-05-08 01:57:18 -07001103 ss_.SetSendingBlocked(false);
1104 ss_.ProcessMessagesUntilIdle();
1105 EXPECT_TRUE(sink.Check(socket1.get(), SSE_WRITE));
1106 EXPECT_TRUE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001107}
1108
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001109TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02001110 const uint32_t kTestMean[] = {10, 100, 333, 1000};
Yves Gerey665174f2018-06-19 15:03:05 +02001111 const double kTestDev[] = {0.25, 0.1, 0.01};
Taylor Brandstettere7536412016-09-09 13:16:15 -07001112 // TODO(deadbeef): The current code only works for 1000 data points or more.
Peter Boström0c4e06b2015-10-07 12:23:21 +02001113 const uint32_t kTestSamples[] = {/*10, 100,*/ 1000};
tfarina5237aaf2015-11-10 23:44:30 -08001114 for (size_t midx = 0; midx < arraysize(kTestMean); ++midx) {
1115 for (size_t didx = 0; didx < arraysize(kTestDev); ++didx) {
1116 for (size_t sidx = 0; sidx < arraysize(kTestSamples); ++sidx) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001117 ASSERT_LT(0u, kTestSamples[sidx]);
Peter Boström0c4e06b2015-10-07 12:23:21 +02001118 const uint32_t kStdDev =
1119 static_cast<uint32_t>(kTestDev[didx] * kTestMean[midx]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001120 VirtualSocketServer::Function* f =
Yves Gerey665174f2018-06-19 15:03:05 +02001121 VirtualSocketServer::CreateDistribution(kTestMean[midx], kStdDev,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001122 kTestSamples[sidx]);
deadbeef37f5ecf2017-02-27 14:06:41 -08001123 ASSERT_TRUE(nullptr != f);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001124 ASSERT_EQ(kTestSamples[sidx], f->size());
1125 double sum = 0;
Peter Boström0c4e06b2015-10-07 12:23:21 +02001126 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001127 sum += (*f)[i].second;
1128 }
1129 const double mean = sum / f->size();
1130 double sum_sq_dev = 0;
Peter Boström0c4e06b2015-10-07 12:23:21 +02001131 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001132 double dev = (*f)[i].second - mean;
1133 sum_sq_dev += dev * dev;
1134 }
1135 const double stddev = sqrt(sum_sq_dev / f->size());
1136 EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx])
Yves Gerey665174f2018-06-19 15:03:05 +02001137 << "M=" << kTestMean[midx] << " SD=" << kStdDev
1138 << " N=" << kTestSamples[sidx];
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001139 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev)
Yves Gerey665174f2018-06-19 15:03:05 +02001140 << "M=" << kTestMean[midx] << " SD=" << kStdDev
1141 << " N=" << kTestSamples[sidx];
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001142 delete f;
1143 }
1144 }
1145 }
1146}
Mirko Bonadeie10b1632018-12-11 18:43:40 +01001147
1148} // namespace
1149} // namespace rtc