blob: 58dab143a27e73e3bdb37e985b016c8c69fdbb27 [file] [log] [blame]
henrike@webrtc.org0e118e72013-07-10 00:45:36 +00001/*
2 * libjingle
3 * Copyright 2006, Google Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
pbos@webrtc.orgb9518272014-03-07 15:22:04 +000028#include <math.h>
henrike@webrtc.org0e118e72013-07-10 00:45:36 +000029#include <time.h>
30#ifdef POSIX
31#include <netinet/in.h>
32#endif
henrike@webrtc.org0e118e72013-07-10 00:45:36 +000033
34#include "talk/base/logging.h"
35#include "talk/base/gunit.h"
36#include "talk/base/testclient.h"
37#include "talk/base/testutils.h"
38#include "talk/base/thread.h"
39#include "talk/base/timeutils.h"
40#include "talk/base/virtualsocketserver.h"
41
42using namespace talk_base;
43
44// Sends at a constant rate but with random packet sizes.
45struct Sender : public MessageHandler {
46 Sender(Thread* th, AsyncSocket* s, uint32 rt)
47 : thread(th), socket(new AsyncUDPSocket(s)),
48 done(false), rate(rt), count(0) {
mallinath@webrtc.org55280702013-09-27 23:04:10 +000049 last_send = talk_base::Time();
henrike@webrtc.org0e118e72013-07-10 00:45:36 +000050 thread->PostDelayed(NextDelay(), this, 1);
51 }
52
53 uint32 NextDelay() {
54 uint32 size = (rand() % 4096) + 1;
55 return 1000 * size / rate;
56 }
57
58 void OnMessage(Message* pmsg) {
59 ASSERT_EQ(1u, pmsg->message_id);
60
61 if (done)
62 return;
63
mallinath@webrtc.org55280702013-09-27 23:04:10 +000064 uint32 cur_time = talk_base::Time();
henrike@webrtc.org0e118e72013-07-10 00:45:36 +000065 uint32 delay = cur_time - last_send;
66 uint32 size = rate * delay / 1000;
67 size = std::min<uint32>(size, 4096);
68 size = std::max<uint32>(size, sizeof(uint32));
69
70 count += size;
71 memcpy(dummy, &cur_time, sizeof(cur_time));
mallinath@webrtc.orgf5e5b3a2014-02-14 00:56:12 +000072 socket->Send(dummy, size, options);
henrike@webrtc.org0e118e72013-07-10 00:45:36 +000073
74 last_send = cur_time;
75 thread->PostDelayed(NextDelay(), this, 1);
76 }
77
78 Thread* thread;
79 scoped_ptr<AsyncUDPSocket> socket;
mallinath@webrtc.orgf5e5b3a2014-02-14 00:56:12 +000080 talk_base::PacketOptions options;
henrike@webrtc.org0e118e72013-07-10 00:45:36 +000081 bool done;
82 uint32 rate; // bytes per second
83 uint32 count;
84 uint32 last_send;
85 char dummy[4096];
86};
87
88struct Receiver : public MessageHandler, public sigslot::has_slots<> {
89 Receiver(Thread* th, AsyncSocket* s, uint32 bw)
90 : thread(th), socket(new AsyncUDPSocket(s)), bandwidth(bw), done(false),
91 count(0), sec_count(0), sum(0), sum_sq(0), samples(0) {
92 socket->SignalReadPacket.connect(this, &Receiver::OnReadPacket);
93 thread->PostDelayed(1000, this, 1);
94 }
95
96 ~Receiver() {
97 thread->Clear(this);
98 }
99
100 void OnReadPacket(AsyncPacketSocket* s, const char* data, size_t size,
wu@webrtc.orgf89a4032013-12-13 00:21:03 +0000101 const SocketAddress& remote_addr,
102 const PacketTime& packet_time) {
henrike@webrtc.org0e118e72013-07-10 00:45:36 +0000103 ASSERT_EQ(socket.get(), s);
104 ASSERT_GE(size, 4U);
105
106 count += size;
107 sec_count += size;
108
109 uint32 send_time = *reinterpret_cast<const uint32*>(data);
mallinath@webrtc.org55280702013-09-27 23:04:10 +0000110 uint32 recv_time = talk_base::Time();
henrike@webrtc.org0e118e72013-07-10 00:45:36 +0000111 uint32 delay = recv_time - send_time;
112 sum += delay;
113 sum_sq += delay * delay;
114 samples += 1;
115 }
116
117 void OnMessage(Message* pmsg) {
118 ASSERT_EQ(1u, pmsg->message_id);
119
120 if (done)
121 return;
122
123 // It is always possible for us to receive more than expected because
124 // packets can be further delayed in delivery.
125 if (bandwidth > 0)
126 ASSERT_TRUE(sec_count <= 5 * bandwidth / 4);
127 sec_count = 0;
128 thread->PostDelayed(1000, this, 1);
129 }
130
131 Thread* thread;
132 scoped_ptr<AsyncUDPSocket> socket;
133 uint32 bandwidth;
134 bool done;
135 size_t count;
136 size_t sec_count;
137 double sum;
138 double sum_sq;
139 uint32 samples;
140};
141
142class VirtualSocketServerTest : public testing::Test {
143 public:
144 VirtualSocketServerTest() : ss_(new VirtualSocketServer(NULL)),
145 kIPv4AnyAddress(IPAddress(INADDR_ANY), 0),
146 kIPv6AnyAddress(IPAddress(in6addr_any), 0) {
147 }
148
149 void CheckAddressIncrementalization(const SocketAddress& post,
150 const SocketAddress& pre) {
151 EXPECT_EQ(post.port(), pre.port() + 1);
152 IPAddress post_ip = post.ipaddr();
153 IPAddress pre_ip = pre.ipaddr();
154 EXPECT_EQ(pre_ip.family(), post_ip.family());
155 if (post_ip.family() == AF_INET) {
156 in_addr pre_ipv4 = pre_ip.ipv4_address();
157 in_addr post_ipv4 = post_ip.ipv4_address();
158 int difference = ntohl(post_ipv4.s_addr) - ntohl(pre_ipv4.s_addr);
159 EXPECT_EQ(1, difference);
160 } else if (post_ip.family() == AF_INET6) {
161 in6_addr post_ip6 = post_ip.ipv6_address();
162 in6_addr pre_ip6 = pre_ip.ipv6_address();
163 uint32* post_as_ints = reinterpret_cast<uint32*>(&post_ip6.s6_addr);
164 uint32* pre_as_ints = reinterpret_cast<uint32*>(&pre_ip6.s6_addr);
165 EXPECT_EQ(post_as_ints[3], pre_as_ints[3] + 1);
166 }
167 }
168
169 void BasicTest(const SocketAddress& initial_addr) {
170 AsyncSocket* socket = ss_->CreateAsyncSocket(initial_addr.family(),
171 SOCK_DGRAM);
172 socket->Bind(initial_addr);
173 SocketAddress server_addr = socket->GetLocalAddress();
174 // Make sure VSS didn't switch families on us.
175 EXPECT_EQ(server_addr.family(), initial_addr.family());
176
177 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket));
178 AsyncSocket* socket2 =
179 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
180 TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2));
181
182 SocketAddress client2_addr;
183 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
184 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
185
186 SocketAddress client1_addr;
187 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
188 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
189 EXPECT_EQ(client1_addr, server_addr);
190
191 SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family());
192 for (int i = 0; i < 10; i++) {
193 client2 = new TestClient(AsyncUDPSocket::Create(ss_, empty));
194
195 SocketAddress next_client2_addr;
196 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
197 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr));
198 CheckAddressIncrementalization(next_client2_addr, client2_addr);
199 // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1);
200
201 SocketAddress server_addr2;
202 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr));
203 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2));
204 EXPECT_EQ(server_addr2, server_addr);
205
206 client2_addr = next_client2_addr;
207 }
208 }
209
210 // initial_addr should be made from either INADDR_ANY or in6addr_any.
211 void ConnectTest(const SocketAddress& initial_addr) {
212 testing::StreamSink sink;
213 SocketAddress accept_addr;
214 const SocketAddress kEmptyAddr =
215 EmptySocketAddressWithFamily(initial_addr.family());
216
217 // Create client
218 AsyncSocket* client = ss_->CreateAsyncSocket(initial_addr.family(),
219 SOCK_STREAM);
220 sink.Monitor(client);
221 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
222 EXPECT_TRUE(client->GetLocalAddress().IsNil());
223
224 // Create server
225 AsyncSocket* server = ss_->CreateAsyncSocket(initial_addr.family(),
226 SOCK_STREAM);
227 sink.Monitor(server);
228 EXPECT_NE(0, server->Listen(5)); // Bind required
229 EXPECT_EQ(0, server->Bind(initial_addr));
230 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
231 EXPECT_EQ(0, server->Listen(5));
232 EXPECT_EQ(server->GetState(), AsyncSocket::CS_CONNECTING);
233
234 // No pending server connections
235 EXPECT_FALSE(sink.Check(server, testing::SSE_READ));
236 EXPECT_TRUE(NULL == server->Accept(&accept_addr));
237 EXPECT_EQ(AF_UNSPEC, accept_addr.family());
238
239 // Attempt connect to listening socket
240 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
241 EXPECT_NE(client->GetLocalAddress(), kEmptyAddr); // Implicit Bind
242 EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family()); // Implicit Bind
243 EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress());
244
245 // Client is connecting
246 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
247 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN));
248 EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE));
249
250 ss_->ProcessMessagesUntilIdle();
251
252 // Client still connecting
253 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
254 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN));
255 EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE));
256
257 // Server has pending connection
258 EXPECT_TRUE(sink.Check(server, testing::SSE_READ));
259 Socket* accepted = server->Accept(&accept_addr);
260 EXPECT_TRUE(NULL != accepted);
261 EXPECT_NE(accept_addr, kEmptyAddr);
262 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr);
263
264 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED);
265 EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress());
266 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress());
267
268 ss_->ProcessMessagesUntilIdle();
269
270 // Client has connected
271 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTED);
272 EXPECT_TRUE(sink.Check(client, testing::SSE_OPEN));
273 EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE));
274 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
275 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
276 }
277
278 void ConnectToNonListenerTest(const SocketAddress& initial_addr) {
279 testing::StreamSink sink;
280 SocketAddress accept_addr;
281 const SocketAddress nil_addr;
282 const SocketAddress empty_addr =
283 EmptySocketAddressWithFamily(initial_addr.family());
284
285 // Create client
286 AsyncSocket* client = ss_->CreateAsyncSocket(initial_addr.family(),
287 SOCK_STREAM);
288 sink.Monitor(client);
289
290 // Create server
291 AsyncSocket* server = ss_->CreateAsyncSocket(initial_addr.family(),
292 SOCK_STREAM);
293 sink.Monitor(server);
294 EXPECT_EQ(0, server->Bind(initial_addr));
295 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
296 // Attempt connect to non-listening socket
297 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
298
299 ss_->ProcessMessagesUntilIdle();
300
301 // No pending server connections
302 EXPECT_FALSE(sink.Check(server, testing::SSE_READ));
303 EXPECT_TRUE(NULL == server->Accept(&accept_addr));
304 EXPECT_EQ(accept_addr, nil_addr);
305
306 // Connection failed
307 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
308 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN));
309 EXPECT_TRUE(sink.Check(client, testing::SSE_ERROR));
310 EXPECT_EQ(client->GetRemoteAddress(), nil_addr);
311 }
312
313 void CloseDuringConnectTest(const SocketAddress& initial_addr) {
314 testing::StreamSink sink;
315 SocketAddress accept_addr;
316 const SocketAddress empty_addr =
317 EmptySocketAddressWithFamily(initial_addr.family());
318
319 // Create client and server
wu@webrtc.org32ed9d92013-08-13 00:13:26 +0000320 scoped_ptr<AsyncSocket> client(ss_->CreateAsyncSocket(initial_addr.family(),
321 SOCK_STREAM));
322 sink.Monitor(client.get());
323 scoped_ptr<AsyncSocket> server(ss_->CreateAsyncSocket(initial_addr.family(),
324 SOCK_STREAM));
325 sink.Monitor(server.get());
henrike@webrtc.org0e118e72013-07-10 00:45:36 +0000326
327 // Initiate connect
328 EXPECT_EQ(0, server->Bind(initial_addr));
329 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
330
331 EXPECT_EQ(0, server->Listen(5));
332 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
333
334 // Server close before socket enters accept queue
wu@webrtc.org32ed9d92013-08-13 00:13:26 +0000335 EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ));
henrike@webrtc.org0e118e72013-07-10 00:45:36 +0000336 server->Close();
337
338 ss_->ProcessMessagesUntilIdle();
339
340 // Result: connection failed
341 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
wu@webrtc.org32ed9d92013-08-13 00:13:26 +0000342 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR));
henrike@webrtc.org0e118e72013-07-10 00:45:36 +0000343
wu@webrtc.org32ed9d92013-08-13 00:13:26 +0000344 server.reset(ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
345 sink.Monitor(server.get());
henrike@webrtc.org0e118e72013-07-10 00:45:36 +0000346
347 // Initiate connect
348 EXPECT_EQ(0, server->Bind(initial_addr));
349 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
350
351 EXPECT_EQ(0, server->Listen(5));
352 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
353
354 ss_->ProcessMessagesUntilIdle();
355
356 // Server close while socket is in accept queue
wu@webrtc.org32ed9d92013-08-13 00:13:26 +0000357 EXPECT_TRUE(sink.Check(server.get(), testing::SSE_READ));
henrike@webrtc.org0e118e72013-07-10 00:45:36 +0000358 server->Close();
359
360 ss_->ProcessMessagesUntilIdle();
361
362 // Result: connection failed
363 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
wu@webrtc.org32ed9d92013-08-13 00:13:26 +0000364 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR));
henrike@webrtc.org0e118e72013-07-10 00:45:36 +0000365
366 // New server
wu@webrtc.org32ed9d92013-08-13 00:13:26 +0000367 server.reset(ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
368 sink.Monitor(server.get());
henrike@webrtc.org0e118e72013-07-10 00:45:36 +0000369
370 // Initiate connect
371 EXPECT_EQ(0, server->Bind(initial_addr));
372 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
373
374 EXPECT_EQ(0, server->Listen(5));
375 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
376
377 ss_->ProcessMessagesUntilIdle();
378
379 // Server accepts connection
wu@webrtc.org32ed9d92013-08-13 00:13:26 +0000380 EXPECT_TRUE(sink.Check(server.get(), testing::SSE_READ));
381 scoped_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
382 ASSERT_TRUE(NULL != accepted.get());
383 sink.Monitor(accepted.get());
henrike@webrtc.org0e118e72013-07-10 00:45:36 +0000384
385 // Client closes before connection complets
386 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED);
387
388 // Connected message has not been processed yet.
389 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
390 client->Close();
391
392 ss_->ProcessMessagesUntilIdle();
393
394 // Result: accepted socket closes
395 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CLOSED);
wu@webrtc.org32ed9d92013-08-13 00:13:26 +0000396 EXPECT_TRUE(sink.Check(accepted.get(), testing::SSE_CLOSE));
397 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE));
henrike@webrtc.org0e118e72013-07-10 00:45:36 +0000398 }
399
400 void CloseTest(const SocketAddress& initial_addr) {
401 testing::StreamSink sink;
402 const SocketAddress kEmptyAddr;
403
404 // Create clients
405 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM);
406 sink.Monitor(a);
407 a->Bind(initial_addr);
408 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
409
410
wu@webrtc.org32ed9d92013-08-13 00:13:26 +0000411 scoped_ptr<AsyncSocket> b(ss_->CreateAsyncSocket(initial_addr.family(),
412 SOCK_STREAM));
413 sink.Monitor(b.get());
henrike@webrtc.org0e118e72013-07-10 00:45:36 +0000414 b->Bind(initial_addr);
415 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
416
417 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
418 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
419
420 ss_->ProcessMessagesUntilIdle();
421
422 EXPECT_TRUE(sink.Check(a, testing::SSE_OPEN));
423 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CONNECTED);
424 EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress());
425
wu@webrtc.org32ed9d92013-08-13 00:13:26 +0000426 EXPECT_TRUE(sink.Check(b.get(), testing::SSE_OPEN));
henrike@webrtc.org0e118e72013-07-10 00:45:36 +0000427 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CONNECTED);
428 EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress());
429
430 EXPECT_EQ(1, a->Send("a", 1));
431 b->Close();
432 EXPECT_EQ(1, a->Send("b", 1));
433
434 ss_->ProcessMessagesUntilIdle();
435
436 char buffer[10];
wu@webrtc.org32ed9d92013-08-13 00:13:26 +0000437 EXPECT_FALSE(sink.Check(b.get(), testing::SSE_READ));
henrike@webrtc.org0e118e72013-07-10 00:45:36 +0000438 EXPECT_EQ(-1, b->Recv(buffer, 10));
439
440 EXPECT_TRUE(sink.Check(a, testing::SSE_CLOSE));
441 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CLOSED);
442 EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr);
443
wu@webrtc.org32ed9d92013-08-13 00:13:26 +0000444 // No signal for Closer
445 EXPECT_FALSE(sink.Check(b.get(), testing::SSE_CLOSE));
henrike@webrtc.org0e118e72013-07-10 00:45:36 +0000446 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CLOSED);
447 EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr);
448 }
449
450 void TcpSendTest(const SocketAddress& initial_addr) {
451 testing::StreamSink sink;
452 const SocketAddress kEmptyAddr;
453
454 // Connect two sockets
455 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM);
456 sink.Monitor(a);
457 a->Bind(initial_addr);
458 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
459
460 AsyncSocket* b = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM);
461 sink.Monitor(b);
462 b->Bind(initial_addr);
463 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
464
465 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
466 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
467
468 ss_->ProcessMessagesUntilIdle();
469
470 const size_t kBufferSize = 2000;
471 ss_->set_send_buffer_capacity(kBufferSize);
472 ss_->set_recv_buffer_capacity(kBufferSize);
473
474 const size_t kDataSize = 5000;
475 char send_buffer[kDataSize], recv_buffer[kDataSize];
476 for (size_t i = 0; i < kDataSize; ++i)
477 send_buffer[i] = static_cast<char>(i % 256);
478 memset(recv_buffer, 0, sizeof(recv_buffer));
479 size_t send_pos = 0, recv_pos = 0;
480
481 // Can't send more than send buffer in one write
482 int result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
483 EXPECT_EQ(static_cast<int>(kBufferSize), result);
484 send_pos += result;
485
486 ss_->ProcessMessagesUntilIdle();
487 EXPECT_FALSE(sink.Check(a, testing::SSE_WRITE));
488 EXPECT_TRUE(sink.Check(b, testing::SSE_READ));
489
490 // Receive buffer is already filled, fill send buffer again
491 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
492 EXPECT_EQ(static_cast<int>(kBufferSize), result);
493 send_pos += result;
494
495 ss_->ProcessMessagesUntilIdle();
496 EXPECT_FALSE(sink.Check(a, testing::SSE_WRITE));
497 EXPECT_FALSE(sink.Check(b, testing::SSE_READ));
498
499 // No more room in send or receive buffer
500 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
501 EXPECT_EQ(-1, result);
502 EXPECT_TRUE(a->IsBlocking());
503
504 // Read a subset of the data
505 result = b->Recv(recv_buffer + recv_pos, 500);
506 EXPECT_EQ(500, result);
507 recv_pos += result;
508
509 ss_->ProcessMessagesUntilIdle();
510 EXPECT_TRUE(sink.Check(a, testing::SSE_WRITE));
511 EXPECT_TRUE(sink.Check(b, testing::SSE_READ));
512
513 // Room for more on the sending side
514 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
515 EXPECT_EQ(500, result);
516 send_pos += result;
517
518 // Empty the recv buffer
519 while (true) {
520 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos);
521 if (result < 0) {
522 EXPECT_EQ(-1, result);
523 EXPECT_TRUE(b->IsBlocking());
524 break;
525 }
526 recv_pos += result;
527 }
528
529 ss_->ProcessMessagesUntilIdle();
530 EXPECT_TRUE(sink.Check(b, testing::SSE_READ));
531
532 // Continue to empty the recv buffer
533 while (true) {
534 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos);
535 if (result < 0) {
536 EXPECT_EQ(-1, result);
537 EXPECT_TRUE(b->IsBlocking());
538 break;
539 }
540 recv_pos += result;
541 }
542
543 // Send last of the data
544 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
545 EXPECT_EQ(500, result);
546 send_pos += result;
547
548 ss_->ProcessMessagesUntilIdle();
549 EXPECT_TRUE(sink.Check(b, testing::SSE_READ));
550
551 // Receive the last of the data
552 while (true) {
553 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos);
554 if (result < 0) {
555 EXPECT_EQ(-1, result);
556 EXPECT_TRUE(b->IsBlocking());
557 break;
558 }
559 recv_pos += result;
560 }
561
562 ss_->ProcessMessagesUntilIdle();
563 EXPECT_FALSE(sink.Check(b, testing::SSE_READ));
564
565 // The received data matches the sent data
566 EXPECT_EQ(kDataSize, send_pos);
567 EXPECT_EQ(kDataSize, recv_pos);
568 EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize));
569 }
570
571 void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) {
572 const SocketAddress kEmptyAddr;
573
574 // Connect two sockets
575 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(),
576 SOCK_STREAM);
577 AsyncSocket* b = ss_->CreateAsyncSocket(initial_addr.family(),
578 SOCK_STREAM);
579 a->Bind(initial_addr);
580 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
581
582 b->Bind(initial_addr);
583 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
584
585 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
586 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
587 ss_->ProcessMessagesUntilIdle();
588
589 // First, deliver all packets in 0 ms.
590 char buffer[2] = { 0, 0 };
591 const char cNumPackets = 10;
592 for (char i = 0; i < cNumPackets; ++i) {
593 buffer[0] = '0' + i;
594 EXPECT_EQ(1, a->Send(buffer, 1));
595 }
596
597 ss_->ProcessMessagesUntilIdle();
598
599 for (char i = 0; i < cNumPackets; ++i) {
600 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer)));
601 EXPECT_EQ(static_cast<char>('0' + i), buffer[0]);
602 }
603
604 // Next, deliver packets at random intervals
605 const uint32 mean = 50;
606 const uint32 stddev = 50;
607
608 ss_->set_delay_mean(mean);
609 ss_->set_delay_stddev(stddev);
610 ss_->UpdateDelayDistribution();
611
612 for (char i = 0; i < cNumPackets; ++i) {
613 buffer[0] = 'A' + i;
614 EXPECT_EQ(1, a->Send(buffer, 1));
615 }
616
617 ss_->ProcessMessagesUntilIdle();
618
619 for (char i = 0; i < cNumPackets; ++i) {
620 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer)));
621 EXPECT_EQ(static_cast<char>('A' + i), buffer[0]);
622 }
623 }
624
625 void BandwidthTest(const SocketAddress& initial_addr) {
626 AsyncSocket* send_socket =
627 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
628 AsyncSocket* recv_socket =
629 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
630 ASSERT_EQ(0, send_socket->Bind(initial_addr));
631 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
632 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
633 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
634 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
635
636 uint32 bandwidth = 64 * 1024;
637 ss_->set_bandwidth(bandwidth);
638
639 Thread* pthMain = Thread::Current();
640 Sender sender(pthMain, send_socket, 80 * 1024);
641 Receiver receiver(pthMain, recv_socket, bandwidth);
642
643 pthMain->ProcessMessages(5000);
644 sender.done = true;
645 pthMain->ProcessMessages(5000);
646
647 ASSERT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4);
648 ASSERT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s
649
650 ss_->set_bandwidth(0);
651 }
652
653 void DelayTest(const SocketAddress& initial_addr) {
654 time_t seed = ::time(NULL);
655 LOG(LS_VERBOSE) << "seed = " << seed;
656 srand(static_cast<unsigned int>(seed));
657
658 const uint32 mean = 2000;
659 const uint32 stddev = 500;
660
661 ss_->set_delay_mean(mean);
662 ss_->set_delay_stddev(stddev);
663 ss_->UpdateDelayDistribution();
664
665 AsyncSocket* send_socket =
666 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
667 AsyncSocket* recv_socket =
668 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
669 ASSERT_EQ(0, send_socket->Bind(initial_addr));
670 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
671 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
672 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
673 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
674
675 Thread* pthMain = Thread::Current();
676 // Avg packet size is 2K, so at 200KB/s for 10s, we should see about
677 // 1000 packets, which is necessary to get a good distribution.
678 Sender sender(pthMain, send_socket, 100 * 2 * 1024);
679 Receiver receiver(pthMain, recv_socket, 0);
680
681 pthMain->ProcessMessages(10000);
682 sender.done = receiver.done = true;
683 ss_->ProcessMessagesUntilIdle();
684
685 const double sample_mean = receiver.sum / receiver.samples;
686 double num =
687 receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum;
688 double den = receiver.samples * (receiver.samples - 1);
pbos@webrtc.orgb9518272014-03-07 15:22:04 +0000689 const double sample_stddev = sqrt(num / den);
henrike@webrtc.org0e118e72013-07-10 00:45:36 +0000690 LOG(LS_VERBOSE) << "mean=" << sample_mean << " stddev=" << sample_stddev;
691
692 EXPECT_LE(500u, receiver.samples);
693 // We initially used a 0.1 fudge factor, but on the build machine, we
694 // have seen the value differ by as much as 0.13.
695 EXPECT_NEAR(mean, sample_mean, 0.15 * mean);
696 EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev);
697
698 ss_->set_delay_mean(0);
699 ss_->set_delay_stddev(0);
700 ss_->UpdateDelayDistribution();
701 }
702
703 // Test cross-family communication between a client bound to client_addr and a
704 // server bound to server_addr. shouldSucceed indicates if communication is
705 // expected to work or not.
706 void CrossFamilyConnectionTest(const SocketAddress& client_addr,
707 const SocketAddress& server_addr,
708 bool shouldSucceed) {
709 testing::StreamSink sink;
710 SocketAddress accept_address;
711 const SocketAddress kEmptyAddr;
712
713 // Client gets a IPv4 address
714 AsyncSocket* client = ss_->CreateAsyncSocket(client_addr.family(),
715 SOCK_STREAM);
716 sink.Monitor(client);
717 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
718 EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr);
719 client->Bind(client_addr);
720
721 // Server gets a non-mapped non-any IPv6 address.
722 // IPv4 sockets should not be able to connect to this.
723 AsyncSocket* server = ss_->CreateAsyncSocket(server_addr.family(),
724 SOCK_STREAM);
725 sink.Monitor(server);
726 server->Bind(server_addr);
727 server->Listen(5);
728
729 if (shouldSucceed) {
730 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
731 ss_->ProcessMessagesUntilIdle();
732 EXPECT_TRUE(sink.Check(server, testing::SSE_READ));
733 Socket* accepted = server->Accept(&accept_address);
734 EXPECT_TRUE(NULL != accepted);
735 EXPECT_NE(kEmptyAddr, accept_address);
736 ss_->ProcessMessagesUntilIdle();
737 EXPECT_TRUE(sink.Check(client, testing::SSE_OPEN));
738 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
739 } else {
740 // Check that the connection failed.
741 EXPECT_EQ(-1, client->Connect(server->GetLocalAddress()));
742 ss_->ProcessMessagesUntilIdle();
743
744 EXPECT_FALSE(sink.Check(server, testing::SSE_READ));
745 EXPECT_TRUE(NULL == server->Accept(&accept_address));
746 EXPECT_EQ(accept_address, kEmptyAddr);
747 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
748 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN));
749 EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr);
750 }
751 }
752
753 // Test cross-family datagram sending between a client bound to client_addr
754 // and a server bound to server_addr. shouldSucceed indicates if sending is
755 // expected to succed or not.
756 void CrossFamilyDatagramTest(const SocketAddress& client_addr,
757 const SocketAddress& server_addr,
758 bool shouldSucceed) {
759 AsyncSocket* socket = ss_->CreateAsyncSocket(SOCK_DGRAM);
760 socket->Bind(server_addr);
761 SocketAddress bound_server_addr = socket->GetLocalAddress();
762 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket));
763
764 AsyncSocket* socket2 = ss_->CreateAsyncSocket(SOCK_DGRAM);
765 socket2->Bind(client_addr);
766 TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2));
767 SocketAddress client2_addr;
768
769 if (shouldSucceed) {
770 EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr));
771 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
772 SocketAddress client1_addr;
773 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
774 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
775 EXPECT_EQ(client1_addr, bound_server_addr);
776 } else {
777 EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr));
778 EXPECT_FALSE(client1->CheckNextPacket("foo", 3, 0));
779 }
780 }
781
782 protected:
783 virtual void SetUp() {
784 Thread::Current()->set_socketserver(ss_);
785 }
786 virtual void TearDown() {
787 Thread::Current()->set_socketserver(NULL);
788 }
789
790 VirtualSocketServer* ss_;
791 const SocketAddress kIPv4AnyAddress;
792 const SocketAddress kIPv6AnyAddress;
793};
794
795TEST_F(VirtualSocketServerTest, basic_v4) {
796 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000);
797 BasicTest(ipv4_test_addr);
798}
799
800TEST_F(VirtualSocketServerTest, basic_v6) {
801 SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 5000);
802 BasicTest(ipv6_test_addr);
803}
804
805TEST_F(VirtualSocketServerTest, connect_v4) {
806 ConnectTest(kIPv4AnyAddress);
807}
808
809TEST_F(VirtualSocketServerTest, connect_v6) {
810 ConnectTest(kIPv6AnyAddress);
811}
812
813TEST_F(VirtualSocketServerTest, connect_to_non_listener_v4) {
814 ConnectToNonListenerTest(kIPv4AnyAddress);
815}
816
817TEST_F(VirtualSocketServerTest, connect_to_non_listener_v6) {
818 ConnectToNonListenerTest(kIPv6AnyAddress);
819}
820
821TEST_F(VirtualSocketServerTest, close_during_connect_v4) {
822 CloseDuringConnectTest(kIPv4AnyAddress);
823}
824
825TEST_F(VirtualSocketServerTest, close_during_connect_v6) {
826 CloseDuringConnectTest(kIPv6AnyAddress);
827}
828
829TEST_F(VirtualSocketServerTest, close_v4) {
830 CloseTest(kIPv4AnyAddress);
831}
832
833TEST_F(VirtualSocketServerTest, close_v6) {
834 CloseTest(kIPv6AnyAddress);
835}
836
837TEST_F(VirtualSocketServerTest, tcp_send_v4) {
838 TcpSendTest(kIPv4AnyAddress);
839}
840
841TEST_F(VirtualSocketServerTest, tcp_send_v6) {
842 TcpSendTest(kIPv6AnyAddress);
843}
844
845TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v4) {
846 TcpSendsPacketsInOrderTest(kIPv4AnyAddress);
847}
848
849TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v6) {
850 TcpSendsPacketsInOrderTest(kIPv6AnyAddress);
851}
852
853TEST_F(VirtualSocketServerTest, bandwidth_v4) {
854 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 1000);
855 BandwidthTest(ipv4_test_addr);
856}
857
858TEST_F(VirtualSocketServerTest, bandwidth_v6) {
859 SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 1000);
860 BandwidthTest(ipv6_test_addr);
861}
862
863TEST_F(VirtualSocketServerTest, delay_v4) {
864 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 1000);
865 DelayTest(ipv4_test_addr);
866}
867
andrew@webrtc.org9fde9662013-09-25 02:33:50 +0000868// See: https://code.google.com/p/webrtc/issues/detail?id=2409
869TEST_F(VirtualSocketServerTest, DISABLED_delay_v6) {
henrike@webrtc.org0e118e72013-07-10 00:45:36 +0000870 SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 1000);
871 DelayTest(ipv6_test_addr);
872}
873
874// Works, receiving socket sees 127.0.0.2.
875TEST_F(VirtualSocketServerTest, CanConnectFromMappedIPv6ToIPv4Any) {
876 CrossFamilyConnectionTest(SocketAddress("::ffff:127.0.0.2", 0),
877 SocketAddress("0.0.0.0", 5000),
878 true);
879}
880
881// Fails.
882TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToIPv4Any) {
883 CrossFamilyConnectionTest(SocketAddress("::2", 0),
884 SocketAddress("0.0.0.0", 5000),
885 false);
886}
887
888// Fails.
889TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToMappedIPv6) {
890 CrossFamilyConnectionTest(SocketAddress("::2", 0),
891 SocketAddress("::ffff:127.0.0.1", 5000),
892 false);
893}
894
895// Works. receiving socket sees ::ffff:127.0.0.2.
896TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToIPv6Any) {
897 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
898 SocketAddress("::", 5000),
899 true);
900}
901
902// Fails.
903TEST_F(VirtualSocketServerTest, CantConnectFromIPv4ToUnMappedIPv6) {
904 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
905 SocketAddress("::1", 5000),
906 false);
907}
908
909// Works. Receiving socket sees ::ffff:127.0.0.1.
910TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToMappedIPv6) {
911 CrossFamilyConnectionTest(SocketAddress("127.0.0.1", 0),
912 SocketAddress("::ffff:127.0.0.2", 5000),
913 true);
914}
915
916// Works, receiving socket sees a result from GetNextIP.
917TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv6ToIPv4Any) {
918 CrossFamilyConnectionTest(SocketAddress("::", 0),
919 SocketAddress("0.0.0.0", 5000),
920 true);
921}
922
923// Works, receiving socket sees whatever GetNextIP gave the client.
924TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv4ToIPv6Any) {
925 CrossFamilyConnectionTest(SocketAddress("0.0.0.0", 0),
926 SocketAddress("::", 5000),
927 true);
928}
929
930TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv4ToIPv6Any) {
931 CrossFamilyDatagramTest(SocketAddress("0.0.0.0", 0),
932 SocketAddress("::", 5000),
933 true);
934}
935
936TEST_F(VirtualSocketServerTest, CanSendDatagramFromMappedIPv6ToIPv4Any) {
937 CrossFamilyDatagramTest(SocketAddress("::ffff:127.0.0.1", 0),
938 SocketAddress("0.0.0.0", 5000),
939 true);
940}
941
942TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToIPv4Any) {
943 CrossFamilyDatagramTest(SocketAddress("::2", 0),
944 SocketAddress("0.0.0.0", 5000),
945 false);
946}
947
948TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToMappedIPv6) {
949 CrossFamilyDatagramTest(SocketAddress("::2", 0),
950 SocketAddress("::ffff:127.0.0.1", 5000),
951 false);
952}
953
954TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToIPv6Any) {
955 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
956 SocketAddress("::", 5000),
957 true);
958}
959
960TEST_F(VirtualSocketServerTest, CantSendDatagramFromIPv4ToUnMappedIPv6) {
961 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
962 SocketAddress("::1", 5000),
963 false);
964}
965
966TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToMappedIPv6) {
967 CrossFamilyDatagramTest(SocketAddress("127.0.0.1", 0),
968 SocketAddress("::ffff:127.0.0.2", 5000),
969 true);
970}
971
972TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) {
973 CrossFamilyDatagramTest(SocketAddress("::", 0),
974 SocketAddress("0.0.0.0", 5000),
975 true);
976}
977
978TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) {
979 const uint32 kTestMean[] = { 10, 100, 333, 1000 };
980 const double kTestDev[] = { 0.25, 0.1, 0.01 };
981 // TODO: The current code only works for 1000 data points or more.
982 const uint32 kTestSamples[] = { /*10, 100,*/ 1000 };
983 for (size_t midx = 0; midx < ARRAY_SIZE(kTestMean); ++midx) {
984 for (size_t didx = 0; didx < ARRAY_SIZE(kTestDev); ++didx) {
985 for (size_t sidx = 0; sidx < ARRAY_SIZE(kTestSamples); ++sidx) {
986 ASSERT_LT(0u, kTestSamples[sidx]);
987 const uint32 kStdDev =
988 static_cast<uint32>(kTestDev[didx] * kTestMean[midx]);
989 VirtualSocketServer::Function* f =
990 VirtualSocketServer::CreateDistribution(kTestMean[midx],
991 kStdDev,
992 kTestSamples[sidx]);
993 ASSERT_TRUE(NULL != f);
994 ASSERT_EQ(kTestSamples[sidx], f->size());
995 double sum = 0;
996 for (uint32 i = 0; i < f->size(); ++i) {
997 sum += (*f)[i].second;
998 }
999 const double mean = sum / f->size();
1000 double sum_sq_dev = 0;
1001 for (uint32 i = 0; i < f->size(); ++i) {
1002 double dev = (*f)[i].second - mean;
1003 sum_sq_dev += dev * dev;
1004 }
pbos@webrtc.orgb9518272014-03-07 15:22:04 +00001005 const double stddev = sqrt(sum_sq_dev / f->size());
henrike@webrtc.org0e118e72013-07-10 00:45:36 +00001006 EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx])
1007 << "M=" << kTestMean[midx]
1008 << " SD=" << kStdDev
1009 << " N=" << kTestSamples[sidx];
1010 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev)
1011 << "M=" << kTestMean[midx]
1012 << " SD=" << kStdDev
1013 << " N=" << kTestSamples[sidx];
1014 delete f;
1015 }
1016 }
1017 }
1018}