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