OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/macros.h" | 5 #include "base/macros.h" |
6 #include "base/memory/scoped_ptr.h" | 6 #include "base/memory/scoped_ptr.h" |
7 #include "base/run_loop.h" | 7 #include "base/run_loop.h" |
8 #include "mojo/public/cpp/application/application_connection.h" | 8 #include "mojo/public/cpp/application/application_connection.h" |
9 #include "mojo/public/cpp/application/application_impl.h" | 9 #include "mojo/public/cpp/application/application_impl.h" |
10 #include "mojo/public/cpp/application/application_test_base.h" | 10 #include "mojo/public/cpp/application/application_test_base.h" |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 } | 215 } |
216 NotifyRun(); | 216 NotifyRun(); |
217 } | 217 } |
218 }; | 218 }; |
219 | 219 |
220 NetworkErrorPtr result_; | 220 NetworkErrorPtr result_; |
221 NetAddressPtr src_addr_; | 221 NetAddressPtr src_addr_; |
222 Array<uint8_t> data_; | 222 Array<uint8_t> data_; |
223 }; | 223 }; |
224 | 224 |
| 225 struct ReceiveResult { |
| 226 NetworkErrorPtr result; |
| 227 NetAddressPtr addr; |
| 228 Array<uint8_t> data; |
| 229 }; |
| 230 |
| 231 class UDPSocketClientImpl : public UDPSocketClient { |
| 232 public: |
| 233 UDPSocketClientImpl() : run_loop_(nullptr), expected_receive_count_(0) {} |
| 234 |
| 235 ~UDPSocketClientImpl() override { |
| 236 while (!results_.empty()) { |
| 237 delete results_.front(); |
| 238 results_.pop(); |
| 239 } |
| 240 } |
| 241 |
| 242 std::queue<ReceiveResult*>* results() { |
| 243 return &results_; |
| 244 } |
| 245 |
| 246 void WaitForReceiveResults(size_t count) { |
| 247 if (results_.size() == count) |
| 248 return; |
| 249 |
| 250 expected_receive_count_ = count; |
| 251 base::RunLoop run_loop; |
| 252 run_loop_ = &run_loop; |
| 253 run_loop.Run(); |
| 254 run_loop_ = nullptr; |
| 255 } |
| 256 |
| 257 private: |
| 258 void OnReceived(NetworkErrorPtr result, |
| 259 NetAddressPtr src_addr, |
| 260 Array<uint8_t> data) override { |
| 261 ReceiveResult* entry = new ReceiveResult(); |
| 262 entry->result = result.Pass(); |
| 263 entry->addr = src_addr.Pass(); |
| 264 entry->data = data.Pass(); |
| 265 |
| 266 results_.push(entry); |
| 267 |
| 268 if (results_.size() == expected_receive_count_ && run_loop_) { |
| 269 expected_receive_count_ = 0; |
| 270 run_loop_->Quit(); |
| 271 } |
| 272 } |
| 273 |
| 274 base::RunLoop* run_loop_; |
| 275 std::queue<ReceiveResult*> results_; |
| 276 size_t expected_receive_count_; |
| 277 |
| 278 DISALLOW_COPY_AND_ASSIGN(UDPSocketClientImpl); |
| 279 }; |
| 280 |
225 class UDPSocketAppTest : public test::ApplicationTestBase { | 281 class UDPSocketAppTest : public test::ApplicationTestBase { |
226 public: | 282 public: |
227 UDPSocketAppTest() {} | 283 UDPSocketAppTest() {} |
228 ~UDPSocketAppTest() override {} | 284 ~UDPSocketAppTest() override {} |
229 | 285 |
230 void SetUp() override { | 286 void SetUp() override { |
231 ApplicationTestBase::SetUp(); | 287 ApplicationTestBase::SetUp(); |
232 | 288 |
233 ApplicationConnection* connection = | 289 ApplicationConnection* connection = |
234 application_impl()->ConnectToApplication("mojo:network_service"); | 290 application_impl()->ConnectToApplication("mojo:network_service"); |
235 connection->ConnectToService(&network_service_); | 291 connection->ConnectToService(&network_service_); |
236 | 292 |
237 network_service_->CreateUDPSocket(GetProxy(&udp_socket_)); | 293 network_service_->CreateUDPSocket(GetProxy(&socket_)); |
238 udp_socket_.set_client(&udp_socket_client_); | 294 socket_.set_client(&receiver_); |
239 } | 295 } |
240 | 296 |
241 protected: | 297 protected: |
242 struct ReceiveResult { | |
243 NetworkErrorPtr result; | |
244 NetAddressPtr addr; | |
245 Array<uint8_t> data; | |
246 }; | |
247 | |
248 class UDPSocketClientImpl : public UDPSocketClient { | |
249 public: | |
250 | |
251 UDPSocketClientImpl() : run_loop_(nullptr), expected_receive_count_(0) {} | |
252 | |
253 ~UDPSocketClientImpl() override { | |
254 while (!results_.empty()) { | |
255 delete results_.front(); | |
256 results_.pop(); | |
257 } | |
258 } | |
259 | |
260 void OnReceived(NetworkErrorPtr result, | |
261 NetAddressPtr src_addr, | |
262 Array<uint8_t> data) override { | |
263 ReceiveResult* entry = new ReceiveResult(); | |
264 entry->result = result.Pass(); | |
265 entry->addr = src_addr.Pass(); | |
266 entry->data = data.Pass(); | |
267 | |
268 results_.push(entry); | |
269 | |
270 if (results_.size() == expected_receive_count_ && run_loop_) { | |
271 expected_receive_count_ = 0; | |
272 run_loop_->Quit(); | |
273 } | |
274 } | |
275 | |
276 base::RunLoop* run_loop_; | |
277 std::queue<ReceiveResult*> results_; | |
278 size_t expected_receive_count_; | |
279 | |
280 DISALLOW_COPY_AND_ASSIGN(UDPSocketClientImpl); | |
281 }; | |
282 | |
283 std::queue<ReceiveResult*>* GetReceiveResults() { | |
284 return &udp_socket_client_.results_; | |
285 } | |
286 | |
287 void WaitForReceiveResults(size_t count) { | |
288 if (GetReceiveResults()->size() == count) | |
289 return; | |
290 | |
291 udp_socket_client_.expected_receive_count_ = count; | |
292 base::RunLoop run_loop; | |
293 udp_socket_client_.run_loop_ = &run_loop; | |
294 run_loop.Run(); | |
295 udp_socket_client_.run_loop_ = nullptr; | |
296 } | |
297 | |
298 NetworkServicePtr network_service_; | 298 NetworkServicePtr network_service_; |
299 UDPSocketPtr udp_socket_; | 299 UDPSocketPtr socket_; |
300 UDPSocketClientImpl udp_socket_client_; | 300 UDPSocketClientImpl receiver_; |
301 | 301 |
302 DISALLOW_COPY_AND_ASSIGN(UDPSocketAppTest); | 302 DISALLOW_COPY_AND_ASSIGN(UDPSocketAppTest); |
303 }; | 303 }; |
304 | 304 |
305 } // namespace | 305 } // namespace |
306 | 306 |
307 TEST_F(UDPSocketAppTest, Settings) { | 307 TEST_F(UDPSocketAppTest, Settings) { |
308 TestCallback callback1; | 308 TestCallback callback1; |
309 udp_socket_->AllowAddressReuse(callback1.callback()); | 309 socket_->AllowAddressReuse(callback1.callback()); |
310 callback1.WaitForResult(); | 310 callback1.WaitForResult(); |
311 EXPECT_EQ(net::OK, callback1.result()->code); | 311 EXPECT_EQ(net::OK, callback1.result()->code); |
312 | 312 |
313 // Should fail because the socket hasn't been bound. | 313 // Should fail because the socket hasn't been bound. |
314 TestCallback callback2; | 314 TestCallback callback2; |
315 udp_socket_->SetSendBufferSize(1024, callback2.callback()); | 315 socket_->SetSendBufferSize(1024, callback2.callback()); |
316 callback2.WaitForResult(); | 316 callback2.WaitForResult(); |
317 EXPECT_NE(net::OK, callback2.result()->code); | 317 EXPECT_NE(net::OK, callback2.result()->code); |
318 | 318 |
319 // Should fail because the socket hasn't been bound. | 319 // Should fail because the socket hasn't been bound. |
320 TestCallback callback3; | 320 TestCallback callback3; |
321 udp_socket_->SetReceiveBufferSize(2048, callback3.callback()); | 321 socket_->SetReceiveBufferSize(2048, callback3.callback()); |
322 callback3.WaitForResult(); | 322 callback3.WaitForResult(); |
323 EXPECT_NE(net::OK, callback3.result()->code); | 323 EXPECT_NE(net::OK, callback3.result()->code); |
324 | 324 |
325 TestCallbackWithAddress callback4; | 325 TestCallbackWithAddress callback4; |
326 udp_socket_->Bind(GetLocalHostWithAnyPort(), callback4.callback()); | 326 socket_->Bind(GetLocalHostWithAnyPort(), callback4.callback()); |
327 callback4.WaitForResult(); | 327 callback4.WaitForResult(); |
328 EXPECT_EQ(net::OK, callback4.result()->code); | 328 EXPECT_EQ(net::OK, callback4.result()->code); |
329 EXPECT_NE(0u, callback4.net_address()->ipv4->port); | 329 EXPECT_NE(0u, callback4.net_address()->ipv4->port); |
330 | 330 |
331 // Should fail because the socket has been bound. | 331 // Should fail because the socket has been bound. |
332 TestCallback callback5; | 332 TestCallback callback5; |
333 udp_socket_->AllowAddressReuse(callback5.callback()); | 333 socket_->AllowAddressReuse(callback5.callback()); |
334 callback5.WaitForResult(); | 334 callback5.WaitForResult(); |
335 EXPECT_NE(net::OK, callback5.result()->code); | 335 EXPECT_NE(net::OK, callback5.result()->code); |
336 | 336 |
337 TestCallback callback6; | 337 TestCallback callback6; |
338 udp_socket_->SetSendBufferSize(1024, callback6.callback()); | 338 socket_->SetSendBufferSize(1024, callback6.callback()); |
339 callback6.WaitForResult(); | 339 callback6.WaitForResult(); |
340 EXPECT_EQ(net::OK, callback6.result()->code); | 340 EXPECT_EQ(net::OK, callback6.result()->code); |
341 | 341 |
342 TestCallback callback7; | 342 TestCallback callback7; |
343 udp_socket_->SetReceiveBufferSize(2048, callback7.callback()); | 343 socket_->SetReceiveBufferSize(2048, callback7.callback()); |
344 callback7.WaitForResult(); | 344 callback7.WaitForResult(); |
345 EXPECT_EQ(net::OK, callback7.result()->code); | 345 EXPECT_EQ(net::OK, callback7.result()->code); |
346 | 346 |
347 TestCallbackWithUint32 callback8; | 347 TestCallbackWithUint32 callback8; |
348 udp_socket_->NegotiateMaxPendingSendRequests(0, callback8.callback()); | 348 socket_->NegotiateMaxPendingSendRequests(0, callback8.callback()); |
349 callback8.WaitForResult(); | 349 callback8.WaitForResult(); |
350 EXPECT_GT(callback8.result(), 0u); | 350 EXPECT_GT(callback8.result(), 0u); |
351 | 351 |
352 TestCallbackWithUint32 callback9; | 352 TestCallbackWithUint32 callback9; |
353 udp_socket_->NegotiateMaxPendingSendRequests(16, callback9.callback()); | 353 socket_->NegotiateMaxPendingSendRequests(16, callback9.callback()); |
354 callback9.WaitForResult(); | 354 callback9.WaitForResult(); |
355 EXPECT_GT(callback9.result(), 0u); | 355 EXPECT_GT(callback9.result(), 0u); |
356 } | 356 } |
357 | 357 |
358 TEST_F(UDPSocketAppTest, TestReadWrite) { | 358 TEST_F(UDPSocketAppTest, TestReadWrite) { |
359 TestCallbackWithAddress callback1; | 359 TestCallbackWithAddress callback1; |
360 udp_socket_->Bind(GetLocalHostWithAnyPort(), callback1.callback()); | 360 socket_->Bind(GetLocalHostWithAnyPort(), callback1.callback()); |
361 callback1.WaitForResult(); | 361 callback1.WaitForResult(); |
362 ASSERT_EQ(net::OK, callback1.result()->code); | 362 ASSERT_EQ(net::OK, callback1.result()->code); |
363 ASSERT_NE(0u, callback1.net_address()->ipv4->port); | 363 ASSERT_NE(0u, callback1.net_address()->ipv4->port); |
364 | 364 |
365 NetAddressPtr server_addr = callback1.net_address().Clone(); | 365 NetAddressPtr server_addr = callback1.net_address().Clone(); |
366 | 366 |
367 UDPSocketPtr client_socket; | 367 UDPSocketPtr client_socket; |
368 network_service_->CreateUDPSocket(GetProxy(&client_socket)); | 368 network_service_->CreateUDPSocket(GetProxy(&client_socket)); |
369 | 369 |
370 TestCallbackWithAddress callback2; | 370 TestCallbackWithAddress callback2; |
371 client_socket->Bind(GetLocalHostWithAnyPort(), callback2.callback()); | 371 client_socket->Bind(GetLocalHostWithAnyPort(), callback2.callback()); |
372 callback2.WaitForResult(); | 372 callback2.WaitForResult(); |
373 ASSERT_EQ(net::OK, callback2.result()->code); | 373 ASSERT_EQ(net::OK, callback2.result()->code); |
374 ASSERT_NE(0u, callback2.net_address()->ipv4->port); | 374 ASSERT_NE(0u, callback2.net_address()->ipv4->port); |
375 | 375 |
376 NetAddressPtr client_addr = callback2.net_address().Clone(); | 376 NetAddressPtr client_addr = callback2.net_address().Clone(); |
377 | 377 |
378 const size_t kDatagramCount = 6; | 378 const size_t kDatagramCount = 6; |
379 const size_t kDatagramSize = 255; | 379 const size_t kDatagramSize = 255; |
380 udp_socket_->ReceiveMore(kDatagramCount); | 380 socket_->ReceiveMore(kDatagramCount); |
381 | 381 |
382 for (size_t i = 0; i < kDatagramCount; ++i) { | 382 for (size_t i = 0; i < kDatagramCount; ++i) { |
383 TestCallback callback; | 383 TestCallback callback; |
384 client_socket->SendTo( | 384 client_socket->SendTo( |
385 server_addr.Clone(), | 385 server_addr.Clone(), |
386 CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize), | 386 CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize), |
387 callback.callback()); | 387 callback.callback()); |
388 callback.WaitForResult(); | 388 callback.WaitForResult(); |
389 EXPECT_EQ(255, callback.result()->code); | 389 EXPECT_EQ(255, callback.result()->code); |
390 } | 390 } |
391 | 391 |
392 WaitForReceiveResults(kDatagramCount); | 392 receiver_.WaitForReceiveResults(kDatagramCount); |
393 for (size_t i = 0; i < kDatagramCount; ++i) { | 393 for (size_t i = 0; i < kDatagramCount; ++i) { |
394 scoped_ptr<ReceiveResult> result(GetReceiveResults()->front()); | 394 scoped_ptr<ReceiveResult> result(receiver_.results()->front()); |
395 GetReceiveResults()->pop(); | 395 receiver_.results()->pop(); |
396 | 396 |
397 EXPECT_EQ(static_cast<int>(kDatagramSize), result->result->code); | 397 EXPECT_EQ(static_cast<int>(kDatagramSize), result->result->code); |
398 EXPECT_TRUE(result->addr.Equals(client_addr)); | 398 EXPECT_TRUE(result->addr.Equals(client_addr)); |
399 EXPECT_TRUE(result->data.Equals( | 399 EXPECT_TRUE(result->data.Equals( |
400 CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize))); | 400 CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize))); |
401 } | 401 } |
402 } | 402 } |
403 | 403 |
404 TEST_F(UDPSocketAppTest, TestUDPSocketWrapper) { | 404 TEST_F(UDPSocketAppTest, TestConnectedReadWrite) { |
405 UDPSocketWrapper udp_socket(udp_socket_.Pass(), 4, 4); | |
406 | |
407 TestCallbackWithAddress callback1; | 405 TestCallbackWithAddress callback1; |
408 udp_socket.Bind(GetLocalHostWithAnyPort(), callback1.callback()); | 406 socket_->Bind(GetLocalHostWithAnyPort(), callback1.callback()); |
409 callback1.WaitForResult(); | 407 callback1.WaitForResult(); |
410 ASSERT_EQ(net::OK, callback1.result()->code); | 408 ASSERT_EQ(net::OK, callback1.result()->code); |
411 ASSERT_NE(0u, callback1.net_address()->ipv4->port); | 409 ASSERT_NE(0u, callback1.net_address()->ipv4->port); |
| 410 |
| 411 NetAddressPtr server_addr = callback1.net_address().Clone(); |
| 412 |
| 413 UDPSocketPtr client_socket; |
| 414 network_service_->CreateUDPSocket(GetProxy(&client_socket)); |
| 415 UDPSocketClientImpl client_socket_receiver; |
| 416 client_socket.set_client(&client_socket_receiver); |
| 417 |
| 418 TestCallbackWithAddress callback2; |
| 419 client_socket->Connect(server_addr.Clone(), callback2.callback()); |
| 420 callback2.WaitForResult(); |
| 421 ASSERT_EQ(net::OK, callback2.result()->code); |
| 422 ASSERT_NE(0u, callback2.net_address()->ipv4->port); |
| 423 |
| 424 NetAddressPtr client_addr = callback2.net_address().Clone(); |
| 425 |
| 426 const size_t kDatagramCount = 6; |
| 427 const size_t kDatagramSize = 255; |
| 428 |
| 429 // Test send using a connected socket. |
| 430 socket_->ReceiveMore(kDatagramCount); |
| 431 |
| 432 for (size_t i = 0; i < kDatagramCount; ++i) { |
| 433 TestCallback callback; |
| 434 client_socket->SendTo( |
| 435 nullptr, |
| 436 CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize), |
| 437 callback.callback()); |
| 438 callback.WaitForResult(); |
| 439 EXPECT_EQ(255, callback.result()->code); |
| 440 } |
| 441 |
| 442 receiver_.WaitForReceiveResults(kDatagramCount); |
| 443 for (size_t i = 0; i < kDatagramCount; ++i) { |
| 444 scoped_ptr<ReceiveResult> result(receiver_.results()->front()); |
| 445 receiver_.results()->pop(); |
| 446 |
| 447 EXPECT_EQ(static_cast<int>(kDatagramSize), result->result->code); |
| 448 EXPECT_TRUE(result->addr.Equals(client_addr)); |
| 449 EXPECT_TRUE(result->data.Equals( |
| 450 CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize))); |
| 451 } |
| 452 |
| 453 // Test receive using a connected socket. |
| 454 client_socket->ReceiveMore(kDatagramCount); |
| 455 |
| 456 for (size_t i = 0; i < kDatagramCount; ++i) { |
| 457 TestCallback callback; |
| 458 socket_->SendTo( |
| 459 client_addr.Clone(), |
| 460 CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize), |
| 461 callback.callback()); |
| 462 callback.WaitForResult(); |
| 463 EXPECT_EQ(255, callback.result()->code); |
| 464 } |
| 465 |
| 466 client_socket_receiver.WaitForReceiveResults(kDatagramCount); |
| 467 for (size_t i = 0; i < kDatagramCount; ++i) { |
| 468 scoped_ptr<ReceiveResult> result(client_socket_receiver.results()->front()); |
| 469 client_socket_receiver.results()->pop(); |
| 470 |
| 471 EXPECT_EQ(static_cast<int>(kDatagramSize), result->result->code); |
| 472 EXPECT_FALSE(result->addr); |
| 473 EXPECT_TRUE(result->data.Equals( |
| 474 CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize))); |
| 475 } |
| 476 } |
| 477 |
| 478 TEST_F(UDPSocketAppTest, TestWrapperReadWrite) { |
| 479 UDPSocketWrapper socket(socket_.Pass(), 4, 4); |
| 480 |
| 481 TestCallbackWithAddress callback1; |
| 482 socket.Bind(GetLocalHostWithAnyPort(), callback1.callback()); |
| 483 callback1.WaitForResult(); |
| 484 ASSERT_EQ(net::OK, callback1.result()->code); |
| 485 ASSERT_NE(0u, callback1.net_address()->ipv4->port); |
412 | 486 |
413 NetAddressPtr server_addr = callback1.net_address().Clone(); | 487 NetAddressPtr server_addr = callback1.net_address().Clone(); |
414 | 488 |
415 UDPSocketPtr raw_client_socket; | 489 UDPSocketPtr raw_client_socket; |
416 network_service_->CreateUDPSocket(GetProxy(&raw_client_socket)); | 490 network_service_->CreateUDPSocket(GetProxy(&raw_client_socket)); |
417 UDPSocketWrapper client_socket(raw_client_socket.Pass(), 4, 4); | 491 UDPSocketWrapper client_socket(raw_client_socket.Pass(), 4, 4); |
418 | 492 |
419 TestCallbackWithAddress callback2; | 493 TestCallbackWithAddress callback2; |
420 client_socket.Bind(GetLocalHostWithAnyPort(), callback2.callback()); | 494 client_socket.Bind(GetLocalHostWithAnyPort(), callback2.callback()); |
421 callback2.WaitForResult(); | 495 callback2.WaitForResult(); |
422 ASSERT_EQ(net::OK, callback2.result()->code); | 496 ASSERT_EQ(net::OK, callback2.result()->code); |
423 ASSERT_NE(0u, callback2.net_address()->ipv4->port); | 497 ASSERT_NE(0u, callback2.net_address()->ipv4->port); |
424 | 498 |
425 NetAddressPtr client_addr = callback2.net_address().Clone(); | 499 NetAddressPtr client_addr = callback2.net_address().Clone(); |
426 | 500 |
427 const size_t kDatagramCount = 16; | 501 const size_t kDatagramCount = 16; |
428 const size_t kDatagramSize = 255; | 502 const size_t kDatagramSize = 255; |
429 | 503 |
430 for (size_t i = 1; i < kDatagramCount; ++i) { | 504 for (size_t i = 1; i < kDatagramCount; ++i) { |
431 scoped_ptr<TestCallback[]> send_callbacks(new TestCallback[i]); | 505 scoped_ptr<TestCallback[]> send_callbacks(new TestCallback[i]); |
432 scoped_ptr<TestReceiveCallback[]> receive_callbacks( | 506 scoped_ptr<TestReceiveCallback[]> receive_callbacks( |
433 new TestReceiveCallback[i]); | 507 new TestReceiveCallback[i]); |
434 | 508 |
435 for (size_t j = 0; j < i; ++j) { | 509 for (size_t j = 0; j < i; ++j) { |
436 client_socket.SendTo( | 510 client_socket.SendTo( |
437 server_addr.Clone(), | 511 server_addr.Clone(), |
438 CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize), | 512 CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize), |
439 send_callbacks[j].callback()); | 513 send_callbacks[j].callback()); |
440 | 514 |
441 udp_socket.ReceiveFrom(receive_callbacks[j].callback()); | 515 socket.ReceiveFrom(receive_callbacks[j].callback()); |
442 } | 516 } |
443 | 517 |
444 receive_callbacks[i - 1].WaitForResult(); | 518 receive_callbacks[i - 1].WaitForResult(); |
445 | 519 |
446 for (size_t j = 0; j < i; ++j) { | 520 for (size_t j = 0; j < i; ++j) { |
447 EXPECT_EQ(static_cast<int>(kDatagramSize), | 521 EXPECT_EQ(static_cast<int>(kDatagramSize), |
448 receive_callbacks[j].result()->code); | 522 receive_callbacks[j].result()->code); |
449 EXPECT_TRUE(receive_callbacks[j].src_addr().Equals(client_addr)); | 523 EXPECT_TRUE(receive_callbacks[j].src_addr().Equals(client_addr)); |
450 EXPECT_TRUE(receive_callbacks[j].data().Equals( | 524 EXPECT_TRUE(receive_callbacks[j].data().Equals( |
451 CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize))); | 525 CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize))); |
452 } | 526 } |
453 } | 527 } |
454 } | 528 } |
455 | 529 |
| 530 TEST_F(UDPSocketAppTest, TestWrapperConnectedReadWrite) { |
| 531 UDPSocketWrapper socket(socket_.Pass(), 4, 4); |
| 532 |
| 533 TestCallbackWithAddress callback1; |
| 534 socket.Bind(GetLocalHostWithAnyPort(), callback1.callback()); |
| 535 callback1.WaitForResult(); |
| 536 ASSERT_EQ(net::OK, callback1.result()->code); |
| 537 ASSERT_NE(0u, callback1.net_address()->ipv4->port); |
| 538 |
| 539 NetAddressPtr server_addr = callback1.net_address().Clone(); |
| 540 |
| 541 UDPSocketPtr raw_client_socket; |
| 542 network_service_->CreateUDPSocket(GetProxy(&raw_client_socket)); |
| 543 UDPSocketWrapper client_socket(raw_client_socket.Pass(), 4, 4); |
| 544 |
| 545 TestCallbackWithAddress callback2; |
| 546 client_socket.Connect(server_addr.Pass(), callback2.callback()); |
| 547 callback2.WaitForResult(); |
| 548 ASSERT_EQ(net::OK, callback2.result()->code); |
| 549 ASSERT_NE(0u, callback2.net_address()->ipv4->port); |
| 550 |
| 551 NetAddressPtr client_addr = callback2.net_address().Clone(); |
| 552 |
| 553 const size_t kDatagramCount = 16; |
| 554 const size_t kDatagramSize = 255; |
| 555 |
| 556 // Test send using a connected socket. |
| 557 for (size_t i = 1; i < kDatagramCount; ++i) { |
| 558 scoped_ptr<TestCallback[]> send_callbacks(new TestCallback[i]); |
| 559 scoped_ptr<TestReceiveCallback[]> receive_callbacks( |
| 560 new TestReceiveCallback[i]); |
| 561 |
| 562 for (size_t j = 0; j < i; ++j) { |
| 563 client_socket.SendTo( |
| 564 nullptr, |
| 565 CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize), |
| 566 send_callbacks[j].callback()); |
| 567 |
| 568 socket.ReceiveFrom(receive_callbacks[j].callback()); |
| 569 } |
| 570 |
| 571 receive_callbacks[i - 1].WaitForResult(); |
| 572 |
| 573 for (size_t j = 0; j < i; ++j) { |
| 574 EXPECT_EQ(static_cast<int>(kDatagramSize), |
| 575 receive_callbacks[j].result()->code); |
| 576 EXPECT_TRUE(receive_callbacks[j].src_addr().Equals(client_addr)); |
| 577 EXPECT_TRUE(receive_callbacks[j].data().Equals( |
| 578 CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize))); |
| 579 } |
| 580 } |
| 581 |
| 582 // Test receive using a connected socket. |
| 583 for (size_t i = 1; i < kDatagramCount; ++i) { |
| 584 scoped_ptr<TestCallback[]> send_callbacks(new TestCallback[i]); |
| 585 scoped_ptr<TestReceiveCallback[]> receive_callbacks( |
| 586 new TestReceiveCallback[i]); |
| 587 |
| 588 for (size_t j = 0; j < i; ++j) { |
| 589 socket.SendTo( |
| 590 client_addr.Clone(), |
| 591 CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize), |
| 592 send_callbacks[j].callback()); |
| 593 |
| 594 client_socket.ReceiveFrom(receive_callbacks[j].callback()); |
| 595 } |
| 596 |
| 597 receive_callbacks[i - 1].WaitForResult(); |
| 598 |
| 599 for (size_t j = 0; j < i; ++j) { |
| 600 EXPECT_EQ(static_cast<int>(kDatagramSize), |
| 601 receive_callbacks[j].result()->code); |
| 602 EXPECT_FALSE(receive_callbacks[j].src_addr()); |
| 603 EXPECT_TRUE(receive_callbacks[j].data().Equals( |
| 604 CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize))); |
| 605 } |
| 606 } |
| 607 } |
| 608 |
456 } // namespace service | 609 } // namespace service |
457 } // namespace mojo | 610 } // namespace mojo |
OLD | NEW |