1 /*
2  *  Copyright 2009 The WebRTC Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef WEBRTC_BASE_SOCKET_UNITTEST_H_
12 #define WEBRTC_BASE_SOCKET_UNITTEST_H_
13 
14 #include "webrtc/base/gunit.h"
15 #include "webrtc/base/thread.h"
16 
17 namespace rtc {
18 
19 // Generic socket tests, to be used when testing individual socketservers.
20 // Derive your specific test class from SocketTest, install your
21 // socketserver, and call the SocketTest test methods.
22 class SocketTest : public testing::Test {
23  protected:
SocketTest()24   SocketTest() : kIPv4Loopback(INADDR_LOOPBACK),
25                  kIPv6Loopback(in6addr_loopback),
26                  ss_(nullptr) {}
SetUp()27   virtual void SetUp() { ss_ = Thread::Current()->socketserver(); }
28   void TestConnectIPv4();
29   void TestConnectIPv6();
30   void TestConnectWithDnsLookupIPv4();
31   void TestConnectWithDnsLookupIPv6();
32   void TestConnectFailIPv4();
33   void TestConnectFailIPv6();
34   void TestConnectWithDnsLookupFailIPv4();
35   void TestConnectWithDnsLookupFailIPv6();
36   void TestConnectWithClosedSocketIPv4();
37   void TestConnectWithClosedSocketIPv6();
38   void TestConnectWhileNotClosedIPv4();
39   void TestConnectWhileNotClosedIPv6();
40   void TestServerCloseDuringConnectIPv4();
41   void TestServerCloseDuringConnectIPv6();
42   void TestClientCloseDuringConnectIPv4();
43   void TestClientCloseDuringConnectIPv6();
44   void TestServerCloseIPv4();
45   void TestServerCloseIPv6();
46   void TestCloseInClosedCallbackIPv4();
47   void TestCloseInClosedCallbackIPv6();
48   void TestSocketServerWaitIPv4();
49   void TestSocketServerWaitIPv6();
50   void TestTcpIPv4();
51   void TestTcpIPv6();
52   void TestSingleFlowControlCallbackIPv4();
53   void TestSingleFlowControlCallbackIPv6();
54   void TestUdpIPv4();
55   void TestUdpIPv6();
56   void TestUdpReadyToSendIPv4();
57   void TestUdpReadyToSendIPv6();
58   void TestGetSetOptionsIPv4();
59   void TestGetSetOptionsIPv6();
60 
61   static const int kTimeout = 5000;  // ms
62   const IPAddress kIPv4Loopback;
63   const IPAddress kIPv6Loopback;
64 
65  private:
66   void ConnectInternal(const IPAddress& loopback);
67   void ConnectWithDnsLookupInternal(const IPAddress& loopback,
68                                     const std::string& host);
69   void ConnectFailInternal(const IPAddress& loopback);
70 
71   void ConnectWithDnsLookupFailInternal(const IPAddress& loopback);
72   void ConnectWithClosedSocketInternal(const IPAddress& loopback);
73   void ConnectWhileNotClosedInternal(const IPAddress& loopback);
74   void ServerCloseDuringConnectInternal(const IPAddress& loopback);
75   void ClientCloseDuringConnectInternal(const IPAddress& loopback);
76   void ServerCloseInternal(const IPAddress& loopback);
77   void CloseInClosedCallbackInternal(const IPAddress& loopback);
78   void SocketServerWaitInternal(const IPAddress& loopback);
79   void TcpInternal(const IPAddress& loopback);
80   void SingleFlowControlCallbackInternal(const IPAddress& loopback);
81   void UdpInternal(const IPAddress& loopback);
82   void UdpReadyToSend(const IPAddress& loopback);
83   void GetSetOptionsInternal(const IPAddress& loopback);
84 
85   SocketServer* ss_;
86 };
87 
88 // For unbound sockets, GetLocalAddress / GetRemoteAddress return AF_UNSPEC
89 // values on Windows, but an empty address of the same family on Linux/MacOS X.
90 bool IsUnspecOrEmptyIP(const IPAddress& address);
91 
92 }  // namespace rtc
93 
94 #endif  // WEBRTC_BASE_SOCKET_UNITTEST_H_
95