blob: 488cada386eb5f7743393e1fa26be4d73a2b7d87 [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),
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 virtual void SetUp() { Thread::Current()->set_socketserver(&ss_); }
deadbeef37f5ecf2017-02-27 14:06:41 -0800832 virtual void TearDown() { Thread::Current()->set_socketserver(nullptr); }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000833
nisse32f25052017-05-08 01:57:18 -0700834 VirtualSocketServer ss_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000835 const SocketAddress kIPv4AnyAddress;
836 const SocketAddress kIPv6AnyAddress;
837};
838
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000839TEST_F(VirtualSocketServerTest, basic_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000840 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000);
841 BasicTest(ipv4_test_addr);
842}
843
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000844TEST_F(VirtualSocketServerTest, basic_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000845 SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 5000);
846 BasicTest(ipv6_test_addr);
847}
848
Guo-wei Shieh38f88932015-08-13 22:24:02 -0700849TEST_F(VirtualSocketServerTest, TestDefaultRoute_v4) {
850 IPAddress ipv4_default_addr(0x01020304);
851 TestDefaultRoute(ipv4_default_addr);
852}
853
854TEST_F(VirtualSocketServerTest, TestDefaultRoute_v6) {
855 IPAddress ipv6_default_addr;
856 EXPECT_TRUE(
857 IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ipv6_default_addr));
858 TestDefaultRoute(ipv6_default_addr);
859}
860
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000861TEST_F(VirtualSocketServerTest, connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000862 ConnectTest(kIPv4AnyAddress);
863}
864
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000865TEST_F(VirtualSocketServerTest, connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000866 ConnectTest(kIPv6AnyAddress);
867}
868
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000869TEST_F(VirtualSocketServerTest, connect_to_non_listener_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000870 ConnectToNonListenerTest(kIPv4AnyAddress);
871}
872
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000873TEST_F(VirtualSocketServerTest, connect_to_non_listener_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000874 ConnectToNonListenerTest(kIPv6AnyAddress);
875}
876
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000877TEST_F(VirtualSocketServerTest, close_during_connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000878 CloseDuringConnectTest(kIPv4AnyAddress);
879}
880
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000881TEST_F(VirtualSocketServerTest, close_during_connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000882 CloseDuringConnectTest(kIPv6AnyAddress);
883}
884
885TEST_F(VirtualSocketServerTest, close_v4) {
886 CloseTest(kIPv4AnyAddress);
887}
888
889TEST_F(VirtualSocketServerTest, close_v6) {
890 CloseTest(kIPv6AnyAddress);
891}
892
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000893TEST_F(VirtualSocketServerTest, tcp_send_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000894 TcpSendTest(kIPv4AnyAddress);
895}
896
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000897TEST_F(VirtualSocketServerTest, tcp_send_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000898 TcpSendTest(kIPv6AnyAddress);
899}
900
901TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v4) {
902 TcpSendsPacketsInOrderTest(kIPv4AnyAddress);
903}
904
905TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v6) {
906 TcpSendsPacketsInOrderTest(kIPv6AnyAddress);
907}
908
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000909TEST_F(VirtualSocketServerTest, bandwidth_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000910 BandwidthTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000911}
912
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000913TEST_F(VirtualSocketServerTest, bandwidth_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000914 BandwidthTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000915}
916
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000917TEST_F(VirtualSocketServerTest, delay_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000918 DelayTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000919}
920
921// See: https://code.google.com/p/webrtc/issues/detail?id=2409
922TEST_F(VirtualSocketServerTest, DISABLED_delay_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000923 DelayTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000924}
925
926// Works, receiving socket sees 127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000927TEST_F(VirtualSocketServerTest, CanConnectFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000928 CrossFamilyConnectionTest(SocketAddress("::ffff:127.0.0.2", 0),
929 SocketAddress("0.0.0.0", 5000),
930 true);
931}
932
933// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000934TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000935 CrossFamilyConnectionTest(SocketAddress("::2", 0),
936 SocketAddress("0.0.0.0", 5000),
937 false);
938}
939
940// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000941TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000942 CrossFamilyConnectionTest(SocketAddress("::2", 0),
943 SocketAddress("::ffff:127.0.0.1", 5000),
944 false);
945}
946
947// Works. receiving socket sees ::ffff:127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000948TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000949 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
950 SocketAddress("::", 5000),
951 true);
952}
953
954// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000955TEST_F(VirtualSocketServerTest, CantConnectFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000956 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
957 SocketAddress("::1", 5000),
958 false);
959}
960
961// Works. Receiving socket sees ::ffff:127.0.0.1.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000962TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000963 CrossFamilyConnectionTest(SocketAddress("127.0.0.1", 0),
964 SocketAddress("::ffff:127.0.0.2", 5000),
965 true);
966}
967
968// Works, receiving socket sees a result from GetNextIP.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000969TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000970 CrossFamilyConnectionTest(SocketAddress("::", 0),
971 SocketAddress("0.0.0.0", 5000),
972 true);
973}
974
975// Works, receiving socket sees whatever GetNextIP gave the client.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000976TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000977 CrossFamilyConnectionTest(SocketAddress("0.0.0.0", 0),
978 SocketAddress("::", 5000),
979 true);
980}
981
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000982TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000983 CrossFamilyDatagramTest(SocketAddress("0.0.0.0", 0),
984 SocketAddress("::", 5000),
985 true);
986}
987
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000988TEST_F(VirtualSocketServerTest, CanSendDatagramFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000989 CrossFamilyDatagramTest(SocketAddress("::ffff:127.0.0.1", 0),
990 SocketAddress("0.0.0.0", 5000),
991 true);
992}
993
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000994TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000995 CrossFamilyDatagramTest(SocketAddress("::2", 0),
996 SocketAddress("0.0.0.0", 5000),
997 false);
998}
999
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001000TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001001 CrossFamilyDatagramTest(SocketAddress("::2", 0),
1002 SocketAddress("::ffff:127.0.0.1", 5000),
1003 false);
1004}
1005
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001006TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001007 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
1008 SocketAddress("::", 5000),
1009 true);
1010}
1011
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001012TEST_F(VirtualSocketServerTest, CantSendDatagramFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001013 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
1014 SocketAddress("::1", 5000),
1015 false);
1016}
1017
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001018TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001019 CrossFamilyDatagramTest(SocketAddress("127.0.0.1", 0),
1020 SocketAddress("::ffff:127.0.0.2", 5000),
1021 true);
1022}
1023
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +00001024TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001025 CrossFamilyDatagramTest(SocketAddress("::", 0),
1026 SocketAddress("0.0.0.0", 5000),
1027 true);
1028}
1029
Taylor Brandstettere7536412016-09-09 13:16:15 -07001030TEST_F(VirtualSocketServerTest, SetSendingBlockedWithUdpSocket) {
1031 AsyncSocket* socket1 =
nisse32f25052017-05-08 01:57:18 -07001032 ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM);
1033 std::unique_ptr<AsyncSocket> socket2 =
1034 WrapUnique(ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001035 socket1->Bind(kIPv4AnyAddress);
1036 socket2->Bind(kIPv4AnyAddress);
nisse32f25052017-05-08 01:57:18 -07001037 auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket1));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001038
nisse32f25052017-05-08 01:57:18 -07001039 ss_.SetSendingBlocked(true);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001040 EXPECT_EQ(-1, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1041 EXPECT_TRUE(socket1->IsBlocking());
1042 EXPECT_EQ(0, client1->ready_to_send_count());
1043
nisse32f25052017-05-08 01:57:18 -07001044 ss_.SetSendingBlocked(false);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001045 EXPECT_EQ(1, client1->ready_to_send_count());
1046 EXPECT_EQ(3, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1047}
1048
1049TEST_F(VirtualSocketServerTest, SetSendingBlockedWithTcpSocket) {
1050 constexpr size_t kBufferSize = 1024;
nisse32f25052017-05-08 01:57:18 -07001051 ss_.set_send_buffer_capacity(kBufferSize);
1052 ss_.set_recv_buffer_capacity(kBufferSize);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001053
kwibergd0d81482017-04-18 03:18:22 -07001054 StreamSink sink;
nisse32f25052017-05-08 01:57:18 -07001055 std::unique_ptr<AsyncSocket> socket1 =
1056 WrapUnique(ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
1057 std::unique_ptr<AsyncSocket> socket2 =
1058 WrapUnique(ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
1059 sink.Monitor(socket1.get());
1060 sink.Monitor(socket2.get());
Taylor Brandstettere7536412016-09-09 13:16:15 -07001061 socket1->Bind(kIPv4AnyAddress);
1062 socket2->Bind(kIPv4AnyAddress);
1063
1064 // Connect sockets.
1065 EXPECT_EQ(0, socket1->Connect(socket2->GetLocalAddress()));
1066 EXPECT_EQ(0, socket2->Connect(socket1->GetLocalAddress()));
nisse32f25052017-05-08 01:57:18 -07001067 ss_.ProcessMessagesUntilIdle();
Taylor Brandstettere7536412016-09-09 13:16:15 -07001068
1069 char data[kBufferSize] = {};
1070
1071 // First Send call will fill the send buffer but not send anything.
nisse32f25052017-05-08 01:57:18 -07001072 ss_.SetSendingBlocked(true);
Taylor Brandstettere7536412016-09-09 13:16:15 -07001073 EXPECT_EQ(static_cast<int>(kBufferSize), socket1->Send(data, kBufferSize));
nisse32f25052017-05-08 01:57:18 -07001074 ss_.ProcessMessagesUntilIdle();
1075 EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
1076 EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001077 EXPECT_FALSE(socket1->IsBlocking());
1078
1079 // Since the send buffer is full, next Send will result in EWOULDBLOCK.
1080 EXPECT_EQ(-1, socket1->Send(data, kBufferSize));
nisse32f25052017-05-08 01:57:18 -07001081 EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
1082 EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001083 EXPECT_TRUE(socket1->IsBlocking());
1084
1085 // When sending is unblocked, the buffered data should be sent and
1086 // SignalWriteEvent should fire.
nisse32f25052017-05-08 01:57:18 -07001087 ss_.SetSendingBlocked(false);
1088 ss_.ProcessMessagesUntilIdle();
1089 EXPECT_TRUE(sink.Check(socket1.get(), SSE_WRITE));
1090 EXPECT_TRUE(sink.Check(socket2.get(), SSE_READ));
Taylor Brandstettere7536412016-09-09 13:16:15 -07001091}
1092
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001093TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02001094 const uint32_t kTestMean[] = {10, 100, 333, 1000};
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001095 const double kTestDev[] = { 0.25, 0.1, 0.01 };
Taylor Brandstettere7536412016-09-09 13:16:15 -07001096 // TODO(deadbeef): The current code only works for 1000 data points or more.
Peter Boström0c4e06b2015-10-07 12:23:21 +02001097 const uint32_t kTestSamples[] = {/*10, 100,*/ 1000};
tfarina5237aaf2015-11-10 23:44:30 -08001098 for (size_t midx = 0; midx < arraysize(kTestMean); ++midx) {
1099 for (size_t didx = 0; didx < arraysize(kTestDev); ++didx) {
1100 for (size_t sidx = 0; sidx < arraysize(kTestSamples); ++sidx) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001101 ASSERT_LT(0u, kTestSamples[sidx]);
Peter Boström0c4e06b2015-10-07 12:23:21 +02001102 const uint32_t kStdDev =
1103 static_cast<uint32_t>(kTestDev[didx] * kTestMean[midx]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001104 VirtualSocketServer::Function* f =
1105 VirtualSocketServer::CreateDistribution(kTestMean[midx],
1106 kStdDev,
1107 kTestSamples[sidx]);
deadbeef37f5ecf2017-02-27 14:06:41 -08001108 ASSERT_TRUE(nullptr != f);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001109 ASSERT_EQ(kTestSamples[sidx], f->size());
1110 double sum = 0;
Peter Boström0c4e06b2015-10-07 12:23:21 +02001111 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001112 sum += (*f)[i].second;
1113 }
1114 const double mean = sum / f->size();
1115 double sum_sq_dev = 0;
Peter Boström0c4e06b2015-10-07 12:23:21 +02001116 for (uint32_t i = 0; i < f->size(); ++i) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001117 double dev = (*f)[i].second - mean;
1118 sum_sq_dev += dev * dev;
1119 }
1120 const double stddev = sqrt(sum_sq_dev / f->size());
1121 EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx])
1122 << "M=" << kTestMean[midx]
1123 << " SD=" << kStdDev
1124 << " N=" << kTestSamples[sidx];
1125 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev)
1126 << "M=" << kTestMean[midx]
1127 << " SD=" << kStdDev
1128 << " N=" << kTestSamples[sidx];
1129 delete f;
1130 }
1131 }
1132 }
1133}