blob: 54a52d9eae207b8a93501cfb7bc42970dd72ece1 [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()
nisse32f25052017-05-08 01:57:18 -0700149 : ss_(nullptr),
nisse7eaa4ea2017-05-08 05:25:41 -0700150 thread_(&ss_),
deadbeef37f5ecf2017-02-27 14:06:41 -0800151 kIPv4AnyAddress(IPAddress(INADDR_ANY), 0),
152 kIPv6AnyAddress(IPAddress(in6addr_any), 0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000153
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000154 void CheckPortIncrementalization(const SocketAddress& post,
155 const SocketAddress& pre) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000156 EXPECT_EQ(post.port(), pre.port() + 1);
157 IPAddress post_ip = post.ipaddr();
158 IPAddress pre_ip = pre.ipaddr();
159 EXPECT_EQ(pre_ip.family(), post_ip.family());
160 if (post_ip.family() == AF_INET) {
161 in_addr pre_ipv4 = pre_ip.ipv4_address();
162 in_addr post_ipv4 = post_ip.ipv4_address();
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000163 EXPECT_EQ(post_ipv4.s_addr, pre_ipv4.s_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000164 } else if (post_ip.family() == AF_INET6) {
165 in6_addr post_ip6 = post_ip.ipv6_address();
166 in6_addr pre_ip6 = pre_ip.ipv6_address();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200167 uint32_t* post_as_ints = reinterpret_cast<uint32_t*>(&post_ip6.s6_addr);
168 uint32_t* pre_as_ints = reinterpret_cast<uint32_t*>(&pre_ip6.s6_addr);
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000169 EXPECT_EQ(post_as_ints[3], pre_as_ints[3]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000170 }
171 }
172
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700173 // Test a client can bind to the any address, and all sent packets will have
174 // the default route as the source address. Also, it can receive packets sent
175 // to the default route.
176 void TestDefaultRoute(const IPAddress& default_route) {
nisse32f25052017-05-08 01:57:18 -0700177 ss_.SetDefaultRoute(default_route);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700178
179 // Create client1 bound to the any address.
180 AsyncSocket* socket =
nisse32f25052017-05-08 01:57:18 -0700181 ss_.CreateAsyncSocket(default_route.family(), SOCK_DGRAM);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700182 socket->Bind(EmptySocketAddressWithFamily(default_route.family()));
183 SocketAddress client1_any_addr = socket->GetLocalAddress();
184 EXPECT_TRUE(client1_any_addr.IsAnyIP());
nisse32f25052017-05-08 01:57:18 -0700185 auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket));
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700186
187 // Create client2 bound to the default route.
188 AsyncSocket* socket2 =
nisse32f25052017-05-08 01:57:18 -0700189 ss_.CreateAsyncSocket(default_route.family(), SOCK_DGRAM);
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700190 socket2->Bind(SocketAddress(default_route, 0));
191 SocketAddress client2_addr = socket2->GetLocalAddress();
192 EXPECT_FALSE(client2_addr.IsAnyIP());
nisse32f25052017-05-08 01:57:18 -0700193 auto client2 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket2));
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700194
195 // Client1 sends to client2, client2 should see the default route as
196 // client1's address.
197 SocketAddress client1_addr;
198 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
199 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
200 EXPECT_EQ(client1_addr,
201 SocketAddress(default_route, client1_any_addr.port()));
202
203 // Client2 can send back to client1's default route address.
204 EXPECT_EQ(3, client2->SendTo("foo", 3, client1_addr));
205 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
206 }
207
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000208 void BasicTest(const SocketAddress& initial_addr) {
nisse32f25052017-05-08 01:57:18 -0700209 AsyncSocket* socket =
210 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000211 socket->Bind(initial_addr);
212 SocketAddress server_addr = socket->GetLocalAddress();
213 // Make sure VSS didn't switch families on us.
214 EXPECT_EQ(server_addr.family(), initial_addr.family());
215
nisse32f25052017-05-08 01:57:18 -0700216 auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000217 AsyncSocket* socket2 =
nisse32f25052017-05-08 01:57:18 -0700218 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
219 auto client2 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket2));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000220
221 SocketAddress client2_addr;
222 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
223 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
224
225 SocketAddress client1_addr;
226 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
227 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
228 EXPECT_EQ(client1_addr, server_addr);
229
230 SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family());
231 for (int i = 0; i < 10; i++) {
nisse32f25052017-05-08 01:57:18 -0700232 client2 = MakeUnique<TestClient>(
233 WrapUnique(AsyncUDPSocket::Create(&ss_, empty)));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000234
235 SocketAddress next_client2_addr;
236 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
237 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr));
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000238 CheckPortIncrementalization(next_client2_addr, client2_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000239 // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1);
240
241 SocketAddress server_addr2;
242 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr));
243 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2));
244 EXPECT_EQ(server_addr2, server_addr);
245
246 client2_addr = next_client2_addr;
247 }
248 }
249
250 // initial_addr should be made from either INADDR_ANY or in6addr_any.
251 void ConnectTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700252 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000253 SocketAddress accept_addr;
254 const SocketAddress kEmptyAddr =
255 EmptySocketAddressWithFamily(initial_addr.family());
256
257 // Create client
nisse32f25052017-05-08 01:57:18 -0700258 std::unique_ptr<AsyncSocket> client =
259 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
260 sink.Monitor(client.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000261 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
262 EXPECT_TRUE(client->GetLocalAddress().IsNil());
263
264 // Create server
nisse32f25052017-05-08 01:57:18 -0700265 std::unique_ptr<AsyncSocket> server =
266 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
267 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000268 EXPECT_NE(0, server->Listen(5)); // Bind required
269 EXPECT_EQ(0, server->Bind(initial_addr));
270 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
271 EXPECT_EQ(0, server->Listen(5));
272 EXPECT_EQ(server->GetState(), AsyncSocket::CS_CONNECTING);
273
274 // No pending server connections
nisse32f25052017-05-08 01:57:18 -0700275 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800276 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000277 EXPECT_EQ(AF_UNSPEC, accept_addr.family());
278
279 // Attempt connect to listening socket
280 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
281 EXPECT_NE(client->GetLocalAddress(), kEmptyAddr); // Implicit Bind
282 EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family()); // Implicit Bind
283 EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress());
284
285 // Client is connecting
286 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
nisse32f25052017-05-08 01:57:18 -0700287 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
288 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000289
nisse32f25052017-05-08 01:57:18 -0700290 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000291
292 // Client still connecting
293 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
nisse32f25052017-05-08 01:57:18 -0700294 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
295 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000296
297 // Server has pending connection
nisse32f25052017-05-08 01:57:18 -0700298 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
299 std::unique_ptr<Socket> accepted = WrapUnique(server->Accept(&accept_addr));
deadbeef37f5ecf2017-02-27 14:06:41 -0800300 EXPECT_TRUE(nullptr != accepted);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000301 EXPECT_NE(accept_addr, kEmptyAddr);
302 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr);
303
304 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED);
305 EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress());
306 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress());
307
nisse32f25052017-05-08 01:57:18 -0700308 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000309
310 // Client has connected
311 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTED);
nisse32f25052017-05-08 01:57:18 -0700312 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
313 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000314 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
315 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
316 }
317
318 void ConnectToNonListenerTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700319 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000320 SocketAddress accept_addr;
321 const SocketAddress nil_addr;
322 const SocketAddress empty_addr =
323 EmptySocketAddressWithFamily(initial_addr.family());
324
325 // Create client
nisse32f25052017-05-08 01:57:18 -0700326 std::unique_ptr<AsyncSocket> client =
327 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
328 sink.Monitor(client.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000329
330 // Create server
nisse32f25052017-05-08 01:57:18 -0700331 std::unique_ptr<AsyncSocket> server =
332 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
333 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000334 EXPECT_EQ(0, server->Bind(initial_addr));
335 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
336 // Attempt connect to non-listening socket
337 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
338
nisse32f25052017-05-08 01:57:18 -0700339 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000340
341 // No pending server connections
nisse32f25052017-05-08 01:57:18 -0700342 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800343 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000344 EXPECT_EQ(accept_addr, nil_addr);
345
346 // Connection failed
347 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
nisse32f25052017-05-08 01:57:18 -0700348 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
349 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000350 EXPECT_EQ(client->GetRemoteAddress(), nil_addr);
351 }
352
353 void CloseDuringConnectTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700354 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000355 SocketAddress accept_addr;
356 const SocketAddress empty_addr =
357 EmptySocketAddressWithFamily(initial_addr.family());
358
359 // Create client and server
jbauch555604a2016-04-26 03:13:22 -0700360 std::unique_ptr<AsyncSocket> client(
nisse32f25052017-05-08 01:57:18 -0700361 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000362 sink.Monitor(client.get());
jbauch555604a2016-04-26 03:13:22 -0700363 std::unique_ptr<AsyncSocket> server(
nisse32f25052017-05-08 01:57:18 -0700364 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000365 sink.Monitor(server.get());
366
367 // Initiate connect
368 EXPECT_EQ(0, server->Bind(initial_addr));
369 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
370
371 EXPECT_EQ(0, server->Listen(5));
372 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
373
374 // Server close before socket enters accept queue
kwibergd0d81482017-04-18 03:18:22 -0700375 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000376 server->Close();
377
nisse32f25052017-05-08 01:57:18 -0700378 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000379
380 // Result: connection failed
381 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700382 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000383
nisse32f25052017-05-08 01:57:18 -0700384 server.reset(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000385 sink.Monitor(server.get());
386
387 // Initiate connect
388 EXPECT_EQ(0, server->Bind(initial_addr));
389 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
390
391 EXPECT_EQ(0, server->Listen(5));
392 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
393
nisse32f25052017-05-08 01:57:18 -0700394 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000395
396 // Server close while socket is in accept queue
kwibergd0d81482017-04-18 03:18:22 -0700397 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000398 server->Close();
399
nisse32f25052017-05-08 01:57:18 -0700400 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000401
402 // Result: connection failed
403 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700404 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000405
406 // New server
nisse32f25052017-05-08 01:57:18 -0700407 server.reset(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000408 sink.Monitor(server.get());
409
410 // Initiate connect
411 EXPECT_EQ(0, server->Bind(initial_addr));
412 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
413
414 EXPECT_EQ(0, server->Listen(5));
415 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
416
nisse32f25052017-05-08 01:57:18 -0700417 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000418
419 // Server accepts connection
kwibergd0d81482017-04-18 03:18:22 -0700420 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
jbauch555604a2016-04-26 03:13:22 -0700421 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
deadbeef37f5ecf2017-02-27 14:06:41 -0800422 ASSERT_TRUE(nullptr != accepted.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000423 sink.Monitor(accepted.get());
424
425 // Client closes before connection complets
426 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED);
427
428 // Connected message has not been processed yet.
429 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
430 client->Close();
431
nisse32f25052017-05-08 01:57:18 -0700432 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000433
434 // Result: accepted socket closes
435 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CLOSED);
kwibergd0d81482017-04-18 03:18:22 -0700436 EXPECT_TRUE(sink.Check(accepted.get(), SSE_CLOSE));
437 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000438 }
439
440 void CloseTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700441 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000442 const SocketAddress kEmptyAddr;
443
444 // Create clients
nisse32f25052017-05-08 01:57:18 -0700445 std::unique_ptr<AsyncSocket> a =
446 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
447 sink.Monitor(a.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000448 a->Bind(initial_addr);
449 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
450
nisse32f25052017-05-08 01:57:18 -0700451 std::unique_ptr<AsyncSocket> b =
452 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000453 sink.Monitor(b.get());
454 b->Bind(initial_addr);
455 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
456
457 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
458 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
459
nisse32f25052017-05-08 01:57:18 -0700460 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000461
nisse32f25052017-05-08 01:57:18 -0700462 EXPECT_TRUE(sink.Check(a.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000463 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CONNECTED);
464 EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress());
465
kwibergd0d81482017-04-18 03:18:22 -0700466 EXPECT_TRUE(sink.Check(b.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000467 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CONNECTED);
468 EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress());
469
470 EXPECT_EQ(1, a->Send("a", 1));
471 b->Close();
472 EXPECT_EQ(1, a->Send("b", 1));
473
nisse32f25052017-05-08 01:57:18 -0700474 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000475
476 char buffer[10];
kwibergd0d81482017-04-18 03:18:22 -0700477 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
Stefan Holmer9131efd2016-05-23 18:19:26 +0200478 EXPECT_EQ(-1, b->Recv(buffer, 10, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000479
nisse32f25052017-05-08 01:57:18 -0700480 EXPECT_TRUE(sink.Check(a.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000481 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CLOSED);
482 EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr);
483
484 // No signal for Closer
kwibergd0d81482017-04-18 03:18:22 -0700485 EXPECT_FALSE(sink.Check(b.get(), SSE_CLOSE));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000486 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CLOSED);
487 EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr);
488 }
489
490 void TcpSendTest(const SocketAddress& initial_addr) {
kwibergd0d81482017-04-18 03:18:22 -0700491 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000492 const SocketAddress kEmptyAddr;
493
494 // Connect two sockets
nisse32f25052017-05-08 01:57:18 -0700495 std::unique_ptr<AsyncSocket> a =
496 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
497 sink.Monitor(a.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000498 a->Bind(initial_addr);
499 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
500
nisse32f25052017-05-08 01:57:18 -0700501 std::unique_ptr<AsyncSocket> b =
502 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
503 sink.Monitor(b.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000504 b->Bind(initial_addr);
505 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
506
507 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
508 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
509
nisse32f25052017-05-08 01:57:18 -0700510 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000511
512 const size_t kBufferSize = 2000;
nisse32f25052017-05-08 01:57:18 -0700513 ss_.set_send_buffer_capacity(kBufferSize);
514 ss_.set_recv_buffer_capacity(kBufferSize);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000515
516 const size_t kDataSize = 5000;
517 char send_buffer[kDataSize], recv_buffer[kDataSize];
518 for (size_t i = 0; i < kDataSize; ++i)
519 send_buffer[i] = static_cast<char>(i % 256);
520 memset(recv_buffer, 0, sizeof(recv_buffer));
521 size_t send_pos = 0, recv_pos = 0;
522
523 // Can't send more than send buffer in one write
524 int result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
525 EXPECT_EQ(static_cast<int>(kBufferSize), result);
526 send_pos += result;
527
nisse32f25052017-05-08 01:57:18 -0700528 ss_.ProcessMessagesUntilIdle();
529 EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE));
530 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000531
532 // Receive buffer is already filled, fill send buffer again
533 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
534 EXPECT_EQ(static_cast<int>(kBufferSize), result);
535 send_pos += result;
536
nisse32f25052017-05-08 01:57:18 -0700537 ss_.ProcessMessagesUntilIdle();
538 EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE));
539 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000540
541 // No more room in send or receive buffer
542 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
543 EXPECT_EQ(-1, result);
544 EXPECT_TRUE(a->IsBlocking());
545
546 // Read a subset of the data
Stefan Holmer9131efd2016-05-23 18:19:26 +0200547 result = b->Recv(recv_buffer + recv_pos, 500, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000548 EXPECT_EQ(500, result);
549 recv_pos += result;
550
nisse32f25052017-05-08 01:57:18 -0700551 ss_.ProcessMessagesUntilIdle();
552 EXPECT_TRUE(sink.Check(a.get(), SSE_WRITE));
553 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000554
555 // Room for more on the sending side
556 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
557 EXPECT_EQ(500, result);
558 send_pos += result;
559
560 // Empty the recv buffer
561 while (true) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200562 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000563 if (result < 0) {
564 EXPECT_EQ(-1, result);
565 EXPECT_TRUE(b->IsBlocking());
566 break;
567 }
568 recv_pos += result;
569 }
570
nisse32f25052017-05-08 01:57:18 -0700571 ss_.ProcessMessagesUntilIdle();
572 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000573
574 // Continue to empty the recv buffer
575 while (true) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200576 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000577 if (result < 0) {
578 EXPECT_EQ(-1, result);
579 EXPECT_TRUE(b->IsBlocking());
580 break;
581 }
582 recv_pos += result;
583 }
584
585 // Send last of the data
586 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
587 EXPECT_EQ(500, result);
588 send_pos += result;
589
nisse32f25052017-05-08 01:57:18 -0700590 ss_.ProcessMessagesUntilIdle();
591 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000592
593 // Receive the last of the data
594 while (true) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200595 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000596 if (result < 0) {
597 EXPECT_EQ(-1, result);
598 EXPECT_TRUE(b->IsBlocking());
599 break;
600 }
601 recv_pos += result;
602 }
603
nisse32f25052017-05-08 01:57:18 -0700604 ss_.ProcessMessagesUntilIdle();
605 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000606
607 // The received data matches the sent data
608 EXPECT_EQ(kDataSize, send_pos);
609 EXPECT_EQ(kDataSize, recv_pos);
610 EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize));
611 }
612
613 void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) {
614 const SocketAddress kEmptyAddr;
615
616 // Connect two sockets
nisse32f25052017-05-08 01:57:18 -0700617 std::unique_ptr<AsyncSocket> a =
618 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
619 std::unique_ptr<AsyncSocket> b =
620 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000621 a->Bind(initial_addr);
622 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
623
624 b->Bind(initial_addr);
625 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
626
627 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
628 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -0700629 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000630
631 // First, deliver all packets in 0 ms.
632 char buffer[2] = { 0, 0 };
633 const char cNumPackets = 10;
634 for (char i = 0; i < cNumPackets; ++i) {
635 buffer[0] = '0' + i;
636 EXPECT_EQ(1, a->Send(buffer, 1));
637 }
638
nisse32f25052017-05-08 01:57:18 -0700639 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000640
641 for (char i = 0; i < cNumPackets; ++i) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200642 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000643 EXPECT_EQ(static_cast<char>('0' + i), buffer[0]);
644 }
645
646 // Next, deliver packets at random intervals
Peter Boström0c4e06b2015-10-07 12:23:21 +0200647 const uint32_t mean = 50;
648 const uint32_t stddev = 50;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000649
nisse32f25052017-05-08 01:57:18 -0700650 ss_.set_delay_mean(mean);
651 ss_.set_delay_stddev(stddev);
652 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000653
654 for (char i = 0; i < cNumPackets; ++i) {
655 buffer[0] = 'A' + i;
656 EXPECT_EQ(1, a->Send(buffer, 1));
657 }
658
nisse32f25052017-05-08 01:57:18 -0700659 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000660
661 for (char i = 0; i < cNumPackets; ++i) {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200662 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000663 EXPECT_EQ(static_cast<char>('A' + i), buffer[0]);
664 }
665 }
666
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000667 // It is important that initial_addr's port has to be 0 such that the
668 // incremental port behavior could ensure the 2 Binds result in different
669 // address.
670 void BandwidthTest(const SocketAddress& initial_addr) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000671 AsyncSocket* send_socket =
nisse32f25052017-05-08 01:57:18 -0700672 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000673 AsyncSocket* recv_socket =
nisse32f25052017-05-08 01:57:18 -0700674 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000675 ASSERT_EQ(0, send_socket->Bind(initial_addr));
676 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
677 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
678 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000679 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
680
Peter Boström0c4e06b2015-10-07 12:23:21 +0200681 uint32_t bandwidth = 64 * 1024;
nisse32f25052017-05-08 01:57:18 -0700682 ss_.set_bandwidth(bandwidth);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000683
684 Thread* pthMain = Thread::Current();
685 Sender sender(pthMain, send_socket, 80 * 1024);
686 Receiver receiver(pthMain, recv_socket, bandwidth);
687
688 pthMain->ProcessMessages(5000);
689 sender.done = true;
690 pthMain->ProcessMessages(5000);
691
692 ASSERT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4);
693 ASSERT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s
694
nisse32f25052017-05-08 01:57:18 -0700695 ss_.set_bandwidth(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000696 }
697
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000698 // It is important that initial_addr's port has to be 0 such that the
699 // incremental port behavior could ensure the 2 Binds result in different
700 // address.
701 void DelayTest(const SocketAddress& initial_addr) {
deadbeef37f5ecf2017-02-27 14:06:41 -0800702 time_t seed = ::time(nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000703 LOG(LS_VERBOSE) << "seed = " << seed;
704 srand(static_cast<unsigned int>(seed));
705
Peter Boström0c4e06b2015-10-07 12:23:21 +0200706 const uint32_t mean = 2000;
707 const uint32_t stddev = 500;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000708
nisse32f25052017-05-08 01:57:18 -0700709 ss_.set_delay_mean(mean);
710 ss_.set_delay_stddev(stddev);
711 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000712
713 AsyncSocket* send_socket =
nisse32f25052017-05-08 01:57:18 -0700714 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000715 AsyncSocket* recv_socket =
nisse32f25052017-05-08 01:57:18 -0700716 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000717 ASSERT_EQ(0, send_socket->Bind(initial_addr));
718 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
719 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
720 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000721 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
722
723 Thread* pthMain = Thread::Current();
724 // Avg packet size is 2K, so at 200KB/s for 10s, we should see about
725 // 1000 packets, which is necessary to get a good distribution.
726 Sender sender(pthMain, send_socket, 100 * 2 * 1024);
727 Receiver receiver(pthMain, recv_socket, 0);
728
729 pthMain->ProcessMessages(10000);
730 sender.done = receiver.done = true;
nisse32f25052017-05-08 01:57:18 -0700731 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000732
733 const double sample_mean = receiver.sum / receiver.samples;
734 double num =
735 receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum;
736 double den = receiver.samples * (receiver.samples - 1);
737 const double sample_stddev = sqrt(num / den);
738 LOG(LS_VERBOSE) << "mean=" << sample_mean << " stddev=" << sample_stddev;
739
740 EXPECT_LE(500u, receiver.samples);
741 // We initially used a 0.1 fudge factor, but on the build machine, we
742 // have seen the value differ by as much as 0.13.
743 EXPECT_NEAR(mean, sample_mean, 0.15 * mean);
744 EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev);
745
nisse32f25052017-05-08 01:57:18 -0700746 ss_.set_delay_mean(0);
747 ss_.set_delay_stddev(0);
748 ss_.UpdateDelayDistribution();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000749 }
750
751 // Test cross-family communication between a client bound to client_addr and a
752 // server bound to server_addr. shouldSucceed indicates if communication is
753 // expected to work or not.
754 void CrossFamilyConnectionTest(const SocketAddress& client_addr,
755 const SocketAddress& server_addr,
756 bool shouldSucceed) {
kwibergd0d81482017-04-18 03:18:22 -0700757 StreamSink sink;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000758 SocketAddress accept_address;
759 const SocketAddress kEmptyAddr;
760
761 // Client gets a IPv4 address
nisse32f25052017-05-08 01:57:18 -0700762 std::unique_ptr<AsyncSocket> client =
763 WrapUnique(ss_.CreateAsyncSocket(client_addr.family(), SOCK_STREAM));
764 sink.Monitor(client.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000765 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
766 EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr);
767 client->Bind(client_addr);
768
769 // Server gets a non-mapped non-any IPv6 address.
770 // IPv4 sockets should not be able to connect to this.
nisse32f25052017-05-08 01:57:18 -0700771 std::unique_ptr<AsyncSocket> server =
772 WrapUnique(ss_.CreateAsyncSocket(server_addr.family(), SOCK_STREAM));
773 sink.Monitor(server.get());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000774 server->Bind(server_addr);
775 server->Listen(5);
776
777 if (shouldSucceed) {
778 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -0700779 ss_.ProcessMessagesUntilIdle();
780 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
781 std::unique_ptr<Socket> accepted =
782 WrapUnique(server->Accept(&accept_address));
deadbeef37f5ecf2017-02-27 14:06:41 -0800783 EXPECT_TRUE(nullptr != accepted);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000784 EXPECT_NE(kEmptyAddr, accept_address);
nisse32f25052017-05-08 01:57:18 -0700785 ss_.ProcessMessagesUntilIdle();
786 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000787 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
788 } else {
789 // Check that the connection failed.
790 EXPECT_EQ(-1, client->Connect(server->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -0700791 ss_.ProcessMessagesUntilIdle();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000792
nisse32f25052017-05-08 01:57:18 -0700793 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
deadbeef37f5ecf2017-02-27 14:06:41 -0800794 EXPECT_TRUE(nullptr == server->Accept(&accept_address));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000795 EXPECT_EQ(accept_address, kEmptyAddr);
796 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
nisse32f25052017-05-08 01:57:18 -0700797 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000798 EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr);
799 }
800 }
801
802 // Test cross-family datagram sending between a client bound to client_addr
803 // and a server bound to server_addr. shouldSucceed indicates if sending is
jlmiller@webrtc.orgec499be2015-02-07 22:37:59 +0000804 // expected to succeed or not.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000805 void CrossFamilyDatagramTest(const SocketAddress& client_addr,
806 const SocketAddress& server_addr,
807 bool shouldSucceed) {
nisse32f25052017-05-08 01:57:18 -0700808 AsyncSocket* socket = ss_.CreateAsyncSocket(SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000809 socket->Bind(server_addr);
810 SocketAddress bound_server_addr = socket->GetLocalAddress();
nisse32f25052017-05-08 01:57:18 -0700811 auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000812
nisse32f25052017-05-08 01:57:18 -0700813 AsyncSocket* socket2 = ss_.CreateAsyncSocket(SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000814 socket2->Bind(client_addr);
nisse32f25052017-05-08 01:57:18 -0700815 auto client2 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket2));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000816 SocketAddress client2_addr;
817
818 if (shouldSucceed) {
819 EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr));
820 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
821 SocketAddress client1_addr;
822 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
823 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
824 EXPECT_EQ(client1_addr, bound_server_addr);
825 } else {
826 EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr));
jlmiller@webrtc.orgec499be2015-02-07 22:37:59 +0000827 EXPECT_TRUE(client1->CheckNoPacket());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000828 }
829 }
830
831 protected:
nisse32f25052017-05-08 01:57:18 -0700832 VirtualSocketServer ss_;
nisse7eaa4ea2017-05-08 05:25:41 -0700833 AutoSocketServerThread thread_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000834 const SocketAddress kIPv4AnyAddress;
835 const SocketAddress kIPv6AnyAddress;
836};
837
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000838TEST_F(VirtualSocketServerTest, basic_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000839 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000);
840 BasicTest(ipv4_test_addr);
841}
842
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000843TEST_F(VirtualSocketServerTest, basic_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000844 SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 5000);
845 BasicTest(ipv6_test_addr);
846}
847
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700848TEST_F(VirtualSocketServerTest, TestDefaultRoute_v4) {
849 IPAddress ipv4_default_addr(0x01020304);
850 TestDefaultRoute(ipv4_default_addr);
851}
852
853TEST_F(VirtualSocketServerTest, TestDefaultRoute_v6) {
854 IPAddress ipv6_default_addr;
855 EXPECT_TRUE(
856 IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ipv6_default_addr));
857 TestDefaultRoute(ipv6_default_addr);
858}
859
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000860TEST_F(VirtualSocketServerTest, connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000861 ConnectTest(kIPv4AnyAddress);
862}
863
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000864TEST_F(VirtualSocketServerTest, connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000865 ConnectTest(kIPv6AnyAddress);
866}
867
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000868TEST_F(VirtualSocketServerTest, connect_to_non_listener_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000869 ConnectToNonListenerTest(kIPv4AnyAddress);
870}
871
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000872TEST_F(VirtualSocketServerTest, connect_to_non_listener_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000873 ConnectToNonListenerTest(kIPv6AnyAddress);
874}
875
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000876TEST_F(VirtualSocketServerTest, close_during_connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000877 CloseDuringConnectTest(kIPv4AnyAddress);
878}
879
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000880TEST_F(VirtualSocketServerTest, close_during_connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000881 CloseDuringConnectTest(kIPv6AnyAddress);
882}
883
884TEST_F(VirtualSocketServerTest, close_v4) {
885 CloseTest(kIPv4AnyAddress);
886}
887
888TEST_F(VirtualSocketServerTest, close_v6) {
889 CloseTest(kIPv6AnyAddress);
890}
891
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000892TEST_F(VirtualSocketServerTest, tcp_send_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000893 TcpSendTest(kIPv4AnyAddress);
894}
895
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000896TEST_F(VirtualSocketServerTest, tcp_send_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000897 TcpSendTest(kIPv6AnyAddress);
898}
899
900TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v4) {
901 TcpSendsPacketsInOrderTest(kIPv4AnyAddress);
902}
903
904TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v6) {
905 TcpSendsPacketsInOrderTest(kIPv6AnyAddress);
906}
907
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000908TEST_F(VirtualSocketServerTest, bandwidth_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000909 BandwidthTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000910}
911
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000912TEST_F(VirtualSocketServerTest, bandwidth_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000913 BandwidthTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000914}
915
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000916TEST_F(VirtualSocketServerTest, delay_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000917 DelayTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000918}
919
920// See: https://code.google.com/p/webrtc/issues/detail?id=2409
921TEST_F(VirtualSocketServerTest, DISABLED_delay_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000922 DelayTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000923}
924
925// Works, receiving socket sees 127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000926TEST_F(VirtualSocketServerTest, CanConnectFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000927 CrossFamilyConnectionTest(SocketAddress("::ffff:127.0.0.2", 0),
928 SocketAddress("0.0.0.0", 5000),
929 true);
930}
931
932// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000933TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000934 CrossFamilyConnectionTest(SocketAddress("::2", 0),
935 SocketAddress("0.0.0.0", 5000),
936 false);
937}
938
939// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000940TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000941 CrossFamilyConnectionTest(SocketAddress("::2", 0),
942 SocketAddress("::ffff:127.0.0.1", 5000),
943 false);
944}
945
946// Works. receiving socket sees ::ffff:127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000947TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000948 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
949 SocketAddress("::", 5000),
950 true);
951}
952
953// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000954TEST_F(VirtualSocketServerTest, CantConnectFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000955 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
956 SocketAddress("::1", 5000),
957 false);
958}
959
960// Works. Receiving socket sees ::ffff:127.0.0.1.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000961TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000962 CrossFamilyConnectionTest(SocketAddress("127.0.0.1", 0),
963 SocketAddress("::ffff:127.0.0.2", 5000),
964 true);
965}
966
967// Works, receiving socket sees a result from GetNextIP.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000968TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000969 CrossFamilyConnectionTest(SocketAddress("::", 0),
970 SocketAddress("0.0.0.0", 5000),
971 true);
972}
973
974// Works, receiving socket sees whatever GetNextIP gave the client.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000975TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000976 CrossFamilyConnectionTest(SocketAddress("0.0.0.0", 0),
977 SocketAddress("::", 5000),
978 true);
979}
980
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000981TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000982 CrossFamilyDatagramTest(SocketAddress("0.0.0.0", 0),
983 SocketAddress("::", 5000),
984 true);
985}
986
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000987TEST_F(VirtualSocketServerTest, CanSendDatagramFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000988 CrossFamilyDatagramTest(SocketAddress("::ffff:127.0.0.1", 0),
989 SocketAddress("0.0.0.0", 5000),
990 true);
991}
992
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000993TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000994 CrossFamilyDatagramTest(SocketAddress("::2", 0),
995 SocketAddress("0.0.0.0", 5000),
996 false);
997}
998
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000999TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001000 CrossFamilyDatagramTest(SocketAddress("::2", 0),
1001 SocketAddress("::ffff:127.0.0.1", 5000),
1002 false);
1003}
1004
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001005TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001006 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
1007 SocketAddress("::", 5000),
1008 true);
1009}
1010
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001011TEST_F(VirtualSocketServerTest, CantSendDatagramFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001012 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
1013 SocketAddress("::1", 5000),
1014 false);
1015}
1016
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001017TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001018 CrossFamilyDatagramTest(SocketAddress("127.0.0.1", 0),
1019 SocketAddress("::ffff:127.0.0.2", 5000),
1020 true);
1021}
1022
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001023TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001024 CrossFamilyDatagramTest(SocketAddress("::", 0),
1025 SocketAddress("0.0.0.0", 5000),
1026 true);
1027}
1028
Taylor Brandstettere7536412016-09-09 13:16:15 -07001029TEST_F(VirtualSocketServerTest, SetSendingBlockedWithUdpSocket) {
1030 AsyncSocket* socket1 =
nisse32f25052017-05-08 01:57:18 -07001031 ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM);
1032 std::unique_ptr<AsyncSocket> socket2 =
1033 WrapUnique(ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001034 socket1->Bind(kIPv4AnyAddress);
1035 socket2->Bind(kIPv4AnyAddress);
nisse32f25052017-05-08 01:57:18 -07001036 auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket1));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001037
nisse32f25052017-05-08 01:57:18 -07001038 ss_.SetSendingBlocked(true);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001039 EXPECT_EQ(-1, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1040 EXPECT_TRUE(socket1->IsBlocking());
1041 EXPECT_EQ(0, client1->ready_to_send_count());
1042
nisse32f25052017-05-08 01:57:18 -07001043 ss_.SetSendingBlocked(false);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001044 EXPECT_EQ(1, client1->ready_to_send_count());
1045 EXPECT_EQ(3, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1046}
1047
1048TEST_F(VirtualSocketServerTest, SetSendingBlockedWithTcpSocket) {
1049 constexpr size_t kBufferSize = 1024;
nisse32f25052017-05-08 01:57:18 -07001050 ss_.set_send_buffer_capacity(kBufferSize);
1051 ss_.set_recv_buffer_capacity(kBufferSize);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001052
kwibergd0d81482017-04-18 03:18:22 -07001053 StreamSink sink;
nisse32f25052017-05-08 01:57:18 -07001054 std::unique_ptr<AsyncSocket> socket1 =
1055 WrapUnique(ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
1056 std::unique_ptr<AsyncSocket> socket2 =
1057 WrapUnique(ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
1058 sink.Monitor(socket1.get());
1059 sink.Monitor(socket2.get());
Taylor Brandstettere7536412016-09-09 13:16:15 -07001060 socket1->Bind(kIPv4AnyAddress);
1061 socket2->Bind(kIPv4AnyAddress);
1062
1063 // Connect sockets.
1064 EXPECT_EQ(0, socket1->Connect(socket2->GetLocalAddress()));
1065 EXPECT_EQ(0, socket2->Connect(socket1->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -07001066 ss_.ProcessMessagesUntilIdle();
Taylor Brandstettere7536412016-09-09 13:16:15 -07001067
1068 char data[kBufferSize] = {};
1069
1070 // First Send call will fill the send buffer but not send anything.
nisse32f25052017-05-08 01:57:18 -07001071 ss_.SetSendingBlocked(true);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001072 EXPECT_EQ(static_cast<int>(kBufferSize), socket1->Send(data, kBufferSize));
nisse32f25052017-05-08 01:57:18 -07001073 ss_.ProcessMessagesUntilIdle();
1074 EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
1075 EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001076 EXPECT_FALSE(socket1->IsBlocking());
1077
1078 // Since the send buffer is full, next Send will result in EWOULDBLOCK.
1079 EXPECT_EQ(-1, socket1->Send(data, kBufferSize));
nisse32f25052017-05-08 01:57:18 -07001080 EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
1081 EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001082 EXPECT_TRUE(socket1->IsBlocking());
1083
1084 // When sending is unblocked, the buffered data should be sent and
1085 // SignalWriteEvent should fire.
nisse32f25052017-05-08 01:57:18 -07001086 ss_.SetSendingBlocked(false);
1087 ss_.ProcessMessagesUntilIdle();
1088 EXPECT_TRUE(sink.Check(socket1.get(), SSE_WRITE));
1089 EXPECT_TRUE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001090}
1091
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001092TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02001093 const uint32_t kTestMean[] = {10, 100, 333, 1000};
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001094 const double kTestDev[] = { 0.25, 0.1, 0.01 };
Taylor Brandstettere7536412016-09-09 13:16:15 -07001095 // TODO(deadbeef): The current code only works for 1000 data points or more.
Peter Boström0c4e06b2015-10-07 12:23:21 +02001096 const uint32_t kTestSamples[] = {/*10, 100,*/ 1000};
tfarina5237aaf2015-11-10 23:44:30 -08001097 for (size_t midx = 0; midx < arraysize(kTestMean); ++midx) {
1098 for (size_t didx = 0; didx < arraysize(kTestDev); ++didx) {
1099 for (size_t sidx = 0; sidx < arraysize(kTestSamples); ++sidx) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001100 ASSERT_LT(0u, kTestSamples[sidx]);
Peter Boström0c4e06b2015-10-07 12:23:21 +02001101 const uint32_t kStdDev =
1102 static_cast<uint32_t>(kTestDev[didx] * kTestMean[midx]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001103 VirtualSocketServer::Function* f =
1104 VirtualSocketServer::CreateDistribution(kTestMean[midx],
1105 kStdDev,
1106 kTestSamples[sidx]);
deadbeef37f5ecf2017-02-27 14:06:41 -08001107 ASSERT_TRUE(nullptr != f);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001108 ASSERT_EQ(kTestSamples[sidx], f->size());
1109 double sum = 0;
Peter Boström0c4e06b2015-10-07 12:23:21 +02001110 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001111 sum += (*f)[i].second;
1112 }
1113 const double mean = sum / f->size();
1114 double sum_sq_dev = 0;
Peter Boström0c4e06b2015-10-07 12:23:21 +02001115 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001116 double dev = (*f)[i].second - mean;
1117 sum_sq_dev += dev * dev;
1118 }
1119 const double stddev = sqrt(sum_sq_dev / f->size());
1120 EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx])
1121 << "M=" << kTestMean[midx]
1122 << " SD=" << kStdDev
1123 << " N=" << kTestSamples[sidx];
1124 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev)
1125 << "M=" << kTestMean[midx]
1126 << " SD=" << kStdDev
1127 << " N=" << kTestSamples[sidx];
1128 delete f;
1129 }
1130 }
1131 }
1132}