Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(140)

Side by Side Diff: webrtc/base/virtualsocket_unittest.cc

Issue 2859373003: Refactor TestClient to use std::unique_ptr, and fix VirtualSocketServerTest leaks. (Closed)
Patch Set: Comment fix, 0 -> null. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/base/testclient_unittest.cc ('k') | webrtc/p2p/base/relayserver_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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 =
Taylor Brandstetter 2017/05/07 21:37:00 Would be better to use MakeUnique here rather than
nisse-webrtc 2017/05/08 07:51:15 I think AsyncUDPSocket takes over ownership, via a
kwiberg-webrtc 2017/05/08 10:21:26 I would definitely say that using unique_ptr here
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
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
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 }
OLDNEW
« no previous file with comments | « webrtc/base/testclient_unittest.cc ('k') | webrtc/p2p/base/relayserver_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698