OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2006 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2006 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include <math.h> | 11 #include <math.h> |
12 #include <time.h> | 12 #include <time.h> |
13 #if defined(WEBRTC_POSIX) | 13 #if defined(WEBRTC_POSIX) |
14 #include <netinet/in.h> | 14 #include <netinet/in.h> |
15 #endif | 15 #endif |
16 | 16 |
17 #include <memory> | 17 #include <memory> |
18 | 18 |
19 #include "webrtc/base/arraysize.h" | 19 #include "webrtc/base/arraysize.h" |
| 20 #include "webrtc/base/gunit.h" |
20 #include "webrtc/base/logging.h" | 21 #include "webrtc/base/logging.h" |
21 #include "webrtc/base/gunit.h" | 22 #include "webrtc/base/ptr_util.h" |
22 #include "webrtc/base/testclient.h" | 23 #include "webrtc/base/testclient.h" |
23 #include "webrtc/base/testutils.h" | 24 #include "webrtc/base/testutils.h" |
24 #include "webrtc/base/thread.h" | 25 #include "webrtc/base/thread.h" |
25 #include "webrtc/base/timeutils.h" | 26 #include "webrtc/base/timeutils.h" |
26 #include "webrtc/base/virtualsocketserver.h" | 27 #include "webrtc/base/virtualsocketserver.h" |
27 | 28 |
28 using namespace rtc; | 29 using namespace rtc; |
29 | 30 |
30 using webrtc::testing::SSE_CLOSE; | 31 using webrtc::testing::SSE_CLOSE; |
31 using webrtc::testing::SSE_ERROR; | 32 using webrtc::testing::SSE_ERROR; |
32 using webrtc::testing::SSE_OPEN; | 33 using webrtc::testing::SSE_OPEN; |
33 using webrtc::testing::SSE_READ; | 34 using webrtc::testing::SSE_READ; |
34 using webrtc::testing::SSE_WRITE; | 35 using webrtc::testing::SSE_WRITE; |
35 using webrtc::testing::StreamSink; | 36 using webrtc::testing::StreamSink; |
36 | 37 |
37 // Sends at a constant rate but with random packet sizes. | 38 // Sends at a constant rate but with random packet sizes. |
38 struct Sender : public MessageHandler { | 39 struct Sender : public MessageHandler { |
39 Sender(Thread* th, AsyncSocket* s, uint32_t rt) | 40 Sender(Thread* th, AsyncSocket* s, uint32_t rt) |
40 : thread(th), | 41 : thread(th), |
41 socket(new AsyncUDPSocket(s)), | 42 socket(MakeUnique<AsyncUDPSocket>(s)), |
42 done(false), | 43 done(false), |
43 rate(rt), | 44 rate(rt), |
44 count(0) { | 45 count(0) { |
45 last_send = rtc::TimeMillis(); | 46 last_send = rtc::TimeMillis(); |
46 thread->PostDelayed(RTC_FROM_HERE, NextDelay(), this, 1); | 47 thread->PostDelayed(RTC_FROM_HERE, NextDelay(), this, 1); |
47 } | 48 } |
48 | 49 |
49 uint32_t NextDelay() { | 50 uint32_t NextDelay() { |
50 uint32_t size = (rand() % 4096) + 1; | 51 uint32_t size = (rand() % 4096) + 1; |
51 return 1000 * size / rate; | 52 return 1000 * size / rate; |
(...skipping 25 matching lines...) Expand all Loading... |
77 bool done; | 78 bool done; |
78 uint32_t rate; // bytes per second | 79 uint32_t rate; // bytes per second |
79 uint32_t count; | 80 uint32_t count; |
80 int64_t last_send; | 81 int64_t last_send; |
81 char dummy[4096]; | 82 char dummy[4096]; |
82 }; | 83 }; |
83 | 84 |
84 struct Receiver : public MessageHandler, public sigslot::has_slots<> { | 85 struct Receiver : public MessageHandler, public sigslot::has_slots<> { |
85 Receiver(Thread* th, AsyncSocket* s, uint32_t bw) | 86 Receiver(Thread* th, AsyncSocket* s, uint32_t bw) |
86 : thread(th), | 87 : thread(th), |
87 socket(new AsyncUDPSocket(s)), | 88 socket(MakeUnique<AsyncUDPSocket>(s)), |
88 bandwidth(bw), | 89 bandwidth(bw), |
89 done(false), | 90 done(false), |
90 count(0), | 91 count(0), |
91 sec_count(0), | 92 sec_count(0), |
92 sum(0), | 93 sum(0), |
93 sum_sq(0), | 94 sum_sq(0), |
94 samples(0) { | 95 samples(0) { |
95 socket->SignalReadPacket.connect(this, &Receiver::OnReadPacket); | 96 socket->SignalReadPacket.connect(this, &Receiver::OnReadPacket); |
96 thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1); | 97 thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1); |
97 } | 98 } |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 size_t count; | 139 size_t count; |
139 size_t sec_count; | 140 size_t sec_count; |
140 double sum; | 141 double sum; |
141 double sum_sq; | 142 double sum_sq; |
142 uint32_t samples; | 143 uint32_t samples; |
143 }; | 144 }; |
144 | 145 |
145 class VirtualSocketServerTest : public testing::Test { | 146 class VirtualSocketServerTest : public testing::Test { |
146 public: | 147 public: |
147 VirtualSocketServerTest() | 148 VirtualSocketServerTest() |
148 : ss_(new VirtualSocketServer(nullptr)), | 149 : ss_(nullptr), |
149 kIPv4AnyAddress(IPAddress(INADDR_ANY), 0), | 150 kIPv4AnyAddress(IPAddress(INADDR_ANY), 0), |
150 kIPv6AnyAddress(IPAddress(in6addr_any), 0) {} | 151 kIPv6AnyAddress(IPAddress(in6addr_any), 0) {} |
151 | 152 |
152 void CheckPortIncrementalization(const SocketAddress& post, | 153 void CheckPortIncrementalization(const SocketAddress& post, |
153 const SocketAddress& pre) { | 154 const SocketAddress& pre) { |
154 EXPECT_EQ(post.port(), pre.port() + 1); | 155 EXPECT_EQ(post.port(), pre.port() + 1); |
155 IPAddress post_ip = post.ipaddr(); | 156 IPAddress post_ip = post.ipaddr(); |
156 IPAddress pre_ip = pre.ipaddr(); | 157 IPAddress pre_ip = pre.ipaddr(); |
157 EXPECT_EQ(pre_ip.family(), post_ip.family()); | 158 EXPECT_EQ(pre_ip.family(), post_ip.family()); |
158 if (post_ip.family() == AF_INET) { | 159 if (post_ip.family() == AF_INET) { |
159 in_addr pre_ipv4 = pre_ip.ipv4_address(); | 160 in_addr pre_ipv4 = pre_ip.ipv4_address(); |
160 in_addr post_ipv4 = post_ip.ipv4_address(); | 161 in_addr post_ipv4 = post_ip.ipv4_address(); |
161 EXPECT_EQ(post_ipv4.s_addr, pre_ipv4.s_addr); | 162 EXPECT_EQ(post_ipv4.s_addr, pre_ipv4.s_addr); |
162 } else if (post_ip.family() == AF_INET6) { | 163 } else if (post_ip.family() == AF_INET6) { |
163 in6_addr post_ip6 = post_ip.ipv6_address(); | 164 in6_addr post_ip6 = post_ip.ipv6_address(); |
164 in6_addr pre_ip6 = pre_ip.ipv6_address(); | 165 in6_addr pre_ip6 = pre_ip.ipv6_address(); |
165 uint32_t* post_as_ints = reinterpret_cast<uint32_t*>(&post_ip6.s6_addr); | 166 uint32_t* post_as_ints = reinterpret_cast<uint32_t*>(&post_ip6.s6_addr); |
166 uint32_t* pre_as_ints = reinterpret_cast<uint32_t*>(&pre_ip6.s6_addr); | 167 uint32_t* pre_as_ints = reinterpret_cast<uint32_t*>(&pre_ip6.s6_addr); |
167 EXPECT_EQ(post_as_ints[3], pre_as_ints[3]); | 168 EXPECT_EQ(post_as_ints[3], pre_as_ints[3]); |
168 } | 169 } |
169 } | 170 } |
170 | 171 |
171 // Test a client can bind to the any address, and all sent packets will have | 172 // Test a client can bind to the any address, and all sent packets will have |
172 // the default route as the source address. Also, it can receive packets sent | 173 // the default route as the source address. Also, it can receive packets sent |
173 // to the default route. | 174 // to the default route. |
174 void TestDefaultRoute(const IPAddress& default_route) { | 175 void TestDefaultRoute(const IPAddress& default_route) { |
175 ss_->SetDefaultRoute(default_route); | 176 ss_.SetDefaultRoute(default_route); |
176 | 177 |
177 // Create client1 bound to the any address. | 178 // Create client1 bound to the any address. |
178 AsyncSocket* socket = | 179 AsyncSocket* socket = |
179 ss_->CreateAsyncSocket(default_route.family(), SOCK_DGRAM); | 180 ss_.CreateAsyncSocket(default_route.family(), SOCK_DGRAM); |
180 socket->Bind(EmptySocketAddressWithFamily(default_route.family())); | 181 socket->Bind(EmptySocketAddressWithFamily(default_route.family())); |
181 SocketAddress client1_any_addr = socket->GetLocalAddress(); | 182 SocketAddress client1_any_addr = socket->GetLocalAddress(); |
182 EXPECT_TRUE(client1_any_addr.IsAnyIP()); | 183 EXPECT_TRUE(client1_any_addr.IsAnyIP()); |
183 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket)); | 184 auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket)); |
184 | 185 |
185 // Create client2 bound to the default route. | 186 // Create client2 bound to the default route. |
186 AsyncSocket* socket2 = | 187 AsyncSocket* socket2 = |
187 ss_->CreateAsyncSocket(default_route.family(), SOCK_DGRAM); | 188 ss_.CreateAsyncSocket(default_route.family(), SOCK_DGRAM); |
188 socket2->Bind(SocketAddress(default_route, 0)); | 189 socket2->Bind(SocketAddress(default_route, 0)); |
189 SocketAddress client2_addr = socket2->GetLocalAddress(); | 190 SocketAddress client2_addr = socket2->GetLocalAddress(); |
190 EXPECT_FALSE(client2_addr.IsAnyIP()); | 191 EXPECT_FALSE(client2_addr.IsAnyIP()); |
191 TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2)); | 192 auto client2 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket2)); |
192 | 193 |
193 // Client1 sends to client2, client2 should see the default route as | 194 // Client1 sends to client2, client2 should see the default route as |
194 // client1's address. | 195 // client1's address. |
195 SocketAddress client1_addr; | 196 SocketAddress client1_addr; |
196 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); | 197 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); |
197 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); | 198 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); |
198 EXPECT_EQ(client1_addr, | 199 EXPECT_EQ(client1_addr, |
199 SocketAddress(default_route, client1_any_addr.port())); | 200 SocketAddress(default_route, client1_any_addr.port())); |
200 | 201 |
201 // Client2 can send back to client1's default route address. | 202 // Client2 can send back to client1's default route address. |
202 EXPECT_EQ(3, client2->SendTo("foo", 3, client1_addr)); | 203 EXPECT_EQ(3, client2->SendTo("foo", 3, client1_addr)); |
203 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); | 204 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); |
204 } | 205 } |
205 | 206 |
206 void BasicTest(const SocketAddress& initial_addr) { | 207 void BasicTest(const SocketAddress& initial_addr) { |
207 AsyncSocket* socket = ss_->CreateAsyncSocket(initial_addr.family(), | 208 AsyncSocket* socket = |
208 SOCK_DGRAM); | 209 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); |
209 socket->Bind(initial_addr); | 210 socket->Bind(initial_addr); |
210 SocketAddress server_addr = socket->GetLocalAddress(); | 211 SocketAddress server_addr = socket->GetLocalAddress(); |
211 // Make sure VSS didn't switch families on us. | 212 // Make sure VSS didn't switch families on us. |
212 EXPECT_EQ(server_addr.family(), initial_addr.family()); | 213 EXPECT_EQ(server_addr.family(), initial_addr.family()); |
213 | 214 |
214 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket)); | 215 auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket)); |
215 AsyncSocket* socket2 = | 216 AsyncSocket* socket2 = |
216 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); | 217 ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); |
217 TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2)); | 218 auto client2 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket2)); |
218 | 219 |
219 SocketAddress client2_addr; | 220 SocketAddress client2_addr; |
220 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr)); | 221 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr)); |
221 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); | 222 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); |
222 | 223 |
223 SocketAddress client1_addr; | 224 SocketAddress client1_addr; |
224 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); | 225 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); |
225 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); | 226 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); |
226 EXPECT_EQ(client1_addr, server_addr); | 227 EXPECT_EQ(client1_addr, server_addr); |
227 | 228 |
228 SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family()); | 229 SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family()); |
229 for (int i = 0; i < 10; i++) { | 230 for (int i = 0; i < 10; i++) { |
230 client2 = new TestClient(AsyncUDPSocket::Create(ss_, empty)); | 231 client2 = MakeUnique<TestClient>( |
| 232 WrapUnique(AsyncUDPSocket::Create(&ss_, empty))); |
231 | 233 |
232 SocketAddress next_client2_addr; | 234 SocketAddress next_client2_addr; |
233 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr)); | 235 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr)); |
234 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr)); | 236 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr)); |
235 CheckPortIncrementalization(next_client2_addr, client2_addr); | 237 CheckPortIncrementalization(next_client2_addr, client2_addr); |
236 // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1); | 238 // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1); |
237 | 239 |
238 SocketAddress server_addr2; | 240 SocketAddress server_addr2; |
239 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr)); | 241 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr)); |
240 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2)); | 242 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2)); |
241 EXPECT_EQ(server_addr2, server_addr); | 243 EXPECT_EQ(server_addr2, server_addr); |
242 | 244 |
243 client2_addr = next_client2_addr; | 245 client2_addr = next_client2_addr; |
244 } | 246 } |
245 } | 247 } |
246 | 248 |
247 // initial_addr should be made from either INADDR_ANY or in6addr_any. | 249 // initial_addr should be made from either INADDR_ANY or in6addr_any. |
248 void ConnectTest(const SocketAddress& initial_addr) { | 250 void ConnectTest(const SocketAddress& initial_addr) { |
249 StreamSink sink; | 251 StreamSink sink; |
250 SocketAddress accept_addr; | 252 SocketAddress accept_addr; |
251 const SocketAddress kEmptyAddr = | 253 const SocketAddress kEmptyAddr = |
252 EmptySocketAddressWithFamily(initial_addr.family()); | 254 EmptySocketAddressWithFamily(initial_addr.family()); |
253 | 255 |
254 // Create client | 256 // Create client |
255 AsyncSocket* client = ss_->CreateAsyncSocket(initial_addr.family(), | 257 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 Loading... |
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 Loading... |
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 } |
OLD | NEW |