OLD | NEW |
| (Empty) |
1 /* | |
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 <memory> | |
18 | |
19 #include "webrtc/base/arraysize.h" | |
20 #include "webrtc/base/fakeclock.h" | |
21 #include "webrtc/base/gunit.h" | |
22 #include "webrtc/base/logging.h" | |
23 #include "webrtc/base/ptr_util.h" | |
24 #include "webrtc/base/testclient.h" | |
25 #include "webrtc/base/testutils.h" | |
26 #include "webrtc/base/thread.h" | |
27 #include "webrtc/base/timeutils.h" | |
28 #include "webrtc/base/virtualsocketserver.h" | |
29 | |
30 using namespace rtc; | |
31 | |
32 using webrtc::testing::SSE_CLOSE; | |
33 using webrtc::testing::SSE_ERROR; | |
34 using webrtc::testing::SSE_OPEN; | |
35 using webrtc::testing::SSE_READ; | |
36 using webrtc::testing::SSE_WRITE; | |
37 using webrtc::testing::StreamSink; | |
38 | |
39 // Sends at a constant rate but with random packet sizes. | |
40 struct Sender : public MessageHandler { | |
41 Sender(Thread* th, AsyncSocket* s, uint32_t rt) | |
42 : thread(th), | |
43 socket(MakeUnique<AsyncUDPSocket>(s)), | |
44 done(false), | |
45 rate(rt), | |
46 count(0) { | |
47 last_send = rtc::TimeMillis(); | |
48 thread->PostDelayed(RTC_FROM_HERE, NextDelay(), this, 1); | |
49 } | |
50 | |
51 uint32_t NextDelay() { | |
52 uint32_t size = (rand() % 4096) + 1; | |
53 return 1000 * size / rate; | |
54 } | |
55 | |
56 void OnMessage(Message* pmsg) { | |
57 ASSERT_EQ(1u, pmsg->message_id); | |
58 | |
59 if (done) | |
60 return; | |
61 | |
62 int64_t cur_time = rtc::TimeMillis(); | |
63 int64_t delay = cur_time - last_send; | |
64 uint32_t size = static_cast<uint32_t>(rate * delay / 1000); | |
65 size = std::min<uint32_t>(size, 4096); | |
66 size = std::max<uint32_t>(size, sizeof(uint32_t)); | |
67 | |
68 count += size; | |
69 memcpy(dummy, &cur_time, sizeof(cur_time)); | |
70 socket->Send(dummy, size, options); | |
71 | |
72 last_send = cur_time; | |
73 thread->PostDelayed(RTC_FROM_HERE, NextDelay(), this, 1); | |
74 } | |
75 | |
76 Thread* thread; | |
77 std::unique_ptr<AsyncUDPSocket> socket; | |
78 rtc::PacketOptions options; | |
79 bool done; | |
80 uint32_t rate; // bytes per second | |
81 uint32_t count; | |
82 int64_t last_send; | |
83 char dummy[4096]; | |
84 }; | |
85 | |
86 struct Receiver : public MessageHandler, public sigslot::has_slots<> { | |
87 Receiver(Thread* th, AsyncSocket* s, uint32_t bw) | |
88 : thread(th), | |
89 socket(MakeUnique<AsyncUDPSocket>(s)), | |
90 bandwidth(bw), | |
91 done(false), | |
92 count(0), | |
93 sec_count(0), | |
94 sum(0), | |
95 sum_sq(0), | |
96 samples(0) { | |
97 socket->SignalReadPacket.connect(this, &Receiver::OnReadPacket); | |
98 thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1); | |
99 } | |
100 | |
101 ~Receiver() { | |
102 thread->Clear(this); | |
103 } | |
104 | |
105 void OnReadPacket(AsyncPacketSocket* s, const char* data, size_t size, | |
106 const SocketAddress& remote_addr, | |
107 const PacketTime& packet_time) { | |
108 ASSERT_EQ(socket.get(), s); | |
109 ASSERT_GE(size, 4U); | |
110 | |
111 count += size; | |
112 sec_count += size; | |
113 | |
114 uint32_t send_time = *reinterpret_cast<const uint32_t*>(data); | |
115 uint32_t recv_time = rtc::TimeMillis(); | |
116 uint32_t delay = recv_time - send_time; | |
117 sum += delay; | |
118 sum_sq += delay * delay; | |
119 samples += 1; | |
120 } | |
121 | |
122 void OnMessage(Message* pmsg) { | |
123 ASSERT_EQ(1u, pmsg->message_id); | |
124 | |
125 if (done) | |
126 return; | |
127 | |
128 // It is always possible for us to receive more than expected because | |
129 // packets can be further delayed in delivery. | |
130 if (bandwidth > 0) | |
131 ASSERT_TRUE(sec_count <= 5 * bandwidth / 4); | |
132 sec_count = 0; | |
133 thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1); | |
134 } | |
135 | |
136 Thread* thread; | |
137 std::unique_ptr<AsyncUDPSocket> socket; | |
138 uint32_t bandwidth; | |
139 bool done; | |
140 size_t count; | |
141 size_t sec_count; | |
142 double sum; | |
143 double sum_sq; | |
144 uint32_t samples; | |
145 }; | |
146 | |
147 // Note: This test uses a fake clock in addition to a virtual network. | |
148 class VirtualSocketServerTest : public testing::Test { | |
149 public: | |
150 VirtualSocketServerTest() | |
151 : ss_(&fake_clock_), | |
152 thread_(&ss_), | |
153 kIPv4AnyAddress(IPAddress(INADDR_ANY), 0), | |
154 kIPv6AnyAddress(IPAddress(in6addr_any), 0) {} | |
155 | |
156 void CheckPortIncrementalization(const SocketAddress& post, | |
157 const SocketAddress& pre) { | |
158 EXPECT_EQ(post.port(), pre.port() + 1); | |
159 IPAddress post_ip = post.ipaddr(); | |
160 IPAddress pre_ip = pre.ipaddr(); | |
161 EXPECT_EQ(pre_ip.family(), post_ip.family()); | |
162 if (post_ip.family() == AF_INET) { | |
163 in_addr pre_ipv4 = pre_ip.ipv4_address(); | |
164 in_addr post_ipv4 = post_ip.ipv4_address(); | |
165 EXPECT_EQ(post_ipv4.s_addr, pre_ipv4.s_addr); | |
166 } else if (post_ip.family() == AF_INET6) { | |
167 in6_addr post_ip6 = post_ip.ipv6_address(); | |
168 in6_addr pre_ip6 = pre_ip.ipv6_address(); | |
169 uint32_t* post_as_ints = reinterpret_cast<uint32_t*>(&post_ip6.s6_addr); | |
170 uint32_t* pre_as_ints = reinterpret_cast<uint32_t*>(&pre_ip6.s6_addr); | |
171 EXPECT_EQ(post_as_ints[3], pre_as_ints[3]); | |
172 } | |
173 } | |
174 | |
175 // Test a client can bind to the any address, and all sent packets will have | |
176 // the default route as the source address. Also, it can receive packets sent | |
177 // to the default route. | |
178 void TestDefaultRoute(const IPAddress& default_route) { | |
179 ss_.SetDefaultRoute(default_route); | |
180 | |
181 // Create client1 bound to the any address. | |
182 AsyncSocket* socket = | |
183 ss_.CreateAsyncSocket(default_route.family(), SOCK_DGRAM); | |
184 socket->Bind(EmptySocketAddressWithFamily(default_route.family())); | |
185 SocketAddress client1_any_addr = socket->GetLocalAddress(); | |
186 EXPECT_TRUE(client1_any_addr.IsAnyIP()); | |
187 auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket), | |
188 &fake_clock_); | |
189 | |
190 // Create client2 bound to the default route. | |
191 AsyncSocket* socket2 = | |
192 ss_.CreateAsyncSocket(default_route.family(), SOCK_DGRAM); | |
193 socket2->Bind(SocketAddress(default_route, 0)); | |
194 SocketAddress client2_addr = socket2->GetLocalAddress(); | |
195 EXPECT_FALSE(client2_addr.IsAnyIP()); | |
196 auto client2 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket2), | |
197 &fake_clock_); | |
198 | |
199 // Client1 sends to client2, client2 should see the default route as | |
200 // client1's address. | |
201 SocketAddress client1_addr; | |
202 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); | |
203 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); | |
204 EXPECT_EQ(client1_addr, | |
205 SocketAddress(default_route, client1_any_addr.port())); | |
206 | |
207 // Client2 can send back to client1's default route address. | |
208 EXPECT_EQ(3, client2->SendTo("foo", 3, client1_addr)); | |
209 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); | |
210 } | |
211 | |
212 void BasicTest(const SocketAddress& initial_addr) { | |
213 AsyncSocket* socket = | |
214 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); | |
215 socket->Bind(initial_addr); | |
216 SocketAddress server_addr = socket->GetLocalAddress(); | |
217 // Make sure VSS didn't switch families on us. | |
218 EXPECT_EQ(server_addr.family(), initial_addr.family()); | |
219 | |
220 auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket), | |
221 &fake_clock_); | |
222 AsyncSocket* socket2 = | |
223 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); | |
224 auto client2 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket2), | |
225 &fake_clock_); | |
226 | |
227 SocketAddress client2_addr; | |
228 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr)); | |
229 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); | |
230 | |
231 SocketAddress client1_addr; | |
232 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); | |
233 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); | |
234 EXPECT_EQ(client1_addr, server_addr); | |
235 | |
236 SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family()); | |
237 for (int i = 0; i < 10; i++) { | |
238 client2 = MakeUnique<TestClient>( | |
239 WrapUnique(AsyncUDPSocket::Create(&ss_, empty)), &fake_clock_); | |
240 | |
241 SocketAddress next_client2_addr; | |
242 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr)); | |
243 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr)); | |
244 CheckPortIncrementalization(next_client2_addr, client2_addr); | |
245 // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1); | |
246 | |
247 SocketAddress server_addr2; | |
248 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr)); | |
249 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2)); | |
250 EXPECT_EQ(server_addr2, server_addr); | |
251 | |
252 client2_addr = next_client2_addr; | |
253 } | |
254 } | |
255 | |
256 // initial_addr should be made from either INADDR_ANY or in6addr_any. | |
257 void ConnectTest(const SocketAddress& initial_addr) { | |
258 StreamSink sink; | |
259 SocketAddress accept_addr; | |
260 const SocketAddress kEmptyAddr = | |
261 EmptySocketAddressWithFamily(initial_addr.family()); | |
262 | |
263 // Create client | |
264 std::unique_ptr<AsyncSocket> client = | |
265 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); | |
266 sink.Monitor(client.get()); | |
267 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); | |
268 EXPECT_TRUE(client->GetLocalAddress().IsNil()); | |
269 | |
270 // Create server | |
271 std::unique_ptr<AsyncSocket> server = | |
272 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); | |
273 sink.Monitor(server.get()); | |
274 EXPECT_NE(0, server->Listen(5)); // Bind required | |
275 EXPECT_EQ(0, server->Bind(initial_addr)); | |
276 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); | |
277 EXPECT_EQ(0, server->Listen(5)); | |
278 EXPECT_EQ(server->GetState(), AsyncSocket::CS_CONNECTING); | |
279 | |
280 // No pending server connections | |
281 EXPECT_FALSE(sink.Check(server.get(), SSE_READ)); | |
282 EXPECT_TRUE(nullptr == server->Accept(&accept_addr)); | |
283 EXPECT_EQ(AF_UNSPEC, accept_addr.family()); | |
284 | |
285 // Attempt connect to listening socket | |
286 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | |
287 EXPECT_NE(client->GetLocalAddress(), kEmptyAddr); // Implicit Bind | |
288 EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family()); // Implicit Bind | |
289 EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress()); | |
290 | |
291 // Client is connecting | |
292 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); | |
293 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN)); | |
294 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE)); | |
295 | |
296 ss_.ProcessMessagesUntilIdle(); | |
297 | |
298 // Client still connecting | |
299 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); | |
300 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN)); | |
301 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE)); | |
302 | |
303 // Server has pending connection | |
304 EXPECT_TRUE(sink.Check(server.get(), SSE_READ)); | |
305 std::unique_ptr<Socket> accepted = WrapUnique(server->Accept(&accept_addr)); | |
306 EXPECT_TRUE(nullptr != accepted); | |
307 EXPECT_NE(accept_addr, kEmptyAddr); | |
308 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr); | |
309 | |
310 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED); | |
311 EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress()); | |
312 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress()); | |
313 | |
314 ss_.ProcessMessagesUntilIdle(); | |
315 | |
316 // Client has connected | |
317 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTED); | |
318 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN)); | |
319 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE)); | |
320 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); | |
321 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); | |
322 } | |
323 | |
324 void ConnectToNonListenerTest(const SocketAddress& initial_addr) { | |
325 StreamSink sink; | |
326 SocketAddress accept_addr; | |
327 const SocketAddress nil_addr; | |
328 const SocketAddress empty_addr = | |
329 EmptySocketAddressWithFamily(initial_addr.family()); | |
330 | |
331 // Create client | |
332 std::unique_ptr<AsyncSocket> client = | |
333 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); | |
334 sink.Monitor(client.get()); | |
335 | |
336 // Create server | |
337 std::unique_ptr<AsyncSocket> server = | |
338 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); | |
339 sink.Monitor(server.get()); | |
340 EXPECT_EQ(0, server->Bind(initial_addr)); | |
341 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); | |
342 // Attempt connect to non-listening socket | |
343 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | |
344 | |
345 ss_.ProcessMessagesUntilIdle(); | |
346 | |
347 // No pending server connections | |
348 EXPECT_FALSE(sink.Check(server.get(), SSE_READ)); | |
349 EXPECT_TRUE(nullptr == server->Accept(&accept_addr)); | |
350 EXPECT_EQ(accept_addr, nil_addr); | |
351 | |
352 // Connection failed | |
353 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); | |
354 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN)); | |
355 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR)); | |
356 EXPECT_EQ(client->GetRemoteAddress(), nil_addr); | |
357 } | |
358 | |
359 void CloseDuringConnectTest(const SocketAddress& initial_addr) { | |
360 StreamSink sink; | |
361 SocketAddress accept_addr; | |
362 const SocketAddress empty_addr = | |
363 EmptySocketAddressWithFamily(initial_addr.family()); | |
364 | |
365 // Create client and server | |
366 std::unique_ptr<AsyncSocket> client( | |
367 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); | |
368 sink.Monitor(client.get()); | |
369 std::unique_ptr<AsyncSocket> server( | |
370 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); | |
371 sink.Monitor(server.get()); | |
372 | |
373 // Initiate connect | |
374 EXPECT_EQ(0, server->Bind(initial_addr)); | |
375 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); | |
376 | |
377 EXPECT_EQ(0, server->Listen(5)); | |
378 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | |
379 | |
380 // Server close before socket enters accept queue | |
381 EXPECT_FALSE(sink.Check(server.get(), SSE_READ)); | |
382 server->Close(); | |
383 | |
384 ss_.ProcessMessagesUntilIdle(); | |
385 | |
386 // Result: connection failed | |
387 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); | |
388 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR)); | |
389 | |
390 server.reset(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); | |
391 sink.Monitor(server.get()); | |
392 | |
393 // Initiate connect | |
394 EXPECT_EQ(0, server->Bind(initial_addr)); | |
395 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); | |
396 | |
397 EXPECT_EQ(0, server->Listen(5)); | |
398 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | |
399 | |
400 ss_.ProcessMessagesUntilIdle(); | |
401 | |
402 // Server close while socket is in accept queue | |
403 EXPECT_TRUE(sink.Check(server.get(), SSE_READ)); | |
404 server->Close(); | |
405 | |
406 ss_.ProcessMessagesUntilIdle(); | |
407 | |
408 // Result: connection failed | |
409 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); | |
410 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR)); | |
411 | |
412 // New server | |
413 server.reset(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); | |
414 sink.Monitor(server.get()); | |
415 | |
416 // Initiate connect | |
417 EXPECT_EQ(0, server->Bind(initial_addr)); | |
418 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); | |
419 | |
420 EXPECT_EQ(0, server->Listen(5)); | |
421 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | |
422 | |
423 ss_.ProcessMessagesUntilIdle(); | |
424 | |
425 // Server accepts connection | |
426 EXPECT_TRUE(sink.Check(server.get(), SSE_READ)); | |
427 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); | |
428 ASSERT_TRUE(nullptr != accepted.get()); | |
429 sink.Monitor(accepted.get()); | |
430 | |
431 // Client closes before connection complets | |
432 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED); | |
433 | |
434 // Connected message has not been processed yet. | |
435 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); | |
436 client->Close(); | |
437 | |
438 ss_.ProcessMessagesUntilIdle(); | |
439 | |
440 // Result: accepted socket closes | |
441 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CLOSED); | |
442 EXPECT_TRUE(sink.Check(accepted.get(), SSE_CLOSE)); | |
443 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE)); | |
444 } | |
445 | |
446 void CloseTest(const SocketAddress& initial_addr) { | |
447 StreamSink sink; | |
448 const SocketAddress kEmptyAddr; | |
449 | |
450 // Create clients | |
451 std::unique_ptr<AsyncSocket> a = | |
452 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); | |
453 sink.Monitor(a.get()); | |
454 a->Bind(initial_addr); | |
455 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); | |
456 | |
457 std::unique_ptr<AsyncSocket> b = | |
458 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); | |
459 sink.Monitor(b.get()); | |
460 b->Bind(initial_addr); | |
461 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); | |
462 | |
463 EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); | |
464 EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); | |
465 | |
466 ss_.ProcessMessagesUntilIdle(); | |
467 | |
468 EXPECT_TRUE(sink.Check(a.get(), SSE_OPEN)); | |
469 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CONNECTED); | |
470 EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress()); | |
471 | |
472 EXPECT_TRUE(sink.Check(b.get(), SSE_OPEN)); | |
473 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CONNECTED); | |
474 EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress()); | |
475 | |
476 EXPECT_EQ(1, a->Send("a", 1)); | |
477 b->Close(); | |
478 EXPECT_EQ(1, a->Send("b", 1)); | |
479 | |
480 ss_.ProcessMessagesUntilIdle(); | |
481 | |
482 char buffer[10]; | |
483 EXPECT_FALSE(sink.Check(b.get(), SSE_READ)); | |
484 EXPECT_EQ(-1, b->Recv(buffer, 10, nullptr)); | |
485 | |
486 EXPECT_TRUE(sink.Check(a.get(), SSE_CLOSE)); | |
487 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CLOSED); | |
488 EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr); | |
489 | |
490 // No signal for Closer | |
491 EXPECT_FALSE(sink.Check(b.get(), SSE_CLOSE)); | |
492 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CLOSED); | |
493 EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr); | |
494 } | |
495 | |
496 void TcpSendTest(const SocketAddress& initial_addr) { | |
497 StreamSink sink; | |
498 const SocketAddress kEmptyAddr; | |
499 | |
500 // Connect two sockets | |
501 std::unique_ptr<AsyncSocket> a = | |
502 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); | |
503 sink.Monitor(a.get()); | |
504 a->Bind(initial_addr); | |
505 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); | |
506 | |
507 std::unique_ptr<AsyncSocket> b = | |
508 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); | |
509 sink.Monitor(b.get()); | |
510 b->Bind(initial_addr); | |
511 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); | |
512 | |
513 EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); | |
514 EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); | |
515 | |
516 ss_.ProcessMessagesUntilIdle(); | |
517 | |
518 const size_t kBufferSize = 2000; | |
519 ss_.set_send_buffer_capacity(kBufferSize); | |
520 ss_.set_recv_buffer_capacity(kBufferSize); | |
521 | |
522 const size_t kDataSize = 5000; | |
523 char send_buffer[kDataSize], recv_buffer[kDataSize]; | |
524 for (size_t i = 0; i < kDataSize; ++i) | |
525 send_buffer[i] = static_cast<char>(i % 256); | |
526 memset(recv_buffer, 0, sizeof(recv_buffer)); | |
527 size_t send_pos = 0, recv_pos = 0; | |
528 | |
529 // Can't send more than send buffer in one write | |
530 int result = a->Send(send_buffer + send_pos, kDataSize - send_pos); | |
531 EXPECT_EQ(static_cast<int>(kBufferSize), result); | |
532 send_pos += result; | |
533 | |
534 ss_.ProcessMessagesUntilIdle(); | |
535 EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE)); | |
536 EXPECT_TRUE(sink.Check(b.get(), SSE_READ)); | |
537 | |
538 // Receive buffer is already filled, fill send buffer again | |
539 result = a->Send(send_buffer + send_pos, kDataSize - send_pos); | |
540 EXPECT_EQ(static_cast<int>(kBufferSize), result); | |
541 send_pos += result; | |
542 | |
543 ss_.ProcessMessagesUntilIdle(); | |
544 EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE)); | |
545 EXPECT_FALSE(sink.Check(b.get(), SSE_READ)); | |
546 | |
547 // No more room in send or receive buffer | |
548 result = a->Send(send_buffer + send_pos, kDataSize - send_pos); | |
549 EXPECT_EQ(-1, result); | |
550 EXPECT_TRUE(a->IsBlocking()); | |
551 | |
552 // Read a subset of the data | |
553 result = b->Recv(recv_buffer + recv_pos, 500, nullptr); | |
554 EXPECT_EQ(500, result); | |
555 recv_pos += result; | |
556 | |
557 ss_.ProcessMessagesUntilIdle(); | |
558 EXPECT_TRUE(sink.Check(a.get(), SSE_WRITE)); | |
559 EXPECT_TRUE(sink.Check(b.get(), SSE_READ)); | |
560 | |
561 // Room for more on the sending side | |
562 result = a->Send(send_buffer + send_pos, kDataSize - send_pos); | |
563 EXPECT_EQ(500, result); | |
564 send_pos += result; | |
565 | |
566 // Empty the recv buffer | |
567 while (true) { | |
568 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr); | |
569 if (result < 0) { | |
570 EXPECT_EQ(-1, result); | |
571 EXPECT_TRUE(b->IsBlocking()); | |
572 break; | |
573 } | |
574 recv_pos += result; | |
575 } | |
576 | |
577 ss_.ProcessMessagesUntilIdle(); | |
578 EXPECT_TRUE(sink.Check(b.get(), SSE_READ)); | |
579 | |
580 // Continue to empty the recv buffer | |
581 while (true) { | |
582 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr); | |
583 if (result < 0) { | |
584 EXPECT_EQ(-1, result); | |
585 EXPECT_TRUE(b->IsBlocking()); | |
586 break; | |
587 } | |
588 recv_pos += result; | |
589 } | |
590 | |
591 // Send last of the data | |
592 result = a->Send(send_buffer + send_pos, kDataSize - send_pos); | |
593 EXPECT_EQ(500, result); | |
594 send_pos += result; | |
595 | |
596 ss_.ProcessMessagesUntilIdle(); | |
597 EXPECT_TRUE(sink.Check(b.get(), SSE_READ)); | |
598 | |
599 // Receive the last of the data | |
600 while (true) { | |
601 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr); | |
602 if (result < 0) { | |
603 EXPECT_EQ(-1, result); | |
604 EXPECT_TRUE(b->IsBlocking()); | |
605 break; | |
606 } | |
607 recv_pos += result; | |
608 } | |
609 | |
610 ss_.ProcessMessagesUntilIdle(); | |
611 EXPECT_FALSE(sink.Check(b.get(), SSE_READ)); | |
612 | |
613 // The received data matches the sent data | |
614 EXPECT_EQ(kDataSize, send_pos); | |
615 EXPECT_EQ(kDataSize, recv_pos); | |
616 EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize)); | |
617 } | |
618 | |
619 void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) { | |
620 const SocketAddress kEmptyAddr; | |
621 | |
622 // Connect two sockets | |
623 std::unique_ptr<AsyncSocket> a = | |
624 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); | |
625 std::unique_ptr<AsyncSocket> b = | |
626 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); | |
627 a->Bind(initial_addr); | |
628 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); | |
629 | |
630 b->Bind(initial_addr); | |
631 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); | |
632 | |
633 EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); | |
634 EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); | |
635 ss_.ProcessMessagesUntilIdle(); | |
636 | |
637 // First, deliver all packets in 0 ms. | |
638 char buffer[2] = { 0, 0 }; | |
639 const char cNumPackets = 10; | |
640 for (char i = 0; i < cNumPackets; ++i) { | |
641 buffer[0] = '0' + i; | |
642 EXPECT_EQ(1, a->Send(buffer, 1)); | |
643 } | |
644 | |
645 ss_.ProcessMessagesUntilIdle(); | |
646 | |
647 for (char i = 0; i < cNumPackets; ++i) { | |
648 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr)); | |
649 EXPECT_EQ(static_cast<char>('0' + i), buffer[0]); | |
650 } | |
651 | |
652 // Next, deliver packets at random intervals | |
653 const uint32_t mean = 50; | |
654 const uint32_t stddev = 50; | |
655 | |
656 ss_.set_delay_mean(mean); | |
657 ss_.set_delay_stddev(stddev); | |
658 ss_.UpdateDelayDistribution(); | |
659 | |
660 for (char i = 0; i < cNumPackets; ++i) { | |
661 buffer[0] = 'A' + i; | |
662 EXPECT_EQ(1, a->Send(buffer, 1)); | |
663 } | |
664 | |
665 ss_.ProcessMessagesUntilIdle(); | |
666 | |
667 for (char i = 0; i < cNumPackets; ++i) { | |
668 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr)); | |
669 EXPECT_EQ(static_cast<char>('A' + i), buffer[0]); | |
670 } | |
671 } | |
672 | |
673 // It is important that initial_addr's port has to be 0 such that the | |
674 // incremental port behavior could ensure the 2 Binds result in different | |
675 // address. | |
676 void BandwidthTest(const SocketAddress& initial_addr) { | |
677 AsyncSocket* send_socket = | |
678 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); | |
679 AsyncSocket* recv_socket = | |
680 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); | |
681 ASSERT_EQ(0, send_socket->Bind(initial_addr)); | |
682 ASSERT_EQ(0, recv_socket->Bind(initial_addr)); | |
683 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family()); | |
684 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family()); | |
685 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress())); | |
686 | |
687 uint32_t bandwidth = 64 * 1024; | |
688 ss_.set_bandwidth(bandwidth); | |
689 | |
690 Thread* pthMain = Thread::Current(); | |
691 Sender sender(pthMain, send_socket, 80 * 1024); | |
692 Receiver receiver(pthMain, recv_socket, bandwidth); | |
693 | |
694 // Allow the sender to run for 5 (simulated) seconds, then be stopped for 5 | |
695 // seconds. | |
696 SIMULATED_WAIT(false, 5000, fake_clock_); | |
697 sender.done = true; | |
698 SIMULATED_WAIT(false, 5000, fake_clock_); | |
699 | |
700 // Ensure the observed bandwidth fell within a reasonable margin of error. | |
701 EXPECT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4); | |
702 EXPECT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s | |
703 | |
704 ss_.set_bandwidth(0); | |
705 } | |
706 | |
707 // It is important that initial_addr's port has to be 0 such that the | |
708 // incremental port behavior could ensure the 2 Binds result in different | |
709 // address. | |
710 void DelayTest(const SocketAddress& initial_addr) { | |
711 time_t seed = ::time(nullptr); | |
712 LOG(LS_VERBOSE) << "seed = " << seed; | |
713 srand(static_cast<unsigned int>(seed)); | |
714 | |
715 const uint32_t mean = 2000; | |
716 const uint32_t stddev = 500; | |
717 | |
718 ss_.set_delay_mean(mean); | |
719 ss_.set_delay_stddev(stddev); | |
720 ss_.UpdateDelayDistribution(); | |
721 | |
722 AsyncSocket* send_socket = | |
723 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); | |
724 AsyncSocket* recv_socket = | |
725 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); | |
726 ASSERT_EQ(0, send_socket->Bind(initial_addr)); | |
727 ASSERT_EQ(0, recv_socket->Bind(initial_addr)); | |
728 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family()); | |
729 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family()); | |
730 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress())); | |
731 | |
732 Thread* pthMain = Thread::Current(); | |
733 // Avg packet size is 2K, so at 200KB/s for 10s, we should see about | |
734 // 1000 packets, which is necessary to get a good distribution. | |
735 Sender sender(pthMain, send_socket, 100 * 2 * 1024); | |
736 Receiver receiver(pthMain, recv_socket, 0); | |
737 | |
738 // Simulate 10 seconds of packets being sent, then check the observed delay | |
739 // distribution. | |
740 SIMULATED_WAIT(false, 10000, fake_clock_); | |
741 sender.done = receiver.done = true; | |
742 ss_.ProcessMessagesUntilIdle(); | |
743 | |
744 const double sample_mean = receiver.sum / receiver.samples; | |
745 double num = | |
746 receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum; | |
747 double den = receiver.samples * (receiver.samples - 1); | |
748 const double sample_stddev = sqrt(num / den); | |
749 LOG(LS_VERBOSE) << "mean=" << sample_mean << " stddev=" << sample_stddev; | |
750 | |
751 EXPECT_LE(500u, receiver.samples); | |
752 // We initially used a 0.1 fudge factor, but on the build machine, we | |
753 // have seen the value differ by as much as 0.13. | |
754 EXPECT_NEAR(mean, sample_mean, 0.15 * mean); | |
755 EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev); | |
756 | |
757 ss_.set_delay_mean(0); | |
758 ss_.set_delay_stddev(0); | |
759 ss_.UpdateDelayDistribution(); | |
760 } | |
761 | |
762 // Test cross-family communication between a client bound to client_addr and a | |
763 // server bound to server_addr. shouldSucceed indicates if communication is | |
764 // expected to work or not. | |
765 void CrossFamilyConnectionTest(const SocketAddress& client_addr, | |
766 const SocketAddress& server_addr, | |
767 bool shouldSucceed) { | |
768 StreamSink sink; | |
769 SocketAddress accept_address; | |
770 const SocketAddress kEmptyAddr; | |
771 | |
772 // Client gets a IPv4 address | |
773 std::unique_ptr<AsyncSocket> client = | |
774 WrapUnique(ss_.CreateAsyncSocket(client_addr.family(), SOCK_STREAM)); | |
775 sink.Monitor(client.get()); | |
776 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); | |
777 EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr); | |
778 client->Bind(client_addr); | |
779 | |
780 // Server gets a non-mapped non-any IPv6 address. | |
781 // IPv4 sockets should not be able to connect to this. | |
782 std::unique_ptr<AsyncSocket> server = | |
783 WrapUnique(ss_.CreateAsyncSocket(server_addr.family(), SOCK_STREAM)); | |
784 sink.Monitor(server.get()); | |
785 server->Bind(server_addr); | |
786 server->Listen(5); | |
787 | |
788 if (shouldSucceed) { | |
789 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | |
790 ss_.ProcessMessagesUntilIdle(); | |
791 EXPECT_TRUE(sink.Check(server.get(), SSE_READ)); | |
792 std::unique_ptr<Socket> accepted = | |
793 WrapUnique(server->Accept(&accept_address)); | |
794 EXPECT_TRUE(nullptr != accepted); | |
795 EXPECT_NE(kEmptyAddr, accept_address); | |
796 ss_.ProcessMessagesUntilIdle(); | |
797 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN)); | |
798 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); | |
799 } else { | |
800 // Check that the connection failed. | |
801 EXPECT_EQ(-1, client->Connect(server->GetLocalAddress())); | |
802 ss_.ProcessMessagesUntilIdle(); | |
803 | |
804 EXPECT_FALSE(sink.Check(server.get(), SSE_READ)); | |
805 EXPECT_TRUE(nullptr == server->Accept(&accept_address)); | |
806 EXPECT_EQ(accept_address, kEmptyAddr); | |
807 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); | |
808 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN)); | |
809 EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr); | |
810 } | |
811 } | |
812 | |
813 // Test cross-family datagram sending between a client bound to client_addr | |
814 // and a server bound to server_addr. shouldSucceed indicates if sending is | |
815 // expected to succeed or not. | |
816 void CrossFamilyDatagramTest(const SocketAddress& client_addr, | |
817 const SocketAddress& server_addr, | |
818 bool shouldSucceed) { | |
819 AsyncSocket* socket = ss_.CreateAsyncSocket(SOCK_DGRAM); | |
820 socket->Bind(server_addr); | |
821 SocketAddress bound_server_addr = socket->GetLocalAddress(); | |
822 auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket), | |
823 &fake_clock_); | |
824 | |
825 AsyncSocket* socket2 = ss_.CreateAsyncSocket(SOCK_DGRAM); | |
826 socket2->Bind(client_addr); | |
827 auto client2 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket2), | |
828 &fake_clock_); | |
829 SocketAddress client2_addr; | |
830 | |
831 if (shouldSucceed) { | |
832 EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr)); | |
833 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); | |
834 SocketAddress client1_addr; | |
835 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); | |
836 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); | |
837 EXPECT_EQ(client1_addr, bound_server_addr); | |
838 } else { | |
839 EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr)); | |
840 EXPECT_TRUE(client1->CheckNoPacket()); | |
841 } | |
842 } | |
843 | |
844 protected: | |
845 rtc::ScopedFakeClock fake_clock_; | |
846 VirtualSocketServer ss_; | |
847 AutoSocketServerThread thread_; | |
848 const SocketAddress kIPv4AnyAddress; | |
849 const SocketAddress kIPv6AnyAddress; | |
850 }; | |
851 | |
852 TEST_F(VirtualSocketServerTest, basic_v4) { | |
853 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000); | |
854 BasicTest(ipv4_test_addr); | |
855 } | |
856 | |
857 TEST_F(VirtualSocketServerTest, basic_v6) { | |
858 SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 5000); | |
859 BasicTest(ipv6_test_addr); | |
860 } | |
861 | |
862 TEST_F(VirtualSocketServerTest, TestDefaultRoute_v4) { | |
863 IPAddress ipv4_default_addr(0x01020304); | |
864 TestDefaultRoute(ipv4_default_addr); | |
865 } | |
866 | |
867 TEST_F(VirtualSocketServerTest, TestDefaultRoute_v6) { | |
868 IPAddress ipv6_default_addr; | |
869 EXPECT_TRUE( | |
870 IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ipv6_default_addr)); | |
871 TestDefaultRoute(ipv6_default_addr); | |
872 } | |
873 | |
874 TEST_F(VirtualSocketServerTest, connect_v4) { | |
875 ConnectTest(kIPv4AnyAddress); | |
876 } | |
877 | |
878 TEST_F(VirtualSocketServerTest, connect_v6) { | |
879 ConnectTest(kIPv6AnyAddress); | |
880 } | |
881 | |
882 TEST_F(VirtualSocketServerTest, connect_to_non_listener_v4) { | |
883 ConnectToNonListenerTest(kIPv4AnyAddress); | |
884 } | |
885 | |
886 TEST_F(VirtualSocketServerTest, connect_to_non_listener_v6) { | |
887 ConnectToNonListenerTest(kIPv6AnyAddress); | |
888 } | |
889 | |
890 TEST_F(VirtualSocketServerTest, close_during_connect_v4) { | |
891 CloseDuringConnectTest(kIPv4AnyAddress); | |
892 } | |
893 | |
894 TEST_F(VirtualSocketServerTest, close_during_connect_v6) { | |
895 CloseDuringConnectTest(kIPv6AnyAddress); | |
896 } | |
897 | |
898 TEST_F(VirtualSocketServerTest, close_v4) { | |
899 CloseTest(kIPv4AnyAddress); | |
900 } | |
901 | |
902 TEST_F(VirtualSocketServerTest, close_v6) { | |
903 CloseTest(kIPv6AnyAddress); | |
904 } | |
905 | |
906 TEST_F(VirtualSocketServerTest, tcp_send_v4) { | |
907 TcpSendTest(kIPv4AnyAddress); | |
908 } | |
909 | |
910 TEST_F(VirtualSocketServerTest, tcp_send_v6) { | |
911 TcpSendTest(kIPv6AnyAddress); | |
912 } | |
913 | |
914 TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v4) { | |
915 TcpSendsPacketsInOrderTest(kIPv4AnyAddress); | |
916 } | |
917 | |
918 TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v6) { | |
919 TcpSendsPacketsInOrderTest(kIPv6AnyAddress); | |
920 } | |
921 | |
922 TEST_F(VirtualSocketServerTest, bandwidth_v4) { | |
923 BandwidthTest(kIPv4AnyAddress); | |
924 } | |
925 | |
926 TEST_F(VirtualSocketServerTest, bandwidth_v6) { | |
927 BandwidthTest(kIPv6AnyAddress); | |
928 } | |
929 | |
930 TEST_F(VirtualSocketServerTest, delay_v4) { | |
931 DelayTest(kIPv4AnyAddress); | |
932 } | |
933 | |
934 TEST_F(VirtualSocketServerTest, delay_v6) { | |
935 DelayTest(kIPv6AnyAddress); | |
936 } | |
937 | |
938 // Works, receiving socket sees 127.0.0.2. | |
939 TEST_F(VirtualSocketServerTest, CanConnectFromMappedIPv6ToIPv4Any) { | |
940 CrossFamilyConnectionTest(SocketAddress("::ffff:127.0.0.2", 0), | |
941 SocketAddress("0.0.0.0", 5000), | |
942 true); | |
943 } | |
944 | |
945 // Fails. | |
946 TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToIPv4Any) { | |
947 CrossFamilyConnectionTest(SocketAddress("::2", 0), | |
948 SocketAddress("0.0.0.0", 5000), | |
949 false); | |
950 } | |
951 | |
952 // Fails. | |
953 TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToMappedIPv6) { | |
954 CrossFamilyConnectionTest(SocketAddress("::2", 0), | |
955 SocketAddress("::ffff:127.0.0.1", 5000), | |
956 false); | |
957 } | |
958 | |
959 // Works. receiving socket sees ::ffff:127.0.0.2. | |
960 TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToIPv6Any) { | |
961 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0), | |
962 SocketAddress("::", 5000), | |
963 true); | |
964 } | |
965 | |
966 // Fails. | |
967 TEST_F(VirtualSocketServerTest, CantConnectFromIPv4ToUnMappedIPv6) { | |
968 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0), | |
969 SocketAddress("::1", 5000), | |
970 false); | |
971 } | |
972 | |
973 // Works. Receiving socket sees ::ffff:127.0.0.1. | |
974 TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToMappedIPv6) { | |
975 CrossFamilyConnectionTest(SocketAddress("127.0.0.1", 0), | |
976 SocketAddress("::ffff:127.0.0.2", 5000), | |
977 true); | |
978 } | |
979 | |
980 // Works, receiving socket sees a result from GetNextIP. | |
981 TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv6ToIPv4Any) { | |
982 CrossFamilyConnectionTest(SocketAddress("::", 0), | |
983 SocketAddress("0.0.0.0", 5000), | |
984 true); | |
985 } | |
986 | |
987 // Works, receiving socket sees whatever GetNextIP gave the client. | |
988 TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv4ToIPv6Any) { | |
989 CrossFamilyConnectionTest(SocketAddress("0.0.0.0", 0), | |
990 SocketAddress("::", 5000), | |
991 true); | |
992 } | |
993 | |
994 TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv4ToIPv6Any) { | |
995 CrossFamilyDatagramTest(SocketAddress("0.0.0.0", 0), | |
996 SocketAddress("::", 5000), | |
997 true); | |
998 } | |
999 | |
1000 TEST_F(VirtualSocketServerTest, CanSendDatagramFromMappedIPv6ToIPv4Any) { | |
1001 CrossFamilyDatagramTest(SocketAddress("::ffff:127.0.0.1", 0), | |
1002 SocketAddress("0.0.0.0", 5000), | |
1003 true); | |
1004 } | |
1005 | |
1006 TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToIPv4Any) { | |
1007 CrossFamilyDatagramTest(SocketAddress("::2", 0), | |
1008 SocketAddress("0.0.0.0", 5000), | |
1009 false); | |
1010 } | |
1011 | |
1012 TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToMappedIPv6) { | |
1013 CrossFamilyDatagramTest(SocketAddress("::2", 0), | |
1014 SocketAddress("::ffff:127.0.0.1", 5000), | |
1015 false); | |
1016 } | |
1017 | |
1018 TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToIPv6Any) { | |
1019 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0), | |
1020 SocketAddress("::", 5000), | |
1021 true); | |
1022 } | |
1023 | |
1024 TEST_F(VirtualSocketServerTest, CantSendDatagramFromIPv4ToUnMappedIPv6) { | |
1025 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0), | |
1026 SocketAddress("::1", 5000), | |
1027 false); | |
1028 } | |
1029 | |
1030 TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToMappedIPv6) { | |
1031 CrossFamilyDatagramTest(SocketAddress("127.0.0.1", 0), | |
1032 SocketAddress("::ffff:127.0.0.2", 5000), | |
1033 true); | |
1034 } | |
1035 | |
1036 TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) { | |
1037 CrossFamilyDatagramTest(SocketAddress("::", 0), | |
1038 SocketAddress("0.0.0.0", 5000), | |
1039 true); | |
1040 } | |
1041 | |
1042 TEST_F(VirtualSocketServerTest, SetSendingBlockedWithUdpSocket) { | |
1043 AsyncSocket* socket1 = | |
1044 ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM); | |
1045 std::unique_ptr<AsyncSocket> socket2 = | |
1046 WrapUnique(ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM)); | |
1047 socket1->Bind(kIPv4AnyAddress); | |
1048 socket2->Bind(kIPv4AnyAddress); | |
1049 auto client1 = | |
1050 MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket1), &fake_clock_); | |
1051 | |
1052 ss_.SetSendingBlocked(true); | |
1053 EXPECT_EQ(-1, client1->SendTo("foo", 3, socket2->GetLocalAddress())); | |
1054 EXPECT_TRUE(socket1->IsBlocking()); | |
1055 EXPECT_EQ(0, client1->ready_to_send_count()); | |
1056 | |
1057 ss_.SetSendingBlocked(false); | |
1058 EXPECT_EQ(1, client1->ready_to_send_count()); | |
1059 EXPECT_EQ(3, client1->SendTo("foo", 3, socket2->GetLocalAddress())); | |
1060 } | |
1061 | |
1062 TEST_F(VirtualSocketServerTest, SetSendingBlockedWithTcpSocket) { | |
1063 constexpr size_t kBufferSize = 1024; | |
1064 ss_.set_send_buffer_capacity(kBufferSize); | |
1065 ss_.set_recv_buffer_capacity(kBufferSize); | |
1066 | |
1067 StreamSink sink; | |
1068 std::unique_ptr<AsyncSocket> socket1 = | |
1069 WrapUnique(ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM)); | |
1070 std::unique_ptr<AsyncSocket> socket2 = | |
1071 WrapUnique(ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM)); | |
1072 sink.Monitor(socket1.get()); | |
1073 sink.Monitor(socket2.get()); | |
1074 socket1->Bind(kIPv4AnyAddress); | |
1075 socket2->Bind(kIPv4AnyAddress); | |
1076 | |
1077 // Connect sockets. | |
1078 EXPECT_EQ(0, socket1->Connect(socket2->GetLocalAddress())); | |
1079 EXPECT_EQ(0, socket2->Connect(socket1->GetLocalAddress())); | |
1080 ss_.ProcessMessagesUntilIdle(); | |
1081 | |
1082 char data[kBufferSize] = {}; | |
1083 | |
1084 // First Send call will fill the send buffer but not send anything. | |
1085 ss_.SetSendingBlocked(true); | |
1086 EXPECT_EQ(static_cast<int>(kBufferSize), socket1->Send(data, kBufferSize)); | |
1087 ss_.ProcessMessagesUntilIdle(); | |
1088 EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE)); | |
1089 EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ)); | |
1090 EXPECT_FALSE(socket1->IsBlocking()); | |
1091 | |
1092 // Since the send buffer is full, next Send will result in EWOULDBLOCK. | |
1093 EXPECT_EQ(-1, socket1->Send(data, kBufferSize)); | |
1094 EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE)); | |
1095 EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ)); | |
1096 EXPECT_TRUE(socket1->IsBlocking()); | |
1097 | |
1098 // When sending is unblocked, the buffered data should be sent and | |
1099 // SignalWriteEvent should fire. | |
1100 ss_.SetSendingBlocked(false); | |
1101 ss_.ProcessMessagesUntilIdle(); | |
1102 EXPECT_TRUE(sink.Check(socket1.get(), SSE_WRITE)); | |
1103 EXPECT_TRUE(sink.Check(socket2.get(), SSE_READ)); | |
1104 } | |
1105 | |
1106 TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) { | |
1107 const uint32_t kTestMean[] = {10, 100, 333, 1000}; | |
1108 const double kTestDev[] = { 0.25, 0.1, 0.01 }; | |
1109 // TODO(deadbeef): The current code only works for 1000 data points or more. | |
1110 const uint32_t kTestSamples[] = {/*10, 100,*/ 1000}; | |
1111 for (size_t midx = 0; midx < arraysize(kTestMean); ++midx) { | |
1112 for (size_t didx = 0; didx < arraysize(kTestDev); ++didx) { | |
1113 for (size_t sidx = 0; sidx < arraysize(kTestSamples); ++sidx) { | |
1114 ASSERT_LT(0u, kTestSamples[sidx]); | |
1115 const uint32_t kStdDev = | |
1116 static_cast<uint32_t>(kTestDev[didx] * kTestMean[midx]); | |
1117 VirtualSocketServer::Function* f = | |
1118 VirtualSocketServer::CreateDistribution(kTestMean[midx], | |
1119 kStdDev, | |
1120 kTestSamples[sidx]); | |
1121 ASSERT_TRUE(nullptr != f); | |
1122 ASSERT_EQ(kTestSamples[sidx], f->size()); | |
1123 double sum = 0; | |
1124 for (uint32_t i = 0; i < f->size(); ++i) { | |
1125 sum += (*f)[i].second; | |
1126 } | |
1127 const double mean = sum / f->size(); | |
1128 double sum_sq_dev = 0; | |
1129 for (uint32_t i = 0; i < f->size(); ++i) { | |
1130 double dev = (*f)[i].second - mean; | |
1131 sum_sq_dev += dev * dev; | |
1132 } | |
1133 const double stddev = sqrt(sum_sq_dev / f->size()); | |
1134 EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx]) | |
1135 << "M=" << kTestMean[midx] | |
1136 << " SD=" << kStdDev | |
1137 << " N=" << kTestSamples[sidx]; | |
1138 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev) | |
1139 << "M=" << kTestMean[midx] | |
1140 << " SD=" << kStdDev | |
1141 << " N=" << kTestSamples[sidx]; | |
1142 delete f; | |
1143 } | |
1144 } | |
1145 } | |
1146 } | |
OLD | NEW |