147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <signal.h> 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <stdarg.h> 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/gunit.h" 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/logging.h" 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/physicalsocketserver.h" 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/scoped_ptr.h" 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/socket_unittest.h" 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/testutils.h" 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/thread.h" 21a127c9555d5bc8d9404562840ebfd5281c670600henrike@webrtc.org#include "webrtc/test/testsupport/gtest_disable.h" 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass PhysicalSocketTest : public SocketTest { 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestConnectIPv4) { 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestConnectIPv4(); 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestConnectIPv6) { 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestConnectIPv6(); 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestConnectWithDnsLookupIPv4) { 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestConnectWithDnsLookupIPv4(); 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestConnectWithDnsLookupIPv6) { 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestConnectWithDnsLookupIPv6(); 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestConnectFailIPv4) { 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestConnectFailIPv4(); 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestConnectFailIPv6) { 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestConnectFailIPv6(); 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestConnectWithDnsLookupFailIPv4) { 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestConnectWithDnsLookupFailIPv4(); 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestConnectWithDnsLookupFailIPv6) { 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestConnectWithDnsLookupFailIPv6(); 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestConnectWithClosedSocketIPv4) { 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestConnectWithClosedSocketIPv4(); 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestConnectWithClosedSocketIPv6) { 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestConnectWithClosedSocketIPv6(); 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestConnectWhileNotClosedIPv4) { 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestConnectWhileNotClosedIPv4(); 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestConnectWhileNotClosedIPv6) { 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestConnectWhileNotClosedIPv6(); 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestServerCloseDuringConnectIPv4) { 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestServerCloseDuringConnectIPv4(); 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestServerCloseDuringConnectIPv6) { 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestServerCloseDuringConnectIPv6(); 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestClientCloseDuringConnectIPv4) { 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestClientCloseDuringConnectIPv4(); 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestClientCloseDuringConnectIPv6) { 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestClientCloseDuringConnectIPv6(); 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestServerCloseIPv4) { 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestServerCloseIPv4(); 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestServerCloseIPv6) { 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestServerCloseIPv6(); 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestCloseInClosedCallbackIPv4) { 10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestCloseInClosedCallbackIPv4(); 10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestCloseInClosedCallbackIPv6) { 10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestCloseInClosedCallbackIPv6(); 10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 110a127c9555d5bc8d9404562840ebfd5281c670600henrike@webrtc.orgTEST_F(PhysicalSocketTest, DISABLED_ON_MAC(TestSocketServerWaitIPv4)) { 11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestSocketServerWaitIPv4(); 11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 114a127c9555d5bc8d9404562840ebfd5281c670600henrike@webrtc.orgTEST_F(PhysicalSocketTest, DISABLED_ON_MAC(TestSocketServerWaitIPv6)) { 11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestSocketServerWaitIPv6(); 11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestTcpIPv4) { 11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestTcpIPv4(); 12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestTcpIPv6) { 12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestTcpIPv6(); 12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestUdpIPv4) { 12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestUdpIPv4(); 12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestUdpIPv6) { 13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestUdpIPv6(); 13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 134484a4e72450ebd4cc59dbdb3ae29ea6ff95348cdhenrike@webrtc.org// Disable for TSan v2, see 135484a4e72450ebd4cc59dbdb3ae29ea6ff95348cdhenrike@webrtc.org// https://code.google.com/p/webrtc/issues/detail?id=3498 for details. 136484a4e72450ebd4cc59dbdb3ae29ea6ff95348cdhenrike@webrtc.org#if !defined(THREAD_SANITIZER) 137484a4e72450ebd4cc59dbdb3ae29ea6ff95348cdhenrike@webrtc.org 13847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestUdpReadyToSendIPv4) { 13947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestUdpReadyToSendIPv4(); 14047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 14147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 142484a4e72450ebd4cc59dbdb3ae29ea6ff95348cdhenrike@webrtc.org#endif // if !defined(THREAD_SANITIZER) 143484a4e72450ebd4cc59dbdb3ae29ea6ff95348cdhenrike@webrtc.org 14447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestUdpReadyToSendIPv6) { 14547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestUdpReadyToSendIPv6(); 14647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 14747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 14847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestGetSetOptionsIPv4) { 14947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestGetSetOptionsIPv4(); 15047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 15147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 15247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(PhysicalSocketTest, TestGetSetOptionsIPv6) { 15347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketTest::TestGetSetOptionsIPv6(); 15447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 15547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 15647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_POSIX) 15747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 15847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass PosixSignalDeliveryTest : public testing::Test { 15947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 16047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static void RecordSignal(int signum) { 16147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org signals_received_.push_back(signum); 16247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org signaled_thread_ = Thread::Current(); 16347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 16447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 16547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected: 16647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void SetUp() { 16747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ss_.reset(new PhysicalSocketServer()); 16847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 16947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 17047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void TearDown() { 17147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ss_.reset(NULL); 17247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org signals_received_.clear(); 17347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org signaled_thread_ = NULL; 17447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 17547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 17647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool ExpectSignal(int signum) { 17747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (signals_received_.empty()) { 17847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_ERROR) << "ExpectSignal(): No signal received"; 17947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return false; 18047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 18147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (signals_received_[0] != signum) { 18247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_ERROR) << "ExpectSignal(): Received signal " << 18347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org signals_received_[0] << ", expected " << signum; 18447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return false; 18547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 18647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org signals_received_.erase(signals_received_.begin()); 18747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return true; 18847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 18947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 19047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool ExpectNone() { 19147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool ret = signals_received_.empty(); 19247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (!ret) { 19347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_ERROR) << "ExpectNone(): Received signal " << signals_received_[0] 19447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org << ", expected none"; 19547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 19647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return ret; 19747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 19847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 19947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static std::vector<int> signals_received_; 20047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static Thread *signaled_thread_; 20147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 20247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org scoped_ptr<PhysicalSocketServer> ss_; 20347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 20447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 20547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstd::vector<int> PosixSignalDeliveryTest::signals_received_; 20647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgThread *PosixSignalDeliveryTest::signaled_thread_ = NULL; 20747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 20847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Test receiving a synchronous signal while not in Wait() and then entering 20947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Wait() afterwards. 210a127c9555d5bc8d9404562840ebfd5281c670600henrike@webrtc.orgTEST_F(PosixSignalDeliveryTest, DISABLED_ON_MAC(RaiseThenWait)) { 21147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT_TRUE(ss_->SetPosixSignalHandler(SIGTERM, &RecordSignal)); 21247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org raise(SIGTERM); 21347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(ss_->Wait(0, true)); 21447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(ExpectSignal(SIGTERM)); 21547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(ExpectNone()); 21647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 21747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 21847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Test that we can handle getting tons of repeated signals and that we see all 21947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// the different ones. 220a127c9555d5bc8d9404562840ebfd5281c670600henrike@webrtc.orgTEST_F(PosixSignalDeliveryTest, DISABLED_ON_MAC(InsanelyManySignals)) { 22147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ss_->SetPosixSignalHandler(SIGTERM, &RecordSignal); 22247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ss_->SetPosixSignalHandler(SIGINT, &RecordSignal); 22347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org for (int i = 0; i < 10000; ++i) { 22447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org raise(SIGTERM); 22547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 22647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org raise(SIGINT); 22747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(ss_->Wait(0, true)); 22847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Order will be lowest signal numbers first. 22947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(ExpectSignal(SIGINT)); 23047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(ExpectSignal(SIGTERM)); 23147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(ExpectNone()); 23247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 23347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 23447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Test that a signal during a Wait() call is detected. 235a127c9555d5bc8d9404562840ebfd5281c670600henrike@webrtc.orgTEST_F(PosixSignalDeliveryTest, DISABLED_ON_MAC(SignalDuringWait)) { 23647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ss_->SetPosixSignalHandler(SIGALRM, &RecordSignal); 23747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org alarm(1); 23847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(ss_->Wait(1500, true)); 23947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(ExpectSignal(SIGALRM)); 24047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(ExpectNone()); 24147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 24247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 24347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass RaiseSigTermRunnable : public Runnable { 24447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void Run(Thread *thread) { 24547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org thread->socketserver()->Wait(1000, false); 24647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 24747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Allow SIGTERM. This will be the only thread with it not masked so it will 24847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // be delivered to us. 24947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org sigset_t mask; 25047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org sigemptyset(&mask); 25147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org pthread_sigmask(SIG_SETMASK, &mask, NULL); 25247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 25347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Raise it. 25447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org raise(SIGTERM); 25547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 25647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 25747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 25847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Test that it works no matter what thread the kernel chooses to give the 25947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// signal to (since it's not guaranteed to be the one that Wait() runs on). 260a127c9555d5bc8d9404562840ebfd5281c670600henrike@webrtc.orgTEST_F(PosixSignalDeliveryTest, DISABLED_ON_MAC(SignalOnDifferentThread)) { 26147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ss_->SetPosixSignalHandler(SIGTERM, &RecordSignal); 26247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Mask out SIGTERM so that it can't be delivered to this thread. 26347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org sigset_t mask; 26447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org sigemptyset(&mask); 26547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org sigaddset(&mask, SIGTERM); 26647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_EQ(0, pthread_sigmask(SIG_SETMASK, &mask, NULL)); 26747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Start a new thread that raises it. It will have to be delivered to that 26847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // thread. Our implementation should safely handle it and dispatch 26947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // RecordSignal() on this thread. 27047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org scoped_ptr<Thread> thread(new Thread()); 27147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org scoped_ptr<RaiseSigTermRunnable> runnable(new RaiseSigTermRunnable()); 27247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org thread->Start(runnable.get()); 27347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(ss_->Wait(1500, true)); 27447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(ExpectSignal(SIGTERM)); 27547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_EQ(Thread::Current(), signaled_thread_); 27647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(ExpectNone()); 27747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 27847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 27947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 28047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 28147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 282