|  | /* | 
|  | *  Copyright 2009 The WebRTC Project Authors. All rights reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #include <memory> | 
|  |  | 
|  | #include "webrtc/base/gunit.h" | 
|  | #include "webrtc/base/socket_unittest.h" | 
|  | #include "webrtc/base/thread.h" | 
|  | #include "webrtc/base/macsocketserver.h" | 
|  |  | 
|  | namespace rtc { | 
|  |  | 
|  | class WakeThread : public Thread { | 
|  | public: | 
|  | WakeThread(SocketServer* ss) : ss_(ss) { | 
|  | } | 
|  | virtual ~WakeThread() { | 
|  | Stop(); | 
|  | } | 
|  | void Run() { | 
|  | ss_->WakeUp(); | 
|  | } | 
|  | private: | 
|  | SocketServer* ss_; | 
|  | }; | 
|  |  | 
|  | #ifndef CARBON_DEPRECATED | 
|  |  | 
|  | // Test that MacCFSocketServer::Wait works as expected. | 
|  | TEST(MacCFSocketServerTest, TestWait) { | 
|  | MacCFSocketServer server; | 
|  | uint32_t start = Time(); | 
|  | server.Wait(1000, true); | 
|  | EXPECT_GE(TimeSince(start), 1000); | 
|  | } | 
|  |  | 
|  | // Test that MacCFSocketServer::Wakeup works as expected. | 
|  | TEST(MacCFSocketServerTest, TestWakeup) { | 
|  | MacCFSocketServer server; | 
|  | WakeThread thread(&server); | 
|  | uint32_t start = Time(); | 
|  | thread.Start(); | 
|  | server.Wait(10000, true); | 
|  | EXPECT_LT(TimeSince(start), 10000); | 
|  | } | 
|  |  | 
|  | // Test that MacCarbonSocketServer::Wait works as expected. | 
|  | TEST(MacCarbonSocketServerTest, TestWait) { | 
|  | MacCarbonSocketServer server; | 
|  | uint32_t start = Time(); | 
|  | server.Wait(1000, true); | 
|  | EXPECT_GE(TimeSince(start), 1000); | 
|  | } | 
|  |  | 
|  | // Test that MacCarbonSocketServer::Wakeup works as expected. | 
|  | TEST(MacCarbonSocketServerTest, TestWakeup) { | 
|  | MacCarbonSocketServer server; | 
|  | WakeThread thread(&server); | 
|  | uint32_t start = Time(); | 
|  | thread.Start(); | 
|  | server.Wait(10000, true); | 
|  | EXPECT_LT(TimeSince(start), 10000); | 
|  | } | 
|  |  | 
|  | // Test that MacCarbonAppSocketServer::Wait works as expected. | 
|  | TEST(MacCarbonAppSocketServerTest, TestWait) { | 
|  | MacCarbonAppSocketServer server; | 
|  | uint32_t start = Time(); | 
|  | server.Wait(1000, true); | 
|  | EXPECT_GE(TimeSince(start), 1000); | 
|  | } | 
|  |  | 
|  | // Test that MacCarbonAppSocketServer::Wakeup works as expected. | 
|  | TEST(MacCarbonAppSocketServerTest, TestWakeup) { | 
|  | MacCarbonAppSocketServer server; | 
|  | WakeThread thread(&server); | 
|  | uint32_t start = Time(); | 
|  | thread.Start(); | 
|  | server.Wait(10000, true); | 
|  | EXPECT_LT(TimeSince(start), 10000); | 
|  | } | 
|  |  | 
|  | #endif | 
|  |  | 
|  | // Test that MacAsyncSocket passes all the generic Socket tests. | 
|  | class MacAsyncSocketTest : public SocketTest { | 
|  | protected: | 
|  | MacAsyncSocketTest() | 
|  | : server_(CreateSocketServer()), | 
|  | scope_(server_.get()) {} | 
|  | // Override for other implementations of MacBaseSocketServer. | 
|  | virtual MacBaseSocketServer* CreateSocketServer() { | 
|  | return new MacCFSocketServer(); | 
|  | }; | 
|  | std::unique_ptr<MacBaseSocketServer> server_; | 
|  | SocketServerScope scope_; | 
|  | }; | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, TestConnectIPv4) { | 
|  | SocketTest::TestConnectIPv4(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, TestConnectIPv6) { | 
|  | SocketTest::TestConnectIPv6(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, TestConnectWithDnsLookupIPv4) { | 
|  | SocketTest::TestConnectWithDnsLookupIPv4(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, TestConnectWithDnsLookupIPv6) { | 
|  | SocketTest::TestConnectWithDnsLookupIPv6(); | 
|  | } | 
|  |  | 
|  | // BUG=https://code.google.com/p/webrtc/issues/detail?id=2272 | 
|  | TEST_F(MacAsyncSocketTest, DISABLED_TestConnectFailIPv4) { | 
|  | SocketTest::TestConnectFailIPv4(); | 
|  | } | 
|  |  | 
|  | // Flaky. See webrtc:4738. | 
|  | TEST_F(MacAsyncSocketTest, DISABLED_TestConnectFailIPv6) { | 
|  | SocketTest::TestConnectFailIPv6(); | 
|  | } | 
|  |  | 
|  | // Reenable once we have mac async dns | 
|  | TEST_F(MacAsyncSocketTest, DISABLED_TestConnectWithDnsLookupFailIPv4) { | 
|  | SocketTest::TestConnectWithDnsLookupFailIPv4(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, DISABLED_TestConnectWithDnsLookupFailIPv6) { | 
|  | SocketTest::TestConnectWithDnsLookupFailIPv6(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, TestConnectWithClosedSocketIPv4) { | 
|  | SocketTest::TestConnectWithClosedSocketIPv4(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, TestConnectWithClosedSocketIPv6) { | 
|  | SocketTest::TestConnectWithClosedSocketIPv6(); | 
|  | } | 
|  |  | 
|  | // Flaky at the moment (10% failure rate).  Seems the client doesn't get | 
|  | // signalled in a timely manner... | 
|  | TEST_F(MacAsyncSocketTest, DISABLED_TestServerCloseDuringConnectIPv4) { | 
|  | SocketTest::TestServerCloseDuringConnectIPv4(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, DISABLED_TestServerCloseDuringConnectIPv6) { | 
|  | SocketTest::TestServerCloseDuringConnectIPv6(); | 
|  | } | 
|  | // Flaky at the moment (0.5% failure rate).  Seems the client doesn't get | 
|  | // signalled in a timely manner... | 
|  | TEST_F(MacAsyncSocketTest, TestClientCloseDuringConnectIPv4) { | 
|  | SocketTest::TestClientCloseDuringConnectIPv4(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, TestClientCloseDuringConnectIPv6) { | 
|  | SocketTest::TestClientCloseDuringConnectIPv6(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, TestServerCloseIPv4) { | 
|  | SocketTest::TestServerCloseIPv4(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, TestServerCloseIPv6) { | 
|  | SocketTest::TestServerCloseIPv6(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, TestCloseInClosedCallbackIPv4) { | 
|  | SocketTest::TestCloseInClosedCallbackIPv4(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, TestCloseInClosedCallbackIPv6) { | 
|  | SocketTest::TestCloseInClosedCallbackIPv6(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, TestSocketServerWaitIPv4) { | 
|  | SocketTest::TestSocketServerWaitIPv4(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, TestSocketServerWaitIPv6) { | 
|  | SocketTest::TestSocketServerWaitIPv6(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, TestTcpIPv4) { | 
|  | SocketTest::TestTcpIPv4(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, TestTcpIPv6) { | 
|  | SocketTest::TestTcpIPv6(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, TestSingleFlowControlCallbackIPv4) { | 
|  | SocketTest::TestSingleFlowControlCallbackIPv4(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, TestSingleFlowControlCallbackIPv6) { | 
|  | SocketTest::TestSingleFlowControlCallbackIPv6(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, DISABLED_TestUdpIPv4) { | 
|  | SocketTest::TestUdpIPv4(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, DISABLED_TestUdpIPv6) { | 
|  | SocketTest::TestUdpIPv6(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, DISABLED_TestGetSetOptionsIPv4) { | 
|  | SocketTest::TestGetSetOptionsIPv4(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacAsyncSocketTest, DISABLED_TestGetSetOptionsIPv6) { | 
|  | SocketTest::TestGetSetOptionsIPv6(); | 
|  | } | 
|  |  | 
|  | #ifndef CARBON_DEPRECATED | 
|  | class MacCarbonAppAsyncSocketTest : public MacAsyncSocketTest { | 
|  | virtual MacBaseSocketServer* CreateSocketServer() { | 
|  | return new MacCarbonAppSocketServer(); | 
|  | }; | 
|  | }; | 
|  |  | 
|  | TEST_F(MacCarbonAppAsyncSocketTest, TestSocketServerWaitIPv4) { | 
|  | SocketTest::TestSocketServerWaitIPv4(); | 
|  | } | 
|  |  | 
|  | TEST_F(MacCarbonAppAsyncSocketTest, TestSocketServerWaitIPv6) { | 
|  | SocketTest::TestSocketServerWaitIPv6(); | 
|  | } | 
|  | #endif | 
|  | }  // namespace rtc |