1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/*
2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *
4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */
10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
11f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <signal.h>
12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <stdarg.h>
13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/gunit.h"
15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/logging.h"
16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/physicalsocketserver.h"
17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/scoped_ptr.h"
18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/socket_unittest.h"
19f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/testutils.h"
20f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/thread.h"
21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
22f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace rtc {
23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
24095ae15d6b9ff60357b44ed6f4997754079eff2ejbauchclass PhysicalSocketTest;
25095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
26095ae15d6b9ff60357b44ed6f4997754079eff2ejbauchclass FakeSocketDispatcher : public SocketDispatcher {
27095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch public:
28095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  explicit FakeSocketDispatcher(PhysicalSocketServer* ss)
29095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch    : SocketDispatcher(ss) {
30095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  }
31095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
32095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch protected:
33095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  SOCKET DoAccept(SOCKET socket, sockaddr* addr, socklen_t* addrlen) override;
34095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch};
35095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
36095ae15d6b9ff60357b44ed6f4997754079eff2ejbauchclass FakePhysicalSocketServer : public PhysicalSocketServer {
37095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch public:
38095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  explicit FakePhysicalSocketServer(PhysicalSocketTest* test)
39095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch    : test_(test) {
40095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  }
41095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
42095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  AsyncSocket* CreateAsyncSocket(int type) override {
43095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch    SocketDispatcher* dispatcher = new FakeSocketDispatcher(this);
44095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch    if (dispatcher->Create(type)) {
45095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch      return dispatcher;
46095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch    } else {
47095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch      delete dispatcher;
48095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch      return nullptr;
49095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch    }
50095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  }
51095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
52095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  AsyncSocket* CreateAsyncSocket(int family, int type) override {
53095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch    SocketDispatcher* dispatcher = new FakeSocketDispatcher(this);
54095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch    if (dispatcher->Create(family, type)) {
55095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch      return dispatcher;
56095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch    } else {
57095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch      delete dispatcher;
58095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch      return nullptr;
59095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch    }
60095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  }
61095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
62095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  PhysicalSocketTest* GetTest() const { return test_; }
63095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
64095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch private:
65095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  PhysicalSocketTest* test_;
66095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch};
67095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
68f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass PhysicalSocketTest : public SocketTest {
69095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch public:
70095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  // Set flag to simluate failures when calling "::accept" on a AsyncSocket.
71095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  void SetFailAccept(bool fail) { fail_accept_ = fail; }
72095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  bool FailAccept() const { return fail_accept_; }
73095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
74095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch protected:
75095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  PhysicalSocketTest()
76095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch    : server_(new FakePhysicalSocketServer(this)),
77095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch      scope_(server_.get()),
78095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch      fail_accept_(false) {
79095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  }
80095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
81095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  void ConnectInternalAcceptError(const IPAddress& loopback);
82095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
83095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  rtc::scoped_ptr<FakePhysicalSocketServer> server_;
84095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  SocketServerScope scope_;
85095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  bool fail_accept_;
86f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
87f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
88095ae15d6b9ff60357b44ed6f4997754079eff2ejbauchSOCKET FakeSocketDispatcher::DoAccept(SOCKET socket,
89095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch                                      sockaddr* addr,
90095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch                                      socklen_t* addrlen) {
91095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  FakePhysicalSocketServer* ss =
92095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch      static_cast<FakePhysicalSocketServer*>(socketserver());
93095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  if (ss->GetTest()->FailAccept()) {
94095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch    return INVALID_SOCKET;
95095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  }
96095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
97095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  return SocketDispatcher::DoAccept(socket, addr, addrlen);
98095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch}
99095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
100f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestConnectIPv4) {
101f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestConnectIPv4();
102f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
103f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
1045d69648782de066a55e4b1ff8dc77e146cc354efminyue// Crashes on Linux. See webrtc:4923.
1055d69648782de066a55e4b1ff8dc77e146cc354efminyue#if defined(WEBRTC_LINUX)
1065d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestConnectIPv6 DISABLED_TestConnectIPv6
1075d69648782de066a55e4b1ff8dc77e146cc354efminyue#else
1085d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestConnectIPv6 TestConnectIPv6
1095d69648782de066a55e4b1ff8dc77e146cc354efminyue#endif
1105d69648782de066a55e4b1ff8dc77e146cc354efminyueTEST_F(PhysicalSocketTest, MAYBE_TestConnectIPv6) {
111f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestConnectIPv6();
112f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
113f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
114f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestConnectWithDnsLookupIPv4) {
115f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestConnectWithDnsLookupIPv4();
116f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
117f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
118f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestConnectWithDnsLookupIPv6) {
119f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestConnectWithDnsLookupIPv6();
120f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
121f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
122f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestConnectFailIPv4) {
123f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestConnectFailIPv4();
124f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
125f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
126095ae15d6b9ff60357b44ed6f4997754079eff2ejbauchvoid PhysicalSocketTest::ConnectInternalAcceptError(const IPAddress& loopback) {
127095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  testing::StreamSink sink;
128095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  SocketAddress accept_addr;
129095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
130095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  // Create two clients.
131095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  scoped_ptr<AsyncSocket> client1(server_->CreateAsyncSocket(loopback.family(),
132095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch                                                             SOCK_STREAM));
133095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  sink.Monitor(client1.get());
134095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_EQ(AsyncSocket::CS_CLOSED, client1->GetState());
135095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_PRED1(IsUnspecOrEmptyIP, client1->GetLocalAddress().ipaddr());
136095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
137095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  scoped_ptr<AsyncSocket> client2(server_->CreateAsyncSocket(loopback.family(),
138095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch                                                             SOCK_STREAM));
139095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  sink.Monitor(client2.get());
140095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_EQ(AsyncSocket::CS_CLOSED, client2->GetState());
141095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_PRED1(IsUnspecOrEmptyIP, client2->GetLocalAddress().ipaddr());
142095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
143095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  // Create server and listen.
144095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  scoped_ptr<AsyncSocket> server(
145095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch      server_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
146095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  sink.Monitor(server.get());
147095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
148095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_EQ(0, server->Listen(5));
149095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_EQ(AsyncSocket::CS_CONNECTING, server->GetState());
150095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
151095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  // Ensure no pending server connections, since we haven't done anything yet.
152095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ));
153095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
154095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_TRUE(accept_addr.IsNil());
155095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
156095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  // Attempt first connect to listening socket.
157095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_EQ(0, client1->Connect(server->GetLocalAddress()));
158095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_FALSE(client1->GetLocalAddress().IsNil());
159095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_NE(server->GetLocalAddress(), client1->GetLocalAddress());
160095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
161095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  // Client is connecting, outcome not yet determined.
162095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_EQ(AsyncSocket::CS_CONNECTING, client1->GetState());
163095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_FALSE(sink.Check(client1.get(), testing::SSE_OPEN));
164095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_FALSE(sink.Check(client1.get(), testing::SSE_CLOSE));
165095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
166095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  // Server has pending connection, try to accept it (will fail).
167095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout);
168095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  // Simulate "::accept" returning an error.
169095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  SetFailAccept(true);
170095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  scoped_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
171095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_FALSE(accepted);
172095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  ASSERT_TRUE(accept_addr.IsNil());
173095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
174095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  // Ensure no more pending server connections.
175095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ));
176095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
177095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_TRUE(accept_addr.IsNil());
178095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
179095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  // Attempt second connect to listening socket.
180095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_EQ(0, client2->Connect(server->GetLocalAddress()));
181095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_FALSE(client2->GetLocalAddress().IsNil());
182095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_NE(server->GetLocalAddress(), client2->GetLocalAddress());
183095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
184095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  // Client is connecting, outcome not yet determined.
185095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_EQ(AsyncSocket::CS_CONNECTING, client2->GetState());
186095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_FALSE(sink.Check(client2.get(), testing::SSE_OPEN));
187095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_FALSE(sink.Check(client2.get(), testing::SSE_CLOSE));
188095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
189095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  // Server has pending connection, try to accept it (will succeed).
190095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout);
191095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  SetFailAccept(false);
192095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  scoped_ptr<AsyncSocket> accepted2(server->Accept(&accept_addr));
193095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  ASSERT_TRUE(accepted2);
194095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_FALSE(accept_addr.IsNil());
195095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  EXPECT_EQ(accepted2->GetRemoteAddress(), accept_addr);
196095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch}
197095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
198095ae15d6b9ff60357b44ed6f4997754079eff2ejbauchTEST_F(PhysicalSocketTest, TestConnectAcceptErrorIPv4) {
199095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  ConnectInternalAcceptError(kIPv4Loopback);
200095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch}
201095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
202095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch// Crashes on Linux. See webrtc:4923.
203095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch#if defined(WEBRTC_LINUX)
204095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch#define MAYBE_TestConnectAcceptErrorIPv6 DISABLED_TestConnectAcceptErrorIPv6
205095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch#else
206095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch#define MAYBE_TestConnectAcceptErrorIPv6 TestConnectAcceptErrorIPv6
207095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch#endif
208095ae15d6b9ff60357b44ed6f4997754079eff2ejbauchTEST_F(PhysicalSocketTest, MAYBE_TestConnectAcceptErrorIPv6) {
209095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch  ConnectInternalAcceptError(kIPv6Loopback);
210095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch}
211095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch
2125d69648782de066a55e4b1ff8dc77e146cc354efminyue// Crashes on Linux. See webrtc:4923.
2135d69648782de066a55e4b1ff8dc77e146cc354efminyue#if defined(WEBRTC_LINUX)
2145d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestConnectFailIPv6 DISABLED_TestConnectFailIPv6
2155d69648782de066a55e4b1ff8dc77e146cc354efminyue#else
2165d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestConnectFailIPv6 TestConnectFailIPv6
2175d69648782de066a55e4b1ff8dc77e146cc354efminyue#endif
2185d69648782de066a55e4b1ff8dc77e146cc354efminyueTEST_F(PhysicalSocketTest, MAYBE_TestConnectFailIPv6) {
219f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestConnectFailIPv6();
220f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
221f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
222f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestConnectWithDnsLookupFailIPv4) {
223f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestConnectWithDnsLookupFailIPv4();
224f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
225f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
2265d69648782de066a55e4b1ff8dc77e146cc354efminyue// Crashes on Linux. See webrtc:4923.
2275d69648782de066a55e4b1ff8dc77e146cc354efminyue#if defined(WEBRTC_LINUX)
2285d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestConnectWithDnsLookupFailIPv6 \
2295d69648782de066a55e4b1ff8dc77e146cc354efminyue  DISABLED_TestConnectWithDnsLookupFailIPv6
2305d69648782de066a55e4b1ff8dc77e146cc354efminyue#else
2315d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestConnectWithDnsLookupFailIPv6 \
2325d69648782de066a55e4b1ff8dc77e146cc354efminyue  TestConnectWithDnsLookupFailIPv6
2335d69648782de066a55e4b1ff8dc77e146cc354efminyue#endif
2345d69648782de066a55e4b1ff8dc77e146cc354efminyueTEST_F(PhysicalSocketTest, MAYBE_TestConnectWithDnsLookupFailIPv6) {
235f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestConnectWithDnsLookupFailIPv6();
236f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
237f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
238f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
239f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestConnectWithClosedSocketIPv4) {
240f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestConnectWithClosedSocketIPv4();
241f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
242f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
2435d69648782de066a55e4b1ff8dc77e146cc354efminyue// Crashes on Linux. See webrtc:4923.
2445d69648782de066a55e4b1ff8dc77e146cc354efminyue#if defined(WEBRTC_LINUX)
2455d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestConnectWithClosedSocketIPv6 \
2465d69648782de066a55e4b1ff8dc77e146cc354efminyue  DISABLED_TestConnectWithClosedSocketIPv6
2475d69648782de066a55e4b1ff8dc77e146cc354efminyue#else
2485d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestConnectWithClosedSocketIPv6 TestConnectWithClosedSocketIPv6
2495d69648782de066a55e4b1ff8dc77e146cc354efminyue#endif
2505d69648782de066a55e4b1ff8dc77e146cc354efminyueTEST_F(PhysicalSocketTest, MAYBE_TestConnectWithClosedSocketIPv6) {
251f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestConnectWithClosedSocketIPv6();
252f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
253f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
254f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestConnectWhileNotClosedIPv4) {
255f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestConnectWhileNotClosedIPv4();
256f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
257f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
2585d69648782de066a55e4b1ff8dc77e146cc354efminyue// Crashes on Linux. See webrtc:4923.
2595d69648782de066a55e4b1ff8dc77e146cc354efminyue#if defined(WEBRTC_LINUX)
2605d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestConnectWhileNotClosedIPv6 \
2615d69648782de066a55e4b1ff8dc77e146cc354efminyue  DISABLED_TestConnectWhileNotClosedIPv6
2625d69648782de066a55e4b1ff8dc77e146cc354efminyue#else
2635d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestConnectWhileNotClosedIPv6 TestConnectWhileNotClosedIPv6
2645d69648782de066a55e4b1ff8dc77e146cc354efminyue#endif
2655d69648782de066a55e4b1ff8dc77e146cc354efminyueTEST_F(PhysicalSocketTest, MAYBE_TestConnectWhileNotClosedIPv6) {
266f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestConnectWhileNotClosedIPv6();
267f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
268f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
269f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestServerCloseDuringConnectIPv4) {
270f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestServerCloseDuringConnectIPv4();
271f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
272f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
2735d69648782de066a55e4b1ff8dc77e146cc354efminyue// Crashes on Linux. See webrtc:4923.
2745d69648782de066a55e4b1ff8dc77e146cc354efminyue#if defined(WEBRTC_LINUX)
2755d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestServerCloseDuringConnectIPv6 \
2765d69648782de066a55e4b1ff8dc77e146cc354efminyue  DISABLED_TestServerCloseDuringConnectIPv6
2775d69648782de066a55e4b1ff8dc77e146cc354efminyue#else
2785d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestServerCloseDuringConnectIPv6 TestServerCloseDuringConnectIPv6
2795d69648782de066a55e4b1ff8dc77e146cc354efminyue#endif
2805d69648782de066a55e4b1ff8dc77e146cc354efminyueTEST_F(PhysicalSocketTest, MAYBE_TestServerCloseDuringConnectIPv6) {
281f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestServerCloseDuringConnectIPv6();
282f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
283f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
284f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestClientCloseDuringConnectIPv4) {
285f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestClientCloseDuringConnectIPv4();
286f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
287f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
2885d69648782de066a55e4b1ff8dc77e146cc354efminyue// Crashes on Linux. See webrtc:4923.
2895d69648782de066a55e4b1ff8dc77e146cc354efminyue#if defined(WEBRTC_LINUX)
2905d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestClientCloseDuringConnectIPv6 \
2915d69648782de066a55e4b1ff8dc77e146cc354efminyue  DISABLED_TestClientCloseDuringConnectIPv6
2925d69648782de066a55e4b1ff8dc77e146cc354efminyue#else
2935d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestClientCloseDuringConnectIPv6 TestClientCloseDuringConnectIPv6
2945d69648782de066a55e4b1ff8dc77e146cc354efminyue#endif
2955d69648782de066a55e4b1ff8dc77e146cc354efminyueTEST_F(PhysicalSocketTest, MAYBE_TestClientCloseDuringConnectIPv6) {
296f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestClientCloseDuringConnectIPv6();
297f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
298f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
299f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestServerCloseIPv4) {
300f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestServerCloseIPv4();
301f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
302f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
3035d69648782de066a55e4b1ff8dc77e146cc354efminyue// Crashes on Linux. See webrtc:4923.
3045d69648782de066a55e4b1ff8dc77e146cc354efminyue#if defined(WEBRTC_LINUX)
3055d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestServerCloseIPv6 DISABLED_TestServerCloseIPv6
3065d69648782de066a55e4b1ff8dc77e146cc354efminyue#else
3075d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestServerCloseIPv6 TestServerCloseIPv6
3085d69648782de066a55e4b1ff8dc77e146cc354efminyue#endif
3095d69648782de066a55e4b1ff8dc77e146cc354efminyueTEST_F(PhysicalSocketTest, MAYBE_TestServerCloseIPv6) {
310f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestServerCloseIPv6();
311f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
312f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
313f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestCloseInClosedCallbackIPv4) {
314f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestCloseInClosedCallbackIPv4();
315f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
316f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
3175d69648782de066a55e4b1ff8dc77e146cc354efminyue// Crashes on Linux. See webrtc:4923.
3185d69648782de066a55e4b1ff8dc77e146cc354efminyue#if defined(WEBRTC_LINUX)
3195d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestCloseInClosedCallbackIPv6 \
3205d69648782de066a55e4b1ff8dc77e146cc354efminyue  DISABLED_TestCloseInClosedCallbackIPv6
3215d69648782de066a55e4b1ff8dc77e146cc354efminyue#else
3225d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestCloseInClosedCallbackIPv6 TestCloseInClosedCallbackIPv6
3235d69648782de066a55e4b1ff8dc77e146cc354efminyue#endif
3245d69648782de066a55e4b1ff8dc77e146cc354efminyueTEST_F(PhysicalSocketTest, MAYBE_TestCloseInClosedCallbackIPv6) {
325f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestCloseInClosedCallbackIPv6();
326f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
327f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
328c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestSocketServerWaitIPv4) {
329f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestSocketServerWaitIPv4();
330f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
331f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
3325d69648782de066a55e4b1ff8dc77e146cc354efminyue// Crashes on Linux. See webrtc:4923.
3335d69648782de066a55e4b1ff8dc77e146cc354efminyue#if defined(WEBRTC_LINUX)
3345d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestSocketServerWaitIPv6 DISABLED_TestSocketServerWaitIPv6
3355d69648782de066a55e4b1ff8dc77e146cc354efminyue#else
3365d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestSocketServerWaitIPv6 TestSocketServerWaitIPv6
3375d69648782de066a55e4b1ff8dc77e146cc354efminyue#endif
3385d69648782de066a55e4b1ff8dc77e146cc354efminyueTEST_F(PhysicalSocketTest, MAYBE_TestSocketServerWaitIPv6) {
339f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestSocketServerWaitIPv6();
340f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
341f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
342f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestTcpIPv4) {
343f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestTcpIPv4();
344f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
345f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
3465d69648782de066a55e4b1ff8dc77e146cc354efminyue// Crashes on Linux. See webrtc:4923.
3475d69648782de066a55e4b1ff8dc77e146cc354efminyue#if defined(WEBRTC_LINUX)
3485d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestTcpIPv6 DISABLED_TestTcpIPv6
3495d69648782de066a55e4b1ff8dc77e146cc354efminyue#else
3505d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestTcpIPv6 TestTcpIPv6
3515d69648782de066a55e4b1ff8dc77e146cc354efminyue#endif
3525d69648782de066a55e4b1ff8dc77e146cc354efminyueTEST_F(PhysicalSocketTest, MAYBE_TestTcpIPv6) {
353f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestTcpIPv6();
354f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
355f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
356f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestUdpIPv4) {
357f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestUdpIPv4();
358f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
359f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
3605d69648782de066a55e4b1ff8dc77e146cc354efminyue// Crashes on Linux. See webrtc:4923.
3615d69648782de066a55e4b1ff8dc77e146cc354efminyue#if defined(WEBRTC_LINUX)
3625d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestUdpIPv6 DISABLED_TestUdpIPv6
3635d69648782de066a55e4b1ff8dc77e146cc354efminyue#else
3645d69648782de066a55e4b1ff8dc77e146cc354efminyue#define MAYBE_TestUdpIPv6 TestUdpIPv6
3655d69648782de066a55e4b1ff8dc77e146cc354efminyue#endif
3665d69648782de066a55e4b1ff8dc77e146cc354efminyueTEST_F(PhysicalSocketTest, MAYBE_TestUdpIPv6) {
367f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestUdpIPv6();
368f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
369f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
3706f833c332cbe3fcc744f5d8a05d9cc2168571a71henrike@webrtc.org// Disable for TSan v2, see
3716f833c332cbe3fcc744f5d8a05d9cc2168571a71henrike@webrtc.org// https://code.google.com/p/webrtc/issues/detail?id=3498 for details.
372c97be6a741a4c066a53f703e71570705f5ba16aadeadbeef// Also disable for MSan, see:
373c97be6a741a4c066a53f703e71570705f5ba16aadeadbeef// https://code.google.com/p/webrtc/issues/detail?id=4958
374c97be6a741a4c066a53f703e71570705f5ba16aadeadbeef// TODO(deadbeef): Enable again once test is reimplemented to be unflaky.
375df200d1ef7af4b750f6af21d7a0989509c144328minyue// Also disable for ASan.
3760be3e040f6c3bb1b725bcb8368569267ed0dd40dHenrik Kjellander// Disabled on Android: https://code.google.com/p/webrtc/issues/detail?id=4364
377f399f2174cd72ce92f6ca89dcc71681165c5b9c6ivoc// Disabled on Linux: https://bugs.chromium.org/p/webrtc/issues/detail?id=5233
378df200d1ef7af4b750f6af21d7a0989509c144328minyue#if defined(THREAD_SANITIZER) || defined(MEMORY_SANITIZER) || \
379f399f2174cd72ce92f6ca89dcc71681165c5b9c6ivoc    defined(ADDRESS_SANITIZER) || defined(WEBRTC_ANDROID) ||  \
380f399f2174cd72ce92f6ca89dcc71681165c5b9c6ivoc    defined(WEBRTC_LINUX)
381df200d1ef7af4b750f6af21d7a0989509c144328minyue#define MAYBE_TestUdpReadyToSendIPv4 DISABLED_TestUdpReadyToSendIPv4
382df200d1ef7af4b750f6af21d7a0989509c144328minyue#else
383df200d1ef7af4b750f6af21d7a0989509c144328minyue#define MAYBE_TestUdpReadyToSendIPv4 TestUdpReadyToSendIPv4
384df200d1ef7af4b750f6af21d7a0989509c144328minyue#endif
385df200d1ef7af4b750f6af21d7a0989509c144328minyueTEST_F(PhysicalSocketTest, MAYBE_TestUdpReadyToSendIPv4) {
386f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestUdpReadyToSendIPv4();
387f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
388f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
389c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestUdpReadyToSendIPv6) {
390f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestUdpReadyToSendIPv6();
391f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
392f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
393f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestGetSetOptionsIPv4) {
394f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestGetSetOptionsIPv4();
395f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
396f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
397f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestGetSetOptionsIPv6) {
398f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketTest::TestGetSetOptionsIPv6();
399f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
400f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
401f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(WEBRTC_POSIX)
402f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
403f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass PosixSignalDeliveryTest : public testing::Test {
404f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
405f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  static void RecordSignal(int signum) {
406f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    signals_received_.push_back(signum);
407f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    signaled_thread_ = Thread::Current();
408f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
409f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
410f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org protected:
411f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void SetUp() {
412f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ss_.reset(new PhysicalSocketServer());
413f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
414f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
415f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void TearDown() {
416f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ss_.reset(NULL);
417f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    signals_received_.clear();
418f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    signaled_thread_ = NULL;
419f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
420f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
421f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool ExpectSignal(int signum) {
422f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    if (signals_received_.empty()) {
423f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      LOG(LS_ERROR) << "ExpectSignal(): No signal received";
424f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      return false;
425f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    }
426f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    if (signals_received_[0] != signum) {
427f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      LOG(LS_ERROR) << "ExpectSignal(): Received signal " <<
428f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          signals_received_[0] << ", expected " << signum;
429f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      return false;
430f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    }
431f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    signals_received_.erase(signals_received_.begin());
432f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return true;
433f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
434f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
435f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool ExpectNone() {
436f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    bool ret = signals_received_.empty();
437f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    if (!ret) {
438f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      LOG(LS_ERROR) << "ExpectNone(): Received signal " << signals_received_[0]
439f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org          << ", expected none";
440f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    }
441f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return ret;
442f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
443f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
444f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  static std::vector<int> signals_received_;
445f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  static Thread *signaled_thread_;
446f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
447f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  scoped_ptr<PhysicalSocketServer> ss_;
448f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
449f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
450f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstd::vector<int> PosixSignalDeliveryTest::signals_received_;
451f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgThread *PosixSignalDeliveryTest::signaled_thread_ = NULL;
452f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
453f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test receiving a synchronous signal while not in Wait() and then entering
454f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Wait() afterwards.
455c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(PosixSignalDeliveryTest, RaiseThenWait) {
456f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  ASSERT_TRUE(ss_->SetPosixSignalHandler(SIGTERM, &RecordSignal));
457f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  raise(SIGTERM);
458f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(ss_->Wait(0, true));
459f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(ExpectSignal(SIGTERM));
460f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(ExpectNone());
461f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
462f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
463f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test that we can handle getting tons of repeated signals and that we see all
464f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// the different ones.
465c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(PosixSignalDeliveryTest, InsanelyManySignals) {
466f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  ss_->SetPosixSignalHandler(SIGTERM, &RecordSignal);
467f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  ss_->SetPosixSignalHandler(SIGINT, &RecordSignal);
468f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  for (int i = 0; i < 10000; ++i) {
469f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    raise(SIGTERM);
470f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
471f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  raise(SIGINT);
472f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(ss_->Wait(0, true));
473f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Order will be lowest signal numbers first.
474f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(ExpectSignal(SIGINT));
475f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(ExpectSignal(SIGTERM));
476f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(ExpectNone());
477f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
478f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
479f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test that a signal during a Wait() call is detected.
480c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(PosixSignalDeliveryTest, SignalDuringWait) {
481f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  ss_->SetPosixSignalHandler(SIGALRM, &RecordSignal);
482f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  alarm(1);
483f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(ss_->Wait(1500, true));
484f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(ExpectSignal(SIGALRM));
485f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(ExpectNone());
486f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
487f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
488f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass RaiseSigTermRunnable : public Runnable {
489f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void Run(Thread *thread) {
490f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    thread->socketserver()->Wait(1000, false);
491f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
492f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    // Allow SIGTERM. This will be the only thread with it not masked so it will
493f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    // be delivered to us.
494f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    sigset_t mask;
495f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    sigemptyset(&mask);
496f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    pthread_sigmask(SIG_SETMASK, &mask, NULL);
497f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
498f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    // Raise it.
499f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    raise(SIGTERM);
500f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
501f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
502f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
503f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test that it works no matter what thread the kernel chooses to give the
504f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// signal to (since it's not guaranteed to be the one that Wait() runs on).
505c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(PosixSignalDeliveryTest, SignalOnDifferentThread) {
506f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  ss_->SetPosixSignalHandler(SIGTERM, &RecordSignal);
507f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Mask out SIGTERM so that it can't be delivered to this thread.
508f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  sigset_t mask;
509f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  sigemptyset(&mask);
510f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  sigaddset(&mask, SIGTERM);
511f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(0, pthread_sigmask(SIG_SETMASK, &mask, NULL));
512f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Start a new thread that raises it. It will have to be delivered to that
513f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // thread. Our implementation should safely handle it and dispatch
514f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // RecordSignal() on this thread.
515f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  scoped_ptr<Thread> thread(new Thread());
516f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  scoped_ptr<RaiseSigTermRunnable> runnable(new RaiseSigTermRunnable());
517f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  thread->Start(runnable.get());
518f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(ss_->Wait(1500, true));
519f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(ExpectSignal(SIGTERM));
520f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_EQ(Thread::Current(), signaled_thread_);
521f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EXPECT_TRUE(ExpectNone());
522f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
523f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
524f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif
525f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
526f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}  // namespace rtc
527