OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2006 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2006 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 <math.h> | 11 #include <math.h> |
12 #include <time.h> | 12 #include <time.h> |
13 #if defined(WEBRTC_POSIX) | 13 #if defined(WEBRTC_POSIX) |
14 #include <netinet/in.h> | 14 #include <netinet/in.h> |
15 #endif | 15 #endif |
16 | 16 |
17 #include <memory> | 17 #include <memory> |
18 | 18 |
19 #include "webrtc/base/arraysize.h" | 19 #include "webrtc/base/arraysize.h" |
| 20 #include "webrtc/base/gunit.h" |
20 #include "webrtc/base/logging.h" | 21 #include "webrtc/base/logging.h" |
21 #include "webrtc/base/gunit.h" | 22 #include "webrtc/base/ptr_util.h" |
22 #include "webrtc/base/testclient.h" | 23 #include "webrtc/base/testclient.h" |
23 #include "webrtc/base/testutils.h" | 24 #include "webrtc/base/testutils.h" |
24 #include "webrtc/base/thread.h" | 25 #include "webrtc/base/thread.h" |
25 #include "webrtc/base/timeutils.h" | 26 #include "webrtc/base/timeutils.h" |
26 #include "webrtc/base/virtualsocketserver.h" | 27 #include "webrtc/base/virtualsocketserver.h" |
27 | 28 |
28 using namespace rtc; | 29 using namespace rtc; |
29 | 30 |
30 using webrtc::testing::SSE_CLOSE; | 31 using webrtc::testing::SSE_CLOSE; |
31 using webrtc::testing::SSE_ERROR; | 32 using webrtc::testing::SSE_ERROR; |
32 using webrtc::testing::SSE_OPEN; | 33 using webrtc::testing::SSE_OPEN; |
33 using webrtc::testing::SSE_READ; | 34 using webrtc::testing::SSE_READ; |
34 using webrtc::testing::SSE_WRITE; | 35 using webrtc::testing::SSE_WRITE; |
35 using webrtc::testing::StreamSink; | 36 using webrtc::testing::StreamSink; |
36 | 37 |
37 // Sends at a constant rate but with random packet sizes. | 38 // Sends at a constant rate but with random packet sizes. |
38 struct Sender : public MessageHandler { | 39 struct Sender : public MessageHandler { |
39 Sender(Thread* th, AsyncSocket* s, uint32_t rt) | 40 Sender(Thread* th, AsyncSocket* s, uint32_t rt) |
40 : thread(th), | 41 : thread(th), |
41 socket(new AsyncUDPSocket(s)), | 42 socket(MakeUnique<AsyncUDPSocket>(s)), |
42 done(false), | 43 done(false), |
43 rate(rt), | 44 rate(rt), |
44 count(0) { | 45 count(0) { |
45 last_send = rtc::TimeMillis(); | 46 last_send = rtc::TimeMillis(); |
46 thread->PostDelayed(RTC_FROM_HERE, NextDelay(), this, 1); | 47 thread->PostDelayed(RTC_FROM_HERE, NextDelay(), this, 1); |
47 } | 48 } |
48 | 49 |
49 uint32_t NextDelay() { | 50 uint32_t NextDelay() { |
50 uint32_t size = (rand() % 4096) + 1; | 51 uint32_t size = (rand() % 4096) + 1; |
51 return 1000 * size / rate; | 52 return 1000 * size / rate; |
(...skipping 25 matching lines...) Expand all Loading... |
77 bool done; | 78 bool done; |
78 uint32_t rate; // bytes per second | 79 uint32_t rate; // bytes per second |
79 uint32_t count; | 80 uint32_t count; |
80 int64_t last_send; | 81 int64_t last_send; |
81 char dummy[4096]; | 82 char dummy[4096]; |
82 }; | 83 }; |
83 | 84 |
84 struct Receiver : public MessageHandler, public sigslot::has_slots<> { | 85 struct Receiver : public MessageHandler, public sigslot::has_slots<> { |
85 Receiver(Thread* th, AsyncSocket* s, uint32_t bw) | 86 Receiver(Thread* th, AsyncSocket* s, uint32_t bw) |
86 : thread(th), | 87 : thread(th), |
87 socket(new AsyncUDPSocket(s)), | 88 socket(MakeUnique<AsyncUDPSocket>(s)), |
88 bandwidth(bw), | 89 bandwidth(bw), |
89 done(false), | 90 done(false), |
90 count(0), | 91 count(0), |
91 sec_count(0), | 92 sec_count(0), |
92 sum(0), | 93 sum(0), |
93 sum_sq(0), | 94 sum_sq(0), |
94 samples(0) { | 95 samples(0) { |
95 socket->SignalReadPacket.connect(this, &Receiver::OnReadPacket); | 96 socket->SignalReadPacket.connect(this, &Receiver::OnReadPacket); |
96 thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1); | 97 thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1); |
97 } | 98 } |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 size_t count; | 139 size_t count; |
139 size_t sec_count; | 140 size_t sec_count; |
140 double sum; | 141 double sum; |
141 double sum_sq; | 142 double sum_sq; |
142 uint32_t samples; | 143 uint32_t samples; |
143 }; | 144 }; |
144 | 145 |
145 class VirtualSocketServerTest : public testing::Test { | 146 class VirtualSocketServerTest : public testing::Test { |
146 public: | 147 public: |
147 VirtualSocketServerTest() | 148 VirtualSocketServerTest() |
148 : ss_(new VirtualSocketServer(nullptr)), | 149 : ss_(nullptr), |
149 kIPv4AnyAddress(IPAddress(INADDR_ANY), 0), | 150 kIPv4AnyAddress(IPAddress(INADDR_ANY), 0), |
150 kIPv6AnyAddress(IPAddress(in6addr_any), 0) {} | 151 kIPv6AnyAddress(IPAddress(in6addr_any), 0) {} |
151 | 152 |
152 void CheckPortIncrementalization(const SocketAddress& post, | 153 void CheckPortIncrementalization(const SocketAddress& post, |
153 const SocketAddress& pre) { | 154 const SocketAddress& pre) { |
154 EXPECT_EQ(post.port(), pre.port() + 1); | 155 EXPECT_EQ(post.port(), pre.port() + 1); |
155 IPAddress post_ip = post.ipaddr(); | 156 IPAddress post_ip = post.ipaddr(); |
156 IPAddress pre_ip = pre.ipaddr(); | 157 IPAddress pre_ip = pre.ipaddr(); |
157 EXPECT_EQ(pre_ip.family(), post_ip.family()); | 158 EXPECT_EQ(pre_ip.family(), post_ip.family()); |
158 if (post_ip.family() == AF_INET) { | 159 if (post_ip.family() == AF_INET) { |
159 in_addr pre_ipv4 = pre_ip.ipv4_address(); | 160 in_addr pre_ipv4 = pre_ip.ipv4_address(); |
160 in_addr post_ipv4 = post_ip.ipv4_address(); | 161 in_addr post_ipv4 = post_ip.ipv4_address(); |
161 EXPECT_EQ(post_ipv4.s_addr, pre_ipv4.s_addr); | 162 EXPECT_EQ(post_ipv4.s_addr, pre_ipv4.s_addr); |
162 } else if (post_ip.family() == AF_INET6) { | 163 } else if (post_ip.family() == AF_INET6) { |
163 in6_addr post_ip6 = post_ip.ipv6_address(); | 164 in6_addr post_ip6 = post_ip.ipv6_address(); |
164 in6_addr pre_ip6 = pre_ip.ipv6_address(); | 165 in6_addr pre_ip6 = pre_ip.ipv6_address(); |
165 uint32_t* post_as_ints = reinterpret_cast<uint32_t*>(&post_ip6.s6_addr); | 166 uint32_t* post_as_ints = reinterpret_cast<uint32_t*>(&post_ip6.s6_addr); |
166 uint32_t* pre_as_ints = reinterpret_cast<uint32_t*>(&pre_ip6.s6_addr); | 167 uint32_t* pre_as_ints = reinterpret_cast<uint32_t*>(&pre_ip6.s6_addr); |
167 EXPECT_EQ(post_as_ints[3], pre_as_ints[3]); | 168 EXPECT_EQ(post_as_ints[3], pre_as_ints[3]); |
168 } | 169 } |
169 } | 170 } |
170 | 171 |
171 // Test a client can bind to the any address, and all sent packets will have | 172 // Test a client can bind to the any address, and all sent packets will have |
172 // the default route as the source address. Also, it can receive packets sent | 173 // the default route as the source address. Also, it can receive packets sent |
173 // to the default route. | 174 // to the default route. |
174 void TestDefaultRoute(const IPAddress& default_route) { | 175 void TestDefaultRoute(const IPAddress& default_route) { |
175 ss_->SetDefaultRoute(default_route); | 176 ss_.SetDefaultRoute(default_route); |
176 | 177 |
177 // Create client1 bound to the any address. | 178 // Create client1 bound to the any address. |
178 AsyncSocket* socket = | 179 AsyncSocket* socket = |
179 ss_->CreateAsyncSocket(default_route.family(), SOCK_DGRAM); | 180 ss_.CreateAsyncSocket(default_route.family(), SOCK_DGRAM); |
180 socket->Bind(EmptySocketAddressWithFamily(default_route.family())); | 181 socket->Bind(EmptySocketAddressWithFamily(default_route.family())); |
181 SocketAddress client1_any_addr = socket->GetLocalAddress(); | 182 SocketAddress client1_any_addr = socket->GetLocalAddress(); |
182 EXPECT_TRUE(client1_any_addr.IsAnyIP()); | 183 EXPECT_TRUE(client1_any_addr.IsAnyIP()); |
183 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket)); | 184 auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket)); |
184 | 185 |
185 // Create client2 bound to the default route. | 186 // Create client2 bound to the default route. |
186 AsyncSocket* socket2 = | 187 AsyncSocket* socket2 = |
187 ss_->CreateAsyncSocket(default_route.family(), SOCK_DGRAM); | 188 ss_.CreateAsyncSocket(default_route.family(), SOCK_DGRAM); |
188 socket2->Bind(SocketAddress(default_route, 0)); | 189 socket2->Bind(SocketAddress(default_route, 0)); |
189 SocketAddress client2_addr = socket2->GetLocalAddress(); | 190 SocketAddress client2_addr = socket2->GetLocalAddress(); |
190 EXPECT_FALSE(client2_addr.IsAnyIP()); | 191 EXPECT_FALSE(client2_addr.IsAnyIP()); |
191 TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2)); | 192 auto client2 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket2)); |
192 | 193 |
193 // Client1 sends to client2, client2 should see the default route as | 194 // Client1 sends to client2, client2 should see the default route as |
194 // client1's address. | 195 // client1's address. |
195 SocketAddress client1_addr; | 196 SocketAddress client1_addr; |
196 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); | 197 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); |
197 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); | 198 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); |
198 EXPECT_EQ(client1_addr, | 199 EXPECT_EQ(client1_addr, |
199 SocketAddress(default_route, client1_any_addr.port())); | 200 SocketAddress(default_route, client1_any_addr.port())); |
200 | 201 |
201 // Client2 can send back to client1's default route address. | 202 // Client2 can send back to client1's default route address. |
202 EXPECT_EQ(3, client2->SendTo("foo", 3, client1_addr)); | 203 EXPECT_EQ(3, client2->SendTo("foo", 3, client1_addr)); |
203 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); | 204 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); |
204 } | 205 } |
205 | 206 |
206 void BasicTest(const SocketAddress& initial_addr) { | 207 void BasicTest(const SocketAddress& initial_addr) { |
207 AsyncSocket* socket = ss_->CreateAsyncSocket(initial_addr.family(), | 208 AsyncSocket* socket = |
208 SOCK_DGRAM); | 209 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); |
209 socket->Bind(initial_addr); | 210 socket->Bind(initial_addr); |
210 SocketAddress server_addr = socket->GetLocalAddress(); | 211 SocketAddress server_addr = socket->GetLocalAddress(); |
211 // Make sure VSS didn't switch families on us. | 212 // Make sure VSS didn't switch families on us. |
212 EXPECT_EQ(server_addr.family(), initial_addr.family()); | 213 EXPECT_EQ(server_addr.family(), initial_addr.family()); |
213 | 214 |
214 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket)); | 215 auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket)); |
215 AsyncSocket* socket2 = | 216 AsyncSocket* socket2 = |
216 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); | 217 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); |
217 TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2)); | 218 auto client2 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket2)); |
218 | 219 |
219 SocketAddress client2_addr; | 220 SocketAddress client2_addr; |
220 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr)); | 221 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr)); |
221 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); | 222 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); |
222 | 223 |
223 SocketAddress client1_addr; | 224 SocketAddress client1_addr; |
224 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); | 225 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); |
225 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); | 226 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); |
226 EXPECT_EQ(client1_addr, server_addr); | 227 EXPECT_EQ(client1_addr, server_addr); |
227 | 228 |
228 SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family()); | 229 SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family()); |
229 for (int i = 0; i < 10; i++) { | 230 for (int i = 0; i < 10; i++) { |
230 client2 = new TestClient(AsyncUDPSocket::Create(ss_, empty)); | 231 client2 = MakeUnique<TestClient>( |
| 232 WrapUnique(AsyncUDPSocket::Create(&ss_, empty))); |
231 | 233 |
232 SocketAddress next_client2_addr; | 234 SocketAddress next_client2_addr; |
233 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr)); | 235 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr)); |
234 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr)); | 236 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr)); |
235 CheckPortIncrementalization(next_client2_addr, client2_addr); | 237 CheckPortIncrementalization(next_client2_addr, client2_addr); |
236 // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1); | 238 // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1); |
237 | 239 |
238 SocketAddress server_addr2; | 240 SocketAddress server_addr2; |
239 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr)); | 241 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr)); |
240 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2)); | 242 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2)); |
241 EXPECT_EQ(server_addr2, server_addr); | 243 EXPECT_EQ(server_addr2, server_addr); |
242 | 244 |
243 client2_addr = next_client2_addr; | 245 client2_addr = next_client2_addr; |
244 } | 246 } |
245 } | 247 } |
246 | 248 |
247 // initial_addr should be made from either INADDR_ANY or in6addr_any. | 249 // initial_addr should be made from either INADDR_ANY or in6addr_any. |
248 void ConnectTest(const SocketAddress& initial_addr) { | 250 void ConnectTest(const SocketAddress& initial_addr) { |
249 StreamSink sink; | 251 StreamSink sink; |
250 SocketAddress accept_addr; | 252 SocketAddress accept_addr; |
251 const SocketAddress kEmptyAddr = | 253 const SocketAddress kEmptyAddr = |
252 EmptySocketAddressWithFamily(initial_addr.family()); | 254 EmptySocketAddressWithFamily(initial_addr.family()); |
253 | 255 |
254 // Create client | 256 // Create client |
255 AsyncSocket* client = ss_->CreateAsyncSocket(initial_addr.family(), | 257 AsyncSocket* client = |
256 SOCK_STREAM); | 258 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); |
257 sink.Monitor(client); | 259 sink.Monitor(client); |
258 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); | 260 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); |
259 EXPECT_TRUE(client->GetLocalAddress().IsNil()); | 261 EXPECT_TRUE(client->GetLocalAddress().IsNil()); |
260 | 262 |
261 // Create server | 263 // Create server |
262 AsyncSocket* server = ss_->CreateAsyncSocket(initial_addr.family(), | 264 AsyncSocket* server = |
263 SOCK_STREAM); | 265 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); |
264 sink.Monitor(server); | 266 sink.Monitor(server); |
265 EXPECT_NE(0, server->Listen(5)); // Bind required | 267 EXPECT_NE(0, server->Listen(5)); // Bind required |
266 EXPECT_EQ(0, server->Bind(initial_addr)); | 268 EXPECT_EQ(0, server->Bind(initial_addr)); |
267 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); | 269 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); |
268 EXPECT_EQ(0, server->Listen(5)); | 270 EXPECT_EQ(0, server->Listen(5)); |
269 EXPECT_EQ(server->GetState(), AsyncSocket::CS_CONNECTING); | 271 EXPECT_EQ(server->GetState(), AsyncSocket::CS_CONNECTING); |
270 | 272 |
271 // No pending server connections | 273 // No pending server connections |
272 EXPECT_FALSE(sink.Check(server, SSE_READ)); | 274 EXPECT_FALSE(sink.Check(server, SSE_READ)); |
273 EXPECT_TRUE(nullptr == server->Accept(&accept_addr)); | 275 EXPECT_TRUE(nullptr == server->Accept(&accept_addr)); |
274 EXPECT_EQ(AF_UNSPEC, accept_addr.family()); | 276 EXPECT_EQ(AF_UNSPEC, accept_addr.family()); |
275 | 277 |
276 // Attempt connect to listening socket | 278 // Attempt connect to listening socket |
277 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | 279 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); |
278 EXPECT_NE(client->GetLocalAddress(), kEmptyAddr); // Implicit Bind | 280 EXPECT_NE(client->GetLocalAddress(), kEmptyAddr); // Implicit Bind |
279 EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family()); // Implicit Bind | 281 EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family()); // Implicit Bind |
280 EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress()); | 282 EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress()); |
281 | 283 |
282 // Client is connecting | 284 // Client is connecting |
283 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); | 285 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); |
284 EXPECT_FALSE(sink.Check(client, SSE_OPEN)); | 286 EXPECT_FALSE(sink.Check(client, SSE_OPEN)); |
285 EXPECT_FALSE(sink.Check(client, SSE_CLOSE)); | 287 EXPECT_FALSE(sink.Check(client, SSE_CLOSE)); |
286 | 288 |
287 ss_->ProcessMessagesUntilIdle(); | 289 ss_.ProcessMessagesUntilIdle(); |
288 | 290 |
289 // Client still connecting | 291 // Client still connecting |
290 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); | 292 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); |
291 EXPECT_FALSE(sink.Check(client, SSE_OPEN)); | 293 EXPECT_FALSE(sink.Check(client, SSE_OPEN)); |
292 EXPECT_FALSE(sink.Check(client, SSE_CLOSE)); | 294 EXPECT_FALSE(sink.Check(client, SSE_CLOSE)); |
293 | 295 |
294 // Server has pending connection | 296 // Server has pending connection |
295 EXPECT_TRUE(sink.Check(server, SSE_READ)); | 297 EXPECT_TRUE(sink.Check(server, SSE_READ)); |
296 Socket* accepted = server->Accept(&accept_addr); | 298 Socket* accepted = server->Accept(&accept_addr); |
297 EXPECT_TRUE(nullptr != accepted); | 299 EXPECT_TRUE(nullptr != accepted); |
298 EXPECT_NE(accept_addr, kEmptyAddr); | 300 EXPECT_NE(accept_addr, kEmptyAddr); |
299 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr); | 301 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr); |
300 | 302 |
301 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED); | 303 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED); |
302 EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress()); | 304 EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress()); |
303 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress()); | 305 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress()); |
304 | 306 |
305 ss_->ProcessMessagesUntilIdle(); | 307 ss_.ProcessMessagesUntilIdle(); |
306 | 308 |
307 // Client has connected | 309 // Client has connected |
308 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTED); | 310 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTED); |
309 EXPECT_TRUE(sink.Check(client, SSE_OPEN)); | 311 EXPECT_TRUE(sink.Check(client, SSE_OPEN)); |
310 EXPECT_FALSE(sink.Check(client, SSE_CLOSE)); | 312 EXPECT_FALSE(sink.Check(client, SSE_CLOSE)); |
311 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); | 313 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); |
312 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); | 314 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); |
313 } | 315 } |
314 | 316 |
315 void ConnectToNonListenerTest(const SocketAddress& initial_addr) { | 317 void ConnectToNonListenerTest(const SocketAddress& initial_addr) { |
316 StreamSink sink; | 318 StreamSink sink; |
317 SocketAddress accept_addr; | 319 SocketAddress accept_addr; |
318 const SocketAddress nil_addr; | 320 const SocketAddress nil_addr; |
319 const SocketAddress empty_addr = | 321 const SocketAddress empty_addr = |
320 EmptySocketAddressWithFamily(initial_addr.family()); | 322 EmptySocketAddressWithFamily(initial_addr.family()); |
321 | 323 |
322 // Create client | 324 // Create client |
323 AsyncSocket* client = ss_->CreateAsyncSocket(initial_addr.family(), | 325 AsyncSocket* client = |
324 SOCK_STREAM); | 326 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); |
325 sink.Monitor(client); | 327 sink.Monitor(client); |
326 | 328 |
327 // Create server | 329 // Create server |
328 AsyncSocket* server = ss_->CreateAsyncSocket(initial_addr.family(), | 330 AsyncSocket* server = |
329 SOCK_STREAM); | 331 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); |
330 sink.Monitor(server); | 332 sink.Monitor(server); |
331 EXPECT_EQ(0, server->Bind(initial_addr)); | 333 EXPECT_EQ(0, server->Bind(initial_addr)); |
332 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); | 334 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); |
333 // Attempt connect to non-listening socket | 335 // Attempt connect to non-listening socket |
334 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | 336 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); |
335 | 337 |
336 ss_->ProcessMessagesUntilIdle(); | 338 ss_.ProcessMessagesUntilIdle(); |
337 | 339 |
338 // No pending server connections | 340 // No pending server connections |
339 EXPECT_FALSE(sink.Check(server, SSE_READ)); | 341 EXPECT_FALSE(sink.Check(server, SSE_READ)); |
340 EXPECT_TRUE(nullptr == server->Accept(&accept_addr)); | 342 EXPECT_TRUE(nullptr == server->Accept(&accept_addr)); |
341 EXPECT_EQ(accept_addr, nil_addr); | 343 EXPECT_EQ(accept_addr, nil_addr); |
342 | 344 |
343 // Connection failed | 345 // Connection failed |
344 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); | 346 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); |
345 EXPECT_FALSE(sink.Check(client, SSE_OPEN)); | 347 EXPECT_FALSE(sink.Check(client, SSE_OPEN)); |
346 EXPECT_TRUE(sink.Check(client, SSE_ERROR)); | 348 EXPECT_TRUE(sink.Check(client, SSE_ERROR)); |
347 EXPECT_EQ(client->GetRemoteAddress(), nil_addr); | 349 EXPECT_EQ(client->GetRemoteAddress(), nil_addr); |
348 } | 350 } |
349 | 351 |
350 void CloseDuringConnectTest(const SocketAddress& initial_addr) { | 352 void CloseDuringConnectTest(const SocketAddress& initial_addr) { |
351 StreamSink sink; | 353 StreamSink sink; |
352 SocketAddress accept_addr; | 354 SocketAddress accept_addr; |
353 const SocketAddress empty_addr = | 355 const SocketAddress empty_addr = |
354 EmptySocketAddressWithFamily(initial_addr.family()); | 356 EmptySocketAddressWithFamily(initial_addr.family()); |
355 | 357 |
356 // Create client and server | 358 // Create client and server |
357 std::unique_ptr<AsyncSocket> client( | 359 std::unique_ptr<AsyncSocket> client( |
358 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); | 360 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); |
359 sink.Monitor(client.get()); | 361 sink.Monitor(client.get()); |
360 std::unique_ptr<AsyncSocket> server( | 362 std::unique_ptr<AsyncSocket> server( |
361 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); | 363 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); |
362 sink.Monitor(server.get()); | 364 sink.Monitor(server.get()); |
363 | 365 |
364 // Initiate connect | 366 // Initiate connect |
365 EXPECT_EQ(0, server->Bind(initial_addr)); | 367 EXPECT_EQ(0, server->Bind(initial_addr)); |
366 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); | 368 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); |
367 | 369 |
368 EXPECT_EQ(0, server->Listen(5)); | 370 EXPECT_EQ(0, server->Listen(5)); |
369 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | 371 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); |
370 | 372 |
371 // Server close before socket enters accept queue | 373 // Server close before socket enters accept queue |
372 EXPECT_FALSE(sink.Check(server.get(), SSE_READ)); | 374 EXPECT_FALSE(sink.Check(server.get(), SSE_READ)); |
373 server->Close(); | 375 server->Close(); |
374 | 376 |
375 ss_->ProcessMessagesUntilIdle(); | 377 ss_.ProcessMessagesUntilIdle(); |
376 | 378 |
377 // Result: connection failed | 379 // Result: connection failed |
378 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); | 380 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); |
379 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR)); | 381 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR)); |
380 | 382 |
381 server.reset(ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); | 383 server.reset(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); |
382 sink.Monitor(server.get()); | 384 sink.Monitor(server.get()); |
383 | 385 |
384 // Initiate connect | 386 // Initiate connect |
385 EXPECT_EQ(0, server->Bind(initial_addr)); | 387 EXPECT_EQ(0, server->Bind(initial_addr)); |
386 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); | 388 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); |
387 | 389 |
388 EXPECT_EQ(0, server->Listen(5)); | 390 EXPECT_EQ(0, server->Listen(5)); |
389 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | 391 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); |
390 | 392 |
391 ss_->ProcessMessagesUntilIdle(); | 393 ss_.ProcessMessagesUntilIdle(); |
392 | 394 |
393 // Server close while socket is in accept queue | 395 // Server close while socket is in accept queue |
394 EXPECT_TRUE(sink.Check(server.get(), SSE_READ)); | 396 EXPECT_TRUE(sink.Check(server.get(), SSE_READ)); |
395 server->Close(); | 397 server->Close(); |
396 | 398 |
397 ss_->ProcessMessagesUntilIdle(); | 399 ss_.ProcessMessagesUntilIdle(); |
398 | 400 |
399 // Result: connection failed | 401 // Result: connection failed |
400 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); | 402 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); |
401 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR)); | 403 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR)); |
402 | 404 |
403 // New server | 405 // New server |
404 server.reset(ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); | 406 server.reset(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); |
405 sink.Monitor(server.get()); | 407 sink.Monitor(server.get()); |
406 | 408 |
407 // Initiate connect | 409 // Initiate connect |
408 EXPECT_EQ(0, server->Bind(initial_addr)); | 410 EXPECT_EQ(0, server->Bind(initial_addr)); |
409 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); | 411 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); |
410 | 412 |
411 EXPECT_EQ(0, server->Listen(5)); | 413 EXPECT_EQ(0, server->Listen(5)); |
412 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | 414 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); |
413 | 415 |
414 ss_->ProcessMessagesUntilIdle(); | 416 ss_.ProcessMessagesUntilIdle(); |
415 | 417 |
416 // Server accepts connection | 418 // Server accepts connection |
417 EXPECT_TRUE(sink.Check(server.get(), SSE_READ)); | 419 EXPECT_TRUE(sink.Check(server.get(), SSE_READ)); |
418 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); | 420 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); |
419 ASSERT_TRUE(nullptr != accepted.get()); | 421 ASSERT_TRUE(nullptr != accepted.get()); |
420 sink.Monitor(accepted.get()); | 422 sink.Monitor(accepted.get()); |
421 | 423 |
422 // Client closes before connection complets | 424 // Client closes before connection complets |
423 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED); | 425 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED); |
424 | 426 |
425 // Connected message has not been processed yet. | 427 // Connected message has not been processed yet. |
426 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); | 428 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); |
427 client->Close(); | 429 client->Close(); |
428 | 430 |
429 ss_->ProcessMessagesUntilIdle(); | 431 ss_.ProcessMessagesUntilIdle(); |
430 | 432 |
431 // Result: accepted socket closes | 433 // Result: accepted socket closes |
432 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CLOSED); | 434 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CLOSED); |
433 EXPECT_TRUE(sink.Check(accepted.get(), SSE_CLOSE)); | 435 EXPECT_TRUE(sink.Check(accepted.get(), SSE_CLOSE)); |
434 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE)); | 436 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE)); |
435 } | 437 } |
436 | 438 |
437 void CloseTest(const SocketAddress& initial_addr) { | 439 void CloseTest(const SocketAddress& initial_addr) { |
438 StreamSink sink; | 440 StreamSink sink; |
439 const SocketAddress kEmptyAddr; | 441 const SocketAddress kEmptyAddr; |
440 | 442 |
441 // Create clients | 443 // Create clients |
442 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); | 444 AsyncSocket* a = ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); |
443 sink.Monitor(a); | 445 sink.Monitor(a); |
444 a->Bind(initial_addr); | 446 a->Bind(initial_addr); |
445 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); | 447 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); |
446 | 448 |
447 std::unique_ptr<AsyncSocket> b( | 449 std::unique_ptr<AsyncSocket> b( |
448 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); | 450 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); |
449 sink.Monitor(b.get()); | 451 sink.Monitor(b.get()); |
450 b->Bind(initial_addr); | 452 b->Bind(initial_addr); |
451 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); | 453 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); |
452 | 454 |
453 EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); | 455 EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); |
454 EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); | 456 EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); |
455 | 457 |
456 ss_->ProcessMessagesUntilIdle(); | 458 ss_.ProcessMessagesUntilIdle(); |
457 | 459 |
458 EXPECT_TRUE(sink.Check(a, SSE_OPEN)); | 460 EXPECT_TRUE(sink.Check(a, SSE_OPEN)); |
459 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CONNECTED); | 461 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CONNECTED); |
460 EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress()); | 462 EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress()); |
461 | 463 |
462 EXPECT_TRUE(sink.Check(b.get(), SSE_OPEN)); | 464 EXPECT_TRUE(sink.Check(b.get(), SSE_OPEN)); |
463 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CONNECTED); | 465 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CONNECTED); |
464 EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress()); | 466 EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress()); |
465 | 467 |
466 EXPECT_EQ(1, a->Send("a", 1)); | 468 EXPECT_EQ(1, a->Send("a", 1)); |
467 b->Close(); | 469 b->Close(); |
468 EXPECT_EQ(1, a->Send("b", 1)); | 470 EXPECT_EQ(1, a->Send("b", 1)); |
469 | 471 |
470 ss_->ProcessMessagesUntilIdle(); | 472 ss_.ProcessMessagesUntilIdle(); |
471 | 473 |
472 char buffer[10]; | 474 char buffer[10]; |
473 EXPECT_FALSE(sink.Check(b.get(), SSE_READ)); | 475 EXPECT_FALSE(sink.Check(b.get(), SSE_READ)); |
474 EXPECT_EQ(-1, b->Recv(buffer, 10, nullptr)); | 476 EXPECT_EQ(-1, b->Recv(buffer, 10, nullptr)); |
475 | 477 |
476 EXPECT_TRUE(sink.Check(a, SSE_CLOSE)); | 478 EXPECT_TRUE(sink.Check(a, SSE_CLOSE)); |
477 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CLOSED); | 479 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CLOSED); |
478 EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr); | 480 EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr); |
479 | 481 |
480 // No signal for Closer | 482 // No signal for Closer |
481 EXPECT_FALSE(sink.Check(b.get(), SSE_CLOSE)); | 483 EXPECT_FALSE(sink.Check(b.get(), SSE_CLOSE)); |
482 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CLOSED); | 484 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CLOSED); |
483 EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr); | 485 EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr); |
484 } | 486 } |
485 | 487 |
486 void TcpSendTest(const SocketAddress& initial_addr) { | 488 void TcpSendTest(const SocketAddress& initial_addr) { |
487 StreamSink sink; | 489 StreamSink sink; |
488 const SocketAddress kEmptyAddr; | 490 const SocketAddress kEmptyAddr; |
489 | 491 |
490 // Connect two sockets | 492 // Connect two sockets |
491 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); | 493 AsyncSocket* a = ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); |
492 sink.Monitor(a); | 494 sink.Monitor(a); |
493 a->Bind(initial_addr); | 495 a->Bind(initial_addr); |
494 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); | 496 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); |
495 | 497 |
496 AsyncSocket* b = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); | 498 AsyncSocket* b = ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); |
497 sink.Monitor(b); | 499 sink.Monitor(b); |
498 b->Bind(initial_addr); | 500 b->Bind(initial_addr); |
499 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); | 501 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); |
500 | 502 |
501 EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); | 503 EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); |
502 EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); | 504 EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); |
503 | 505 |
504 ss_->ProcessMessagesUntilIdle(); | 506 ss_.ProcessMessagesUntilIdle(); |
505 | 507 |
506 const size_t kBufferSize = 2000; | 508 const size_t kBufferSize = 2000; |
507 ss_->set_send_buffer_capacity(kBufferSize); | 509 ss_.set_send_buffer_capacity(kBufferSize); |
508 ss_->set_recv_buffer_capacity(kBufferSize); | 510 ss_.set_recv_buffer_capacity(kBufferSize); |
509 | 511 |
510 const size_t kDataSize = 5000; | 512 const size_t kDataSize = 5000; |
511 char send_buffer[kDataSize], recv_buffer[kDataSize]; | 513 char send_buffer[kDataSize], recv_buffer[kDataSize]; |
512 for (size_t i = 0; i < kDataSize; ++i) | 514 for (size_t i = 0; i < kDataSize; ++i) |
513 send_buffer[i] = static_cast<char>(i % 256); | 515 send_buffer[i] = static_cast<char>(i % 256); |
514 memset(recv_buffer, 0, sizeof(recv_buffer)); | 516 memset(recv_buffer, 0, sizeof(recv_buffer)); |
515 size_t send_pos = 0, recv_pos = 0; | 517 size_t send_pos = 0, recv_pos = 0; |
516 | 518 |
517 // Can't send more than send buffer in one write | 519 // Can't send more than send buffer in one write |
518 int result = a->Send(send_buffer + send_pos, kDataSize - send_pos); | 520 int result = a->Send(send_buffer + send_pos, kDataSize - send_pos); |
519 EXPECT_EQ(static_cast<int>(kBufferSize), result); | 521 EXPECT_EQ(static_cast<int>(kBufferSize), result); |
520 send_pos += result; | 522 send_pos += result; |
521 | 523 |
522 ss_->ProcessMessagesUntilIdle(); | 524 ss_.ProcessMessagesUntilIdle(); |
523 EXPECT_FALSE(sink.Check(a, SSE_WRITE)); | 525 EXPECT_FALSE(sink.Check(a, SSE_WRITE)); |
524 EXPECT_TRUE(sink.Check(b, SSE_READ)); | 526 EXPECT_TRUE(sink.Check(b, SSE_READ)); |
525 | 527 |
526 // Receive buffer is already filled, fill send buffer again | 528 // Receive buffer is already filled, fill send buffer again |
527 result = a->Send(send_buffer + send_pos, kDataSize - send_pos); | 529 result = a->Send(send_buffer + send_pos, kDataSize - send_pos); |
528 EXPECT_EQ(static_cast<int>(kBufferSize), result); | 530 EXPECT_EQ(static_cast<int>(kBufferSize), result); |
529 send_pos += result; | 531 send_pos += result; |
530 | 532 |
531 ss_->ProcessMessagesUntilIdle(); | 533 ss_.ProcessMessagesUntilIdle(); |
532 EXPECT_FALSE(sink.Check(a, SSE_WRITE)); | 534 EXPECT_FALSE(sink.Check(a, SSE_WRITE)); |
533 EXPECT_FALSE(sink.Check(b, SSE_READ)); | 535 EXPECT_FALSE(sink.Check(b, SSE_READ)); |
534 | 536 |
535 // No more room in send or receive buffer | 537 // No more room in send or receive buffer |
536 result = a->Send(send_buffer + send_pos, kDataSize - send_pos); | 538 result = a->Send(send_buffer + send_pos, kDataSize - send_pos); |
537 EXPECT_EQ(-1, result); | 539 EXPECT_EQ(-1, result); |
538 EXPECT_TRUE(a->IsBlocking()); | 540 EXPECT_TRUE(a->IsBlocking()); |
539 | 541 |
540 // Read a subset of the data | 542 // Read a subset of the data |
541 result = b->Recv(recv_buffer + recv_pos, 500, nullptr); | 543 result = b->Recv(recv_buffer + recv_pos, 500, nullptr); |
542 EXPECT_EQ(500, result); | 544 EXPECT_EQ(500, result); |
543 recv_pos += result; | 545 recv_pos += result; |
544 | 546 |
545 ss_->ProcessMessagesUntilIdle(); | 547 ss_.ProcessMessagesUntilIdle(); |
546 EXPECT_TRUE(sink.Check(a, SSE_WRITE)); | 548 EXPECT_TRUE(sink.Check(a, SSE_WRITE)); |
547 EXPECT_TRUE(sink.Check(b, SSE_READ)); | 549 EXPECT_TRUE(sink.Check(b, SSE_READ)); |
548 | 550 |
549 // Room for more on the sending side | 551 // Room for more on the sending side |
550 result = a->Send(send_buffer + send_pos, kDataSize - send_pos); | 552 result = a->Send(send_buffer + send_pos, kDataSize - send_pos); |
551 EXPECT_EQ(500, result); | 553 EXPECT_EQ(500, result); |
552 send_pos += result; | 554 send_pos += result; |
553 | 555 |
554 // Empty the recv buffer | 556 // Empty the recv buffer |
555 while (true) { | 557 while (true) { |
556 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr); | 558 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr); |
557 if (result < 0) { | 559 if (result < 0) { |
558 EXPECT_EQ(-1, result); | 560 EXPECT_EQ(-1, result); |
559 EXPECT_TRUE(b->IsBlocking()); | 561 EXPECT_TRUE(b->IsBlocking()); |
560 break; | 562 break; |
561 } | 563 } |
562 recv_pos += result; | 564 recv_pos += result; |
563 } | 565 } |
564 | 566 |
565 ss_->ProcessMessagesUntilIdle(); | 567 ss_.ProcessMessagesUntilIdle(); |
566 EXPECT_TRUE(sink.Check(b, SSE_READ)); | 568 EXPECT_TRUE(sink.Check(b, SSE_READ)); |
567 | 569 |
568 // Continue to empty the recv buffer | 570 // Continue to empty the recv buffer |
569 while (true) { | 571 while (true) { |
570 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr); | 572 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr); |
571 if (result < 0) { | 573 if (result < 0) { |
572 EXPECT_EQ(-1, result); | 574 EXPECT_EQ(-1, result); |
573 EXPECT_TRUE(b->IsBlocking()); | 575 EXPECT_TRUE(b->IsBlocking()); |
574 break; | 576 break; |
575 } | 577 } |
576 recv_pos += result; | 578 recv_pos += result; |
577 } | 579 } |
578 | 580 |
579 // Send last of the data | 581 // Send last of the data |
580 result = a->Send(send_buffer + send_pos, kDataSize - send_pos); | 582 result = a->Send(send_buffer + send_pos, kDataSize - send_pos); |
581 EXPECT_EQ(500, result); | 583 EXPECT_EQ(500, result); |
582 send_pos += result; | 584 send_pos += result; |
583 | 585 |
584 ss_->ProcessMessagesUntilIdle(); | 586 ss_.ProcessMessagesUntilIdle(); |
585 EXPECT_TRUE(sink.Check(b, SSE_READ)); | 587 EXPECT_TRUE(sink.Check(b, SSE_READ)); |
586 | 588 |
587 // Receive the last of the data | 589 // Receive the last of the data |
588 while (true) { | 590 while (true) { |
589 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr); | 591 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr); |
590 if (result < 0) { | 592 if (result < 0) { |
591 EXPECT_EQ(-1, result); | 593 EXPECT_EQ(-1, result); |
592 EXPECT_TRUE(b->IsBlocking()); | 594 EXPECT_TRUE(b->IsBlocking()); |
593 break; | 595 break; |
594 } | 596 } |
595 recv_pos += result; | 597 recv_pos += result; |
596 } | 598 } |
597 | 599 |
598 ss_->ProcessMessagesUntilIdle(); | 600 ss_.ProcessMessagesUntilIdle(); |
599 EXPECT_FALSE(sink.Check(b, SSE_READ)); | 601 EXPECT_FALSE(sink.Check(b, SSE_READ)); |
600 | 602 |
601 // The received data matches the sent data | 603 // The received data matches the sent data |
602 EXPECT_EQ(kDataSize, send_pos); | 604 EXPECT_EQ(kDataSize, send_pos); |
603 EXPECT_EQ(kDataSize, recv_pos); | 605 EXPECT_EQ(kDataSize, recv_pos); |
604 EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize)); | 606 EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize)); |
605 } | 607 } |
606 | 608 |
607 void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) { | 609 void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) { |
608 const SocketAddress kEmptyAddr; | 610 const SocketAddress kEmptyAddr; |
609 | 611 |
610 // Connect two sockets | 612 // Connect two sockets |
611 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), | 613 AsyncSocket* a = ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); |
612 SOCK_STREAM); | 614 AsyncSocket* b = ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); |
613 AsyncSocket* b = ss_->CreateAsyncSocket(initial_addr.family(), | |
614 SOCK_STREAM); | |
615 a->Bind(initial_addr); | 615 a->Bind(initial_addr); |
616 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); | 616 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); |
617 | 617 |
618 b->Bind(initial_addr); | 618 b->Bind(initial_addr); |
619 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); | 619 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); |
620 | 620 |
621 EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); | 621 EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); |
622 EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); | 622 EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); |
623 ss_->ProcessMessagesUntilIdle(); | 623 ss_.ProcessMessagesUntilIdle(); |
624 | 624 |
625 // First, deliver all packets in 0 ms. | 625 // First, deliver all packets in 0 ms. |
626 char buffer[2] = { 0, 0 }; | 626 char buffer[2] = { 0, 0 }; |
627 const char cNumPackets = 10; | 627 const char cNumPackets = 10; |
628 for (char i = 0; i < cNumPackets; ++i) { | 628 for (char i = 0; i < cNumPackets; ++i) { |
629 buffer[0] = '0' + i; | 629 buffer[0] = '0' + i; |
630 EXPECT_EQ(1, a->Send(buffer, 1)); | 630 EXPECT_EQ(1, a->Send(buffer, 1)); |
631 } | 631 } |
632 | 632 |
633 ss_->ProcessMessagesUntilIdle(); | 633 ss_.ProcessMessagesUntilIdle(); |
634 | 634 |
635 for (char i = 0; i < cNumPackets; ++i) { | 635 for (char i = 0; i < cNumPackets; ++i) { |
636 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr)); | 636 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr)); |
637 EXPECT_EQ(static_cast<char>('0' + i), buffer[0]); | 637 EXPECT_EQ(static_cast<char>('0' + i), buffer[0]); |
638 } | 638 } |
639 | 639 |
640 // Next, deliver packets at random intervals | 640 // Next, deliver packets at random intervals |
641 const uint32_t mean = 50; | 641 const uint32_t mean = 50; |
642 const uint32_t stddev = 50; | 642 const uint32_t stddev = 50; |
643 | 643 |
644 ss_->set_delay_mean(mean); | 644 ss_.set_delay_mean(mean); |
645 ss_->set_delay_stddev(stddev); | 645 ss_.set_delay_stddev(stddev); |
646 ss_->UpdateDelayDistribution(); | 646 ss_.UpdateDelayDistribution(); |
647 | 647 |
648 for (char i = 0; i < cNumPackets; ++i) { | 648 for (char i = 0; i < cNumPackets; ++i) { |
649 buffer[0] = 'A' + i; | 649 buffer[0] = 'A' + i; |
650 EXPECT_EQ(1, a->Send(buffer, 1)); | 650 EXPECT_EQ(1, a->Send(buffer, 1)); |
651 } | 651 } |
652 | 652 |
653 ss_->ProcessMessagesUntilIdle(); | 653 ss_.ProcessMessagesUntilIdle(); |
654 | 654 |
655 for (char i = 0; i < cNumPackets; ++i) { | 655 for (char i = 0; i < cNumPackets; ++i) { |
656 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr)); | 656 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr)); |
657 EXPECT_EQ(static_cast<char>('A' + i), buffer[0]); | 657 EXPECT_EQ(static_cast<char>('A' + i), buffer[0]); |
658 } | 658 } |
659 } | 659 } |
660 | 660 |
661 // It is important that initial_addr's port has to be 0 such that the | 661 // It is important that initial_addr's port has to be 0 such that the |
662 // incremental port behavior could ensure the 2 Binds result in different | 662 // incremental port behavior could ensure the 2 Binds result in different |
663 // address. | 663 // address. |
664 void BandwidthTest(const SocketAddress& initial_addr) { | 664 void BandwidthTest(const SocketAddress& initial_addr) { |
665 AsyncSocket* send_socket = | 665 AsyncSocket* send_socket = |
666 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); | 666 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); |
667 AsyncSocket* recv_socket = | 667 AsyncSocket* recv_socket = |
668 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); | 668 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); |
669 ASSERT_EQ(0, send_socket->Bind(initial_addr)); | 669 ASSERT_EQ(0, send_socket->Bind(initial_addr)); |
670 ASSERT_EQ(0, recv_socket->Bind(initial_addr)); | 670 ASSERT_EQ(0, recv_socket->Bind(initial_addr)); |
671 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family()); | 671 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family()); |
672 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family()); | 672 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family()); |
673 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress())); | 673 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress())); |
674 | 674 |
675 uint32_t bandwidth = 64 * 1024; | 675 uint32_t bandwidth = 64 * 1024; |
676 ss_->set_bandwidth(bandwidth); | 676 ss_.set_bandwidth(bandwidth); |
677 | 677 |
678 Thread* pthMain = Thread::Current(); | 678 Thread* pthMain = Thread::Current(); |
679 Sender sender(pthMain, send_socket, 80 * 1024); | 679 Sender sender(pthMain, send_socket, 80 * 1024); |
680 Receiver receiver(pthMain, recv_socket, bandwidth); | 680 Receiver receiver(pthMain, recv_socket, bandwidth); |
681 | 681 |
682 pthMain->ProcessMessages(5000); | 682 pthMain->ProcessMessages(5000); |
683 sender.done = true; | 683 sender.done = true; |
684 pthMain->ProcessMessages(5000); | 684 pthMain->ProcessMessages(5000); |
685 | 685 |
686 ASSERT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4); | 686 ASSERT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4); |
687 ASSERT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s | 687 ASSERT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s |
688 | 688 |
689 ss_->set_bandwidth(0); | 689 ss_.set_bandwidth(0); |
690 } | 690 } |
691 | 691 |
692 // It is important that initial_addr's port has to be 0 such that the | 692 // It is important that initial_addr's port has to be 0 such that the |
693 // incremental port behavior could ensure the 2 Binds result in different | 693 // incremental port behavior could ensure the 2 Binds result in different |
694 // address. | 694 // address. |
695 void DelayTest(const SocketAddress& initial_addr) { | 695 void DelayTest(const SocketAddress& initial_addr) { |
696 time_t seed = ::time(nullptr); | 696 time_t seed = ::time(nullptr); |
697 LOG(LS_VERBOSE) << "seed = " << seed; | 697 LOG(LS_VERBOSE) << "seed = " << seed; |
698 srand(static_cast<unsigned int>(seed)); | 698 srand(static_cast<unsigned int>(seed)); |
699 | 699 |
700 const uint32_t mean = 2000; | 700 const uint32_t mean = 2000; |
701 const uint32_t stddev = 500; | 701 const uint32_t stddev = 500; |
702 | 702 |
703 ss_->set_delay_mean(mean); | 703 ss_.set_delay_mean(mean); |
704 ss_->set_delay_stddev(stddev); | 704 ss_.set_delay_stddev(stddev); |
705 ss_->UpdateDelayDistribution(); | 705 ss_.UpdateDelayDistribution(); |
706 | 706 |
707 AsyncSocket* send_socket = | 707 AsyncSocket* send_socket = |
708 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); | 708 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); |
709 AsyncSocket* recv_socket = | 709 AsyncSocket* recv_socket = |
710 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); | 710 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); |
711 ASSERT_EQ(0, send_socket->Bind(initial_addr)); | 711 ASSERT_EQ(0, send_socket->Bind(initial_addr)); |
712 ASSERT_EQ(0, recv_socket->Bind(initial_addr)); | 712 ASSERT_EQ(0, recv_socket->Bind(initial_addr)); |
713 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family()); | 713 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family()); |
714 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family()); | 714 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family()); |
715 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress())); | 715 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress())); |
716 | 716 |
717 Thread* pthMain = Thread::Current(); | 717 Thread* pthMain = Thread::Current(); |
718 // Avg packet size is 2K, so at 200KB/s for 10s, we should see about | 718 // Avg packet size is 2K, so at 200KB/s for 10s, we should see about |
719 // 1000 packets, which is necessary to get a good distribution. | 719 // 1000 packets, which is necessary to get a good distribution. |
720 Sender sender(pthMain, send_socket, 100 * 2 * 1024); | 720 Sender sender(pthMain, send_socket, 100 * 2 * 1024); |
721 Receiver receiver(pthMain, recv_socket, 0); | 721 Receiver receiver(pthMain, recv_socket, 0); |
722 | 722 |
723 pthMain->ProcessMessages(10000); | 723 pthMain->ProcessMessages(10000); |
724 sender.done = receiver.done = true; | 724 sender.done = receiver.done = true; |
725 ss_->ProcessMessagesUntilIdle(); | 725 ss_.ProcessMessagesUntilIdle(); |
726 | 726 |
727 const double sample_mean = receiver.sum / receiver.samples; | 727 const double sample_mean = receiver.sum / receiver.samples; |
728 double num = | 728 double num = |
729 receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum; | 729 receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum; |
730 double den = receiver.samples * (receiver.samples - 1); | 730 double den = receiver.samples * (receiver.samples - 1); |
731 const double sample_stddev = sqrt(num / den); | 731 const double sample_stddev = sqrt(num / den); |
732 LOG(LS_VERBOSE) << "mean=" << sample_mean << " stddev=" << sample_stddev; | 732 LOG(LS_VERBOSE) << "mean=" << sample_mean << " stddev=" << sample_stddev; |
733 | 733 |
734 EXPECT_LE(500u, receiver.samples); | 734 EXPECT_LE(500u, receiver.samples); |
735 // We initially used a 0.1 fudge factor, but on the build machine, we | 735 // We initially used a 0.1 fudge factor, but on the build machine, we |
736 // have seen the value differ by as much as 0.13. | 736 // have seen the value differ by as much as 0.13. |
737 EXPECT_NEAR(mean, sample_mean, 0.15 * mean); | 737 EXPECT_NEAR(mean, sample_mean, 0.15 * mean); |
738 EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev); | 738 EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev); |
739 | 739 |
740 ss_->set_delay_mean(0); | 740 ss_.set_delay_mean(0); |
741 ss_->set_delay_stddev(0); | 741 ss_.set_delay_stddev(0); |
742 ss_->UpdateDelayDistribution(); | 742 ss_.UpdateDelayDistribution(); |
743 } | 743 } |
744 | 744 |
745 // Test cross-family communication between a client bound to client_addr and a | 745 // Test cross-family communication between a client bound to client_addr and a |
746 // server bound to server_addr. shouldSucceed indicates if communication is | 746 // server bound to server_addr. shouldSucceed indicates if communication is |
747 // expected to work or not. | 747 // expected to work or not. |
748 void CrossFamilyConnectionTest(const SocketAddress& client_addr, | 748 void CrossFamilyConnectionTest(const SocketAddress& client_addr, |
749 const SocketAddress& server_addr, | 749 const SocketAddress& server_addr, |
750 bool shouldSucceed) { | 750 bool shouldSucceed) { |
751 StreamSink sink; | 751 StreamSink sink; |
752 SocketAddress accept_address; | 752 SocketAddress accept_address; |
753 const SocketAddress kEmptyAddr; | 753 const SocketAddress kEmptyAddr; |
754 | 754 |
755 // Client gets a IPv4 address | 755 // Client gets a IPv4 address |
756 AsyncSocket* client = ss_->CreateAsyncSocket(client_addr.family(), | 756 AsyncSocket* client = |
757 SOCK_STREAM); | 757 ss_.CreateAsyncSocket(client_addr.family(), SOCK_STREAM); |
758 sink.Monitor(client); | 758 sink.Monitor(client); |
759 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); | 759 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); |
760 EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr); | 760 EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr); |
761 client->Bind(client_addr); | 761 client->Bind(client_addr); |
762 | 762 |
763 // Server gets a non-mapped non-any IPv6 address. | 763 // Server gets a non-mapped non-any IPv6 address. |
764 // IPv4 sockets should not be able to connect to this. | 764 // IPv4 sockets should not be able to connect to this. |
765 AsyncSocket* server = ss_->CreateAsyncSocket(server_addr.family(), | 765 AsyncSocket* server = |
766 SOCK_STREAM); | 766 ss_.CreateAsyncSocket(server_addr.family(), SOCK_STREAM); |
767 sink.Monitor(server); | 767 sink.Monitor(server); |
768 server->Bind(server_addr); | 768 server->Bind(server_addr); |
769 server->Listen(5); | 769 server->Listen(5); |
770 | 770 |
771 if (shouldSucceed) { | 771 if (shouldSucceed) { |
772 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | 772 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); |
773 ss_->ProcessMessagesUntilIdle(); | 773 ss_.ProcessMessagesUntilIdle(); |
774 EXPECT_TRUE(sink.Check(server, SSE_READ)); | 774 EXPECT_TRUE(sink.Check(server, SSE_READ)); |
775 Socket* accepted = server->Accept(&accept_address); | 775 Socket* accepted = server->Accept(&accept_address); |
776 EXPECT_TRUE(nullptr != accepted); | 776 EXPECT_TRUE(nullptr != accepted); |
777 EXPECT_NE(kEmptyAddr, accept_address); | 777 EXPECT_NE(kEmptyAddr, accept_address); |
778 ss_->ProcessMessagesUntilIdle(); | 778 ss_.ProcessMessagesUntilIdle(); |
779 EXPECT_TRUE(sink.Check(client, SSE_OPEN)); | 779 EXPECT_TRUE(sink.Check(client, SSE_OPEN)); |
780 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); | 780 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); |
781 } else { | 781 } else { |
782 // Check that the connection failed. | 782 // Check that the connection failed. |
783 EXPECT_EQ(-1, client->Connect(server->GetLocalAddress())); | 783 EXPECT_EQ(-1, client->Connect(server->GetLocalAddress())); |
784 ss_->ProcessMessagesUntilIdle(); | 784 ss_.ProcessMessagesUntilIdle(); |
785 | 785 |
786 EXPECT_FALSE(sink.Check(server, SSE_READ)); | 786 EXPECT_FALSE(sink.Check(server, SSE_READ)); |
787 EXPECT_TRUE(nullptr == server->Accept(&accept_address)); | 787 EXPECT_TRUE(nullptr == server->Accept(&accept_address)); |
788 EXPECT_EQ(accept_address, kEmptyAddr); | 788 EXPECT_EQ(accept_address, kEmptyAddr); |
789 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); | 789 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); |
790 EXPECT_FALSE(sink.Check(client, SSE_OPEN)); | 790 EXPECT_FALSE(sink.Check(client, SSE_OPEN)); |
791 EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr); | 791 EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr); |
792 } | 792 } |
793 } | 793 } |
794 | 794 |
795 // Test cross-family datagram sending between a client bound to client_addr | 795 // Test cross-family datagram sending between a client bound to client_addr |
796 // and a server bound to server_addr. shouldSucceed indicates if sending is | 796 // and a server bound to server_addr. shouldSucceed indicates if sending is |
797 // expected to succeed or not. | 797 // expected to succeed or not. |
798 void CrossFamilyDatagramTest(const SocketAddress& client_addr, | 798 void CrossFamilyDatagramTest(const SocketAddress& client_addr, |
799 const SocketAddress& server_addr, | 799 const SocketAddress& server_addr, |
800 bool shouldSucceed) { | 800 bool shouldSucceed) { |
801 AsyncSocket* socket = ss_->CreateAsyncSocket(SOCK_DGRAM); | 801 AsyncSocket* socket = ss_.CreateAsyncSocket(SOCK_DGRAM); |
802 socket->Bind(server_addr); | 802 socket->Bind(server_addr); |
803 SocketAddress bound_server_addr = socket->GetLocalAddress(); | 803 SocketAddress bound_server_addr = socket->GetLocalAddress(); |
804 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket)); | 804 auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket)); |
805 | 805 |
806 AsyncSocket* socket2 = ss_->CreateAsyncSocket(SOCK_DGRAM); | 806 AsyncSocket* socket2 = ss_.CreateAsyncSocket(SOCK_DGRAM); |
807 socket2->Bind(client_addr); | 807 socket2->Bind(client_addr); |
808 TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2)); | 808 auto client2 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket2)); |
809 SocketAddress client2_addr; | 809 SocketAddress client2_addr; |
810 | 810 |
811 if (shouldSucceed) { | 811 if (shouldSucceed) { |
812 EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr)); | 812 EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr)); |
813 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); | 813 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); |
814 SocketAddress client1_addr; | 814 SocketAddress client1_addr; |
815 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); | 815 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); |
816 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); | 816 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); |
817 EXPECT_EQ(client1_addr, bound_server_addr); | 817 EXPECT_EQ(client1_addr, bound_server_addr); |
818 } else { | 818 } else { |
819 EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr)); | 819 EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr)); |
820 EXPECT_TRUE(client1->CheckNoPacket()); | 820 EXPECT_TRUE(client1->CheckNoPacket()); |
821 } | 821 } |
822 } | 822 } |
823 | 823 |
824 protected: | 824 protected: |
825 virtual void SetUp() { | 825 virtual void SetUp() { Thread::Current()->set_socketserver(&ss_); } |
826 Thread::Current()->set_socketserver(ss_); | |
827 } | |
828 virtual void TearDown() { Thread::Current()->set_socketserver(nullptr); } | 826 virtual void TearDown() { Thread::Current()->set_socketserver(nullptr); } |
829 | 827 |
830 VirtualSocketServer* ss_; | 828 VirtualSocketServer ss_; |
831 const SocketAddress kIPv4AnyAddress; | 829 const SocketAddress kIPv4AnyAddress; |
832 const SocketAddress kIPv6AnyAddress; | 830 const SocketAddress kIPv6AnyAddress; |
833 }; | 831 }; |
834 | 832 |
835 TEST_F(VirtualSocketServerTest, basic_v4) { | 833 TEST_F(VirtualSocketServerTest, basic_v4) { |
836 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000); | 834 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000); |
837 BasicTest(ipv4_test_addr); | 835 BasicTest(ipv4_test_addr); |
838 } | 836 } |
839 | 837 |
840 TEST_F(VirtualSocketServerTest, basic_v6) { | 838 TEST_F(VirtualSocketServerTest, basic_v6) { |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1018 } | 1016 } |
1019 | 1017 |
1020 TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) { | 1018 TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) { |
1021 CrossFamilyDatagramTest(SocketAddress("::", 0), | 1019 CrossFamilyDatagramTest(SocketAddress("::", 0), |
1022 SocketAddress("0.0.0.0", 5000), | 1020 SocketAddress("0.0.0.0", 5000), |
1023 true); | 1021 true); |
1024 } | 1022 } |
1025 | 1023 |
1026 TEST_F(VirtualSocketServerTest, SetSendingBlockedWithUdpSocket) { | 1024 TEST_F(VirtualSocketServerTest, SetSendingBlockedWithUdpSocket) { |
1027 AsyncSocket* socket1 = | 1025 AsyncSocket* socket1 = |
1028 ss_->CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM); | 1026 ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM); |
1029 AsyncSocket* socket2 = | 1027 AsyncSocket* socket2 = |
1030 ss_->CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM); | 1028 ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM); |
1031 socket1->Bind(kIPv4AnyAddress); | 1029 socket1->Bind(kIPv4AnyAddress); |
1032 socket2->Bind(kIPv4AnyAddress); | 1030 socket2->Bind(kIPv4AnyAddress); |
1033 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket1)); | 1031 auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket1)); |
1034 | 1032 |
1035 ss_->SetSendingBlocked(true); | 1033 ss_.SetSendingBlocked(true); |
1036 EXPECT_EQ(-1, client1->SendTo("foo", 3, socket2->GetLocalAddress())); | 1034 EXPECT_EQ(-1, client1->SendTo("foo", 3, socket2->GetLocalAddress())); |
1037 EXPECT_TRUE(socket1->IsBlocking()); | 1035 EXPECT_TRUE(socket1->IsBlocking()); |
1038 EXPECT_EQ(0, client1->ready_to_send_count()); | 1036 EXPECT_EQ(0, client1->ready_to_send_count()); |
1039 | 1037 |
1040 ss_->SetSendingBlocked(false); | 1038 ss_.SetSendingBlocked(false); |
1041 EXPECT_EQ(1, client1->ready_to_send_count()); | 1039 EXPECT_EQ(1, client1->ready_to_send_count()); |
1042 EXPECT_EQ(3, client1->SendTo("foo", 3, socket2->GetLocalAddress())); | 1040 EXPECT_EQ(3, client1->SendTo("foo", 3, socket2->GetLocalAddress())); |
1043 } | 1041 } |
1044 | 1042 |
1045 TEST_F(VirtualSocketServerTest, SetSendingBlockedWithTcpSocket) { | 1043 TEST_F(VirtualSocketServerTest, SetSendingBlockedWithTcpSocket) { |
1046 constexpr size_t kBufferSize = 1024; | 1044 constexpr size_t kBufferSize = 1024; |
1047 ss_->set_send_buffer_capacity(kBufferSize); | 1045 ss_.set_send_buffer_capacity(kBufferSize); |
1048 ss_->set_recv_buffer_capacity(kBufferSize); | 1046 ss_.set_recv_buffer_capacity(kBufferSize); |
1049 | 1047 |
1050 StreamSink sink; | 1048 StreamSink sink; |
1051 AsyncSocket* socket1 = | 1049 AsyncSocket* socket1 = |
1052 ss_->CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM); | 1050 ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM); |
1053 AsyncSocket* socket2 = | 1051 AsyncSocket* socket2 = |
1054 ss_->CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM); | 1052 ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM); |
1055 sink.Monitor(socket1); | 1053 sink.Monitor(socket1); |
1056 sink.Monitor(socket2); | 1054 sink.Monitor(socket2); |
1057 socket1->Bind(kIPv4AnyAddress); | 1055 socket1->Bind(kIPv4AnyAddress); |
1058 socket2->Bind(kIPv4AnyAddress); | 1056 socket2->Bind(kIPv4AnyAddress); |
1059 | 1057 |
1060 // Connect sockets. | 1058 // Connect sockets. |
1061 EXPECT_EQ(0, socket1->Connect(socket2->GetLocalAddress())); | 1059 EXPECT_EQ(0, socket1->Connect(socket2->GetLocalAddress())); |
1062 EXPECT_EQ(0, socket2->Connect(socket1->GetLocalAddress())); | 1060 EXPECT_EQ(0, socket2->Connect(socket1->GetLocalAddress())); |
1063 ss_->ProcessMessagesUntilIdle(); | 1061 ss_.ProcessMessagesUntilIdle(); |
1064 | 1062 |
1065 char data[kBufferSize] = {}; | 1063 char data[kBufferSize] = {}; |
1066 | 1064 |
1067 // First Send call will fill the send buffer but not send anything. | 1065 // First Send call will fill the send buffer but not send anything. |
1068 ss_->SetSendingBlocked(true); | 1066 ss_.SetSendingBlocked(true); |
1069 EXPECT_EQ(static_cast<int>(kBufferSize), socket1->Send(data, kBufferSize)); | 1067 EXPECT_EQ(static_cast<int>(kBufferSize), socket1->Send(data, kBufferSize)); |
1070 ss_->ProcessMessagesUntilIdle(); | 1068 ss_.ProcessMessagesUntilIdle(); |
1071 EXPECT_FALSE(sink.Check(socket1, SSE_WRITE)); | 1069 EXPECT_FALSE(sink.Check(socket1, SSE_WRITE)); |
1072 EXPECT_FALSE(sink.Check(socket2, SSE_READ)); | 1070 EXPECT_FALSE(sink.Check(socket2, SSE_READ)); |
1073 EXPECT_FALSE(socket1->IsBlocking()); | 1071 EXPECT_FALSE(socket1->IsBlocking()); |
1074 | 1072 |
1075 // Since the send buffer is full, next Send will result in EWOULDBLOCK. | 1073 // Since the send buffer is full, next Send will result in EWOULDBLOCK. |
1076 EXPECT_EQ(-1, socket1->Send(data, kBufferSize)); | 1074 EXPECT_EQ(-1, socket1->Send(data, kBufferSize)); |
1077 EXPECT_FALSE(sink.Check(socket1, SSE_WRITE)); | 1075 EXPECT_FALSE(sink.Check(socket1, SSE_WRITE)); |
1078 EXPECT_FALSE(sink.Check(socket2, SSE_READ)); | 1076 EXPECT_FALSE(sink.Check(socket2, SSE_READ)); |
1079 EXPECT_TRUE(socket1->IsBlocking()); | 1077 EXPECT_TRUE(socket1->IsBlocking()); |
1080 | 1078 |
1081 // When sending is unblocked, the buffered data should be sent and | 1079 // When sending is unblocked, the buffered data should be sent and |
1082 // SignalWriteEvent should fire. | 1080 // SignalWriteEvent should fire. |
1083 ss_->SetSendingBlocked(false); | 1081 ss_.SetSendingBlocked(false); |
1084 ss_->ProcessMessagesUntilIdle(); | 1082 ss_.ProcessMessagesUntilIdle(); |
1085 EXPECT_TRUE(sink.Check(socket1, SSE_WRITE)); | 1083 EXPECT_TRUE(sink.Check(socket1, SSE_WRITE)); |
1086 EXPECT_TRUE(sink.Check(socket2, SSE_READ)); | 1084 EXPECT_TRUE(sink.Check(socket2, SSE_READ)); |
1087 } | 1085 } |
1088 | 1086 |
1089 TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) { | 1087 TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) { |
1090 const uint32_t kTestMean[] = {10, 100, 333, 1000}; | 1088 const uint32_t kTestMean[] = {10, 100, 333, 1000}; |
1091 const double kTestDev[] = { 0.25, 0.1, 0.01 }; | 1089 const double kTestDev[] = { 0.25, 0.1, 0.01 }; |
1092 // TODO(deadbeef): The current code only works for 1000 data points or more. | 1090 // TODO(deadbeef): The current code only works for 1000 data points or more. |
1093 const uint32_t kTestSamples[] = {/*10, 100,*/ 1000}; | 1091 const uint32_t kTestSamples[] = {/*10, 100,*/ 1000}; |
1094 for (size_t midx = 0; midx < arraysize(kTestMean); ++midx) { | 1092 for (size_t midx = 0; midx < arraysize(kTestMean); ++midx) { |
(...skipping 25 matching lines...) Expand all Loading... |
1120 << " N=" << kTestSamples[sidx]; | 1118 << " N=" << kTestSamples[sidx]; |
1121 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev) | 1119 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev) |
1122 << "M=" << kTestMean[midx] | 1120 << "M=" << kTestMean[midx] |
1123 << " SD=" << kStdDev | 1121 << " SD=" << kStdDev |
1124 << " N=" << kTestSamples[sidx]; | 1122 << " N=" << kTestSamples[sidx]; |
1125 delete f; | 1123 delete f; |
1126 } | 1124 } |
1127 } | 1125 } |
1128 } | 1126 } |
1129 } | 1127 } |
OLD | NEW |