blob: d09385bbb3b5c2d10839cdc263ca61bb4d286a1f [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
2 * Copyright 2004 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
jbauch555604a2016-04-26 03:13:22 -070011#include <memory>
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000012#include <signal.h>
13#include <stdarg.h>
14
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "rtc_base/gunit.h"
16#include "rtc_base/logging.h"
17#include "rtc_base/networkmonitor.h"
18#include "rtc_base/physicalsocketserver.h"
19#include "rtc_base/socket_unittest.h"
20#include "rtc_base/testutils.h"
21#include "rtc_base/thread.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000022
23namespace rtc {
24
Mirko Bonadei675513b2017-11-09 11:09:25 +010025#define MAYBE_SKIP_IPV4 \
26 if (!HasIPv4Enabled()) { \
27 RTC_LOG(LS_INFO) << "No IPv4... skipping"; \
28 return; \
deadbeef9a6f4d42017-05-15 19:43:33 -070029 }
30
Mirko Bonadei675513b2017-11-09 11:09:25 +010031#define MAYBE_SKIP_IPV6 \
32 if (!HasIPv6Enabled()) { \
33 RTC_LOG(LS_INFO) << "No IPv6... skipping"; \
34 return; \
Taylor Brandstetter2b3bf6b2016-05-19 14:57:31 -070035 }
36
jbauch095ae152015-12-18 01:39:55 -080037class PhysicalSocketTest;
38
39class FakeSocketDispatcher : public SocketDispatcher {
40 public:
41 explicit FakeSocketDispatcher(PhysicalSocketServer* ss)
42 : SocketDispatcher(ss) {
43 }
44
jbauchf2a2bf42016-02-03 16:45:32 -080045 FakeSocketDispatcher(SOCKET s, PhysicalSocketServer* ss)
46 : SocketDispatcher(s, ss) {
47 }
48
jbauch095ae152015-12-18 01:39:55 -080049 protected:
50 SOCKET DoAccept(SOCKET socket, sockaddr* addr, socklen_t* addrlen) override;
jbauchf2a2bf42016-02-03 16:45:32 -080051 int DoSend(SOCKET socket, const char* buf, int len, int flags) override;
52 int DoSendTo(SOCKET socket, const char* buf, int len, int flags,
53 const struct sockaddr* dest_addr, socklen_t addrlen) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000054};
55
jbauch095ae152015-12-18 01:39:55 -080056class FakePhysicalSocketServer : public PhysicalSocketServer {
57 public:
58 explicit FakePhysicalSocketServer(PhysicalSocketTest* test)
59 : test_(test) {
60 }
61
62 AsyncSocket* CreateAsyncSocket(int type) override {
63 SocketDispatcher* dispatcher = new FakeSocketDispatcher(this);
jbauchf2a2bf42016-02-03 16:45:32 -080064 if (!dispatcher->Create(type)) {
jbauch095ae152015-12-18 01:39:55 -080065 delete dispatcher;
66 return nullptr;
67 }
jbauchf2a2bf42016-02-03 16:45:32 -080068 return dispatcher;
jbauch095ae152015-12-18 01:39:55 -080069 }
70
71 AsyncSocket* CreateAsyncSocket(int family, int type) override {
72 SocketDispatcher* dispatcher = new FakeSocketDispatcher(this);
jbauchf2a2bf42016-02-03 16:45:32 -080073 if (!dispatcher->Create(family, type)) {
jbauch095ae152015-12-18 01:39:55 -080074 delete dispatcher;
75 return nullptr;
76 }
jbauchf2a2bf42016-02-03 16:45:32 -080077 return dispatcher;
78 }
79
80 AsyncSocket* WrapSocket(SOCKET s) override {
81 SocketDispatcher* dispatcher = new FakeSocketDispatcher(s, this);
82 if (!dispatcher->Initialize()) {
83 delete dispatcher;
84 return nullptr;
85 }
86 return dispatcher;
jbauch095ae152015-12-18 01:39:55 -080087 }
88
89 PhysicalSocketTest* GetTest() const { return test_; }
90
91 private:
92 PhysicalSocketTest* test_;
93};
94
deadbeefc874d122017-02-13 15:41:59 -080095class FakeNetworkBinder : public NetworkBinderInterface {
96 public:
97 NetworkBindingResult BindSocketToNetwork(int, const IPAddress&) override {
deadbeef9ffa13f2017-02-21 16:18:00 -080098 ++num_binds_;
deadbeefc874d122017-02-13 15:41:59 -080099 return result_;
100 }
101
102 void set_result(NetworkBindingResult result) { result_ = result; }
103
deadbeef9ffa13f2017-02-21 16:18:00 -0800104 int num_binds() { return num_binds_; }
105
deadbeefc874d122017-02-13 15:41:59 -0800106 private:
107 NetworkBindingResult result_ = NetworkBindingResult::SUCCESS;
deadbeef9ffa13f2017-02-21 16:18:00 -0800108 int num_binds_ = 0;
deadbeefc874d122017-02-13 15:41:59 -0800109};
110
jbauch095ae152015-12-18 01:39:55 -0800111class PhysicalSocketTest : public SocketTest {
112 public:
113 // Set flag to simluate failures when calling "::accept" on a AsyncSocket.
114 void SetFailAccept(bool fail) { fail_accept_ = fail; }
115 bool FailAccept() const { return fail_accept_; }
116
jbauchf2a2bf42016-02-03 16:45:32 -0800117 // Maximum size to ::send to a socket. Set to < 0 to disable limiting.
118 void SetMaxSendSize(int max_size) { max_send_size_ = max_size; }
119 int MaxSendSize() const { return max_send_size_; }
120
jbauch095ae152015-12-18 01:39:55 -0800121 protected:
122 PhysicalSocketTest()
123 : server_(new FakePhysicalSocketServer(this)),
nisse7eaa4ea2017-05-08 05:25:41 -0700124 thread_(server_.get()),
jbauchf2a2bf42016-02-03 16:45:32 -0800125 fail_accept_(false),
nisse7eaa4ea2017-05-08 05:25:41 -0700126 max_send_size_(-1) {}
jbauch095ae152015-12-18 01:39:55 -0800127
128 void ConnectInternalAcceptError(const IPAddress& loopback);
jbauchf2a2bf42016-02-03 16:45:32 -0800129 void WritableAfterPartialWrite(const IPAddress& loopback);
jbauch095ae152015-12-18 01:39:55 -0800130
jbauch555604a2016-04-26 03:13:22 -0700131 std::unique_ptr<FakePhysicalSocketServer> server_;
nisse7eaa4ea2017-05-08 05:25:41 -0700132 rtc::AutoSocketServerThread thread_;
jbauch095ae152015-12-18 01:39:55 -0800133 bool fail_accept_;
jbauchf2a2bf42016-02-03 16:45:32 -0800134 int max_send_size_;
jbauch095ae152015-12-18 01:39:55 -0800135};
136
137SOCKET FakeSocketDispatcher::DoAccept(SOCKET socket,
138 sockaddr* addr,
139 socklen_t* addrlen) {
140 FakePhysicalSocketServer* ss =
141 static_cast<FakePhysicalSocketServer*>(socketserver());
142 if (ss->GetTest()->FailAccept()) {
143 return INVALID_SOCKET;
144 }
145
146 return SocketDispatcher::DoAccept(socket, addr, addrlen);
147}
148
jbauchf2a2bf42016-02-03 16:45:32 -0800149int FakeSocketDispatcher::DoSend(SOCKET socket, const char* buf, int len,
150 int flags) {
151 FakePhysicalSocketServer* ss =
152 static_cast<FakePhysicalSocketServer*>(socketserver());
153 if (ss->GetTest()->MaxSendSize() >= 0) {
154 len = std::min(len, ss->GetTest()->MaxSendSize());
155 }
156
157 return SocketDispatcher::DoSend(socket, buf, len, flags);
158}
159
160int FakeSocketDispatcher::DoSendTo(SOCKET socket, const char* buf, int len,
161 int flags, const struct sockaddr* dest_addr, socklen_t addrlen) {
162 FakePhysicalSocketServer* ss =
163 static_cast<FakePhysicalSocketServer*>(socketserver());
164 if (ss->GetTest()->MaxSendSize() >= 0) {
165 len = std::min(len, ss->GetTest()->MaxSendSize());
166 }
167
168 return SocketDispatcher::DoSendTo(socket, buf, len, flags, dest_addr,
169 addrlen);
170}
171
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000172TEST_F(PhysicalSocketTest, TestConnectIPv4) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700173 MAYBE_SKIP_IPV4;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000174 SocketTest::TestConnectIPv4();
175}
176
Taylor Brandstetter2b3bf6b2016-05-19 14:57:31 -0700177TEST_F(PhysicalSocketTest, TestConnectIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000178 SocketTest::TestConnectIPv6();
179}
180
181TEST_F(PhysicalSocketTest, TestConnectWithDnsLookupIPv4) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700182 MAYBE_SKIP_IPV4;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000183 SocketTest::TestConnectWithDnsLookupIPv4();
184}
185
186TEST_F(PhysicalSocketTest, TestConnectWithDnsLookupIPv6) {
187 SocketTest::TestConnectWithDnsLookupIPv6();
188}
189
190TEST_F(PhysicalSocketTest, TestConnectFailIPv4) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700191 MAYBE_SKIP_IPV4;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000192 SocketTest::TestConnectFailIPv4();
193}
194
jbauch095ae152015-12-18 01:39:55 -0800195void PhysicalSocketTest::ConnectInternalAcceptError(const IPAddress& loopback) {
kwibergd0d81482017-04-18 03:18:22 -0700196 webrtc::testing::StreamSink sink;
jbauch095ae152015-12-18 01:39:55 -0800197 SocketAddress accept_addr;
198
199 // Create two clients.
jbauch555604a2016-04-26 03:13:22 -0700200 std::unique_ptr<AsyncSocket> client1(
201 server_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
jbauch095ae152015-12-18 01:39:55 -0800202 sink.Monitor(client1.get());
203 EXPECT_EQ(AsyncSocket::CS_CLOSED, client1->GetState());
204 EXPECT_PRED1(IsUnspecOrEmptyIP, client1->GetLocalAddress().ipaddr());
205
jbauch555604a2016-04-26 03:13:22 -0700206 std::unique_ptr<AsyncSocket> client2(
207 server_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
jbauch095ae152015-12-18 01:39:55 -0800208 sink.Monitor(client2.get());
209 EXPECT_EQ(AsyncSocket::CS_CLOSED, client2->GetState());
210 EXPECT_PRED1(IsUnspecOrEmptyIP, client2->GetLocalAddress().ipaddr());
211
212 // Create server and listen.
jbauch555604a2016-04-26 03:13:22 -0700213 std::unique_ptr<AsyncSocket> server(
jbauch095ae152015-12-18 01:39:55 -0800214 server_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
215 sink.Monitor(server.get());
216 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
217 EXPECT_EQ(0, server->Listen(5));
218 EXPECT_EQ(AsyncSocket::CS_CONNECTING, server->GetState());
219
220 // Ensure no pending server connections, since we haven't done anything yet.
kwibergd0d81482017-04-18 03:18:22 -0700221 EXPECT_FALSE(sink.Check(server.get(), webrtc::testing::SSE_READ));
jbauch095ae152015-12-18 01:39:55 -0800222 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
223 EXPECT_TRUE(accept_addr.IsNil());
224
225 // Attempt first connect to listening socket.
226 EXPECT_EQ(0, client1->Connect(server->GetLocalAddress()));
227 EXPECT_FALSE(client1->GetLocalAddress().IsNil());
228 EXPECT_NE(server->GetLocalAddress(), client1->GetLocalAddress());
229
230 // Client is connecting, outcome not yet determined.
231 EXPECT_EQ(AsyncSocket::CS_CONNECTING, client1->GetState());
kwibergd0d81482017-04-18 03:18:22 -0700232 EXPECT_FALSE(sink.Check(client1.get(), webrtc::testing::SSE_OPEN));
233 EXPECT_FALSE(sink.Check(client1.get(), webrtc::testing::SSE_CLOSE));
jbauch095ae152015-12-18 01:39:55 -0800234
235 // Server has pending connection, try to accept it (will fail).
kwibergd0d81482017-04-18 03:18:22 -0700236 EXPECT_TRUE_WAIT((sink.Check(server.get(), webrtc::testing::SSE_READ)),
237 kTimeout);
jbauch095ae152015-12-18 01:39:55 -0800238 // Simulate "::accept" returning an error.
239 SetFailAccept(true);
jbauch555604a2016-04-26 03:13:22 -0700240 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
jbauch095ae152015-12-18 01:39:55 -0800241 EXPECT_FALSE(accepted);
242 ASSERT_TRUE(accept_addr.IsNil());
243
244 // Ensure no more pending server connections.
kwibergd0d81482017-04-18 03:18:22 -0700245 EXPECT_FALSE(sink.Check(server.get(), webrtc::testing::SSE_READ));
jbauch095ae152015-12-18 01:39:55 -0800246 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
247 EXPECT_TRUE(accept_addr.IsNil());
248
249 // Attempt second connect to listening socket.
250 EXPECT_EQ(0, client2->Connect(server->GetLocalAddress()));
251 EXPECT_FALSE(client2->GetLocalAddress().IsNil());
252 EXPECT_NE(server->GetLocalAddress(), client2->GetLocalAddress());
253
254 // Client is connecting, outcome not yet determined.
255 EXPECT_EQ(AsyncSocket::CS_CONNECTING, client2->GetState());
kwibergd0d81482017-04-18 03:18:22 -0700256 EXPECT_FALSE(sink.Check(client2.get(), webrtc::testing::SSE_OPEN));
257 EXPECT_FALSE(sink.Check(client2.get(), webrtc::testing::SSE_CLOSE));
jbauch095ae152015-12-18 01:39:55 -0800258
259 // Server has pending connection, try to accept it (will succeed).
kwibergd0d81482017-04-18 03:18:22 -0700260 EXPECT_TRUE_WAIT((sink.Check(server.get(), webrtc::testing::SSE_READ)),
261 kTimeout);
jbauch095ae152015-12-18 01:39:55 -0800262 SetFailAccept(false);
jbauch555604a2016-04-26 03:13:22 -0700263 std::unique_ptr<AsyncSocket> accepted2(server->Accept(&accept_addr));
jbauch095ae152015-12-18 01:39:55 -0800264 ASSERT_TRUE(accepted2);
265 EXPECT_FALSE(accept_addr.IsNil());
266 EXPECT_EQ(accepted2->GetRemoteAddress(), accept_addr);
267}
268
269TEST_F(PhysicalSocketTest, TestConnectAcceptErrorIPv4) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700270 MAYBE_SKIP_IPV4;
jbauch095ae152015-12-18 01:39:55 -0800271 ConnectInternalAcceptError(kIPv4Loopback);
272}
273
Taylor Brandstetter2b3bf6b2016-05-19 14:57:31 -0700274TEST_F(PhysicalSocketTest, TestConnectAcceptErrorIPv6) {
275 MAYBE_SKIP_IPV6;
jbauch095ae152015-12-18 01:39:55 -0800276 ConnectInternalAcceptError(kIPv6Loopback);
277}
278
jbauchf2a2bf42016-02-03 16:45:32 -0800279void PhysicalSocketTest::WritableAfterPartialWrite(const IPAddress& loopback) {
280 // Simulate a really small maximum send size.
281 const int kMaxSendSize = 128;
282 SetMaxSendSize(kMaxSendSize);
283
284 // Run the default send/receive socket tests with a smaller amount of data
285 // to avoid long running times due to the small maximum send size.
286 const size_t kDataSize = 128 * 1024;
287 TcpInternal(loopback, kDataSize, kMaxSendSize);
288}
289
danilchapb7b9dca2016-08-05 05:55:43 -0700290// https://bugs.chromium.org/p/webrtc/issues/detail?id=6167
291#if defined(WEBRTC_WIN)
292#define MAYBE_TestWritableAfterPartialWriteIPv4 DISABLED_TestWritableAfterPartialWriteIPv4
293#else
294#define MAYBE_TestWritableAfterPartialWriteIPv4 TestWritableAfterPartialWriteIPv4
295#endif
296TEST_F(PhysicalSocketTest, MAYBE_TestWritableAfterPartialWriteIPv4) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700297 MAYBE_SKIP_IPV4;
jbauchf2a2bf42016-02-03 16:45:32 -0800298 WritableAfterPartialWrite(kIPv4Loopback);
299}
300
danilchapb7b9dca2016-08-05 05:55:43 -0700301// https://bugs.chromium.org/p/webrtc/issues/detail?id=6167
302#if defined(WEBRTC_WIN)
303#define MAYBE_TestWritableAfterPartialWriteIPv6 DISABLED_TestWritableAfterPartialWriteIPv6
304#else
305#define MAYBE_TestWritableAfterPartialWriteIPv6 TestWritableAfterPartialWriteIPv6
306#endif
307TEST_F(PhysicalSocketTest, MAYBE_TestWritableAfterPartialWriteIPv6) {
Taylor Brandstetter2b3bf6b2016-05-19 14:57:31 -0700308 MAYBE_SKIP_IPV6;
jbauchf2a2bf42016-02-03 16:45:32 -0800309 WritableAfterPartialWrite(kIPv6Loopback);
310}
311
Taylor Brandstetter2b3bf6b2016-05-19 14:57:31 -0700312TEST_F(PhysicalSocketTest, TestConnectFailIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000313 SocketTest::TestConnectFailIPv6();
314}
315
316TEST_F(PhysicalSocketTest, TestConnectWithDnsLookupFailIPv4) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700317 MAYBE_SKIP_IPV4;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000318 SocketTest::TestConnectWithDnsLookupFailIPv4();
319}
320
Taylor Brandstetter2b3bf6b2016-05-19 14:57:31 -0700321TEST_F(PhysicalSocketTest, TestConnectWithDnsLookupFailIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000322 SocketTest::TestConnectWithDnsLookupFailIPv6();
323}
324
325
326TEST_F(PhysicalSocketTest, TestConnectWithClosedSocketIPv4) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700327 MAYBE_SKIP_IPV4;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000328 SocketTest::TestConnectWithClosedSocketIPv4();
329}
330
Taylor Brandstetter2b3bf6b2016-05-19 14:57:31 -0700331TEST_F(PhysicalSocketTest, TestConnectWithClosedSocketIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000332 SocketTest::TestConnectWithClosedSocketIPv6();
333}
334
335TEST_F(PhysicalSocketTest, TestConnectWhileNotClosedIPv4) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700336 MAYBE_SKIP_IPV4;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000337 SocketTest::TestConnectWhileNotClosedIPv4();
338}
339
Taylor Brandstetter2b3bf6b2016-05-19 14:57:31 -0700340TEST_F(PhysicalSocketTest, TestConnectWhileNotClosedIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000341 SocketTest::TestConnectWhileNotClosedIPv6();
342}
343
344TEST_F(PhysicalSocketTest, TestServerCloseDuringConnectIPv4) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700345 MAYBE_SKIP_IPV4;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000346 SocketTest::TestServerCloseDuringConnectIPv4();
347}
348
Taylor Brandstetter2b3bf6b2016-05-19 14:57:31 -0700349TEST_F(PhysicalSocketTest, TestServerCloseDuringConnectIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000350 SocketTest::TestServerCloseDuringConnectIPv6();
351}
352
353TEST_F(PhysicalSocketTest, TestClientCloseDuringConnectIPv4) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700354 MAYBE_SKIP_IPV4;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000355 SocketTest::TestClientCloseDuringConnectIPv4();
356}
357
Taylor Brandstetter2b3bf6b2016-05-19 14:57:31 -0700358TEST_F(PhysicalSocketTest, TestClientCloseDuringConnectIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000359 SocketTest::TestClientCloseDuringConnectIPv6();
360}
361
362TEST_F(PhysicalSocketTest, TestServerCloseIPv4) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700363 MAYBE_SKIP_IPV4;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000364 SocketTest::TestServerCloseIPv4();
365}
366
Taylor Brandstetter2b3bf6b2016-05-19 14:57:31 -0700367TEST_F(PhysicalSocketTest, TestServerCloseIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000368 SocketTest::TestServerCloseIPv6();
369}
370
371TEST_F(PhysicalSocketTest, TestCloseInClosedCallbackIPv4) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700372 MAYBE_SKIP_IPV4;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000373 SocketTest::TestCloseInClosedCallbackIPv4();
374}
375
Taylor Brandstetter2b3bf6b2016-05-19 14:57:31 -0700376TEST_F(PhysicalSocketTest, TestCloseInClosedCallbackIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000377 SocketTest::TestCloseInClosedCallbackIPv6();
378}
379
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000380TEST_F(PhysicalSocketTest, TestSocketServerWaitIPv4) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700381 MAYBE_SKIP_IPV4;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000382 SocketTest::TestSocketServerWaitIPv4();
383}
384
Taylor Brandstetter2b3bf6b2016-05-19 14:57:31 -0700385TEST_F(PhysicalSocketTest, TestSocketServerWaitIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000386 SocketTest::TestSocketServerWaitIPv6();
387}
388
389TEST_F(PhysicalSocketTest, TestTcpIPv4) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700390 MAYBE_SKIP_IPV4;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000391 SocketTest::TestTcpIPv4();
392}
393
Taylor Brandstetter2b3bf6b2016-05-19 14:57:31 -0700394TEST_F(PhysicalSocketTest, TestTcpIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000395 SocketTest::TestTcpIPv6();
396}
397
398TEST_F(PhysicalSocketTest, TestUdpIPv4) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700399 MAYBE_SKIP_IPV4;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000400 SocketTest::TestUdpIPv4();
401}
402
Taylor Brandstetter2b3bf6b2016-05-19 14:57:31 -0700403TEST_F(PhysicalSocketTest, TestUdpIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000404 SocketTest::TestUdpIPv6();
405}
406
henrike@webrtc.org6f833c32014-06-27 16:21:49 +0000407// Disable for TSan v2, see
408// https://code.google.com/p/webrtc/issues/detail?id=3498 for details.
deadbeefc97be6a2015-09-25 11:00:38 -0700409// Also disable for MSan, see:
410// https://code.google.com/p/webrtc/issues/detail?id=4958
411// TODO(deadbeef): Enable again once test is reimplemented to be unflaky.
minyuedf200d12015-10-17 13:10:46 -0700412// Also disable for ASan.
Henrik Kjellander0be3e042015-10-30 21:21:03 +0100413// Disabled on Android: https://code.google.com/p/webrtc/issues/detail?id=4364
ivocf399f212015-11-19 06:44:32 -0800414// Disabled on Linux: https://bugs.chromium.org/p/webrtc/issues/detail?id=5233
minyuedf200d12015-10-17 13:10:46 -0700415#if defined(THREAD_SANITIZER) || defined(MEMORY_SANITIZER) || \
ivocf399f212015-11-19 06:44:32 -0800416 defined(ADDRESS_SANITIZER) || defined(WEBRTC_ANDROID) || \
417 defined(WEBRTC_LINUX)
minyuedf200d12015-10-17 13:10:46 -0700418#define MAYBE_TestUdpReadyToSendIPv4 DISABLED_TestUdpReadyToSendIPv4
419#else
420#define MAYBE_TestUdpReadyToSendIPv4 TestUdpReadyToSendIPv4
421#endif
422TEST_F(PhysicalSocketTest, MAYBE_TestUdpReadyToSendIPv4) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700423 MAYBE_SKIP_IPV4;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000424 SocketTest::TestUdpReadyToSendIPv4();
425}
426
danilchapb7b9dca2016-08-05 05:55:43 -0700427// https://bugs.chromium.org/p/webrtc/issues/detail?id=6167
428#if defined(WEBRTC_WIN)
429#define MAYBE_TestUdpReadyToSendIPv6 DISABLED_TestUdpReadyToSendIPv6
430#else
431#define MAYBE_TestUdpReadyToSendIPv6 TestUdpReadyToSendIPv6
432#endif
433TEST_F(PhysicalSocketTest, MAYBE_TestUdpReadyToSendIPv6) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000434 SocketTest::TestUdpReadyToSendIPv6();
435}
436
437TEST_F(PhysicalSocketTest, TestGetSetOptionsIPv4) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700438 MAYBE_SKIP_IPV4;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000439 SocketTest::TestGetSetOptionsIPv4();
440}
441
442TEST_F(PhysicalSocketTest, TestGetSetOptionsIPv6) {
443 SocketTest::TestGetSetOptionsIPv6();
444}
445
446#if defined(WEBRTC_POSIX)
447
Taylor Brandstetter6f825352016-08-11 15:38:28 -0700448// We don't get recv timestamps on Mac.
Stefan Holmer9131efd2016-05-23 18:19:26 +0200449#if !defined(WEBRTC_MAC)
450TEST_F(PhysicalSocketTest, TestSocketRecvTimestampIPv4) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700451 MAYBE_SKIP_IPV4;
Taylor Brandstetter6f825352016-08-11 15:38:28 -0700452 SocketTest::TestSocketRecvTimestampIPv4();
Stefan Holmer9131efd2016-05-23 18:19:26 +0200453}
454
Taylor Brandstetter6f825352016-08-11 15:38:28 -0700455TEST_F(PhysicalSocketTest, TestSocketRecvTimestampIPv6) {
456 SocketTest::TestSocketRecvTimestampIPv6();
Stefan Holmer9131efd2016-05-23 18:19:26 +0200457}
458#endif
459
deadbeefc874d122017-02-13 15:41:59 -0800460// Verify that if the socket was unable to be bound to a real network interface
461// (not loopback), Bind will return an error.
462TEST_F(PhysicalSocketTest,
463 BindFailsIfNetworkBinderFailsForNonLoopbackInterface) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700464 MAYBE_SKIP_IPV4;
deadbeefc874d122017-02-13 15:41:59 -0800465 FakeNetworkBinder fake_network_binder;
466 server_->set_network_binder(&fake_network_binder);
467 std::unique_ptr<AsyncSocket> socket(
468 server_->CreateAsyncSocket(AF_INET, SOCK_DGRAM));
469 fake_network_binder.set_result(NetworkBindingResult::FAILURE);
470 EXPECT_EQ(-1, socket->Bind(SocketAddress("192.168.0.1", 0)));
471 server_->set_network_binder(nullptr);
472}
473
deadbeef9ffa13f2017-02-21 16:18:00 -0800474// Network binder shouldn't be used if the socket is bound to the "any" IP.
475TEST_F(PhysicalSocketTest,
476 NetworkBinderIsNotUsedForAnyIp) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700477 MAYBE_SKIP_IPV4;
deadbeef9ffa13f2017-02-21 16:18:00 -0800478 FakeNetworkBinder fake_network_binder;
479 server_->set_network_binder(&fake_network_binder);
480 std::unique_ptr<AsyncSocket> socket(
481 server_->CreateAsyncSocket(AF_INET, SOCK_DGRAM));
482 EXPECT_EQ(0, socket->Bind(SocketAddress("0.0.0.0", 0)));
483 EXPECT_EQ(0, fake_network_binder.num_binds());
484 server_->set_network_binder(nullptr);
485}
486
deadbeefc874d122017-02-13 15:41:59 -0800487// For a loopback interface, failures to bind to the interface should be
488// tolerated.
489TEST_F(PhysicalSocketTest,
490 BindSucceedsIfNetworkBinderFailsForLoopbackInterface) {
deadbeef9a6f4d42017-05-15 19:43:33 -0700491 MAYBE_SKIP_IPV4;
deadbeefc874d122017-02-13 15:41:59 -0800492 FakeNetworkBinder fake_network_binder;
493 server_->set_network_binder(&fake_network_binder);
494 std::unique_ptr<AsyncSocket> socket(
495 server_->CreateAsyncSocket(AF_INET, SOCK_DGRAM));
496 fake_network_binder.set_result(NetworkBindingResult::FAILURE);
497 EXPECT_EQ(0, socket->Bind(SocketAddress(kIPv4Loopback, 0)));
498 server_->set_network_binder(nullptr);
499}
500
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000501class PosixSignalDeliveryTest : public testing::Test {
502 public:
503 static void RecordSignal(int signum) {
504 signals_received_.push_back(signum);
505 signaled_thread_ = Thread::Current();
506 }
507
508 protected:
Steve Anton9de3aac2017-10-24 10:08:26 -0700509 void SetUp() override { ss_.reset(new PhysicalSocketServer()); }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000510
Steve Anton9de3aac2017-10-24 10:08:26 -0700511 void TearDown() override {
deadbeef37f5ecf2017-02-27 14:06:41 -0800512 ss_.reset(nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000513 signals_received_.clear();
deadbeef37f5ecf2017-02-27 14:06:41 -0800514 signaled_thread_ = nullptr;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000515 }
516
517 bool ExpectSignal(int signum) {
518 if (signals_received_.empty()) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100519 RTC_LOG(LS_ERROR) << "ExpectSignal(): No signal received";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000520 return false;
521 }
522 if (signals_received_[0] != signum) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100523 RTC_LOG(LS_ERROR) << "ExpectSignal(): Received signal "
524 << signals_received_[0] << ", expected " << signum;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000525 return false;
526 }
527 signals_received_.erase(signals_received_.begin());
528 return true;
529 }
530
531 bool ExpectNone() {
532 bool ret = signals_received_.empty();
533 if (!ret) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100534 RTC_LOG(LS_ERROR) << "ExpectNone(): Received signal "
535 << signals_received_[0] << ", expected none";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000536 }
537 return ret;
538 }
539
540 static std::vector<int> signals_received_;
541 static Thread *signaled_thread_;
542
jbauch555604a2016-04-26 03:13:22 -0700543 std::unique_ptr<PhysicalSocketServer> ss_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000544};
545
546std::vector<int> PosixSignalDeliveryTest::signals_received_;
deadbeef37f5ecf2017-02-27 14:06:41 -0800547Thread* PosixSignalDeliveryTest::signaled_thread_ = nullptr;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000548
549// Test receiving a synchronous signal while not in Wait() and then entering
550// Wait() afterwards.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000551TEST_F(PosixSignalDeliveryTest, RaiseThenWait) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000552 ASSERT_TRUE(ss_->SetPosixSignalHandler(SIGTERM, &RecordSignal));
553 raise(SIGTERM);
554 EXPECT_TRUE(ss_->Wait(0, true));
555 EXPECT_TRUE(ExpectSignal(SIGTERM));
556 EXPECT_TRUE(ExpectNone());
557}
558
559// Test that we can handle getting tons of repeated signals and that we see all
560// the different ones.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000561TEST_F(PosixSignalDeliveryTest, InsanelyManySignals) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000562 ss_->SetPosixSignalHandler(SIGTERM, &RecordSignal);
563 ss_->SetPosixSignalHandler(SIGINT, &RecordSignal);
564 for (int i = 0; i < 10000; ++i) {
565 raise(SIGTERM);
566 }
567 raise(SIGINT);
568 EXPECT_TRUE(ss_->Wait(0, true));
569 // Order will be lowest signal numbers first.
570 EXPECT_TRUE(ExpectSignal(SIGINT));
571 EXPECT_TRUE(ExpectSignal(SIGTERM));
572 EXPECT_TRUE(ExpectNone());
573}
574
575// Test that a signal during a Wait() call is detected.
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000576TEST_F(PosixSignalDeliveryTest, SignalDuringWait) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000577 ss_->SetPosixSignalHandler(SIGALRM, &RecordSignal);
578 alarm(1);
579 EXPECT_TRUE(ss_->Wait(1500, true));
580 EXPECT_TRUE(ExpectSignal(SIGALRM));
581 EXPECT_TRUE(ExpectNone());
582}
583
584class RaiseSigTermRunnable : public Runnable {
Steve Anton9de3aac2017-10-24 10:08:26 -0700585 void Run(Thread* thread) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000586 thread->socketserver()->Wait(1000, false);
587
588 // Allow SIGTERM. This will be the only thread with it not masked so it will
589 // be delivered to us.
590 sigset_t mask;
591 sigemptyset(&mask);
deadbeef37f5ecf2017-02-27 14:06:41 -0800592 pthread_sigmask(SIG_SETMASK, &mask, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000593
594 // Raise it.
595 raise(SIGTERM);
596 }
597};
598
599// Test that it works no matter what thread the kernel chooses to give the
600// signal to (since it's not guaranteed to be the one that Wait() runs on).
henrike@webrtc.orgc732a3e2014-10-09 22:08:15 +0000601TEST_F(PosixSignalDeliveryTest, SignalOnDifferentThread) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000602 ss_->SetPosixSignalHandler(SIGTERM, &RecordSignal);
603 // Mask out SIGTERM so that it can't be delivered to this thread.
604 sigset_t mask;
605 sigemptyset(&mask);
606 sigaddset(&mask, SIGTERM);
deadbeef37f5ecf2017-02-27 14:06:41 -0800607 EXPECT_EQ(0, pthread_sigmask(SIG_SETMASK, &mask, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000608 // Start a new thread that raises it. It will have to be delivered to that
609 // thread. Our implementation should safely handle it and dispatch
610 // RecordSignal() on this thread.
tommie7251592017-07-14 14:44:46 -0700611 std::unique_ptr<Thread> thread(Thread::CreateWithSocketServer());
jbauch555604a2016-04-26 03:13:22 -0700612 std::unique_ptr<RaiseSigTermRunnable> runnable(new RaiseSigTermRunnable());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000613 thread->Start(runnable.get());
614 EXPECT_TRUE(ss_->Wait(1500, true));
615 EXPECT_TRUE(ExpectSignal(SIGTERM));
616 EXPECT_EQ(Thread::Current(), signaled_thread_);
617 EXPECT_TRUE(ExpectNone());
618}
619
620#endif
621
622} // namespace rtc