| 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 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 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: |
| 28 explicit FakeSocketDispatcher(PhysicalSocketServer* ss) | 28 explicit FakeSocketDispatcher(PhysicalSocketServer* ss) |
| 29 : SocketDispatcher(ss) { | 29 : SocketDispatcher(ss) { |
| 30 } | 30 } |
| 31 | 31 |
| 32 FakeSocketDispatcher(SOCKET s, PhysicalSocketServer* ss) |
| 33 : SocketDispatcher(s, ss) { |
| 34 } |
| 35 |
| 32 protected: | 36 protected: |
| 33 SOCKET DoAccept(SOCKET socket, sockaddr* addr, socklen_t* addrlen) override; | 37 SOCKET DoAccept(SOCKET socket, sockaddr* addr, socklen_t* addrlen) override; |
| 38 int DoSend(SOCKET socket, const char* buf, int len, int flags) override; |
| 39 int DoSendTo(SOCKET socket, const char* buf, int len, int flags, |
| 40 const struct sockaddr* dest_addr, socklen_t addrlen) override; |
| 34 }; | 41 }; |
| 35 | 42 |
| 36 class FakePhysicalSocketServer : public PhysicalSocketServer { | 43 class FakePhysicalSocketServer : public PhysicalSocketServer { |
| 37 public: | 44 public: |
| 38 explicit FakePhysicalSocketServer(PhysicalSocketTest* test) | 45 explicit FakePhysicalSocketServer(PhysicalSocketTest* test) |
| 39 : test_(test) { | 46 : test_(test) { |
| 40 } | 47 } |
| 41 | 48 |
| 42 AsyncSocket* CreateAsyncSocket(int type) override { | 49 AsyncSocket* CreateAsyncSocket(int type) override { |
| 43 SocketDispatcher* dispatcher = new FakeSocketDispatcher(this); | 50 SocketDispatcher* dispatcher = new FakeSocketDispatcher(this); |
| 44 if (dispatcher->Create(type)) { | 51 if (!dispatcher->Create(type)) { |
| 45 return dispatcher; | |
| 46 } else { | |
| 47 delete dispatcher; | 52 delete dispatcher; |
| 48 return nullptr; | 53 return nullptr; |
| 49 } | 54 } |
| 55 return dispatcher; |
| 50 } | 56 } |
| 51 | 57 |
| 52 AsyncSocket* CreateAsyncSocket(int family, int type) override { | 58 AsyncSocket* CreateAsyncSocket(int family, int type) override { |
| 53 SocketDispatcher* dispatcher = new FakeSocketDispatcher(this); | 59 SocketDispatcher* dispatcher = new FakeSocketDispatcher(this); |
| 54 if (dispatcher->Create(family, type)) { | 60 if (!dispatcher->Create(family, type)) { |
| 55 return dispatcher; | |
| 56 } else { | |
| 57 delete dispatcher; | 61 delete dispatcher; |
| 58 return nullptr; | 62 return nullptr; |
| 59 } | 63 } |
| 64 return dispatcher; |
| 65 } |
| 66 |
| 67 AsyncSocket* WrapSocket(SOCKET s) override { |
| 68 SocketDispatcher* dispatcher = new FakeSocketDispatcher(s, this); |
| 69 if (!dispatcher->Initialize()) { |
| 70 delete dispatcher; |
| 71 return nullptr; |
| 72 } |
| 73 return dispatcher; |
| 60 } | 74 } |
| 61 | 75 |
| 62 PhysicalSocketTest* GetTest() const { return test_; } | 76 PhysicalSocketTest* GetTest() const { return test_; } |
| 63 | 77 |
| 64 private: | 78 private: |
| 65 PhysicalSocketTest* test_; | 79 PhysicalSocketTest* test_; |
| 66 }; | 80 }; |
| 67 | 81 |
| 68 class PhysicalSocketTest : public SocketTest { | 82 class PhysicalSocketTest : public SocketTest { |
| 69 public: | 83 public: |
| 70 // Set flag to simluate failures when calling "::accept" on a AsyncSocket. | 84 // Set flag to simluate failures when calling "::accept" on a AsyncSocket. |
| 71 void SetFailAccept(bool fail) { fail_accept_ = fail; } | 85 void SetFailAccept(bool fail) { fail_accept_ = fail; } |
| 72 bool FailAccept() const { return fail_accept_; } | 86 bool FailAccept() const { return fail_accept_; } |
| 73 | 87 |
| 88 // Maximum size to ::send to a socket. Set to < 0 to disable limiting. |
| 89 void SetMaxSendSize(int max_size) { max_send_size_ = max_size; } |
| 90 int MaxSendSize() const { return max_send_size_; } |
| 91 |
| 74 protected: | 92 protected: |
| 75 PhysicalSocketTest() | 93 PhysicalSocketTest() |
| 76 : server_(new FakePhysicalSocketServer(this)), | 94 : server_(new FakePhysicalSocketServer(this)), |
| 77 scope_(server_.get()), | 95 scope_(server_.get()), |
| 78 fail_accept_(false) { | 96 fail_accept_(false), |
| 97 max_send_size_(-1) { |
| 79 } | 98 } |
| 80 | 99 |
| 81 void ConnectInternalAcceptError(const IPAddress& loopback); | 100 void ConnectInternalAcceptError(const IPAddress& loopback); |
| 101 void WritableAfterPartialWrite(const IPAddress& loopback); |
| 82 | 102 |
| 83 rtc::scoped_ptr<FakePhysicalSocketServer> server_; | 103 rtc::scoped_ptr<FakePhysicalSocketServer> server_; |
| 84 SocketServerScope scope_; | 104 SocketServerScope scope_; |
| 85 bool fail_accept_; | 105 bool fail_accept_; |
| 106 int max_send_size_; |
| 86 }; | 107 }; |
| 87 | 108 |
| 88 SOCKET FakeSocketDispatcher::DoAccept(SOCKET socket, | 109 SOCKET FakeSocketDispatcher::DoAccept(SOCKET socket, |
| 89 sockaddr* addr, | 110 sockaddr* addr, |
| 90 socklen_t* addrlen) { | 111 socklen_t* addrlen) { |
| 91 FakePhysicalSocketServer* ss = | 112 FakePhysicalSocketServer* ss = |
| 92 static_cast<FakePhysicalSocketServer*>(socketserver()); | 113 static_cast<FakePhysicalSocketServer*>(socketserver()); |
| 93 if (ss->GetTest()->FailAccept()) { | 114 if (ss->GetTest()->FailAccept()) { |
| 94 return INVALID_SOCKET; | 115 return INVALID_SOCKET; |
| 95 } | 116 } |
| 96 | 117 |
| 97 return SocketDispatcher::DoAccept(socket, addr, addrlen); | 118 return SocketDispatcher::DoAccept(socket, addr, addrlen); |
| 98 } | 119 } |
| 99 | 120 |
| 121 int FakeSocketDispatcher::DoSend(SOCKET socket, const char* buf, int len, |
| 122 int flags) { |
| 123 FakePhysicalSocketServer* ss = |
| 124 static_cast<FakePhysicalSocketServer*>(socketserver()); |
| 125 if (ss->GetTest()->MaxSendSize() >= 0) { |
| 126 len = std::min(len, ss->GetTest()->MaxSendSize()); |
| 127 } |
| 128 |
| 129 return SocketDispatcher::DoSend(socket, buf, len, flags); |
| 130 } |
| 131 |
| 132 int FakeSocketDispatcher::DoSendTo(SOCKET socket, const char* buf, int len, |
| 133 int flags, const struct sockaddr* dest_addr, socklen_t addrlen) { |
| 134 FakePhysicalSocketServer* ss = |
| 135 static_cast<FakePhysicalSocketServer*>(socketserver()); |
| 136 if (ss->GetTest()->MaxSendSize() >= 0) { |
| 137 len = std::min(len, ss->GetTest()->MaxSendSize()); |
| 138 } |
| 139 |
| 140 return SocketDispatcher::DoSendTo(socket, buf, len, flags, dest_addr, |
| 141 addrlen); |
| 142 } |
| 143 |
| 100 TEST_F(PhysicalSocketTest, TestConnectIPv4) { | 144 TEST_F(PhysicalSocketTest, TestConnectIPv4) { |
| 101 SocketTest::TestConnectIPv4(); | 145 SocketTest::TestConnectIPv4(); |
| 102 } | 146 } |
| 103 | 147 |
| 104 // Crashes on Linux. See webrtc:4923. | 148 // Crashes on Linux. See webrtc:4923. |
| 105 #if defined(WEBRTC_LINUX) | 149 #if defined(WEBRTC_LINUX) |
| 106 #define MAYBE_TestConnectIPv6 DISABLED_TestConnectIPv6 | 150 #define MAYBE_TestConnectIPv6 DISABLED_TestConnectIPv6 |
| 107 #else | 151 #else |
| 108 #define MAYBE_TestConnectIPv6 TestConnectIPv6 | 152 #define MAYBE_TestConnectIPv6 TestConnectIPv6 |
| 109 #endif | 153 #endif |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 // Crashes on Linux. See webrtc:4923. | 246 // Crashes on Linux. See webrtc:4923. |
| 203 #if defined(WEBRTC_LINUX) | 247 #if defined(WEBRTC_LINUX) |
| 204 #define MAYBE_TestConnectAcceptErrorIPv6 DISABLED_TestConnectAcceptErrorIPv6 | 248 #define MAYBE_TestConnectAcceptErrorIPv6 DISABLED_TestConnectAcceptErrorIPv6 |
| 205 #else | 249 #else |
| 206 #define MAYBE_TestConnectAcceptErrorIPv6 TestConnectAcceptErrorIPv6 | 250 #define MAYBE_TestConnectAcceptErrorIPv6 TestConnectAcceptErrorIPv6 |
| 207 #endif | 251 #endif |
| 208 TEST_F(PhysicalSocketTest, MAYBE_TestConnectAcceptErrorIPv6) { | 252 TEST_F(PhysicalSocketTest, MAYBE_TestConnectAcceptErrorIPv6) { |
| 209 ConnectInternalAcceptError(kIPv6Loopback); | 253 ConnectInternalAcceptError(kIPv6Loopback); |
| 210 } | 254 } |
| 211 | 255 |
| 256 void PhysicalSocketTest::WritableAfterPartialWrite(const IPAddress& loopback) { |
| 257 // Simulate a really small maximum send size. |
| 258 const int kMaxSendSize = 128; |
| 259 SetMaxSendSize(kMaxSendSize); |
| 260 |
| 261 // Run the default send/receive socket tests with a smaller amount of data |
| 262 // to avoid long running times due to the small maximum send size. |
| 263 const size_t kDataSize = 128 * 1024; |
| 264 TcpInternal(loopback, kDataSize, kMaxSendSize); |
| 265 } |
| 266 |
| 267 TEST_F(PhysicalSocketTest, TestWritableAfterPartialWriteIPv4) { |
| 268 WritableAfterPartialWrite(kIPv4Loopback); |
| 269 } |
| 270 |
| 271 // Crashes on Linux. See webrtc:4923. |
| 272 #if defined(WEBRTC_LINUX) |
| 273 #define MAYBE_TestWritableAfterPartialWriteIPv6 \ |
| 274 DISABLED_TestWritableAfterPartialWriteIPv6 |
| 275 #else |
| 276 #define MAYBE_TestWritableAfterPartialWriteIPv6 \ |
| 277 TestWritableAfterPartialWriteIPv6 |
| 278 #endif |
| 279 TEST_F(PhysicalSocketTest, MAYBE_TestWritableAfterPartialWriteIPv6) { |
| 280 WritableAfterPartialWrite(kIPv6Loopback); |
| 281 } |
| 282 |
| 212 // Crashes on Linux. See webrtc:4923. | 283 // Crashes on Linux. See webrtc:4923. |
| 213 #if defined(WEBRTC_LINUX) | 284 #if defined(WEBRTC_LINUX) |
| 214 #define MAYBE_TestConnectFailIPv6 DISABLED_TestConnectFailIPv6 | 285 #define MAYBE_TestConnectFailIPv6 DISABLED_TestConnectFailIPv6 |
| 215 #else | 286 #else |
| 216 #define MAYBE_TestConnectFailIPv6 TestConnectFailIPv6 | 287 #define MAYBE_TestConnectFailIPv6 TestConnectFailIPv6 |
| 217 #endif | 288 #endif |
| 218 TEST_F(PhysicalSocketTest, MAYBE_TestConnectFailIPv6) { | 289 TEST_F(PhysicalSocketTest, MAYBE_TestConnectFailIPv6) { |
| 219 SocketTest::TestConnectFailIPv6(); | 290 SocketTest::TestConnectFailIPv6(); |
| 220 } | 291 } |
| 221 | 292 |
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 517 thread->Start(runnable.get()); | 588 thread->Start(runnable.get()); |
| 518 EXPECT_TRUE(ss_->Wait(1500, true)); | 589 EXPECT_TRUE(ss_->Wait(1500, true)); |
| 519 EXPECT_TRUE(ExpectSignal(SIGTERM)); | 590 EXPECT_TRUE(ExpectSignal(SIGTERM)); |
| 520 EXPECT_EQ(Thread::Current(), signaled_thread_); | 591 EXPECT_EQ(Thread::Current(), signaled_thread_); |
| 521 EXPECT_TRUE(ExpectNone()); | 592 EXPECT_TRUE(ExpectNone()); |
| 522 } | 593 } |
| 523 | 594 |
| 524 #endif | 595 #endif |
| 525 | 596 |
| 526 } // namespace rtc | 597 } // namespace rtc |
| OLD | NEW |