blob: cab8bb0dc39821514d54ff0dbeb2c257a59bce04 [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>
12#include <time.h>
13#if defined(WEBRTC_POSIX)
14#include <netinet/in.h>
15#endif
16
jbauch555604a2016-04-26 03:13:22 -070017#include <memory>
18
tfarina5237aaf2015-11-10 23:44:30 -080019#include "webrtc/base/arraysize.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000020#include "webrtc/base/gunit.h"
nisse32f25052017-05-08 01:57:18 -070021#include "webrtc/base/logging.h"
22#include "webrtc/base/ptr_util.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000023#include "webrtc/base/testclient.h"
24#include "webrtc/base/testutils.h"
25#include "webrtc/base/thread.h"
26#include "webrtc/base/timeutils.h"
27#include "webrtc/base/virtualsocketserver.h"
28
29using namespace rtc;
30
kwibergd0d81482017-04-18 03:18:22 -070031using webrtc::testing::SSE_CLOSE;
32using webrtc::testing::SSE_ERROR;
33using webrtc::testing::SSE_OPEN;
34using webrtc::testing::SSE_READ;
35using webrtc::testing::SSE_WRITE;
36using webrtc::testing::StreamSink;
37
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000038// Sends at a constant rate but with random packet sizes.
39struct Sender : public MessageHandler {
Peter Boström0c4e06b2015-10-07 12:23:21 +020040 Sender(Thread* th, AsyncSocket* s, uint32_t rt)
41 : thread(th),
nisse32f25052017-05-08 01:57:18 -070042 socket(MakeUnique<AsyncUDPSocket>(s)),
Peter Boström0c4e06b2015-10-07 12:23:21 +020043 done(false),
44 rate(rt),
45 count(0) {
Honghai Zhang82d78622016-05-06 11:29:15 -070046 last_send = rtc::TimeMillis();
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070047 thread->PostDelayed(RTC_FROM_HERE, NextDelay(), this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000048 }
49
Peter Boström0c4e06b2015-10-07 12:23:21 +020050 uint32_t NextDelay() {
51 uint32_t size = (rand() % 4096) + 1;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000052 return 1000 * size / rate;
53 }
54
55 void OnMessage(Message* pmsg) {
56 ASSERT_EQ(1u, pmsg->message_id);
57
58 if (done)
59 return;
60
Honghai Zhang82d78622016-05-06 11:29:15 -070061 int64_t cur_time = rtc::TimeMillis();
62 int64_t delay = cur_time - last_send;
63 uint32_t size = static_cast<uint32_t>(rate * delay / 1000);
Peter Boström0c4e06b2015-10-07 12:23:21 +020064 size = std::min<uint32_t>(size, 4096);
65 size = std::max<uint32_t>(size, sizeof(uint32_t));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000066
67 count += size;
68 memcpy(dummy, &cur_time, sizeof(cur_time));
69 socket->Send(dummy, size, options);
70
71 last_send = cur_time;
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070072 thread->PostDelayed(RTC_FROM_HERE, NextDelay(), this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000073 }
74
75 Thread* thread;
jbauch555604a2016-04-26 03:13:22 -070076 std::unique_ptr<AsyncUDPSocket> socket;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000077 rtc::PacketOptions options;
78 bool done;
Peter Boström0c4e06b2015-10-07 12:23:21 +020079 uint32_t rate; // bytes per second
80 uint32_t count;
Honghai Zhang82d78622016-05-06 11:29:15 -070081 int64_t last_send;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000082 char dummy[4096];
83};
84
85struct Receiver : public MessageHandler, public sigslot::has_slots<> {
Peter Boström0c4e06b2015-10-07 12:23:21 +020086 Receiver(Thread* th, AsyncSocket* s, uint32_t bw)
87 : thread(th),
nisse32f25052017-05-08 01:57:18 -070088 socket(MakeUnique<AsyncUDPSocket>(s)),
Peter Boström0c4e06b2015-10-07 12:23:21 +020089 bandwidth(bw),
90 done(false),
91 count(0),
92 sec_count(0),
93 sum(0),
94 sum_sq(0),
95 samples(0) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000096 socket->SignalReadPacket.connect(this, &Receiver::OnReadPacket);
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070097 thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000098 }
99
100 ~Receiver() {
101 thread->Clear(this);
102 }
103
104 void OnReadPacket(AsyncPacketSocket* s, const char* data, size_t size,
105 const SocketAddress& remote_addr,
106 const PacketTime& packet_time) {
107 ASSERT_EQ(socket.get(), s);
108 ASSERT_GE(size, 4U);
109
110 count += size;
111 sec_count += size;
112
Peter Boström0c4e06b2015-10-07 12:23:21 +0200113 uint32_t send_time = *reinterpret_cast<const uint32_t*>(data);
Honghai Zhang82d78622016-05-06 11:29:15 -0700114 uint32_t recv_time = rtc::TimeMillis();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200115 uint32_t delay = recv_time - send_time;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000116 sum += delay;
117 sum_sq += delay * delay;
118 samples += 1;
119 }
120
121 void OnMessage(Message* pmsg) {
122 ASSERT_EQ(1u, pmsg->message_id);
123
124 if (done)
125 return;
126
127 // It is always possible for us to receive more than expected because
128 // packets can be further delayed in delivery.
129 if (bandwidth > 0)
130 ASSERT_TRUE(sec_count <= 5 * bandwidth / 4);
131 sec_count = 0;
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700132 thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000133 }
134
135 Thread* thread;
jbauch555604a2016-04-26 03:13:22 -0700136 std::unique_ptr<AsyncUDPSocket> socket;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200137 uint32_t bandwidth;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000138 bool done;
139 size_t count;
140 size_t sec_count;
141 double sum;
142 double sum_sq;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200143 uint32_t samples;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000144};
145
146class VirtualSocketServerTest : public testing::Test {
147 public:
deadbeef37f5ecf2017-02-27 14:06:41 -0800148 VirtualSocketServerTest()
deadbeef98e186c2017-05-16 18:00:06 -0700149 : thread_(&ss_),
deadbeef37f5ecf2017-02-27 14:06:41 -0800150 kIPv4AnyAddress(IPAddress(INADDR_ANY), 0),
151 kIPv6AnyAddress(IPAddress(in6addr_any), 0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000152
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000153 void CheckPortIncrementalization(const SocketAddress& post,
154 const SocketAddress& pre) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000155 EXPECT_EQ(post.port(), pre.port() + 1);
156 IPAddress post_ip = post.ipaddr();
157 IPAddress pre_ip = pre.ipaddr();
158 EXPECT_EQ(pre_ip.family(), post_ip.family());
159 if (post_ip.family() == AF_INET) {
160 in_addr pre_ipv4 = pre_ip.ipv4_address();
161 in_addr post_ipv4 = post_ip.ipv4_address();
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000162 EXPECT_EQ(post_ipv4.s_addr, pre_ipv4.s_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000163 } else if (post_ip.family() == AF_INET6) {
164 in6_addr post_ip6 = post_ip.ipv6_address();
165 in6_addr pre_ip6 = pre_ip.ipv6_address();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200166 uint32_t* post_as_ints = reinterpret_cast<uint32_t*>(&post_ip6.s6_addr);
167 uint32_t* pre_as_ints = reinterpret_cast<uint32_t*>(&pre_ip6.s6_addr);
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000168 EXPECT_EQ(post_as_ints[3], pre_as_ints[3]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000169 }
170 }
171
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700172 // Test a client can bind to the any address, and all sent packets will have
173 // the default route as the source address. Also, it can receive packets sent
174 // to the default route.
175 void TestDefaultRoute(const IPAddress& default_route) {
nisse32f25052017-05-08 01:57:18 -0700176 ss_.SetDefaultRoute(default_route);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700177
178 // Create client1 bound to the any address.
179 AsyncSocket* socket =
nisse32f25052017-05-08 01:57:18 -0700180 ss_.CreateAsyncSocket(default_route.family(), SOCK_DGRAM);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700181 socket->Bind(EmptySocketAddressWithFamily(default_route.family()));
182 SocketAddress client1_any_addr = socket->GetLocalAddress();
183 EXPECT_TRUE(client1_any_addr.IsAnyIP());
nisse32f25052017-05-08 01:57:18 -0700184 auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket));
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700185
186 // Create client2 bound to the default route.
187 AsyncSocket* socket2 =
nisse32f25052017-05-08 01:57:18 -0700188 ss_.CreateAsyncSocket(default_route.family(), SOCK_DGRAM);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700189 socket2->Bind(SocketAddress(default_route, 0));
190 SocketAddress client2_addr = socket2->GetLocalAddress();
191 EXPECT_FALSE(client2_addr.IsAnyIP());
nisse32f25052017-05-08 01:57:18 -0700192 auto client2 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket2));
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700193
194 // Client1 sends to client2, client2 should see the default route as
195 // client1's address.
196 SocketAddress client1_addr;
197 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
198 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
199 EXPECT_EQ(client1_addr,
200 SocketAddress(default_route, client1_any_addr.port()));
201
202 // Client2 can send back to client1's default route address.
203 EXPECT_EQ(3, client2->SendTo("foo", 3, client1_addr));
204 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
205 }
206
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000207 void BasicTest(const SocketAddress& initial_addr) {
nisse32f25052017-05-08 01:57:18 -0700208 AsyncSocket* socket =
209 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000210 socket->Bind(initial_addr);
211 SocketAddress server_addr = socket->GetLocalAddress();
212 // Make sure VSS didn't switch families on us.
213 EXPECT_EQ(server_addr.family(), initial_addr.family());
214
nisse32f25052017-05-08 01:57:18 -0700215 auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000216 AsyncSocket* socket2 =
nisse32f25052017-05-08 01:57:18 -0700217 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
218 auto client2 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket2));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000219
220 SocketAddress client2_addr;
221 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
222 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
223
224 SocketAddress client1_addr;
225 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
226 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
227 EXPECT_EQ(client1_addr, server_addr);
228
229 SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family());
230 for (int i = 0; i < 10; i++) {
nisse32f25052017-05-08 01:57:18 -0700231 client2 = MakeUnique<TestClient>(
232 WrapUnique(AsyncUDPSocket::Create(&ss_, empty)));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000233
234 SocketAddress next_client2_addr;
235 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
236 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr));
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000237 CheckPortIncrementalization(next_client2_addr, client2_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000238 // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1);
239
240 SocketAddress server_addr2;
241 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr));
242 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2));
243 EXPECT_EQ(server_addr2, server_addr);
244
245 client2_addr = next_client2_addr;
246 }
247 }
248
249 // initial_addr should be made from either INADDR_ANY or in6addr_any.
250 void ConnectTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700251 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000252 SocketAddress accept_addr;
253 const SocketAddress kEmptyAddr =
254 EmptySocketAddressWithFamily(initial_addr.family());
255
256 // Create client
nisse32f25052017-05-08 01:57:18 -0700257 std::unique_ptr<AsyncSocket> client =
258 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
259 sink.Monitor(client.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000260 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
261 EXPECT_TRUE(client->GetLocalAddress().IsNil());
262
263 // Create server
nisse32f25052017-05-08 01:57:18 -0700264 std::unique_ptr<AsyncSocket> server =
265 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
266 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000267 EXPECT_NE(0, server->Listen(5)); // Bind required
268 EXPECT_EQ(0, server->Bind(initial_addr));
269 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
270 EXPECT_EQ(0, server->Listen(5));
271 EXPECT_EQ(server->GetState(), AsyncSocket::CS_CONNECTING);
272
273 // No pending server connections
nisse32f25052017-05-08 01:57:18 -0700274 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800275 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000276 EXPECT_EQ(AF_UNSPEC, accept_addr.family());
277
278 // Attempt connect to listening socket
279 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
280 EXPECT_NE(client->GetLocalAddress(), kEmptyAddr); // Implicit Bind
281 EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family()); // Implicit Bind
282 EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress());
283
284 // Client is connecting
285 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
nisse32f25052017-05-08 01:57:18 -0700286 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
287 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000288
nisse32f25052017-05-08 01:57:18 -0700289 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000290
291 // Client still connecting
292 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
nisse32f25052017-05-08 01:57:18 -0700293 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
294 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000295
296 // Server has pending connection
nisse32f25052017-05-08 01:57:18 -0700297 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
298 std::unique_ptr<Socket> accepted = WrapUnique(server->Accept(&accept_addr));
deadbeef37f5ecf2017-02-27 14:06:41 -0800299 EXPECT_TRUE(nullptr != accepted);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000300 EXPECT_NE(accept_addr, kEmptyAddr);
301 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr);
302
303 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED);
304 EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress());
305 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress());
306
nisse32f25052017-05-08 01:57:18 -0700307 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000308
309 // Client has connected
310 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTED);
nisse32f25052017-05-08 01:57:18 -0700311 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
312 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000313 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
314 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
315 }
316
317 void ConnectToNonListenerTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700318 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000319 SocketAddress accept_addr;
320 const SocketAddress nil_addr;
321 const SocketAddress empty_addr =
322 EmptySocketAddressWithFamily(initial_addr.family());
323
324 // Create client
nisse32f25052017-05-08 01:57:18 -0700325 std::unique_ptr<AsyncSocket> client =
326 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
327 sink.Monitor(client.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000328
329 // Create server
nisse32f25052017-05-08 01:57:18 -0700330 std::unique_ptr<AsyncSocket> server =
331 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
332 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000333 EXPECT_EQ(0, server->Bind(initial_addr));
334 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
335 // Attempt connect to non-listening socket
336 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
337
nisse32f25052017-05-08 01:57:18 -0700338 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000339
340 // No pending server connections
nisse32f25052017-05-08 01:57:18 -0700341 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800342 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000343 EXPECT_EQ(accept_addr, nil_addr);
344
345 // Connection failed
346 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
nisse32f25052017-05-08 01:57:18 -0700347 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
348 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000349 EXPECT_EQ(client->GetRemoteAddress(), nil_addr);
350 }
351
352 void CloseDuringConnectTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700353 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000354 SocketAddress accept_addr;
355 const SocketAddress empty_addr =
356 EmptySocketAddressWithFamily(initial_addr.family());
357
358 // Create client and server
jbauch555604a2016-04-26 03:13:22 -0700359 std::unique_ptr<AsyncSocket> client(
nisse32f25052017-05-08 01:57:18 -0700360 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000361 sink.Monitor(client.get());
jbauch555604a2016-04-26 03:13:22 -0700362 std::unique_ptr<AsyncSocket> server(
nisse32f25052017-05-08 01:57:18 -0700363 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000364 sink.Monitor(server.get());
365
366 // Initiate connect
367 EXPECT_EQ(0, server->Bind(initial_addr));
368 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
369
370 EXPECT_EQ(0, server->Listen(5));
371 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
372
373 // Server close before socket enters accept queue
kwibergd0d81482017-04-18 03:18:22 -0700374 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000375 server->Close();
376
nisse32f25052017-05-08 01:57:18 -0700377 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000378
379 // Result: connection failed
380 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700381 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000382
nisse32f25052017-05-08 01:57:18 -0700383 server.reset(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000384 sink.Monitor(server.get());
385
386 // Initiate connect
387 EXPECT_EQ(0, server->Bind(initial_addr));
388 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
389
390 EXPECT_EQ(0, server->Listen(5));
391 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
392
nisse32f25052017-05-08 01:57:18 -0700393 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000394
395 // Server close while socket is in accept queue
kwibergd0d81482017-04-18 03:18:22 -0700396 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000397 server->Close();
398
nisse32f25052017-05-08 01:57:18 -0700399 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000400
401 // Result: connection failed
402 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700403 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000404
405 // New server
nisse32f25052017-05-08 01:57:18 -0700406 server.reset(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000407 sink.Monitor(server.get());
408
409 // Initiate connect
410 EXPECT_EQ(0, server->Bind(initial_addr));
411 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
412
413 EXPECT_EQ(0, server->Listen(5));
414 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
415
nisse32f25052017-05-08 01:57:18 -0700416 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000417
418 // Server accepts connection
kwibergd0d81482017-04-18 03:18:22 -0700419 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
jbauch555604a2016-04-26 03:13:22 -0700420 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
deadbeef37f5ecf2017-02-27 14:06:41 -0800421 ASSERT_TRUE(nullptr != accepted.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000422 sink.Monitor(accepted.get());
423
424 // Client closes before connection complets
425 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED);
426
427 // Connected message has not been processed yet.
428 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
429 client->Close();
430
nisse32f25052017-05-08 01:57:18 -0700431 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000432
433 // Result: accepted socket closes
434 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700435 EXPECT_TRUE(sink.Check(accepted.get(), SSE_CLOSE));
436 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000437 }
438
439 void CloseTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700440 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000441 const SocketAddress kEmptyAddr;
442
443 // Create clients
nisse32f25052017-05-08 01:57:18 -0700444 std::unique_ptr<AsyncSocket> a =
445 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
446 sink.Monitor(a.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000447 a->Bind(initial_addr);
448 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
449
nisse32f25052017-05-08 01:57:18 -0700450 std::unique_ptr<AsyncSocket> b =
451 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000452 sink.Monitor(b.get());
453 b->Bind(initial_addr);
454 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
455
456 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
457 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
458
nisse32f25052017-05-08 01:57:18 -0700459 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000460
nisse32f25052017-05-08 01:57:18 -0700461 EXPECT_TRUE(sink.Check(a.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000462 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CONNECTED);
463 EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress());
464
kwibergd0d81482017-04-18 03:18:22 -0700465 EXPECT_TRUE(sink.Check(b.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000466 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CONNECTED);
467 EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress());
468
469 EXPECT_EQ(1, a->Send("a", 1));
470 b->Close();
471 EXPECT_EQ(1, a->Send("b", 1));
472
nisse32f25052017-05-08 01:57:18 -0700473 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000474
475 char buffer[10];
kwibergd0d81482017-04-18 03:18:22 -0700476 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
Stefan Holmer9131efd2016-05-23 18:19:26 +0200477 EXPECT_EQ(-1, b->Recv(buffer, 10, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000478
nisse32f25052017-05-08 01:57:18 -0700479 EXPECT_TRUE(sink.Check(a.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000480 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CLOSED);
481 EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr);
482
483 // No signal for Closer
kwibergd0d81482017-04-18 03:18:22 -0700484 EXPECT_FALSE(sink.Check(b.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000485 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CLOSED);
486 EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr);
487 }
488
489 void TcpSendTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700490 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000491 const SocketAddress kEmptyAddr;
492
493 // Connect two sockets
nisse32f25052017-05-08 01:57:18 -0700494 std::unique_ptr<AsyncSocket> a =
495 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
496 sink.Monitor(a.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000497 a->Bind(initial_addr);
498 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
499
nisse32f25052017-05-08 01:57:18 -0700500 std::unique_ptr<AsyncSocket> b =
501 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
502 sink.Monitor(b.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000503 b->Bind(initial_addr);
504 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
505
506 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
507 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
508
nisse32f25052017-05-08 01:57:18 -0700509 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000510
511 const size_t kBufferSize = 2000;
nisse32f25052017-05-08 01:57:18 -0700512 ss_.set_send_buffer_capacity(kBufferSize);
513 ss_.set_recv_buffer_capacity(kBufferSize);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000514
515 const size_t kDataSize = 5000;
516 char send_buffer[kDataSize], recv_buffer[kDataSize];
517 for (size_t i = 0; i < kDataSize; ++i)
518 send_buffer[i] = static_cast<char>(i % 256);
519 memset(recv_buffer, 0, sizeof(recv_buffer));
520 size_t send_pos = 0, recv_pos = 0;
521
522 // Can't send more than send buffer in one write
523 int result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
524 EXPECT_EQ(static_cast<int>(kBufferSize), result);
525 send_pos += result;
526
nisse32f25052017-05-08 01:57:18 -0700527 ss_.ProcessMessagesUntilIdle();
528 EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE));
529 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000530
531 // Receive buffer is already filled, fill send buffer again
532 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
533 EXPECT_EQ(static_cast<int>(kBufferSize), result);
534 send_pos += result;
535
nisse32f25052017-05-08 01:57:18 -0700536 ss_.ProcessMessagesUntilIdle();
537 EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE));
538 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000539
540 // No more room in send or receive buffer
541 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
542 EXPECT_EQ(-1, result);
543 EXPECT_TRUE(a->IsBlocking());
544
545 // Read a subset of the data
Stefan Holmer9131efd2016-05-23 18:19:26 +0200546 result = b->Recv(recv_buffer + recv_pos, 500, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000547 EXPECT_EQ(500, result);
548 recv_pos += result;
549
nisse32f25052017-05-08 01:57:18 -0700550 ss_.ProcessMessagesUntilIdle();
551 EXPECT_TRUE(sink.Check(a.get(), SSE_WRITE));
552 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000553
554 // Room for more on the sending side
555 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
556 EXPECT_EQ(500, result);
557 send_pos += result;
558
559 // Empty the recv buffer
560 while (true) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200561 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000562 if (result < 0) {
563 EXPECT_EQ(-1, result);
564 EXPECT_TRUE(b->IsBlocking());
565 break;
566 }
567 recv_pos += result;
568 }
569
nisse32f25052017-05-08 01:57:18 -0700570 ss_.ProcessMessagesUntilIdle();
571 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000572
573 // Continue to empty the recv buffer
574 while (true) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200575 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000576 if (result < 0) {
577 EXPECT_EQ(-1, result);
578 EXPECT_TRUE(b->IsBlocking());
579 break;
580 }
581 recv_pos += result;
582 }
583
584 // Send last of the data
585 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
586 EXPECT_EQ(500, result);
587 send_pos += result;
588
nisse32f25052017-05-08 01:57:18 -0700589 ss_.ProcessMessagesUntilIdle();
590 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000591
592 // Receive the last of the data
593 while (true) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200594 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000595 if (result < 0) {
596 EXPECT_EQ(-1, result);
597 EXPECT_TRUE(b->IsBlocking());
598 break;
599 }
600 recv_pos += result;
601 }
602
nisse32f25052017-05-08 01:57:18 -0700603 ss_.ProcessMessagesUntilIdle();
604 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000605
606 // The received data matches the sent data
607 EXPECT_EQ(kDataSize, send_pos);
608 EXPECT_EQ(kDataSize, recv_pos);
609 EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize));
610 }
611
612 void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) {
613 const SocketAddress kEmptyAddr;
614
615 // Connect two sockets
nisse32f25052017-05-08 01:57:18 -0700616 std::unique_ptr<AsyncSocket> a =
617 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
618 std::unique_ptr<AsyncSocket> b =
619 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000620 a->Bind(initial_addr);
621 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
622
623 b->Bind(initial_addr);
624 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
625
626 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
627 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -0700628 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000629
630 // First, deliver all packets in 0 ms.
631 char buffer[2] = { 0, 0 };
632 const char cNumPackets = 10;
633 for (char i = 0; i < cNumPackets; ++i) {
634 buffer[0] = '0' + i;
635 EXPECT_EQ(1, a->Send(buffer, 1));
636 }
637
nisse32f25052017-05-08 01:57:18 -0700638 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000639
640 for (char i = 0; i < cNumPackets; ++i) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200641 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000642 EXPECT_EQ(static_cast<char>('0' + i), buffer[0]);
643 }
644
645 // Next, deliver packets at random intervals
Peter Boström0c4e06b2015-10-07 12:23:21 +0200646 const uint32_t mean = 50;
647 const uint32_t stddev = 50;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000648
nisse32f25052017-05-08 01:57:18 -0700649 ss_.set_delay_mean(mean);
650 ss_.set_delay_stddev(stddev);
651 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000652
653 for (char i = 0; i < cNumPackets; ++i) {
654 buffer[0] = 'A' + i;
655 EXPECT_EQ(1, a->Send(buffer, 1));
656 }
657
nisse32f25052017-05-08 01:57:18 -0700658 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000659
660 for (char i = 0; i < cNumPackets; ++i) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200661 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000662 EXPECT_EQ(static_cast<char>('A' + i), buffer[0]);
663 }
664 }
665
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000666 // It is important that initial_addr's port has to be 0 such that the
667 // incremental port behavior could ensure the 2 Binds result in different
668 // address.
669 void BandwidthTest(const SocketAddress& initial_addr) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000670 AsyncSocket* send_socket =
nisse32f25052017-05-08 01:57:18 -0700671 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000672 AsyncSocket* recv_socket =
nisse32f25052017-05-08 01:57:18 -0700673 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000674 ASSERT_EQ(0, send_socket->Bind(initial_addr));
675 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
676 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
677 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000678 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
679
Peter Boström0c4e06b2015-10-07 12:23:21 +0200680 uint32_t bandwidth = 64 * 1024;
nisse32f25052017-05-08 01:57:18 -0700681 ss_.set_bandwidth(bandwidth);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000682
683 Thread* pthMain = Thread::Current();
684 Sender sender(pthMain, send_socket, 80 * 1024);
685 Receiver receiver(pthMain, recv_socket, bandwidth);
686
687 pthMain->ProcessMessages(5000);
688 sender.done = true;
689 pthMain->ProcessMessages(5000);
690
691 ASSERT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4);
692 ASSERT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s
693
nisse32f25052017-05-08 01:57:18 -0700694 ss_.set_bandwidth(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000695 }
696
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000697 // It is important that initial_addr's port has to be 0 such that the
698 // incremental port behavior could ensure the 2 Binds result in different
699 // address.
700 void DelayTest(const SocketAddress& initial_addr) {
deadbeef37f5ecf2017-02-27 14:06:41 -0800701 time_t seed = ::time(nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000702 LOG(LS_VERBOSE) << "seed = " << seed;
703 srand(static_cast<unsigned int>(seed));
704
Peter Boström0c4e06b2015-10-07 12:23:21 +0200705 const uint32_t mean = 2000;
706 const uint32_t stddev = 500;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000707
nisse32f25052017-05-08 01:57:18 -0700708 ss_.set_delay_mean(mean);
709 ss_.set_delay_stddev(stddev);
710 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000711
712 AsyncSocket* send_socket =
nisse32f25052017-05-08 01:57:18 -0700713 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000714 AsyncSocket* recv_socket =
nisse32f25052017-05-08 01:57:18 -0700715 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000716 ASSERT_EQ(0, send_socket->Bind(initial_addr));
717 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
718 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
719 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000720 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
721
722 Thread* pthMain = Thread::Current();
723 // Avg packet size is 2K, so at 200KB/s for 10s, we should see about
724 // 1000 packets, which is necessary to get a good distribution.
725 Sender sender(pthMain, send_socket, 100 * 2 * 1024);
726 Receiver receiver(pthMain, recv_socket, 0);
727
728 pthMain->ProcessMessages(10000);
729 sender.done = receiver.done = true;
nisse32f25052017-05-08 01:57:18 -0700730 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000731
732 const double sample_mean = receiver.sum / receiver.samples;
733 double num =
734 receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum;
735 double den = receiver.samples * (receiver.samples - 1);
736 const double sample_stddev = sqrt(num / den);
737 LOG(LS_VERBOSE) << "mean=" << sample_mean << " stddev=" << sample_stddev;
738
739 EXPECT_LE(500u, receiver.samples);
740 // We initially used a 0.1 fudge factor, but on the build machine, we
741 // have seen the value differ by as much as 0.13.
742 EXPECT_NEAR(mean, sample_mean, 0.15 * mean);
743 EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev);
744
nisse32f25052017-05-08 01:57:18 -0700745 ss_.set_delay_mean(0);
746 ss_.set_delay_stddev(0);
747 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000748 }
749
750 // Test cross-family communication between a client bound to client_addr and a
751 // server bound to server_addr. shouldSucceed indicates if communication is
752 // expected to work or not.
753 void CrossFamilyConnectionTest(const SocketAddress& client_addr,
754 const SocketAddress& server_addr,
755 bool shouldSucceed) {
kwibergd0d81482017-04-18 03:18:22 -0700756 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000757 SocketAddress accept_address;
758 const SocketAddress kEmptyAddr;
759
760 // Client gets a IPv4 address
nisse32f25052017-05-08 01:57:18 -0700761 std::unique_ptr<AsyncSocket> client =
762 WrapUnique(ss_.CreateAsyncSocket(client_addr.family(), SOCK_STREAM));
763 sink.Monitor(client.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000764 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
765 EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr);
766 client->Bind(client_addr);
767
768 // Server gets a non-mapped non-any IPv6 address.
769 // IPv4 sockets should not be able to connect to this.
nisse32f25052017-05-08 01:57:18 -0700770 std::unique_ptr<AsyncSocket> server =
771 WrapUnique(ss_.CreateAsyncSocket(server_addr.family(), SOCK_STREAM));
772 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000773 server->Bind(server_addr);
774 server->Listen(5);
775
776 if (shouldSucceed) {
777 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -0700778 ss_.ProcessMessagesUntilIdle();
779 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
780 std::unique_ptr<Socket> accepted =
781 WrapUnique(server->Accept(&accept_address));
deadbeef37f5ecf2017-02-27 14:06:41 -0800782 EXPECT_TRUE(nullptr != accepted);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000783 EXPECT_NE(kEmptyAddr, accept_address);
nisse32f25052017-05-08 01:57:18 -0700784 ss_.ProcessMessagesUntilIdle();
785 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000786 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
787 } else {
788 // Check that the connection failed.
789 EXPECT_EQ(-1, client->Connect(server->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -0700790 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000791
nisse32f25052017-05-08 01:57:18 -0700792 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800793 EXPECT_TRUE(nullptr == server->Accept(&accept_address));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000794 EXPECT_EQ(accept_address, kEmptyAddr);
795 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
nisse32f25052017-05-08 01:57:18 -0700796 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000797 EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr);
798 }
799 }
800
801 // Test cross-family datagram sending between a client bound to client_addr
802 // and a server bound to server_addr. shouldSucceed indicates if sending is
jlmiller@webrtc.orgec499be2015-02-07 22:37:59 +0000803 // expected to succeed or not.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000804 void CrossFamilyDatagramTest(const SocketAddress& client_addr,
805 const SocketAddress& server_addr,
806 bool shouldSucceed) {
nisse32f25052017-05-08 01:57:18 -0700807 AsyncSocket* socket = ss_.CreateAsyncSocket(SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000808 socket->Bind(server_addr);
809 SocketAddress bound_server_addr = socket->GetLocalAddress();
nisse32f25052017-05-08 01:57:18 -0700810 auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000811
nisse32f25052017-05-08 01:57:18 -0700812 AsyncSocket* socket2 = ss_.CreateAsyncSocket(SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000813 socket2->Bind(client_addr);
nisse32f25052017-05-08 01:57:18 -0700814 auto client2 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket2));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000815 SocketAddress client2_addr;
816
817 if (shouldSucceed) {
818 EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr));
819 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
820 SocketAddress client1_addr;
821 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
822 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
823 EXPECT_EQ(client1_addr, bound_server_addr);
824 } else {
825 EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr));
jlmiller@webrtc.orgec499be2015-02-07 22:37:59 +0000826 EXPECT_TRUE(client1->CheckNoPacket());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000827 }
828 }
829
830 protected:
nisse32f25052017-05-08 01:57:18 -0700831 VirtualSocketServer ss_;
nisse7eaa4ea2017-05-08 05:25:41 -0700832 AutoSocketServerThread thread_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000833 const SocketAddress kIPv4AnyAddress;
834 const SocketAddress kIPv6AnyAddress;
835};
836
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000837TEST_F(VirtualSocketServerTest, basic_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000838 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000);
839 BasicTest(ipv4_test_addr);
840}
841
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000842TEST_F(VirtualSocketServerTest, basic_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000843 SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 5000);
844 BasicTest(ipv6_test_addr);
845}
846
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700847TEST_F(VirtualSocketServerTest, TestDefaultRoute_v4) {
848 IPAddress ipv4_default_addr(0x01020304);
849 TestDefaultRoute(ipv4_default_addr);
850}
851
852TEST_F(VirtualSocketServerTest, TestDefaultRoute_v6) {
853 IPAddress ipv6_default_addr;
854 EXPECT_TRUE(
855 IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ipv6_default_addr));
856 TestDefaultRoute(ipv6_default_addr);
857}
858
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000859TEST_F(VirtualSocketServerTest, connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000860 ConnectTest(kIPv4AnyAddress);
861}
862
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000863TEST_F(VirtualSocketServerTest, connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000864 ConnectTest(kIPv6AnyAddress);
865}
866
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000867TEST_F(VirtualSocketServerTest, connect_to_non_listener_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000868 ConnectToNonListenerTest(kIPv4AnyAddress);
869}
870
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000871TEST_F(VirtualSocketServerTest, connect_to_non_listener_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000872 ConnectToNonListenerTest(kIPv6AnyAddress);
873}
874
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000875TEST_F(VirtualSocketServerTest, close_during_connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000876 CloseDuringConnectTest(kIPv4AnyAddress);
877}
878
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000879TEST_F(VirtualSocketServerTest, close_during_connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000880 CloseDuringConnectTest(kIPv6AnyAddress);
881}
882
883TEST_F(VirtualSocketServerTest, close_v4) {
884 CloseTest(kIPv4AnyAddress);
885}
886
887TEST_F(VirtualSocketServerTest, close_v6) {
888 CloseTest(kIPv6AnyAddress);
889}
890
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000891TEST_F(VirtualSocketServerTest, tcp_send_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000892 TcpSendTest(kIPv4AnyAddress);
893}
894
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000895TEST_F(VirtualSocketServerTest, tcp_send_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000896 TcpSendTest(kIPv6AnyAddress);
897}
898
899TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v4) {
900 TcpSendsPacketsInOrderTest(kIPv4AnyAddress);
901}
902
903TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v6) {
904 TcpSendsPacketsInOrderTest(kIPv6AnyAddress);
905}
906
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000907TEST_F(VirtualSocketServerTest, bandwidth_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000908 BandwidthTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000909}
910
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000911TEST_F(VirtualSocketServerTest, bandwidth_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000912 BandwidthTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000913}
914
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000915TEST_F(VirtualSocketServerTest, delay_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000916 DelayTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000917}
918
919// See: https://code.google.com/p/webrtc/issues/detail?id=2409
920TEST_F(VirtualSocketServerTest, DISABLED_delay_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000921 DelayTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000922}
923
924// Works, receiving socket sees 127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000925TEST_F(VirtualSocketServerTest, CanConnectFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000926 CrossFamilyConnectionTest(SocketAddress("::ffff:127.0.0.2", 0),
927 SocketAddress("0.0.0.0", 5000),
928 true);
929}
930
931// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000932TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000933 CrossFamilyConnectionTest(SocketAddress("::2", 0),
934 SocketAddress("0.0.0.0", 5000),
935 false);
936}
937
938// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000939TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000940 CrossFamilyConnectionTest(SocketAddress("::2", 0),
941 SocketAddress("::ffff:127.0.0.1", 5000),
942 false);
943}
944
945// Works. receiving socket sees ::ffff:127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000946TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000947 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
948 SocketAddress("::", 5000),
949 true);
950}
951
952// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000953TEST_F(VirtualSocketServerTest, CantConnectFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000954 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
955 SocketAddress("::1", 5000),
956 false);
957}
958
959// Works. Receiving socket sees ::ffff:127.0.0.1.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000960TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000961 CrossFamilyConnectionTest(SocketAddress("127.0.0.1", 0),
962 SocketAddress("::ffff:127.0.0.2", 5000),
963 true);
964}
965
966// Works, receiving socket sees a result from GetNextIP.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000967TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000968 CrossFamilyConnectionTest(SocketAddress("::", 0),
969 SocketAddress("0.0.0.0", 5000),
970 true);
971}
972
973// Works, receiving socket sees whatever GetNextIP gave the client.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000974TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000975 CrossFamilyConnectionTest(SocketAddress("0.0.0.0", 0),
976 SocketAddress("::", 5000),
977 true);
978}
979
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000980TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000981 CrossFamilyDatagramTest(SocketAddress("0.0.0.0", 0),
982 SocketAddress("::", 5000),
983 true);
984}
985
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000986TEST_F(VirtualSocketServerTest, CanSendDatagramFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000987 CrossFamilyDatagramTest(SocketAddress("::ffff:127.0.0.1", 0),
988 SocketAddress("0.0.0.0", 5000),
989 true);
990}
991
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000992TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000993 CrossFamilyDatagramTest(SocketAddress("::2", 0),
994 SocketAddress("0.0.0.0", 5000),
995 false);
996}
997
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000998TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000999 CrossFamilyDatagramTest(SocketAddress("::2", 0),
1000 SocketAddress("::ffff:127.0.0.1", 5000),
1001 false);
1002}
1003
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001004TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001005 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
1006 SocketAddress("::", 5000),
1007 true);
1008}
1009
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001010TEST_F(VirtualSocketServerTest, CantSendDatagramFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001011 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
1012 SocketAddress("::1", 5000),
1013 false);
1014}
1015
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001016TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001017 CrossFamilyDatagramTest(SocketAddress("127.0.0.1", 0),
1018 SocketAddress("::ffff:127.0.0.2", 5000),
1019 true);
1020}
1021
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001022TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001023 CrossFamilyDatagramTest(SocketAddress("::", 0),
1024 SocketAddress("0.0.0.0", 5000),
1025 true);
1026}
1027
Taylor Brandstettere7536412016-09-09 13:16:15 -07001028TEST_F(VirtualSocketServerTest, SetSendingBlockedWithUdpSocket) {
1029 AsyncSocket* socket1 =
nisse32f25052017-05-08 01:57:18 -07001030 ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM);
1031 std::unique_ptr<AsyncSocket> socket2 =
1032 WrapUnique(ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001033 socket1->Bind(kIPv4AnyAddress);
1034 socket2->Bind(kIPv4AnyAddress);
nisse32f25052017-05-08 01:57:18 -07001035 auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket1));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001036
nisse32f25052017-05-08 01:57:18 -07001037 ss_.SetSendingBlocked(true);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001038 EXPECT_EQ(-1, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1039 EXPECT_TRUE(socket1->IsBlocking());
1040 EXPECT_EQ(0, client1->ready_to_send_count());
1041
nisse32f25052017-05-08 01:57:18 -07001042 ss_.SetSendingBlocked(false);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001043 EXPECT_EQ(1, client1->ready_to_send_count());
1044 EXPECT_EQ(3, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1045}
1046
1047TEST_F(VirtualSocketServerTest, SetSendingBlockedWithTcpSocket) {
1048 constexpr size_t kBufferSize = 1024;
nisse32f25052017-05-08 01:57:18 -07001049 ss_.set_send_buffer_capacity(kBufferSize);
1050 ss_.set_recv_buffer_capacity(kBufferSize);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001051
kwibergd0d81482017-04-18 03:18:22 -07001052 StreamSink sink;
nisse32f25052017-05-08 01:57:18 -07001053 std::unique_ptr<AsyncSocket> socket1 =
1054 WrapUnique(ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
1055 std::unique_ptr<AsyncSocket> socket2 =
1056 WrapUnique(ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
1057 sink.Monitor(socket1.get());
1058 sink.Monitor(socket2.get());
Taylor Brandstettere7536412016-09-09 13:16:15 -07001059 socket1->Bind(kIPv4AnyAddress);
1060 socket2->Bind(kIPv4AnyAddress);
1061
1062 // Connect sockets.
1063 EXPECT_EQ(0, socket1->Connect(socket2->GetLocalAddress()));
1064 EXPECT_EQ(0, socket2->Connect(socket1->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -07001065 ss_.ProcessMessagesUntilIdle();
Taylor Brandstettere7536412016-09-09 13:16:15 -07001066
1067 char data[kBufferSize] = {};
1068
1069 // First Send call will fill the send buffer but not send anything.
nisse32f25052017-05-08 01:57:18 -07001070 ss_.SetSendingBlocked(true);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001071 EXPECT_EQ(static_cast<int>(kBufferSize), socket1->Send(data, kBufferSize));
nisse32f25052017-05-08 01:57:18 -07001072 ss_.ProcessMessagesUntilIdle();
1073 EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
1074 EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001075 EXPECT_FALSE(socket1->IsBlocking());
1076
1077 // Since the send buffer is full, next Send will result in EWOULDBLOCK.
1078 EXPECT_EQ(-1, socket1->Send(data, kBufferSize));
nisse32f25052017-05-08 01:57:18 -07001079 EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
1080 EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001081 EXPECT_TRUE(socket1->IsBlocking());
1082
1083 // When sending is unblocked, the buffered data should be sent and
1084 // SignalWriteEvent should fire.
nisse32f25052017-05-08 01:57:18 -07001085 ss_.SetSendingBlocked(false);
1086 ss_.ProcessMessagesUntilIdle();
1087 EXPECT_TRUE(sink.Check(socket1.get(), SSE_WRITE));
1088 EXPECT_TRUE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001089}
1090
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001091TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02001092 const uint32_t kTestMean[] = {10, 100, 333, 1000};
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001093 const double kTestDev[] = { 0.25, 0.1, 0.01 };
Taylor Brandstettere7536412016-09-09 13:16:15 -07001094 // TODO(deadbeef): The current code only works for 1000 data points or more.
Peter Boström0c4e06b2015-10-07 12:23:21 +02001095 const uint32_t kTestSamples[] = {/*10, 100,*/ 1000};
tfarina5237aaf2015-11-10 23:44:30 -08001096 for (size_t midx = 0; midx < arraysize(kTestMean); ++midx) {
1097 for (size_t didx = 0; didx < arraysize(kTestDev); ++didx) {
1098 for (size_t sidx = 0; sidx < arraysize(kTestSamples); ++sidx) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001099 ASSERT_LT(0u, kTestSamples[sidx]);
Peter Boström0c4e06b2015-10-07 12:23:21 +02001100 const uint32_t kStdDev =
1101 static_cast<uint32_t>(kTestDev[didx] * kTestMean[midx]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001102 VirtualSocketServer::Function* f =
1103 VirtualSocketServer::CreateDistribution(kTestMean[midx],
1104 kStdDev,
1105 kTestSamples[sidx]);
deadbeef37f5ecf2017-02-27 14:06:41 -08001106 ASSERT_TRUE(nullptr != f);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001107 ASSERT_EQ(kTestSamples[sidx], f->size());
1108 double sum = 0;
Peter Boström0c4e06b2015-10-07 12:23:21 +02001109 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001110 sum += (*f)[i].second;
1111 }
1112 const double mean = sum / f->size();
1113 double sum_sq_dev = 0;
Peter Boström0c4e06b2015-10-07 12:23:21 +02001114 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001115 double dev = (*f)[i].second - mean;
1116 sum_sq_dev += dev * dev;
1117 }
1118 const double stddev = sqrt(sum_sq_dev / f->size());
1119 EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx])
1120 << "M=" << kTestMean[midx]
1121 << " SD=" << kStdDev
1122 << " N=" << kTestSamples[sidx];
1123 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev)
1124 << "M=" << kTestMean[midx]
1125 << " SD=" << kStdDev
1126 << " N=" << kTestSamples[sidx];
1127 delete f;
1128 }
1129 }
1130 }
1131}