blob: e9d57f8f305ac285a0a4fb3a5854877f970c4427 [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
17#include "webrtc/base/logging.h"
18#include "webrtc/base/gunit.h"
19#include "webrtc/base/testclient.h"
20#include "webrtc/base/testutils.h"
21#include "webrtc/base/thread.h"
22#include "webrtc/base/timeutils.h"
23#include "webrtc/base/virtualsocketserver.h"
henrike@webrtc.orgfded02c2014-09-19 13:10:10 +000024#include "webrtc/test/testsupport/gtest_disable.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000025
26using namespace rtc;
27
28// Sends at a constant rate but with random packet sizes.
29struct Sender : public MessageHandler {
30 Sender(Thread* th, AsyncSocket* s, uint32 rt)
31 : thread(th), socket(new AsyncUDPSocket(s)),
32 done(false), rate(rt), count(0) {
33 last_send = rtc::Time();
34 thread->PostDelayed(NextDelay(), this, 1);
35 }
36
37 uint32 NextDelay() {
38 uint32 size = (rand() % 4096) + 1;
39 return 1000 * size / rate;
40 }
41
42 void OnMessage(Message* pmsg) {
43 ASSERT_EQ(1u, pmsg->message_id);
44
45 if (done)
46 return;
47
48 uint32 cur_time = rtc::Time();
49 uint32 delay = cur_time - last_send;
50 uint32 size = rate * delay / 1000;
51 size = std::min<uint32>(size, 4096);
52 size = std::max<uint32>(size, sizeof(uint32));
53
54 count += size;
55 memcpy(dummy, &cur_time, sizeof(cur_time));
56 socket->Send(dummy, size, options);
57
58 last_send = cur_time;
59 thread->PostDelayed(NextDelay(), this, 1);
60 }
61
62 Thread* thread;
63 scoped_ptr<AsyncUDPSocket> socket;
64 rtc::PacketOptions options;
65 bool done;
66 uint32 rate; // bytes per second
67 uint32 count;
68 uint32 last_send;
69 char dummy[4096];
70};
71
72struct Receiver : public MessageHandler, public sigslot::has_slots<> {
73 Receiver(Thread* th, AsyncSocket* s, uint32 bw)
74 : thread(th), socket(new AsyncUDPSocket(s)), bandwidth(bw), done(false),
75 count(0), sec_count(0), sum(0), sum_sq(0), samples(0) {
76 socket->SignalReadPacket.connect(this, &Receiver::OnReadPacket);
77 thread->PostDelayed(1000, this, 1);
78 }
79
80 ~Receiver() {
81 thread->Clear(this);
82 }
83
84 void OnReadPacket(AsyncPacketSocket* s, const char* data, size_t size,
85 const SocketAddress& remote_addr,
86 const PacketTime& packet_time) {
87 ASSERT_EQ(socket.get(), s);
88 ASSERT_GE(size, 4U);
89
90 count += size;
91 sec_count += size;
92
93 uint32 send_time = *reinterpret_cast<const uint32*>(data);
94 uint32 recv_time = rtc::Time();
95 uint32 delay = recv_time - send_time;
96 sum += delay;
97 sum_sq += delay * delay;
98 samples += 1;
99 }
100
101 void OnMessage(Message* pmsg) {
102 ASSERT_EQ(1u, pmsg->message_id);
103
104 if (done)
105 return;
106
107 // It is always possible for us to receive more than expected because
108 // packets can be further delayed in delivery.
109 if (bandwidth > 0)
110 ASSERT_TRUE(sec_count <= 5 * bandwidth / 4);
111 sec_count = 0;
112 thread->PostDelayed(1000, this, 1);
113 }
114
115 Thread* thread;
116 scoped_ptr<AsyncUDPSocket> socket;
117 uint32 bandwidth;
118 bool done;
119 size_t count;
120 size_t sec_count;
121 double sum;
122 double sum_sq;
123 uint32 samples;
124};
125
126class VirtualSocketServerTest : public testing::Test {
127 public:
128 VirtualSocketServerTest() : ss_(new VirtualSocketServer(NULL)),
129 kIPv4AnyAddress(IPAddress(INADDR_ANY), 0),
130 kIPv6AnyAddress(IPAddress(in6addr_any), 0) {
131 }
132
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000133 void CheckPortIncrementalization(const SocketAddress& post,
134 const SocketAddress& pre) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000135 EXPECT_EQ(post.port(), pre.port() + 1);
136 IPAddress post_ip = post.ipaddr();
137 IPAddress pre_ip = pre.ipaddr();
138 EXPECT_EQ(pre_ip.family(), post_ip.family());
139 if (post_ip.family() == AF_INET) {
140 in_addr pre_ipv4 = pre_ip.ipv4_address();
141 in_addr post_ipv4 = post_ip.ipv4_address();
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000142 EXPECT_EQ(post_ipv4.s_addr, pre_ipv4.s_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000143 } else if (post_ip.family() == AF_INET6) {
144 in6_addr post_ip6 = post_ip.ipv6_address();
145 in6_addr pre_ip6 = pre_ip.ipv6_address();
146 uint32* post_as_ints = reinterpret_cast<uint32*>(&post_ip6.s6_addr);
147 uint32* pre_as_ints = reinterpret_cast<uint32*>(&pre_ip6.s6_addr);
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000148 EXPECT_EQ(post_as_ints[3], pre_as_ints[3]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000149 }
150 }
151
152 void BasicTest(const SocketAddress& initial_addr) {
153 AsyncSocket* socket = ss_->CreateAsyncSocket(initial_addr.family(),
154 SOCK_DGRAM);
155 socket->Bind(initial_addr);
156 SocketAddress server_addr = socket->GetLocalAddress();
157 // Make sure VSS didn't switch families on us.
158 EXPECT_EQ(server_addr.family(), initial_addr.family());
159
160 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket));
161 AsyncSocket* socket2 =
162 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
163 TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2));
164
165 SocketAddress client2_addr;
166 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
167 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
168
169 SocketAddress client1_addr;
170 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
171 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
172 EXPECT_EQ(client1_addr, server_addr);
173
174 SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family());
175 for (int i = 0; i < 10; i++) {
176 client2 = new TestClient(AsyncUDPSocket::Create(ss_, empty));
177
178 SocketAddress next_client2_addr;
179 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
180 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr));
guoweis@webrtc.orgd3b453b2015-02-14 00:43:41 +0000181 CheckPortIncrementalization(next_client2_addr, client2_addr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000182 // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1);
183
184 SocketAddress server_addr2;
185 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr));
186 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2));
187 EXPECT_EQ(server_addr2, server_addr);
188
189 client2_addr = next_client2_addr;
190 }
191 }
192
193 // initial_addr should be made from either INADDR_ANY or in6addr_any.
194 void ConnectTest(const SocketAddress& initial_addr) {
195 testing::StreamSink sink;
196 SocketAddress accept_addr;
197 const SocketAddress kEmptyAddr =
198 EmptySocketAddressWithFamily(initial_addr.family());
199
200 // Create client
201 AsyncSocket* client = ss_->CreateAsyncSocket(initial_addr.family(),
202 SOCK_STREAM);
203 sink.Monitor(client);
204 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
205 EXPECT_TRUE(client->GetLocalAddress().IsNil());
206
207 // Create server
208 AsyncSocket* server = ss_->CreateAsyncSocket(initial_addr.family(),
209 SOCK_STREAM);
210 sink.Monitor(server);
211 EXPECT_NE(0, server->Listen(5)); // Bind required
212 EXPECT_EQ(0, server->Bind(initial_addr));
213 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
214 EXPECT_EQ(0, server->Listen(5));
215 EXPECT_EQ(server->GetState(), AsyncSocket::CS_CONNECTING);
216
217 // No pending server connections
218 EXPECT_FALSE(sink.Check(server, testing::SSE_READ));
219 EXPECT_TRUE(NULL == server->Accept(&accept_addr));
220 EXPECT_EQ(AF_UNSPEC, accept_addr.family());
221
222 // Attempt connect to listening socket
223 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
224 EXPECT_NE(client->GetLocalAddress(), kEmptyAddr); // Implicit Bind
225 EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family()); // Implicit Bind
226 EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress());
227
228 // Client is connecting
229 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
230 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN));
231 EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE));
232
233 ss_->ProcessMessagesUntilIdle();
234
235 // Client still connecting
236 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
237 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN));
238 EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE));
239
240 // Server has pending connection
241 EXPECT_TRUE(sink.Check(server, testing::SSE_READ));
242 Socket* accepted = server->Accept(&accept_addr);
243 EXPECT_TRUE(NULL != accepted);
244 EXPECT_NE(accept_addr, kEmptyAddr);
245 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr);
246
247 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED);
248 EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress());
249 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress());
250
251 ss_->ProcessMessagesUntilIdle();
252
253 // Client has connected
254 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTED);
255 EXPECT_TRUE(sink.Check(client, testing::SSE_OPEN));
256 EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE));
257 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
258 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
259 }
260
261 void ConnectToNonListenerTest(const SocketAddress& initial_addr) {
262 testing::StreamSink sink;
263 SocketAddress accept_addr;
264 const SocketAddress nil_addr;
265 const SocketAddress empty_addr =
266 EmptySocketAddressWithFamily(initial_addr.family());
267
268 // Create client
269 AsyncSocket* client = ss_->CreateAsyncSocket(initial_addr.family(),
270 SOCK_STREAM);
271 sink.Monitor(client);
272
273 // Create server
274 AsyncSocket* server = ss_->CreateAsyncSocket(initial_addr.family(),
275 SOCK_STREAM);
276 sink.Monitor(server);
277 EXPECT_EQ(0, server->Bind(initial_addr));
278 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
279 // Attempt connect to non-listening socket
280 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
281
282 ss_->ProcessMessagesUntilIdle();
283
284 // No pending server connections
285 EXPECT_FALSE(sink.Check(server, testing::SSE_READ));
286 EXPECT_TRUE(NULL == server->Accept(&accept_addr));
287 EXPECT_EQ(accept_addr, nil_addr);
288
289 // Connection failed
290 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
291 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN));
292 EXPECT_TRUE(sink.Check(client, testing::SSE_ERROR));
293 EXPECT_EQ(client->GetRemoteAddress(), nil_addr);
294 }
295
296 void CloseDuringConnectTest(const SocketAddress& initial_addr) {
297 testing::StreamSink sink;
298 SocketAddress accept_addr;
299 const SocketAddress empty_addr =
300 EmptySocketAddressWithFamily(initial_addr.family());
301
302 // Create client and server
303 scoped_ptr<AsyncSocket> client(ss_->CreateAsyncSocket(initial_addr.family(),
304 SOCK_STREAM));
305 sink.Monitor(client.get());
306 scoped_ptr<AsyncSocket> server(ss_->CreateAsyncSocket(initial_addr.family(),
307 SOCK_STREAM));
308 sink.Monitor(server.get());
309
310 // Initiate connect
311 EXPECT_EQ(0, server->Bind(initial_addr));
312 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
313
314 EXPECT_EQ(0, server->Listen(5));
315 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
316
317 // Server close before socket enters accept queue
318 EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ));
319 server->Close();
320
321 ss_->ProcessMessagesUntilIdle();
322
323 // Result: connection failed
324 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
325 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR));
326
327 server.reset(ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
328 sink.Monitor(server.get());
329
330 // Initiate connect
331 EXPECT_EQ(0, server->Bind(initial_addr));
332 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
333
334 EXPECT_EQ(0, server->Listen(5));
335 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
336
337 ss_->ProcessMessagesUntilIdle();
338
339 // Server close while socket is in accept queue
340 EXPECT_TRUE(sink.Check(server.get(), testing::SSE_READ));
341 server->Close();
342
343 ss_->ProcessMessagesUntilIdle();
344
345 // Result: connection failed
346 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
347 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR));
348
349 // New server
350 server.reset(ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
351 sink.Monitor(server.get());
352
353 // Initiate connect
354 EXPECT_EQ(0, server->Bind(initial_addr));
355 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
356
357 EXPECT_EQ(0, server->Listen(5));
358 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
359
360 ss_->ProcessMessagesUntilIdle();
361
362 // Server accepts connection
363 EXPECT_TRUE(sink.Check(server.get(), testing::SSE_READ));
364 scoped_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
365 ASSERT_TRUE(NULL != accepted.get());
366 sink.Monitor(accepted.get());
367
368 // Client closes before connection complets
369 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED);
370
371 // Connected message has not been processed yet.
372 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
373 client->Close();
374
375 ss_->ProcessMessagesUntilIdle();
376
377 // Result: accepted socket closes
378 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CLOSED);
379 EXPECT_TRUE(sink.Check(accepted.get(), testing::SSE_CLOSE));
380 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE));
381 }
382
383 void CloseTest(const SocketAddress& initial_addr) {
384 testing::StreamSink sink;
385 const SocketAddress kEmptyAddr;
386
387 // Create clients
388 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM);
389 sink.Monitor(a);
390 a->Bind(initial_addr);
391 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
392
393
394 scoped_ptr<AsyncSocket> b(ss_->CreateAsyncSocket(initial_addr.family(),
395 SOCK_STREAM));
396 sink.Monitor(b.get());
397 b->Bind(initial_addr);
398 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
399
400 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
401 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
402
403 ss_->ProcessMessagesUntilIdle();
404
405 EXPECT_TRUE(sink.Check(a, testing::SSE_OPEN));
406 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CONNECTED);
407 EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress());
408
409 EXPECT_TRUE(sink.Check(b.get(), testing::SSE_OPEN));
410 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CONNECTED);
411 EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress());
412
413 EXPECT_EQ(1, a->Send("a", 1));
414 b->Close();
415 EXPECT_EQ(1, a->Send("b", 1));
416
417 ss_->ProcessMessagesUntilIdle();
418
419 char buffer[10];
420 EXPECT_FALSE(sink.Check(b.get(), testing::SSE_READ));
421 EXPECT_EQ(-1, b->Recv(buffer, 10));
422
423 EXPECT_TRUE(sink.Check(a, testing::SSE_CLOSE));
424 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CLOSED);
425 EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr);
426
427 // No signal for Closer
428 EXPECT_FALSE(sink.Check(b.get(), testing::SSE_CLOSE));
429 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CLOSED);
430 EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr);
431 }
432
433 void TcpSendTest(const SocketAddress& initial_addr) {
434 testing::StreamSink sink;
435 const SocketAddress kEmptyAddr;
436
437 // Connect two sockets
438 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM);
439 sink.Monitor(a);
440 a->Bind(initial_addr);
441 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
442
443 AsyncSocket* b = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM);
444 sink.Monitor(b);
445 b->Bind(initial_addr);
446 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
447
448 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
449 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
450
451 ss_->ProcessMessagesUntilIdle();
452
453 const size_t kBufferSize = 2000;
454 ss_->set_send_buffer_capacity(kBufferSize);
455 ss_->set_recv_buffer_capacity(kBufferSize);
456
457 const size_t kDataSize = 5000;
458 char send_buffer[kDataSize], recv_buffer[kDataSize];
459 for (size_t i = 0; i < kDataSize; ++i)
460 send_buffer[i] = static_cast<char>(i % 256);
461 memset(recv_buffer, 0, sizeof(recv_buffer));
462 size_t send_pos = 0, recv_pos = 0;
463
464 // Can't send more than send buffer in one write
465 int result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
466 EXPECT_EQ(static_cast<int>(kBufferSize), result);
467 send_pos += result;
468
469 ss_->ProcessMessagesUntilIdle();
470 EXPECT_FALSE(sink.Check(a, testing::SSE_WRITE));
471 EXPECT_TRUE(sink.Check(b, testing::SSE_READ));
472
473 // Receive buffer is already filled, fill send buffer again
474 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
475 EXPECT_EQ(static_cast<int>(kBufferSize), result);
476 send_pos += result;
477
478 ss_->ProcessMessagesUntilIdle();
479 EXPECT_FALSE(sink.Check(a, testing::SSE_WRITE));
480 EXPECT_FALSE(sink.Check(b, testing::SSE_READ));
481
482 // No more room in send or receive buffer
483 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
484 EXPECT_EQ(-1, result);
485 EXPECT_TRUE(a->IsBlocking());
486
487 // Read a subset of the data
488 result = b->Recv(recv_buffer + recv_pos, 500);
489 EXPECT_EQ(500, result);
490 recv_pos += result;
491
492 ss_->ProcessMessagesUntilIdle();
493 EXPECT_TRUE(sink.Check(a, testing::SSE_WRITE));
494 EXPECT_TRUE(sink.Check(b, testing::SSE_READ));
495
496 // Room for more on the sending side
497 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
498 EXPECT_EQ(500, result);
499 send_pos += result;
500
501 // Empty the recv buffer
502 while (true) {
503 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos);
504 if (result < 0) {
505 EXPECT_EQ(-1, result);
506 EXPECT_TRUE(b->IsBlocking());
507 break;
508 }
509 recv_pos += result;
510 }
511
512 ss_->ProcessMessagesUntilIdle();
513 EXPECT_TRUE(sink.Check(b, testing::SSE_READ));
514
515 // Continue to empty the recv buffer
516 while (true) {
517 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos);
518 if (result < 0) {
519 EXPECT_EQ(-1, result);
520 EXPECT_TRUE(b->IsBlocking());
521 break;
522 }
523 recv_pos += result;
524 }
525
526 // Send last of the data
527 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
528 EXPECT_EQ(500, result);
529 send_pos += result;
530
531 ss_->ProcessMessagesUntilIdle();
532 EXPECT_TRUE(sink.Check(b, testing::SSE_READ));
533
534 // Receive the last of the data
535 while (true) {
536 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos);
537 if (result < 0) {
538 EXPECT_EQ(-1, result);
539 EXPECT_TRUE(b->IsBlocking());
540 break;
541 }
542 recv_pos += result;
543 }
544
545 ss_->ProcessMessagesUntilIdle();
546 EXPECT_FALSE(sink.Check(b, testing::SSE_READ));
547
548 // The received data matches the sent data
549 EXPECT_EQ(kDataSize, send_pos);
550 EXPECT_EQ(kDataSize, recv_pos);
551 EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize));
552 }
553
554 void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) {
555 const SocketAddress kEmptyAddr;
556
557 // Connect two sockets
558 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(),
559 SOCK_STREAM);
560 AsyncSocket* b = ss_->CreateAsyncSocket(initial_addr.family(),
561 SOCK_STREAM);
562 a->Bind(initial_addr);
563 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
564
565 b->Bind(initial_addr);
566 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
567
568 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
569 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
570 ss_->ProcessMessagesUntilIdle();
571
572 // First, deliver all packets in 0 ms.
573 char buffer[2] = { 0, 0 };
574 const char cNumPackets = 10;
575 for (char i = 0; i < cNumPackets; ++i) {
576 buffer[0] = '0' + i;
577 EXPECT_EQ(1, a->Send(buffer, 1));
578 }
579
580 ss_->ProcessMessagesUntilIdle();
581
582 for (char i = 0; i < cNumPackets; ++i) {
583 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer)));
584 EXPECT_EQ(static_cast<char>('0' + i), buffer[0]);
585 }
586
587 // Next, deliver packets at random intervals
588 const uint32 mean = 50;
589 const uint32 stddev = 50;
590
591 ss_->set_delay_mean(mean);
592 ss_->set_delay_stddev(stddev);
593 ss_->UpdateDelayDistribution();
594
595 for (char i = 0; i < cNumPackets; ++i) {
596 buffer[0] = 'A' + i;
597 EXPECT_EQ(1, a->Send(buffer, 1));
598 }
599
600 ss_->ProcessMessagesUntilIdle();
601
602 for (char i = 0; i < cNumPackets; ++i) {
603 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer)));
604 EXPECT_EQ(static_cast<char>('A' + i), buffer[0]);
605 }
606 }
607
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000608 // It is important that initial_addr's port has to be 0 such that the
609 // incremental port behavior could ensure the 2 Binds result in different
610 // address.
611 void BandwidthTest(const SocketAddress& initial_addr) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000612 AsyncSocket* send_socket =
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000613 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000614 AsyncSocket* recv_socket =
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000615 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
616 ASSERT_EQ(0, send_socket->Bind(initial_addr));
617 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
618 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
619 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000620 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
621
622 uint32 bandwidth = 64 * 1024;
623 ss_->set_bandwidth(bandwidth);
624
625 Thread* pthMain = Thread::Current();
626 Sender sender(pthMain, send_socket, 80 * 1024);
627 Receiver receiver(pthMain, recv_socket, bandwidth);
628
629 pthMain->ProcessMessages(5000);
630 sender.done = true;
631 pthMain->ProcessMessages(5000);
632
633 ASSERT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4);
634 ASSERT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s
635
636 ss_->set_bandwidth(0);
637 }
638
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000639 // It is important that initial_addr's port has to be 0 such that the
640 // incremental port behavior could ensure the 2 Binds result in different
641 // address.
642 void DelayTest(const SocketAddress& initial_addr) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000643 time_t seed = ::time(NULL);
644 LOG(LS_VERBOSE) << "seed = " << seed;
645 srand(static_cast<unsigned int>(seed));
646
647 const uint32 mean = 2000;
648 const uint32 stddev = 500;
649
650 ss_->set_delay_mean(mean);
651 ss_->set_delay_stddev(stddev);
652 ss_->UpdateDelayDistribution();
653
654 AsyncSocket* send_socket =
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000655 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000656 AsyncSocket* recv_socket =
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000657 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
658 ASSERT_EQ(0, send_socket->Bind(initial_addr));
659 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
660 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
661 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000662 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
663
664 Thread* pthMain = Thread::Current();
665 // Avg packet size is 2K, so at 200KB/s for 10s, we should see about
666 // 1000 packets, which is necessary to get a good distribution.
667 Sender sender(pthMain, send_socket, 100 * 2 * 1024);
668 Receiver receiver(pthMain, recv_socket, 0);
669
670 pthMain->ProcessMessages(10000);
671 sender.done = receiver.done = true;
672 ss_->ProcessMessagesUntilIdle();
673
674 const double sample_mean = receiver.sum / receiver.samples;
675 double num =
676 receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum;
677 double den = receiver.samples * (receiver.samples - 1);
678 const double sample_stddev = sqrt(num / den);
679 LOG(LS_VERBOSE) << "mean=" << sample_mean << " stddev=" << sample_stddev;
680
681 EXPECT_LE(500u, receiver.samples);
682 // We initially used a 0.1 fudge factor, but on the build machine, we
683 // have seen the value differ by as much as 0.13.
684 EXPECT_NEAR(mean, sample_mean, 0.15 * mean);
685 EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev);
686
687 ss_->set_delay_mean(0);
688 ss_->set_delay_stddev(0);
689 ss_->UpdateDelayDistribution();
690 }
691
692 // Test cross-family communication between a client bound to client_addr and a
693 // server bound to server_addr. shouldSucceed indicates if communication is
694 // expected to work or not.
695 void CrossFamilyConnectionTest(const SocketAddress& client_addr,
696 const SocketAddress& server_addr,
697 bool shouldSucceed) {
698 testing::StreamSink sink;
699 SocketAddress accept_address;
700 const SocketAddress kEmptyAddr;
701
702 // Client gets a IPv4 address
703 AsyncSocket* client = ss_->CreateAsyncSocket(client_addr.family(),
704 SOCK_STREAM);
705 sink.Monitor(client);
706 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
707 EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr);
708 client->Bind(client_addr);
709
710 // Server gets a non-mapped non-any IPv6 address.
711 // IPv4 sockets should not be able to connect to this.
712 AsyncSocket* server = ss_->CreateAsyncSocket(server_addr.family(),
713 SOCK_STREAM);
714 sink.Monitor(server);
715 server->Bind(server_addr);
716 server->Listen(5);
717
718 if (shouldSucceed) {
719 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
720 ss_->ProcessMessagesUntilIdle();
721 EXPECT_TRUE(sink.Check(server, testing::SSE_READ));
722 Socket* accepted = server->Accept(&accept_address);
723 EXPECT_TRUE(NULL != accepted);
724 EXPECT_NE(kEmptyAddr, accept_address);
725 ss_->ProcessMessagesUntilIdle();
726 EXPECT_TRUE(sink.Check(client, testing::SSE_OPEN));
727 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
728 } else {
729 // Check that the connection failed.
730 EXPECT_EQ(-1, client->Connect(server->GetLocalAddress()));
731 ss_->ProcessMessagesUntilIdle();
732
733 EXPECT_FALSE(sink.Check(server, testing::SSE_READ));
734 EXPECT_TRUE(NULL == server->Accept(&accept_address));
735 EXPECT_EQ(accept_address, kEmptyAddr);
736 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
737 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN));
738 EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr);
739 }
740 }
741
742 // Test cross-family datagram sending between a client bound to client_addr
743 // and a server bound to server_addr. shouldSucceed indicates if sending is
jlmiller@webrtc.orgec499be2015-02-07 22:37:59 +0000744 // expected to succeed or not.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000745 void CrossFamilyDatagramTest(const SocketAddress& client_addr,
746 const SocketAddress& server_addr,
747 bool shouldSucceed) {
748 AsyncSocket* socket = ss_->CreateAsyncSocket(SOCK_DGRAM);
749 socket->Bind(server_addr);
750 SocketAddress bound_server_addr = socket->GetLocalAddress();
751 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket));
752
753 AsyncSocket* socket2 = ss_->CreateAsyncSocket(SOCK_DGRAM);
754 socket2->Bind(client_addr);
755 TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2));
756 SocketAddress client2_addr;
757
758 if (shouldSucceed) {
759 EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr));
760 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
761 SocketAddress client1_addr;
762 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
763 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
764 EXPECT_EQ(client1_addr, bound_server_addr);
765 } else {
766 EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr));
jlmiller@webrtc.orgec499be2015-02-07 22:37:59 +0000767 EXPECT_TRUE(client1->CheckNoPacket());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000768 }
769 }
770
771 protected:
772 virtual void SetUp() {
773 Thread::Current()->set_socketserver(ss_);
774 }
775 virtual void TearDown() {
776 Thread::Current()->set_socketserver(NULL);
777 }
778
779 VirtualSocketServer* ss_;
780 const SocketAddress kIPv4AnyAddress;
781 const SocketAddress kIPv6AnyAddress;
782};
783
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000784TEST_F(VirtualSocketServerTest, basic_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000785 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000);
786 BasicTest(ipv4_test_addr);
787}
788
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000789TEST_F(VirtualSocketServerTest, basic_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000790 SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 5000);
791 BasicTest(ipv6_test_addr);
792}
793
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000794TEST_F(VirtualSocketServerTest, connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000795 ConnectTest(kIPv4AnyAddress);
796}
797
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000798TEST_F(VirtualSocketServerTest, connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000799 ConnectTest(kIPv6AnyAddress);
800}
801
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000802TEST_F(VirtualSocketServerTest, connect_to_non_listener_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000803 ConnectToNonListenerTest(kIPv4AnyAddress);
804}
805
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000806TEST_F(VirtualSocketServerTest, connect_to_non_listener_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000807 ConnectToNonListenerTest(kIPv6AnyAddress);
808}
809
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000810TEST_F(VirtualSocketServerTest, close_during_connect_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000811 CloseDuringConnectTest(kIPv4AnyAddress);
812}
813
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000814TEST_F(VirtualSocketServerTest, close_during_connect_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000815 CloseDuringConnectTest(kIPv6AnyAddress);
816}
817
818TEST_F(VirtualSocketServerTest, close_v4) {
819 CloseTest(kIPv4AnyAddress);
820}
821
822TEST_F(VirtualSocketServerTest, close_v6) {
823 CloseTest(kIPv6AnyAddress);
824}
825
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000826TEST_F(VirtualSocketServerTest, tcp_send_v4) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000827 TcpSendTest(kIPv4AnyAddress);
828}
829
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000830TEST_F(VirtualSocketServerTest, tcp_send_v6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000831 TcpSendTest(kIPv6AnyAddress);
832}
833
834TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v4) {
835 TcpSendsPacketsInOrderTest(kIPv4AnyAddress);
836}
837
838TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v6) {
839 TcpSendsPacketsInOrderTest(kIPv6AnyAddress);
840}
841
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000842TEST_F(VirtualSocketServerTest, bandwidth_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000843 BandwidthTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000844}
845
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000846TEST_F(VirtualSocketServerTest, bandwidth_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000847 BandwidthTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000848}
849
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000850TEST_F(VirtualSocketServerTest, delay_v4) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000851 DelayTest(kIPv4AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000852}
853
854// See: https://code.google.com/p/webrtc/issues/detail?id=2409
855TEST_F(VirtualSocketServerTest, DISABLED_delay_v6) {
guoweis@webrtc.orgf358aea2015-02-18 18:44:01 +0000856 DelayTest(kIPv6AnyAddress);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000857}
858
859// Works, receiving socket sees 127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000860TEST_F(VirtualSocketServerTest, CanConnectFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000861 CrossFamilyConnectionTest(SocketAddress("::ffff:127.0.0.2", 0),
862 SocketAddress("0.0.0.0", 5000),
863 true);
864}
865
866// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000867TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000868 CrossFamilyConnectionTest(SocketAddress("::2", 0),
869 SocketAddress("0.0.0.0", 5000),
870 false);
871}
872
873// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000874TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000875 CrossFamilyConnectionTest(SocketAddress("::2", 0),
876 SocketAddress("::ffff:127.0.0.1", 5000),
877 false);
878}
879
880// Works. receiving socket sees ::ffff:127.0.0.2.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000881TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000882 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
883 SocketAddress("::", 5000),
884 true);
885}
886
887// Fails.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000888TEST_F(VirtualSocketServerTest, CantConnectFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000889 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
890 SocketAddress("::1", 5000),
891 false);
892}
893
894// Works. Receiving socket sees ::ffff:127.0.0.1.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000895TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000896 CrossFamilyConnectionTest(SocketAddress("127.0.0.1", 0),
897 SocketAddress("::ffff:127.0.0.2", 5000),
898 true);
899}
900
901// Works, receiving socket sees a result from GetNextIP.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000902TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000903 CrossFamilyConnectionTest(SocketAddress("::", 0),
904 SocketAddress("0.0.0.0", 5000),
905 true);
906}
907
908// Works, receiving socket sees whatever GetNextIP gave the client.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000909TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000910 CrossFamilyConnectionTest(SocketAddress("0.0.0.0", 0),
911 SocketAddress("::", 5000),
912 true);
913}
914
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000915TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000916 CrossFamilyDatagramTest(SocketAddress("0.0.0.0", 0),
917 SocketAddress("::", 5000),
918 true);
919}
920
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000921TEST_F(VirtualSocketServerTest, CanSendDatagramFromMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000922 CrossFamilyDatagramTest(SocketAddress("::ffff:127.0.0.1", 0),
923 SocketAddress("0.0.0.0", 5000),
924 true);
925}
926
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000927TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000928 CrossFamilyDatagramTest(SocketAddress("::2", 0),
929 SocketAddress("0.0.0.0", 5000),
930 false);
931}
932
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000933TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000934 CrossFamilyDatagramTest(SocketAddress("::2", 0),
935 SocketAddress("::ffff:127.0.0.1", 5000),
936 false);
937}
938
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000939TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToIPv6Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000940 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
941 SocketAddress("::", 5000),
942 true);
943}
944
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000945TEST_F(VirtualSocketServerTest, CantSendDatagramFromIPv4ToUnMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000946 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
947 SocketAddress("::1", 5000),
948 false);
949}
950
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000951TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToMappedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000952 CrossFamilyDatagramTest(SocketAddress("127.0.0.1", 0),
953 SocketAddress("::ffff:127.0.0.2", 5000),
954 true);
955}
956
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000957TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000958 CrossFamilyDatagramTest(SocketAddress("::", 0),
959 SocketAddress("0.0.0.0", 5000),
960 true);
961}
962
963TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) {
964 const uint32 kTestMean[] = { 10, 100, 333, 1000 };
965 const double kTestDev[] = { 0.25, 0.1, 0.01 };
966 // TODO: The current code only works for 1000 data points or more.
967 const uint32 kTestSamples[] = { /*10, 100,*/ 1000 };
968 for (size_t midx = 0; midx < ARRAY_SIZE(kTestMean); ++midx) {
969 for (size_t didx = 0; didx < ARRAY_SIZE(kTestDev); ++didx) {
970 for (size_t sidx = 0; sidx < ARRAY_SIZE(kTestSamples); ++sidx) {
971 ASSERT_LT(0u, kTestSamples[sidx]);
972 const uint32 kStdDev =
973 static_cast<uint32>(kTestDev[didx] * kTestMean[midx]);
974 VirtualSocketServer::Function* f =
975 VirtualSocketServer::CreateDistribution(kTestMean[midx],
976 kStdDev,
977 kTestSamples[sidx]);
978 ASSERT_TRUE(NULL != f);
979 ASSERT_EQ(kTestSamples[sidx], f->size());
980 double sum = 0;
981 for (uint32 i = 0; i < f->size(); ++i) {
982 sum += (*f)[i].second;
983 }
984 const double mean = sum / f->size();
985 double sum_sq_dev = 0;
986 for (uint32 i = 0; i < f->size(); ++i) {
987 double dev = (*f)[i].second - mean;
988 sum_sq_dev += dev * dev;
989 }
990 const double stddev = sqrt(sum_sq_dev / f->size());
991 EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx])
992 << "M=" << kTestMean[midx]
993 << " SD=" << kStdDev
994 << " N=" << kTestSamples[sidx];
995 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev)
996 << "M=" << kTestMean[midx]
997 << " SD=" << kStdDev
998 << " N=" << kTestSamples[sidx];
999 delete f;
1000 }
1001 }
1002 }
1003}