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