| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved. | 
| 3  * | 3  * | 
| 4  *  Use of this source code is governed by a BSD-style license | 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 | 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 | 6  *  tree. An additional intellectual property rights grant can be found | 
| 7  *  in the file PATENTS.  All contributing project authors may | 7  *  in the file PATENTS.  All contributing project authors may | 
| 8  *  be found in the AUTHORS file in the root of the source tree. | 8  *  be found in the AUTHORS file in the root of the source tree. | 
| 9  */ | 9  */ | 
| 10 | 10 | 
|  | 11 #include <memory> | 
| 11 #include <signal.h> | 12 #include <signal.h> | 
| 12 #include <stdarg.h> | 13 #include <stdarg.h> | 
| 13 | 14 | 
| 14 #include "webrtc/base/gunit.h" | 15 #include "webrtc/base/gunit.h" | 
| 15 #include "webrtc/base/logging.h" | 16 #include "webrtc/base/logging.h" | 
| 16 #include "webrtc/base/physicalsocketserver.h" | 17 #include "webrtc/base/physicalsocketserver.h" | 
| 17 #include "webrtc/base/scoped_ptr.h" |  | 
| 18 #include "webrtc/base/socket_unittest.h" | 18 #include "webrtc/base/socket_unittest.h" | 
| 19 #include "webrtc/base/testutils.h" | 19 #include "webrtc/base/testutils.h" | 
| 20 #include "webrtc/base/thread.h" | 20 #include "webrtc/base/thread.h" | 
| 21 | 21 | 
| 22 namespace rtc { | 22 namespace rtc { | 
| 23 | 23 | 
| 24 class PhysicalSocketTest; | 24 class PhysicalSocketTest; | 
| 25 | 25 | 
| 26 class FakeSocketDispatcher : public SocketDispatcher { | 26 class FakeSocketDispatcher : public SocketDispatcher { | 
| 27  public: | 27  public: | 
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 93   PhysicalSocketTest() | 93   PhysicalSocketTest() | 
| 94     : server_(new FakePhysicalSocketServer(this)), | 94     : server_(new FakePhysicalSocketServer(this)), | 
| 95       scope_(server_.get()), | 95       scope_(server_.get()), | 
| 96       fail_accept_(false), | 96       fail_accept_(false), | 
| 97       max_send_size_(-1) { | 97       max_send_size_(-1) { | 
| 98   } | 98   } | 
| 99 | 99 | 
| 100   void ConnectInternalAcceptError(const IPAddress& loopback); | 100   void ConnectInternalAcceptError(const IPAddress& loopback); | 
| 101   void WritableAfterPartialWrite(const IPAddress& loopback); | 101   void WritableAfterPartialWrite(const IPAddress& loopback); | 
| 102 | 102 | 
| 103   rtc::scoped_ptr<FakePhysicalSocketServer> server_; | 103   std::unique_ptr<FakePhysicalSocketServer> server_; | 
| 104   SocketServerScope scope_; | 104   SocketServerScope scope_; | 
| 105   bool fail_accept_; | 105   bool fail_accept_; | 
| 106   int max_send_size_; | 106   int max_send_size_; | 
| 107 }; | 107 }; | 
| 108 | 108 | 
| 109 SOCKET FakeSocketDispatcher::DoAccept(SOCKET socket, | 109 SOCKET FakeSocketDispatcher::DoAccept(SOCKET socket, | 
| 110                                       sockaddr* addr, | 110                                       sockaddr* addr, | 
| 111                                       socklen_t* addrlen) { | 111                                       socklen_t* addrlen) { | 
| 112   FakePhysicalSocketServer* ss = | 112   FakePhysicalSocketServer* ss = | 
| 113       static_cast<FakePhysicalSocketServer*>(socketserver()); | 113       static_cast<FakePhysicalSocketServer*>(socketserver()); | 
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 165 | 165 | 
| 166 TEST_F(PhysicalSocketTest, TestConnectFailIPv4) { | 166 TEST_F(PhysicalSocketTest, TestConnectFailIPv4) { | 
| 167   SocketTest::TestConnectFailIPv4(); | 167   SocketTest::TestConnectFailIPv4(); | 
| 168 } | 168 } | 
| 169 | 169 | 
| 170 void PhysicalSocketTest::ConnectInternalAcceptError(const IPAddress& loopback) { | 170 void PhysicalSocketTest::ConnectInternalAcceptError(const IPAddress& loopback) { | 
| 171   testing::StreamSink sink; | 171   testing::StreamSink sink; | 
| 172   SocketAddress accept_addr; | 172   SocketAddress accept_addr; | 
| 173 | 173 | 
| 174   // Create two clients. | 174   // Create two clients. | 
| 175   scoped_ptr<AsyncSocket> client1(server_->CreateAsyncSocket(loopback.family(), | 175   std::unique_ptr<AsyncSocket> client1( | 
| 176                                                              SOCK_STREAM)); | 176       server_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 
| 177   sink.Monitor(client1.get()); | 177   sink.Monitor(client1.get()); | 
| 178   EXPECT_EQ(AsyncSocket::CS_CLOSED, client1->GetState()); | 178   EXPECT_EQ(AsyncSocket::CS_CLOSED, client1->GetState()); | 
| 179   EXPECT_PRED1(IsUnspecOrEmptyIP, client1->GetLocalAddress().ipaddr()); | 179   EXPECT_PRED1(IsUnspecOrEmptyIP, client1->GetLocalAddress().ipaddr()); | 
| 180 | 180 | 
| 181   scoped_ptr<AsyncSocket> client2(server_->CreateAsyncSocket(loopback.family(), | 181   std::unique_ptr<AsyncSocket> client2( | 
| 182                                                              SOCK_STREAM)); | 182       server_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 
| 183   sink.Monitor(client2.get()); | 183   sink.Monitor(client2.get()); | 
| 184   EXPECT_EQ(AsyncSocket::CS_CLOSED, client2->GetState()); | 184   EXPECT_EQ(AsyncSocket::CS_CLOSED, client2->GetState()); | 
| 185   EXPECT_PRED1(IsUnspecOrEmptyIP, client2->GetLocalAddress().ipaddr()); | 185   EXPECT_PRED1(IsUnspecOrEmptyIP, client2->GetLocalAddress().ipaddr()); | 
| 186 | 186 | 
| 187   // Create server and listen. | 187   // Create server and listen. | 
| 188   scoped_ptr<AsyncSocket> server( | 188   std::unique_ptr<AsyncSocket> server( | 
| 189       server_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 189       server_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 
| 190   sink.Monitor(server.get()); | 190   sink.Monitor(server.get()); | 
| 191   EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); | 191   EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); | 
| 192   EXPECT_EQ(0, server->Listen(5)); | 192   EXPECT_EQ(0, server->Listen(5)); | 
| 193   EXPECT_EQ(AsyncSocket::CS_CONNECTING, server->GetState()); | 193   EXPECT_EQ(AsyncSocket::CS_CONNECTING, server->GetState()); | 
| 194 | 194 | 
| 195   // Ensure no pending server connections, since we haven't done anything yet. | 195   // Ensure no pending server connections, since we haven't done anything yet. | 
| 196   EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ)); | 196   EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ)); | 
| 197   EXPECT_TRUE(nullptr == server->Accept(&accept_addr)); | 197   EXPECT_TRUE(nullptr == server->Accept(&accept_addr)); | 
| 198   EXPECT_TRUE(accept_addr.IsNil()); | 198   EXPECT_TRUE(accept_addr.IsNil()); | 
| 199 | 199 | 
| 200   // Attempt first connect to listening socket. | 200   // Attempt first connect to listening socket. | 
| 201   EXPECT_EQ(0, client1->Connect(server->GetLocalAddress())); | 201   EXPECT_EQ(0, client1->Connect(server->GetLocalAddress())); | 
| 202   EXPECT_FALSE(client1->GetLocalAddress().IsNil()); | 202   EXPECT_FALSE(client1->GetLocalAddress().IsNil()); | 
| 203   EXPECT_NE(server->GetLocalAddress(), client1->GetLocalAddress()); | 203   EXPECT_NE(server->GetLocalAddress(), client1->GetLocalAddress()); | 
| 204 | 204 | 
| 205   // Client is connecting, outcome not yet determined. | 205   // Client is connecting, outcome not yet determined. | 
| 206   EXPECT_EQ(AsyncSocket::CS_CONNECTING, client1->GetState()); | 206   EXPECT_EQ(AsyncSocket::CS_CONNECTING, client1->GetState()); | 
| 207   EXPECT_FALSE(sink.Check(client1.get(), testing::SSE_OPEN)); | 207   EXPECT_FALSE(sink.Check(client1.get(), testing::SSE_OPEN)); | 
| 208   EXPECT_FALSE(sink.Check(client1.get(), testing::SSE_CLOSE)); | 208   EXPECT_FALSE(sink.Check(client1.get(), testing::SSE_CLOSE)); | 
| 209 | 209 | 
| 210   // Server has pending connection, try to accept it (will fail). | 210   // Server has pending connection, try to accept it (will fail). | 
| 211   EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); | 211   EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); | 
| 212   // Simulate "::accept" returning an error. | 212   // Simulate "::accept" returning an error. | 
| 213   SetFailAccept(true); | 213   SetFailAccept(true); | 
| 214   scoped_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); | 214   std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); | 
| 215   EXPECT_FALSE(accepted); | 215   EXPECT_FALSE(accepted); | 
| 216   ASSERT_TRUE(accept_addr.IsNil()); | 216   ASSERT_TRUE(accept_addr.IsNil()); | 
| 217 | 217 | 
| 218   // Ensure no more pending server connections. | 218   // Ensure no more pending server connections. | 
| 219   EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ)); | 219   EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ)); | 
| 220   EXPECT_TRUE(nullptr == server->Accept(&accept_addr)); | 220   EXPECT_TRUE(nullptr == server->Accept(&accept_addr)); | 
| 221   EXPECT_TRUE(accept_addr.IsNil()); | 221   EXPECT_TRUE(accept_addr.IsNil()); | 
| 222 | 222 | 
| 223   // Attempt second connect to listening socket. | 223   // Attempt second connect to listening socket. | 
| 224   EXPECT_EQ(0, client2->Connect(server->GetLocalAddress())); | 224   EXPECT_EQ(0, client2->Connect(server->GetLocalAddress())); | 
| 225   EXPECT_FALSE(client2->GetLocalAddress().IsNil()); | 225   EXPECT_FALSE(client2->GetLocalAddress().IsNil()); | 
| 226   EXPECT_NE(server->GetLocalAddress(), client2->GetLocalAddress()); | 226   EXPECT_NE(server->GetLocalAddress(), client2->GetLocalAddress()); | 
| 227 | 227 | 
| 228   // Client is connecting, outcome not yet determined. | 228   // Client is connecting, outcome not yet determined. | 
| 229   EXPECT_EQ(AsyncSocket::CS_CONNECTING, client2->GetState()); | 229   EXPECT_EQ(AsyncSocket::CS_CONNECTING, client2->GetState()); | 
| 230   EXPECT_FALSE(sink.Check(client2.get(), testing::SSE_OPEN)); | 230   EXPECT_FALSE(sink.Check(client2.get(), testing::SSE_OPEN)); | 
| 231   EXPECT_FALSE(sink.Check(client2.get(), testing::SSE_CLOSE)); | 231   EXPECT_FALSE(sink.Check(client2.get(), testing::SSE_CLOSE)); | 
| 232 | 232 | 
| 233   // Server has pending connection, try to accept it (will succeed). | 233   // Server has pending connection, try to accept it (will succeed). | 
| 234   EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); | 234   EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); | 
| 235   SetFailAccept(false); | 235   SetFailAccept(false); | 
| 236   scoped_ptr<AsyncSocket> accepted2(server->Accept(&accept_addr)); | 236   std::unique_ptr<AsyncSocket> accepted2(server->Accept(&accept_addr)); | 
| 237   ASSERT_TRUE(accepted2); | 237   ASSERT_TRUE(accepted2); | 
| 238   EXPECT_FALSE(accept_addr.IsNil()); | 238   EXPECT_FALSE(accept_addr.IsNil()); | 
| 239   EXPECT_EQ(accepted2->GetRemoteAddress(), accept_addr); | 239   EXPECT_EQ(accepted2->GetRemoteAddress(), accept_addr); | 
| 240 } | 240 } | 
| 241 | 241 | 
| 242 TEST_F(PhysicalSocketTest, TestConnectAcceptErrorIPv4) { | 242 TEST_F(PhysicalSocketTest, TestConnectAcceptErrorIPv4) { | 
| 243   ConnectInternalAcceptError(kIPv4Loopback); | 243   ConnectInternalAcceptError(kIPv4Loopback); | 
| 244 } | 244 } | 
| 245 | 245 | 
| 246 // Crashes on Linux. See webrtc:4923. | 246 // Crashes on Linux. See webrtc:4923. | 
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 508     if (!ret) { | 508     if (!ret) { | 
| 509       LOG(LS_ERROR) << "ExpectNone(): Received signal " << signals_received_[0] | 509       LOG(LS_ERROR) << "ExpectNone(): Received signal " << signals_received_[0] | 
| 510           << ", expected none"; | 510           << ", expected none"; | 
| 511     } | 511     } | 
| 512     return ret; | 512     return ret; | 
| 513   } | 513   } | 
| 514 | 514 | 
| 515   static std::vector<int> signals_received_; | 515   static std::vector<int> signals_received_; | 
| 516   static Thread *signaled_thread_; | 516   static Thread *signaled_thread_; | 
| 517 | 517 | 
| 518   scoped_ptr<PhysicalSocketServer> ss_; | 518   std::unique_ptr<PhysicalSocketServer> ss_; | 
| 519 }; | 519 }; | 
| 520 | 520 | 
| 521 std::vector<int> PosixSignalDeliveryTest::signals_received_; | 521 std::vector<int> PosixSignalDeliveryTest::signals_received_; | 
| 522 Thread *PosixSignalDeliveryTest::signaled_thread_ = NULL; | 522 Thread *PosixSignalDeliveryTest::signaled_thread_ = NULL; | 
| 523 | 523 | 
| 524 // Test receiving a synchronous signal while not in Wait() and then entering | 524 // Test receiving a synchronous signal while not in Wait() and then entering | 
| 525 // Wait() afterwards. | 525 // Wait() afterwards. | 
| 526 TEST_F(PosixSignalDeliveryTest, RaiseThenWait) { | 526 TEST_F(PosixSignalDeliveryTest, RaiseThenWait) { | 
| 527   ASSERT_TRUE(ss_->SetPosixSignalHandler(SIGTERM, &RecordSignal)); | 527   ASSERT_TRUE(ss_->SetPosixSignalHandler(SIGTERM, &RecordSignal)); | 
| 528   raise(SIGTERM); | 528   raise(SIGTERM); | 
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 576 TEST_F(PosixSignalDeliveryTest, SignalOnDifferentThread) { | 576 TEST_F(PosixSignalDeliveryTest, SignalOnDifferentThread) { | 
| 577   ss_->SetPosixSignalHandler(SIGTERM, &RecordSignal); | 577   ss_->SetPosixSignalHandler(SIGTERM, &RecordSignal); | 
| 578   // Mask out SIGTERM so that it can't be delivered to this thread. | 578   // Mask out SIGTERM so that it can't be delivered to this thread. | 
| 579   sigset_t mask; | 579   sigset_t mask; | 
| 580   sigemptyset(&mask); | 580   sigemptyset(&mask); | 
| 581   sigaddset(&mask, SIGTERM); | 581   sigaddset(&mask, SIGTERM); | 
| 582   EXPECT_EQ(0, pthread_sigmask(SIG_SETMASK, &mask, NULL)); | 582   EXPECT_EQ(0, pthread_sigmask(SIG_SETMASK, &mask, NULL)); | 
| 583   // Start a new thread that raises it. It will have to be delivered to that | 583   // Start a new thread that raises it. It will have to be delivered to that | 
| 584   // thread. Our implementation should safely handle it and dispatch | 584   // thread. Our implementation should safely handle it and dispatch | 
| 585   // RecordSignal() on this thread. | 585   // RecordSignal() on this thread. | 
| 586   scoped_ptr<Thread> thread(new Thread()); | 586   std::unique_ptr<Thread> thread(new Thread()); | 
| 587   scoped_ptr<RaiseSigTermRunnable> runnable(new RaiseSigTermRunnable()); | 587   std::unique_ptr<RaiseSigTermRunnable> runnable(new RaiseSigTermRunnable()); | 
| 588   thread->Start(runnable.get()); | 588   thread->Start(runnable.get()); | 
| 589   EXPECT_TRUE(ss_->Wait(1500, true)); | 589   EXPECT_TRUE(ss_->Wait(1500, true)); | 
| 590   EXPECT_TRUE(ExpectSignal(SIGTERM)); | 590   EXPECT_TRUE(ExpectSignal(SIGTERM)); | 
| 591   EXPECT_EQ(Thread::Current(), signaled_thread_); | 591   EXPECT_EQ(Thread::Current(), signaled_thread_); | 
| 592   EXPECT_TRUE(ExpectNone()); | 592   EXPECT_TRUE(ExpectNone()); | 
| 593 } | 593 } | 
| 594 | 594 | 
| 595 #endif | 595 #endif | 
| 596 | 596 | 
| 597 }  // namespace rtc | 597 }  // namespace rtc | 
| OLD | NEW | 
|---|