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

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: Fix more leaks in VirtualSocketServerTest. 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 =
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 std::unique_ptr<AsyncSocket> client =
256 SOCK_STREAM); 258 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
257 sink.Monitor(client); 259 sink.Monitor(client.get());
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 std::unique_ptr<AsyncSocket> server =
263 SOCK_STREAM); 265 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
264 sink.Monitor(server); 266 sink.Monitor(server.get());
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.get(), 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.get(), SSE_OPEN));
285 EXPECT_FALSE(sink.Check(client, SSE_CLOSE)); 287 EXPECT_FALSE(sink.Check(client.get(), 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.get(), SSE_OPEN));
292 EXPECT_FALSE(sink.Check(client, SSE_CLOSE)); 294 EXPECT_FALSE(sink.Check(client.get(), 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.get(), SSE_READ));
296 Socket* accepted = server->Accept(&accept_addr); 298 std::unique_ptr<Socket> accepted = WrapUnique(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.get(), SSE_OPEN));
310 EXPECT_FALSE(sink.Check(client, SSE_CLOSE)); 312 EXPECT_FALSE(sink.Check(client.get(), 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 std::unique_ptr<AsyncSocket> client =
324 SOCK_STREAM); 326 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
325 sink.Monitor(client); 327 sink.Monitor(client.get());
326 328
327 // Create server 329 // Create server
328 AsyncSocket* server = ss_->CreateAsyncSocket(initial_addr.family(), 330 std::unique_ptr<AsyncSocket> server =
329 SOCK_STREAM); 331 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
330 sink.Monitor(server); 332 sink.Monitor(server.get());
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.get(), 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.get(), SSE_OPEN));
346 EXPECT_TRUE(sink.Check(client, SSE_ERROR)); 348 EXPECT_TRUE(sink.Check(client.get(), 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 std::unique_ptr<AsyncSocket> a =
443 sink.Monitor(a); 445 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
446 sink.Monitor(a.get());
444 a->Bind(initial_addr); 447 a->Bind(initial_addr);
445 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); 448 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
446 449
447 std::unique_ptr<AsyncSocket> b( 450 std::unique_ptr<AsyncSocket> b =
448 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); 451 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
449 sink.Monitor(b.get()); 452 sink.Monitor(b.get());
450 b->Bind(initial_addr); 453 b->Bind(initial_addr);
451 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); 454 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
452 455
453 EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); 456 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
454 EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); 457 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
455 458
456 ss_->ProcessMessagesUntilIdle(); 459 ss_.ProcessMessagesUntilIdle();
457 460
458 EXPECT_TRUE(sink.Check(a, SSE_OPEN)); 461 EXPECT_TRUE(sink.Check(a.get(), SSE_OPEN));
459 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CONNECTED); 462 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CONNECTED);
460 EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress()); 463 EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress());
461 464
462 EXPECT_TRUE(sink.Check(b.get(), SSE_OPEN)); 465 EXPECT_TRUE(sink.Check(b.get(), SSE_OPEN));
463 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CONNECTED); 466 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CONNECTED);
464 EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress()); 467 EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress());
465 468
466 EXPECT_EQ(1, a->Send("a", 1)); 469 EXPECT_EQ(1, a->Send("a", 1));
467 b->Close(); 470 b->Close();
468 EXPECT_EQ(1, a->Send("b", 1)); 471 EXPECT_EQ(1, a->Send("b", 1));
469 472
470 ss_->ProcessMessagesUntilIdle(); 473 ss_.ProcessMessagesUntilIdle();
471 474
472 char buffer[10]; 475 char buffer[10];
473 EXPECT_FALSE(sink.Check(b.get(), SSE_READ)); 476 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
474 EXPECT_EQ(-1, b->Recv(buffer, 10, nullptr)); 477 EXPECT_EQ(-1, b->Recv(buffer, 10, nullptr));
475 478
476 EXPECT_TRUE(sink.Check(a, SSE_CLOSE)); 479 EXPECT_TRUE(sink.Check(a.get(), SSE_CLOSE));
477 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CLOSED); 480 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CLOSED);
478 EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr); 481 EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr);
479 482
480 // No signal for Closer 483 // No signal for Closer
481 EXPECT_FALSE(sink.Check(b.get(), SSE_CLOSE)); 484 EXPECT_FALSE(sink.Check(b.get(), SSE_CLOSE));
482 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CLOSED); 485 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CLOSED);
483 EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr); 486 EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr);
484 } 487 }
485 488
486 void TcpSendTest(const SocketAddress& initial_addr) { 489 void TcpSendTest(const SocketAddress& initial_addr) {
487 StreamSink sink; 490 StreamSink sink;
488 const SocketAddress kEmptyAddr; 491 const SocketAddress kEmptyAddr;
489 492
490 // Connect two sockets 493 // Connect two sockets
491 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); 494 std::unique_ptr<AsyncSocket> a =
492 sink.Monitor(a); 495 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
496 sink.Monitor(a.get());
493 a->Bind(initial_addr); 497 a->Bind(initial_addr);
494 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); 498 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
495 499
496 AsyncSocket* b = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); 500 std::unique_ptr<AsyncSocket> b =
497 sink.Monitor(b); 501 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
502 sink.Monitor(b.get());
498 b->Bind(initial_addr); 503 b->Bind(initial_addr);
499 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); 504 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
500 505
501 EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); 506 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
502 EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); 507 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
503 508
504 ss_->ProcessMessagesUntilIdle(); 509 ss_.ProcessMessagesUntilIdle();
505 510
506 const size_t kBufferSize = 2000; 511 const size_t kBufferSize = 2000;
507 ss_->set_send_buffer_capacity(kBufferSize); 512 ss_.set_send_buffer_capacity(kBufferSize);
508 ss_->set_recv_buffer_capacity(kBufferSize); 513 ss_.set_recv_buffer_capacity(kBufferSize);
509 514
510 const size_t kDataSize = 5000; 515 const size_t kDataSize = 5000;
511 char send_buffer[kDataSize], recv_buffer[kDataSize]; 516 char send_buffer[kDataSize], recv_buffer[kDataSize];
512 for (size_t i = 0; i < kDataSize; ++i) 517 for (size_t i = 0; i < kDataSize; ++i)
513 send_buffer[i] = static_cast<char>(i % 256); 518 send_buffer[i] = static_cast<char>(i % 256);
514 memset(recv_buffer, 0, sizeof(recv_buffer)); 519 memset(recv_buffer, 0, sizeof(recv_buffer));
515 size_t send_pos = 0, recv_pos = 0; 520 size_t send_pos = 0, recv_pos = 0;
516 521
517 // Can't send more than send buffer in one write 522 // Can't send more than send buffer in one write
518 int result = a->Send(send_buffer + send_pos, kDataSize - send_pos); 523 int result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
519 EXPECT_EQ(static_cast<int>(kBufferSize), result); 524 EXPECT_EQ(static_cast<int>(kBufferSize), result);
520 send_pos += result; 525 send_pos += result;
521 526
522 ss_->ProcessMessagesUntilIdle(); 527 ss_.ProcessMessagesUntilIdle();
523 EXPECT_FALSE(sink.Check(a, SSE_WRITE)); 528 EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE));
524 EXPECT_TRUE(sink.Check(b, SSE_READ)); 529 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
525 530
526 // Receive buffer is already filled, fill send buffer again 531 // Receive buffer is already filled, fill send buffer again
527 result = a->Send(send_buffer + send_pos, kDataSize - send_pos); 532 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
528 EXPECT_EQ(static_cast<int>(kBufferSize), result); 533 EXPECT_EQ(static_cast<int>(kBufferSize), result);
529 send_pos += result; 534 send_pos += result;
530 535
531 ss_->ProcessMessagesUntilIdle(); 536 ss_.ProcessMessagesUntilIdle();
532 EXPECT_FALSE(sink.Check(a, SSE_WRITE)); 537 EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE));
533 EXPECT_FALSE(sink.Check(b, SSE_READ)); 538 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
534 539
535 // No more room in send or receive buffer 540 // No more room in send or receive buffer
536 result = a->Send(send_buffer + send_pos, kDataSize - send_pos); 541 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
537 EXPECT_EQ(-1, result); 542 EXPECT_EQ(-1, result);
538 EXPECT_TRUE(a->IsBlocking()); 543 EXPECT_TRUE(a->IsBlocking());
539 544
540 // Read a subset of the data 545 // Read a subset of the data
541 result = b->Recv(recv_buffer + recv_pos, 500, nullptr); 546 result = b->Recv(recv_buffer + recv_pos, 500, nullptr);
542 EXPECT_EQ(500, result); 547 EXPECT_EQ(500, result);
543 recv_pos += result; 548 recv_pos += result;
544 549
545 ss_->ProcessMessagesUntilIdle(); 550 ss_.ProcessMessagesUntilIdle();
546 EXPECT_TRUE(sink.Check(a, SSE_WRITE)); 551 EXPECT_TRUE(sink.Check(a.get(), SSE_WRITE));
547 EXPECT_TRUE(sink.Check(b, SSE_READ)); 552 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
548 553
549 // Room for more on the sending side 554 // Room for more on the sending side
550 result = a->Send(send_buffer + send_pos, kDataSize - send_pos); 555 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
551 EXPECT_EQ(500, result); 556 EXPECT_EQ(500, result);
552 send_pos += result; 557 send_pos += result;
553 558
554 // Empty the recv buffer 559 // Empty the recv buffer
555 while (true) { 560 while (true) {
556 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr); 561 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
557 if (result < 0) { 562 if (result < 0) {
558 EXPECT_EQ(-1, result); 563 EXPECT_EQ(-1, result);
559 EXPECT_TRUE(b->IsBlocking()); 564 EXPECT_TRUE(b->IsBlocking());
560 break; 565 break;
561 } 566 }
562 recv_pos += result; 567 recv_pos += result;
563 } 568 }
564 569
565 ss_->ProcessMessagesUntilIdle(); 570 ss_.ProcessMessagesUntilIdle();
566 EXPECT_TRUE(sink.Check(b, SSE_READ)); 571 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
567 572
568 // Continue to empty the recv buffer 573 // Continue to empty the recv buffer
569 while (true) { 574 while (true) {
570 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr); 575 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
571 if (result < 0) { 576 if (result < 0) {
572 EXPECT_EQ(-1, result); 577 EXPECT_EQ(-1, result);
573 EXPECT_TRUE(b->IsBlocking()); 578 EXPECT_TRUE(b->IsBlocking());
574 break; 579 break;
575 } 580 }
576 recv_pos += result; 581 recv_pos += result;
577 } 582 }
578 583
579 // Send last of the data 584 // Send last of the data
580 result = a->Send(send_buffer + send_pos, kDataSize - send_pos); 585 result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
581 EXPECT_EQ(500, result); 586 EXPECT_EQ(500, result);
582 send_pos += result; 587 send_pos += result;
583 588
584 ss_->ProcessMessagesUntilIdle(); 589 ss_.ProcessMessagesUntilIdle();
585 EXPECT_TRUE(sink.Check(b, SSE_READ)); 590 EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
586 591
587 // Receive the last of the data 592 // Receive the last of the data
588 while (true) { 593 while (true) {
589 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr); 594 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
590 if (result < 0) { 595 if (result < 0) {
591 EXPECT_EQ(-1, result); 596 EXPECT_EQ(-1, result);
592 EXPECT_TRUE(b->IsBlocking()); 597 EXPECT_TRUE(b->IsBlocking());
593 break; 598 break;
594 } 599 }
595 recv_pos += result; 600 recv_pos += result;
596 } 601 }
597 602
598 ss_->ProcessMessagesUntilIdle(); 603 ss_.ProcessMessagesUntilIdle();
599 EXPECT_FALSE(sink.Check(b, SSE_READ)); 604 EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
600 605
601 // The received data matches the sent data 606 // The received data matches the sent data
602 EXPECT_EQ(kDataSize, send_pos); 607 EXPECT_EQ(kDataSize, send_pos);
603 EXPECT_EQ(kDataSize, recv_pos); 608 EXPECT_EQ(kDataSize, recv_pos);
604 EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize)); 609 EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize));
605 } 610 }
606 611
607 void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) { 612 void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) {
608 const SocketAddress kEmptyAddr; 613 const SocketAddress kEmptyAddr;
609 614
610 // Connect two sockets 615 // Connect two sockets
611 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), 616 std::unique_ptr<AsyncSocket> a =
612 SOCK_STREAM); 617 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
613 AsyncSocket* b = ss_->CreateAsyncSocket(initial_addr.family(), 618 std::unique_ptr<AsyncSocket> b =
614 SOCK_STREAM); 619 WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
615 a->Bind(initial_addr); 620 a->Bind(initial_addr);
616 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); 621 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
617 622
618 b->Bind(initial_addr); 623 b->Bind(initial_addr);
619 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); 624 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
620 625
621 EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); 626 EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
622 EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); 627 EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
623 ss_->ProcessMessagesUntilIdle(); 628 ss_.ProcessMessagesUntilIdle();
624 629
625 // First, deliver all packets in 0 ms. 630 // First, deliver all packets in 0 ms.
626 char buffer[2] = { 0, 0 }; 631 char buffer[2] = { 0, 0 };
627 const char cNumPackets = 10; 632 const char cNumPackets = 10;
628 for (char i = 0; i < cNumPackets; ++i) { 633 for (char i = 0; i < cNumPackets; ++i) {
629 buffer[0] = '0' + i; 634 buffer[0] = '0' + i;
630 EXPECT_EQ(1, a->Send(buffer, 1)); 635 EXPECT_EQ(1, a->Send(buffer, 1));
631 } 636 }
632 637
633 ss_->ProcessMessagesUntilIdle(); 638 ss_.ProcessMessagesUntilIdle();
634 639
635 for (char i = 0; i < cNumPackets; ++i) { 640 for (char i = 0; i < cNumPackets; ++i) {
636 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr)); 641 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
637 EXPECT_EQ(static_cast<char>('0' + i), buffer[0]); 642 EXPECT_EQ(static_cast<char>('0' + i), buffer[0]);
638 } 643 }
639 644
640 // Next, deliver packets at random intervals 645 // Next, deliver packets at random intervals
641 const uint32_t mean = 50; 646 const uint32_t mean = 50;
642 const uint32_t stddev = 50; 647 const uint32_t stddev = 50;
643 648
644 ss_->set_delay_mean(mean); 649 ss_.set_delay_mean(mean);
645 ss_->set_delay_stddev(stddev); 650 ss_.set_delay_stddev(stddev);
646 ss_->UpdateDelayDistribution(); 651 ss_.UpdateDelayDistribution();
647 652
648 for (char i = 0; i < cNumPackets; ++i) { 653 for (char i = 0; i < cNumPackets; ++i) {
649 buffer[0] = 'A' + i; 654 buffer[0] = 'A' + i;
650 EXPECT_EQ(1, a->Send(buffer, 1)); 655 EXPECT_EQ(1, a->Send(buffer, 1));
651 } 656 }
652 657
653 ss_->ProcessMessagesUntilIdle(); 658 ss_.ProcessMessagesUntilIdle();
654 659
655 for (char i = 0; i < cNumPackets; ++i) { 660 for (char i = 0; i < cNumPackets; ++i) {
656 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr)); 661 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
657 EXPECT_EQ(static_cast<char>('A' + i), buffer[0]); 662 EXPECT_EQ(static_cast<char>('A' + i), buffer[0]);
658 } 663 }
659 } 664 }
660 665
661 // It is important that initial_addr's port has to be 0 such that the 666 // 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 667 // incremental port behavior could ensure the 2 Binds result in different
663 // address. 668 // address.
664 void BandwidthTest(const SocketAddress& initial_addr) { 669 void BandwidthTest(const SocketAddress& initial_addr) {
665 AsyncSocket* send_socket = 670 AsyncSocket* send_socket =
666 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); 671 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
667 AsyncSocket* recv_socket = 672 AsyncSocket* recv_socket =
668 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); 673 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
669 ASSERT_EQ(0, send_socket->Bind(initial_addr)); 674 ASSERT_EQ(0, send_socket->Bind(initial_addr));
670 ASSERT_EQ(0, recv_socket->Bind(initial_addr)); 675 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
671 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family()); 676 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
672 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family()); 677 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
673 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress())); 678 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
674 679
675 uint32_t bandwidth = 64 * 1024; 680 uint32_t bandwidth = 64 * 1024;
676 ss_->set_bandwidth(bandwidth); 681 ss_.set_bandwidth(bandwidth);
677 682
678 Thread* pthMain = Thread::Current(); 683 Thread* pthMain = Thread::Current();
679 Sender sender(pthMain, send_socket, 80 * 1024); 684 Sender sender(pthMain, send_socket, 80 * 1024);
680 Receiver receiver(pthMain, recv_socket, bandwidth); 685 Receiver receiver(pthMain, recv_socket, bandwidth);
681 686
682 pthMain->ProcessMessages(5000); 687 pthMain->ProcessMessages(5000);
683 sender.done = true; 688 sender.done = true;
684 pthMain->ProcessMessages(5000); 689 pthMain->ProcessMessages(5000);
685 690
686 ASSERT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4); 691 ASSERT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4);
687 ASSERT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s 692 ASSERT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s
688 693
689 ss_->set_bandwidth(0); 694 ss_.set_bandwidth(0);
690 } 695 }
691 696
692 // It is important that initial_addr's port has to be 0 such that the 697 // 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 698 // incremental port behavior could ensure the 2 Binds result in different
694 // address. 699 // address.
695 void DelayTest(const SocketAddress& initial_addr) { 700 void DelayTest(const SocketAddress& initial_addr) {
696 time_t seed = ::time(nullptr); 701 time_t seed = ::time(nullptr);
697 LOG(LS_VERBOSE) << "seed = " << seed; 702 LOG(LS_VERBOSE) << "seed = " << seed;
698 srand(static_cast<unsigned int>(seed)); 703 srand(static_cast<unsigned int>(seed));
699 704
700 const uint32_t mean = 2000; 705 const uint32_t mean = 2000;
701 const uint32_t stddev = 500; 706 const uint32_t stddev = 500;
702 707
703 ss_->set_delay_mean(mean); 708 ss_.set_delay_mean(mean);
704 ss_->set_delay_stddev(stddev); 709 ss_.set_delay_stddev(stddev);
705 ss_->UpdateDelayDistribution(); 710 ss_.UpdateDelayDistribution();
706 711
707 AsyncSocket* send_socket = 712 AsyncSocket* send_socket =
708 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); 713 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
709 AsyncSocket* recv_socket = 714 AsyncSocket* recv_socket =
710 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); 715 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
711 ASSERT_EQ(0, send_socket->Bind(initial_addr)); 716 ASSERT_EQ(0, send_socket->Bind(initial_addr));
712 ASSERT_EQ(0, recv_socket->Bind(initial_addr)); 717 ASSERT_EQ(0, recv_socket->Bind(initial_addr));
713 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family()); 718 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
714 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family()); 719 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
715 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress())); 720 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
716 721
717 Thread* pthMain = Thread::Current(); 722 Thread* pthMain = Thread::Current();
718 // Avg packet size is 2K, so at 200KB/s for 10s, we should see about 723 // 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. 724 // 1000 packets, which is necessary to get a good distribution.
720 Sender sender(pthMain, send_socket, 100 * 2 * 1024); 725 Sender sender(pthMain, send_socket, 100 * 2 * 1024);
721 Receiver receiver(pthMain, recv_socket, 0); 726 Receiver receiver(pthMain, recv_socket, 0);
722 727
723 pthMain->ProcessMessages(10000); 728 pthMain->ProcessMessages(10000);
724 sender.done = receiver.done = true; 729 sender.done = receiver.done = true;
725 ss_->ProcessMessagesUntilIdle(); 730 ss_.ProcessMessagesUntilIdle();
726 731
727 const double sample_mean = receiver.sum / receiver.samples; 732 const double sample_mean = receiver.sum / receiver.samples;
728 double num = 733 double num =
729 receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum; 734 receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum;
730 double den = receiver.samples * (receiver.samples - 1); 735 double den = receiver.samples * (receiver.samples - 1);
731 const double sample_stddev = sqrt(num / den); 736 const double sample_stddev = sqrt(num / den);
732 LOG(LS_VERBOSE) << "mean=" << sample_mean << " stddev=" << sample_stddev; 737 LOG(LS_VERBOSE) << "mean=" << sample_mean << " stddev=" << sample_stddev;
733 738
734 EXPECT_LE(500u, receiver.samples); 739 EXPECT_LE(500u, receiver.samples);
735 // We initially used a 0.1 fudge factor, but on the build machine, we 740 // 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. 741 // have seen the value differ by as much as 0.13.
737 EXPECT_NEAR(mean, sample_mean, 0.15 * mean); 742 EXPECT_NEAR(mean, sample_mean, 0.15 * mean);
738 EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev); 743 EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev);
739 744
740 ss_->set_delay_mean(0); 745 ss_.set_delay_mean(0);
741 ss_->set_delay_stddev(0); 746 ss_.set_delay_stddev(0);
742 ss_->UpdateDelayDistribution(); 747 ss_.UpdateDelayDistribution();
743 } 748 }
744 749
745 // Test cross-family communication between a client bound to client_addr and a 750 // Test cross-family communication between a client bound to client_addr and a
746 // server bound to server_addr. shouldSucceed indicates if communication is 751 // server bound to server_addr. shouldSucceed indicates if communication is
747 // expected to work or not. 752 // expected to work or not.
748 void CrossFamilyConnectionTest(const SocketAddress& client_addr, 753 void CrossFamilyConnectionTest(const SocketAddress& client_addr,
749 const SocketAddress& server_addr, 754 const SocketAddress& server_addr,
750 bool shouldSucceed) { 755 bool shouldSucceed) {
751 StreamSink sink; 756 StreamSink sink;
752 SocketAddress accept_address; 757 SocketAddress accept_address;
753 const SocketAddress kEmptyAddr; 758 const SocketAddress kEmptyAddr;
754 759
755 // Client gets a IPv4 address 760 // Client gets a IPv4 address
756 AsyncSocket* client = ss_->CreateAsyncSocket(client_addr.family(), 761 std::unique_ptr<AsyncSocket> client =
757 SOCK_STREAM); 762 WrapUnique(ss_.CreateAsyncSocket(client_addr.family(), SOCK_STREAM));
758 sink.Monitor(client); 763 sink.Monitor(client.get());
759 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); 764 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
760 EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr); 765 EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr);
761 client->Bind(client_addr); 766 client->Bind(client_addr);
762 767
763 // Server gets a non-mapped non-any IPv6 address. 768 // Server gets a non-mapped non-any IPv6 address.
764 // IPv4 sockets should not be able to connect to this. 769 // IPv4 sockets should not be able to connect to this.
765 AsyncSocket* server = ss_->CreateAsyncSocket(server_addr.family(), 770 std::unique_ptr<AsyncSocket> server =
766 SOCK_STREAM); 771 WrapUnique(ss_.CreateAsyncSocket(server_addr.family(), SOCK_STREAM));
767 sink.Monitor(server); 772 sink.Monitor(server.get());
768 server->Bind(server_addr); 773 server->Bind(server_addr);
769 server->Listen(5); 774 server->Listen(5);
770 775
771 if (shouldSucceed) { 776 if (shouldSucceed) {
772 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 777 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
773 ss_->ProcessMessagesUntilIdle(); 778 ss_.ProcessMessagesUntilIdle();
774 EXPECT_TRUE(sink.Check(server, SSE_READ)); 779 EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
775 Socket* accepted = server->Accept(&accept_address); 780 std::unique_ptr<Socket> accepted =
781 WrapUnique(server->Accept(&accept_address));
776 EXPECT_TRUE(nullptr != accepted); 782 EXPECT_TRUE(nullptr != accepted);
777 EXPECT_NE(kEmptyAddr, accept_address); 783 EXPECT_NE(kEmptyAddr, accept_address);
778 ss_->ProcessMessagesUntilIdle(); 784 ss_.ProcessMessagesUntilIdle();
779 EXPECT_TRUE(sink.Check(client, SSE_OPEN)); 785 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
780 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); 786 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
781 } else { 787 } else {
782 // Check that the connection failed. 788 // Check that the connection failed.
783 EXPECT_EQ(-1, client->Connect(server->GetLocalAddress())); 789 EXPECT_EQ(-1, client->Connect(server->GetLocalAddress()));
784 ss_->ProcessMessagesUntilIdle(); 790 ss_.ProcessMessagesUntilIdle();
785 791
786 EXPECT_FALSE(sink.Check(server, SSE_READ)); 792 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
787 EXPECT_TRUE(nullptr == server->Accept(&accept_address)); 793 EXPECT_TRUE(nullptr == server->Accept(&accept_address));
788 EXPECT_EQ(accept_address, kEmptyAddr); 794 EXPECT_EQ(accept_address, kEmptyAddr);
789 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); 795 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
790 EXPECT_FALSE(sink.Check(client, SSE_OPEN)); 796 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
791 EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr); 797 EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr);
792 } 798 }
793 } 799 }
794 800
795 // Test cross-family datagram sending between a client bound to client_addr 801 // 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 802 // and a server bound to server_addr. shouldSucceed indicates if sending is
797 // expected to succeed or not. 803 // expected to succeed or not.
798 void CrossFamilyDatagramTest(const SocketAddress& client_addr, 804 void CrossFamilyDatagramTest(const SocketAddress& client_addr,
799 const SocketAddress& server_addr, 805 const SocketAddress& server_addr,
800 bool shouldSucceed) { 806 bool shouldSucceed) {
801 AsyncSocket* socket = ss_->CreateAsyncSocket(SOCK_DGRAM); 807 AsyncSocket* socket = ss_.CreateAsyncSocket(SOCK_DGRAM);
802 socket->Bind(server_addr); 808 socket->Bind(server_addr);
803 SocketAddress bound_server_addr = socket->GetLocalAddress(); 809 SocketAddress bound_server_addr = socket->GetLocalAddress();
804 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket)); 810 auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket));
805 811
806 AsyncSocket* socket2 = ss_->CreateAsyncSocket(SOCK_DGRAM); 812 AsyncSocket* socket2 = ss_.CreateAsyncSocket(SOCK_DGRAM);
807 socket2->Bind(client_addr); 813 socket2->Bind(client_addr);
808 TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2)); 814 auto client2 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket2));
809 SocketAddress client2_addr; 815 SocketAddress client2_addr;
810 816
811 if (shouldSucceed) { 817 if (shouldSucceed) {
812 EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr)); 818 EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr));
813 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); 819 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
814 SocketAddress client1_addr; 820 SocketAddress client1_addr;
815 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); 821 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
816 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); 822 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
817 EXPECT_EQ(client1_addr, bound_server_addr); 823 EXPECT_EQ(client1_addr, bound_server_addr);
818 } else { 824 } else {
819 EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr)); 825 EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr));
820 EXPECT_TRUE(client1->CheckNoPacket()); 826 EXPECT_TRUE(client1->CheckNoPacket());
821 } 827 }
822 } 828 }
823 829
824 protected: 830 protected:
825 virtual void SetUp() { 831 virtual void SetUp() { Thread::Current()->set_socketserver(&ss_); }
826 Thread::Current()->set_socketserver(ss_);
827 }
828 virtual void TearDown() { Thread::Current()->set_socketserver(nullptr); } 832 virtual void TearDown() { Thread::Current()->set_socketserver(nullptr); }
829 833
830 VirtualSocketServer* ss_; 834 VirtualSocketServer ss_;
831 const SocketAddress kIPv4AnyAddress; 835 const SocketAddress kIPv4AnyAddress;
832 const SocketAddress kIPv6AnyAddress; 836 const SocketAddress kIPv6AnyAddress;
833 }; 837 };
834 838
835 TEST_F(VirtualSocketServerTest, basic_v4) { 839 TEST_F(VirtualSocketServerTest, basic_v4) {
836 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000); 840 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000);
837 BasicTest(ipv4_test_addr); 841 BasicTest(ipv4_test_addr);
838 } 842 }
839 843
840 TEST_F(VirtualSocketServerTest, basic_v6) { 844 TEST_F(VirtualSocketServerTest, basic_v6) {
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
1018 } 1022 }
1019 1023
1020 TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) { 1024 TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) {
1021 CrossFamilyDatagramTest(SocketAddress("::", 0), 1025 CrossFamilyDatagramTest(SocketAddress("::", 0),
1022 SocketAddress("0.0.0.0", 5000), 1026 SocketAddress("0.0.0.0", 5000),
1023 true); 1027 true);
1024 } 1028 }
1025 1029
1026 TEST_F(VirtualSocketServerTest, SetSendingBlockedWithUdpSocket) { 1030 TEST_F(VirtualSocketServerTest, SetSendingBlockedWithUdpSocket) {
1027 AsyncSocket* socket1 = 1031 AsyncSocket* socket1 =
1028 ss_->CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM); 1032 ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM);
1029 AsyncSocket* socket2 = 1033 std::unique_ptr<AsyncSocket> socket2 =
1030 ss_->CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM); 1034 WrapUnique(ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM));
1031 socket1->Bind(kIPv4AnyAddress); 1035 socket1->Bind(kIPv4AnyAddress);
1032 socket2->Bind(kIPv4AnyAddress); 1036 socket2->Bind(kIPv4AnyAddress);
1033 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket1)); 1037 auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket1));
1034 1038
1035 ss_->SetSendingBlocked(true); 1039 ss_.SetSendingBlocked(true);
1036 EXPECT_EQ(-1, client1->SendTo("foo", 3, socket2->GetLocalAddress())); 1040 EXPECT_EQ(-1, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1037 EXPECT_TRUE(socket1->IsBlocking()); 1041 EXPECT_TRUE(socket1->IsBlocking());
1038 EXPECT_EQ(0, client1->ready_to_send_count()); 1042 EXPECT_EQ(0, client1->ready_to_send_count());
1039 1043
1040 ss_->SetSendingBlocked(false); 1044 ss_.SetSendingBlocked(false);
1041 EXPECT_EQ(1, client1->ready_to_send_count()); 1045 EXPECT_EQ(1, client1->ready_to_send_count());
1042 EXPECT_EQ(3, client1->SendTo("foo", 3, socket2->GetLocalAddress())); 1046 EXPECT_EQ(3, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
1043 } 1047 }
1044 1048
1045 TEST_F(VirtualSocketServerTest, SetSendingBlockedWithTcpSocket) { 1049 TEST_F(VirtualSocketServerTest, SetSendingBlockedWithTcpSocket) {
1046 constexpr size_t kBufferSize = 1024; 1050 constexpr size_t kBufferSize = 1024;
1047 ss_->set_send_buffer_capacity(kBufferSize); 1051 ss_.set_send_buffer_capacity(kBufferSize);
1048 ss_->set_recv_buffer_capacity(kBufferSize); 1052 ss_.set_recv_buffer_capacity(kBufferSize);
1049 1053
1050 StreamSink sink; 1054 StreamSink sink;
1051 AsyncSocket* socket1 = 1055 std::unique_ptr<AsyncSocket> socket1 =
1052 ss_->CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM); 1056 WrapUnique(ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
1053 AsyncSocket* socket2 = 1057 std::unique_ptr<AsyncSocket> socket2 =
1054 ss_->CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM); 1058 WrapUnique(ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
1055 sink.Monitor(socket1); 1059 sink.Monitor(socket1.get());
1056 sink.Monitor(socket2); 1060 sink.Monitor(socket2.get());
1057 socket1->Bind(kIPv4AnyAddress); 1061 socket1->Bind(kIPv4AnyAddress);
1058 socket2->Bind(kIPv4AnyAddress); 1062 socket2->Bind(kIPv4AnyAddress);
1059 1063
1060 // Connect sockets. 1064 // Connect sockets.
1061 EXPECT_EQ(0, socket1->Connect(socket2->GetLocalAddress())); 1065 EXPECT_EQ(0, socket1->Connect(socket2->GetLocalAddress()));
1062 EXPECT_EQ(0, socket2->Connect(socket1->GetLocalAddress())); 1066 EXPECT_EQ(0, socket2->Connect(socket1->GetLocalAddress()));
1063 ss_->ProcessMessagesUntilIdle(); 1067 ss_.ProcessMessagesUntilIdle();
1064 1068
1065 char data[kBufferSize] = {}; 1069 char data[kBufferSize] = {};
1066 1070
1067 // First Send call will fill the send buffer but not send anything. 1071 // First Send call will fill the send buffer but not send anything.
1068 ss_->SetSendingBlocked(true); 1072 ss_.SetSendingBlocked(true);
1069 EXPECT_EQ(static_cast<int>(kBufferSize), socket1->Send(data, kBufferSize)); 1073 EXPECT_EQ(static_cast<int>(kBufferSize), socket1->Send(data, kBufferSize));
1070 ss_->ProcessMessagesUntilIdle(); 1074 ss_.ProcessMessagesUntilIdle();
1071 EXPECT_FALSE(sink.Check(socket1, SSE_WRITE)); 1075 EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
1072 EXPECT_FALSE(sink.Check(socket2, SSE_READ)); 1076 EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
1073 EXPECT_FALSE(socket1->IsBlocking()); 1077 EXPECT_FALSE(socket1->IsBlocking());
1074 1078
1075 // Since the send buffer is full, next Send will result in EWOULDBLOCK. 1079 // Since the send buffer is full, next Send will result in EWOULDBLOCK.
1076 EXPECT_EQ(-1, socket1->Send(data, kBufferSize)); 1080 EXPECT_EQ(-1, socket1->Send(data, kBufferSize));
1077 EXPECT_FALSE(sink.Check(socket1, SSE_WRITE)); 1081 EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
1078 EXPECT_FALSE(sink.Check(socket2, SSE_READ)); 1082 EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
1079 EXPECT_TRUE(socket1->IsBlocking()); 1083 EXPECT_TRUE(socket1->IsBlocking());
1080 1084
1081 // When sending is unblocked, the buffered data should be sent and 1085 // When sending is unblocked, the buffered data should be sent and
1082 // SignalWriteEvent should fire. 1086 // SignalWriteEvent should fire.
1083 ss_->SetSendingBlocked(false); 1087 ss_.SetSendingBlocked(false);
1084 ss_->ProcessMessagesUntilIdle(); 1088 ss_.ProcessMessagesUntilIdle();
1085 EXPECT_TRUE(sink.Check(socket1, SSE_WRITE)); 1089 EXPECT_TRUE(sink.Check(socket1.get(), SSE_WRITE));
1086 EXPECT_TRUE(sink.Check(socket2, SSE_READ)); 1090 EXPECT_TRUE(sink.Check(socket2.get(), SSE_READ));
1087 } 1091 }
1088 1092
1089 TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) { 1093 TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) {
1090 const uint32_t kTestMean[] = {10, 100, 333, 1000}; 1094 const uint32_t kTestMean[] = {10, 100, 333, 1000};
1091 const double kTestDev[] = { 0.25, 0.1, 0.01 }; 1095 const double kTestDev[] = { 0.25, 0.1, 0.01 };
1092 // TODO(deadbeef): The current code only works for 1000 data points or more. 1096 // TODO(deadbeef): The current code only works for 1000 data points or more.
1093 const uint32_t kTestSamples[] = {/*10, 100,*/ 1000}; 1097 const uint32_t kTestSamples[] = {/*10, 100,*/ 1000};
1094 for (size_t midx = 0; midx < arraysize(kTestMean); ++midx) { 1098 for (size_t midx = 0; midx < arraysize(kTestMean); ++midx) {
1095 for (size_t didx = 0; didx < arraysize(kTestDev); ++didx) { 1099 for (size_t didx = 0; didx < arraysize(kTestDev); ++didx) {
1096 for (size_t sidx = 0; sidx < arraysize(kTestSamples); ++sidx) { 1100 for (size_t sidx = 0; sidx < arraysize(kTestSamples); ++sidx) {
(...skipping 23 matching lines...) Expand all
1120 << " N=" << kTestSamples[sidx]; 1124 << " N=" << kTestSamples[sidx];
1121 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev) 1125 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev)
1122 << "M=" << kTestMean[midx] 1126 << "M=" << kTestMean[midx]
1123 << " SD=" << kStdDev 1127 << " SD=" << kStdDev
1124 << " N=" << kTestSamples[sidx]; 1128 << " N=" << kTestSamples[sidx];
1125 delete f; 1129 delete f;
1126 } 1130 }
1127 } 1131 }
1128 } 1132 }
1129 } 1133 }
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