Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 <arpa/inet.h> | 5 #include <arpa/inet.h> |
| 6 #include <errno.h> | 6 #include <errno.h> |
| 7 #include <fcntl.h> | 7 #include <fcntl.h> |
| 8 #include <netinet/in.h> | 8 #include <netinet/in.h> |
| 9 #include <pthread.h> | 9 #include <pthread.h> |
| 10 #include <sys/types.h> | 10 #include <sys/types.h> |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 337 char inbuf[512]; | 337 char inbuf[512]; |
| 338 | 338 |
| 339 memset(outbuf, 1, sizeof(outbuf)); | 339 memset(outbuf, 1, sizeof(outbuf)); |
| 340 | 340 |
| 341 sockaddr_in addr; | 341 sockaddr_in addr; |
| 342 socklen_t addrlen = sizeof(addr); | 342 socklen_t addrlen = sizeof(addr); |
| 343 | 343 |
| 344 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); | 344 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); |
| 345 | 345 |
| 346 ASSERT_EQ(0, ki_connect(sock_, (sockaddr*) &addr, addrlen)) | 346 ASSERT_EQ(0, ki_connect(sock_, (sockaddr*) &addr, addrlen)) |
| 347 << "Failed with " << errno << ": " << strerror(errno) << "\n"; | 347 << "Failed with " << errno << ": " << strerror(errno); |
| 348 | 348 |
| 349 // Send two different messages to the echo server and verify the | 349 // Send two different messages to the echo server and verify the |
| 350 // response matches. | 350 // response matches. |
| 351 strcpy(outbuf, "hello"); | 351 strcpy(outbuf, "hello"); |
| 352 memset(inbuf, 0, sizeof(inbuf)); | 352 memset(inbuf, 0, sizeof(inbuf)); |
| 353 ASSERT_EQ(sizeof(outbuf), ki_write(sock_, outbuf, sizeof(outbuf))) | 353 ASSERT_EQ(sizeof(outbuf), ki_write(sock_, outbuf, sizeof(outbuf))) |
| 354 << "socket write failed with: " << strerror(errno); | 354 << "socket write failed with: " << strerror(errno); |
| 355 ASSERT_EQ(sizeof(outbuf), ki_read(sock_, inbuf, sizeof(inbuf))); | 355 ASSERT_EQ(sizeof(outbuf), ki_read(sock_, inbuf, sizeof(inbuf))); |
| 356 EXPECT_EQ(0, memcmp(outbuf, inbuf, sizeof(outbuf))); | 356 EXPECT_EQ(0, memcmp(outbuf, inbuf, sizeof(outbuf))); |
| 357 | 357 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 369 memset(outbuf, 1, sizeof(outbuf)); | 369 memset(outbuf, 1, sizeof(outbuf)); |
| 370 | 370 |
| 371 sockaddr_in addr; | 371 sockaddr_in addr; |
| 372 socklen_t addrlen = sizeof(addr); | 372 socklen_t addrlen = sizeof(addr); |
| 373 | 373 |
| 374 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); | 374 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); |
| 375 | 375 |
| 376 SetNonBlocking(sock_); | 376 SetNonBlocking(sock_); |
| 377 ASSERT_EQ(-1, ki_connect(sock_, (sockaddr*) &addr, addrlen)); | 377 ASSERT_EQ(-1, ki_connect(sock_, (sockaddr*) &addr, addrlen)); |
| 378 ASSERT_EQ(EINPROGRESS, errno) | 378 ASSERT_EQ(EINPROGRESS, errno) |
| 379 << "expected EINPROGRESS but got: " << strerror(errno) << "\n"; | 379 << "expected EINPROGRESS but got: " << strerror(errno); |
|
binji
2013/12/02 20:55:32
nit: 4 space indent
Sam Clegg
2013/12/02 22:55:44
Done.
| |
| 380 ASSERT_EQ(-1, ki_connect(sock_, (sockaddr*) &addr, addrlen)); | 380 ASSERT_EQ(-1, ki_connect(sock_, (sockaddr*) &addr, addrlen)); |
| 381 ASSERT_EQ(EALREADY, errno); | 381 ASSERT_EQ(EALREADY, errno); |
| 382 | 382 |
| 383 // Wait for the socket connection to complete using poll() | 383 // Wait for the socket connection to complete using poll() |
| 384 struct pollfd pollfd = { sock_, POLLIN|POLLOUT, 0 }; | 384 struct pollfd pollfd = { sock_, POLLIN|POLLOUT, 0 }; |
| 385 ASSERT_EQ(1, ki_poll(&pollfd, 1, -1)); | 385 ASSERT_EQ(1, ki_poll(&pollfd, 1, -1)); |
| 386 ASSERT_EQ(POLLOUT, pollfd.revents); | 386 ASSERT_EQ(POLLOUT, pollfd.revents); |
| 387 | 387 |
| 388 // Attempts to connect again should yield EISCONN | 388 // Attempts to connect again should yield EISCONN |
| 389 ASSERT_EQ(-1, ki_connect(sock_, (sockaddr*) &addr, addrlen)); | 389 ASSERT_EQ(-1, ki_connect(sock_, (sockaddr*) &addr, addrlen)); |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 413 TEST_F(SocketTest, Setsockopt) { | 413 TEST_F(SocketTest, Setsockopt) { |
| 414 sock1_ = ki_socket(AF_INET, SOCK_STREAM, 0); | 414 sock1_ = ki_socket(AF_INET, SOCK_STREAM, 0); |
| 415 EXPECT_GT(sock1_, -1); | 415 EXPECT_GT(sock1_, -1); |
| 416 | 416 |
| 417 // It should not be possible to set SO_ERROR using setsockopt. | 417 // It should not be possible to set SO_ERROR using setsockopt. |
| 418 int socket_error = 10; | 418 int socket_error = 10; |
| 419 socklen_t len = sizeof(socket_error); | 419 socklen_t len = sizeof(socket_error); |
| 420 ASSERT_EQ(-1, ki_setsockopt(sock1_, SOL_SOCKET, SO_ERROR, | 420 ASSERT_EQ(-1, ki_setsockopt(sock1_, SOL_SOCKET, SO_ERROR, |
| 421 &socket_error, len)); | 421 &socket_error, len)); |
| 422 ASSERT_EQ(ENOPROTOOPT, errno); | 422 ASSERT_EQ(ENOPROTOOPT, errno); |
| 423 } | |
| 423 | 424 |
| 425 TEST_F(SocketTest, Sockopt_TCP_NODELAY) { | |
| 426 int option = 0; | |
| 427 socklen_t len = sizeof(option); | |
| 428 // Getting and setting TCP_NODELAY on UDP socket should fail | |
| 429 sock1_ = socket(AF_INET, SOCK_DGRAM, 0); | |
| 430 ASSERT_EQ(-1, ki_setsockopt(sock1_, IPPROTO_TCP, TCP_NODELAY, &option, len)); | |
| 431 ASSERT_EQ(ENOPROTOOPT, errno); | |
| 432 ASSERT_EQ(-1, ki_getsockopt(sock1_, IPPROTO_TCP, TCP_NODELAY, &option, &len)); | |
| 433 ASSERT_EQ(ENOPROTOOPT, errno); | |
| 434 | |
| 435 // Getting and setting TCP_NODELAY on TCP socket should preserve value | |
| 436 sock2_ = socket(AF_INET, SOCK_STREAM, 0); | |
|
binji
2013/12/02 20:55:32
this leaks the previous sock2_ ... do we care?
Sam Clegg
2013/12/02 22:55:44
The previous one is sock1_, right?
binji
2013/12/02 22:58:43
Sorry, I thought this was one of the tests that au
| |
| 437 ASSERT_EQ(0, ki_getsockopt(sock2_, IPPROTO_TCP, TCP_NODELAY, &option, &len)); | |
| 438 ASSERT_EQ(0, option); | |
| 439 ASSERT_EQ(sizeof(option), len); | |
| 440 | |
| 441 option = 1; | |
| 442 len = sizeof(option); | |
| 443 ASSERT_EQ(0, ki_setsockopt(sock2_, IPPROTO_TCP, TCP_NODELAY, &option, len)) | |
| 444 << "Failed with " << errno << ": " << strerror(errno); | |
|
binji
2013/12/02 20:55:32
nit: 4 space indent
Sam Clegg
2013/12/02 22:55:44
Done.
| |
| 445 ASSERT_EQ(1, option); | |
|
binji
2013/12/02 20:55:32
is there an easy way to test that this actually se
Sam Clegg
2013/12/02 22:55:44
Yeah.. ideally we would also actually test this by
| |
| 424 } | 446 } |
| 425 | 447 |
| 426 TEST_F(SocketTest, Sockopt_KEEPALIVE) { | 448 TEST_F(SocketTest, Sockopt_KEEPALIVE) { |
| 427 sock1_ = ki_socket(AF_INET, SOCK_STREAM, 0); | 449 sock1_ = ki_socket(AF_INET, SOCK_STREAM, 0); |
| 428 ASSERT_GT(sock1_, -1); | 450 ASSERT_GT(sock1_, -1); |
| 429 sock2_ = ki_socket(AF_INET, SOCK_DGRAM, 0); | 451 sock2_ = ki_socket(AF_INET, SOCK_DGRAM, 0); |
| 430 ASSERT_GT(sock2_, -1); | 452 ASSERT_GT(sock2_, -1); |
| 431 | 453 |
| 432 int value = 0; | 454 int value = 0; |
| 433 socklen_t len = sizeof(value); | 455 socklen_t len = sizeof(value); |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 505 int* inbuf_int = (int*)inbuf; | 527 int* inbuf_int = (int*)inbuf; |
| 506 for (int i = 0; i < LARGE_SEND_BYTES/sizeof(int); i++) { | 528 for (int i = 0; i < LARGE_SEND_BYTES/sizeof(int); i++) { |
| 507 outbuf_int[i] = i; | 529 outbuf_int[i] = i; |
| 508 } | 530 } |
| 509 | 531 |
| 510 sockaddr_in addr; | 532 sockaddr_in addr; |
| 511 socklen_t addrlen = sizeof(addr); | 533 socklen_t addrlen = sizeof(addr); |
| 512 | 534 |
| 513 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); | 535 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); |
| 514 ASSERT_EQ(0, ki_connect(sock_, (sockaddr*) &addr, addrlen)) | 536 ASSERT_EQ(0, ki_connect(sock_, (sockaddr*) &addr, addrlen)) |
| 515 << "Failed with " << errno << ": " << strerror(errno) << "\n"; | 537 << "Failed with " << errno << ": " << strerror(errno); |
| 516 | 538 |
| 517 // Call send an recv until all bytes have been transfered. | 539 // Call send an recv until all bytes have been transfered. |
| 518 while (bytes_received < LARGE_SEND_BYTES) { | 540 while (bytes_received < LARGE_SEND_BYTES) { |
| 519 if (bytes_sent < LARGE_SEND_BYTES) { | 541 if (bytes_sent < LARGE_SEND_BYTES) { |
| 520 int sent = ki_send(sock_, outbuf + bytes_sent, | 542 int sent = ki_send(sock_, outbuf + bytes_sent, |
| 521 LARGE_SEND_BYTES - bytes_sent, MSG_DONTWAIT); | 543 LARGE_SEND_BYTES - bytes_sent, MSG_DONTWAIT); |
| 522 if (sent < 0) | 544 if (sent < 0) |
| 523 ASSERT_EQ(EWOULDBLOCK, errno) << "send failed: " << strerror(errno); | 545 ASSERT_EQ(EWOULDBLOCK, errno) << "send failed: " << strerror(errno); |
| 524 else | 546 else |
| 525 bytes_sent += sent; | 547 bytes_sent += sent; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 581 // Bind and Listen | 603 // Bind and Listen |
| 582 ASSERT_EQ(0, Bind(server_sock, LOCAL_HOST, PORT1)); | 604 ASSERT_EQ(0, Bind(server_sock, LOCAL_HOST, PORT1)); |
| 583 ASSERT_EQ(0, ki_listen(server_sock, 10)) | 605 ASSERT_EQ(0, ki_listen(server_sock, 10)) |
| 584 << "listen failed with: " << strerror(errno); | 606 << "listen failed with: " << strerror(errno); |
| 585 | 607 |
| 586 // Connect to listening socket, and send greeting | 608 // Connect to listening socket, and send greeting |
| 587 int client_sock = sock2_; | 609 int client_sock = sock2_; |
| 588 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); | 610 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); |
| 589 addrlen = sizeof(addr); | 611 addrlen = sizeof(addr); |
| 590 ASSERT_EQ(0, ki_connect(client_sock, (sockaddr*)&addr, addrlen)) | 612 ASSERT_EQ(0, ki_connect(client_sock, (sockaddr*)&addr, addrlen)) |
| 591 << "Failed with " << errno << ": " << strerror(errno) << "\n"; | 613 << "Failed with " << errno << ": " << strerror(errno); |
| 592 | 614 |
| 593 ASSERT_EQ(greeting_len, ki_send(client_sock, client_greeting, | 615 ASSERT_EQ(greeting_len, ki_send(client_sock, client_greeting, |
| 594 greeting_len, 0)); | 616 greeting_len, 0)); |
| 595 | 617 |
| 596 // Pass in addrlen that is larger than our actual address to make | 618 // Pass in addrlen that is larger than our actual address to make |
| 597 // sure that it is correctly set back to sizeof(sockaddr_in) | 619 // sure that it is correctly set back to sizeof(sockaddr_in) |
| 598 addrlen = sizeof(addr) + 10; | 620 addrlen = sizeof(addr) + 10; |
| 599 int new_socket = accept(server_sock, (sockaddr*)&addr, &addrlen); | 621 int new_socket = accept(server_sock, (sockaddr*)&addr, &addrlen); |
| 600 ASSERT_GT(new_socket, -1) | 622 ASSERT_GT(new_socket, -1) |
| 601 << "accept failed with " << errno << ": " << strerror(errno) << "\n"; | 623 << "accept failed with " << errno << ": " << strerror(errno); |
| 602 | 624 |
| 603 // Verify addr and addrlen were set correctly | 625 // Verify addr and addrlen were set correctly |
| 604 ASSERT_EQ(addrlen, sizeof(sockaddr_in)); | 626 ASSERT_EQ(addrlen, sizeof(sockaddr_in)); |
| 605 sockaddr_in client_addr; | 627 sockaddr_in client_addr; |
| 606 ASSERT_EQ(0, ki_getsockname(client_sock, (sockaddr*)&client_addr, &addrlen)); | 628 ASSERT_EQ(0, ki_getsockname(client_sock, (sockaddr*)&client_addr, &addrlen)); |
| 607 ASSERT_EQ(client_addr.sin_family, addr.sin_family); | 629 ASSERT_EQ(client_addr.sin_family, addr.sin_family); |
| 608 ASSERT_EQ(client_addr.sin_port, addr.sin_port); | 630 ASSERT_EQ(client_addr.sin_port, addr.sin_port); |
| 609 ASSERT_EQ(client_addr.sin_addr.s_addr, addr.sin_addr.s_addr); | 631 ASSERT_EQ(client_addr.sin_addr.s_addr, addr.sin_addr.s_addr); |
| 610 | 632 |
| 611 // Recv greeting from client and send reply | 633 // Recv greeting from client and send reply |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 645 // not readable to indicate that no connections are available | 667 // not readable to indicate that no connections are available |
| 646 // to accept. | 668 // to accept. |
| 647 struct pollfd pollfd = { server_sock, POLLIN|POLLOUT, 0 }; | 669 struct pollfd pollfd = { server_sock, POLLIN|POLLOUT, 0 }; |
| 648 ASSERT_EQ(0, ki_poll(&pollfd, 1, 0)); | 670 ASSERT_EQ(0, ki_poll(&pollfd, 1, 0)); |
| 649 | 671 |
| 650 // Connect to listening socket | 672 // Connect to listening socket |
| 651 int client_sock = sock2_; | 673 int client_sock = sock2_; |
| 652 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); | 674 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); |
| 653 addrlen = sizeof(addr); | 675 addrlen = sizeof(addr); |
| 654 ASSERT_EQ(0, ki_connect(client_sock, (sockaddr*)&addr, addrlen)) | 676 ASSERT_EQ(0, ki_connect(client_sock, (sockaddr*)&addr, addrlen)) |
| 655 << "Failed with " << errno << ": " << strerror(errno) << "\n"; | 677 << "Failed with " << errno << ": " << strerror(errno); |
| 656 | 678 |
| 657 // Not poll again but with an infintie timeout. | 679 // Not poll again but with an infintie timeout. |
| 658 pollfd.fd = server_sock; | 680 pollfd.fd = server_sock; |
| 659 pollfd.events = POLLIN | POLLOUT; | 681 pollfd.events = POLLIN | POLLOUT; |
| 660 ASSERT_EQ(1, ki_poll(&pollfd, 1, -1)); | 682 ASSERT_EQ(1, ki_poll(&pollfd, 1, -1)); |
| 661 | 683 |
| 662 // Now non-blocking accept should return the new socket | 684 // Now non-blocking accept should return the new socket |
| 663 int new_socket = accept(server_sock, (sockaddr*)&addr, &addrlen); | 685 int new_socket = accept(server_sock, (sockaddr*)&addr, &addrlen); |
| 664 ASSERT_NE(-1, new_socket) | 686 ASSERT_NE(-1, new_socket) |
| 665 << "accept failed with: " << strerror(errno) << "\n"; | 687 << "accept failed with: " << strerror(errno); |
| 666 ASSERT_EQ(0, ki_close(new_socket)); | 688 ASSERT_EQ(0, ki_close(new_socket)); |
| 667 | 689 |
| 668 // Accept calls should once again fail with EAGAIN | 690 // Accept calls should once again fail with EAGAIN |
| 669 ASSERT_EQ(-1, accept(server_sock, (sockaddr*)&addr, &addrlen)); | 691 ASSERT_EQ(-1, accept(server_sock, (sockaddr*)&addr, &addrlen)); |
| 670 ASSERT_EQ(EAGAIN, errno); | 692 ASSERT_EQ(EAGAIN, errno); |
| 671 | 693 |
| 672 // As should polling the listening socket | 694 // As should polling the listening socket |
| 673 pollfd.fd = server_sock; | 695 pollfd.fd = server_sock; |
| 674 pollfd.events = POLLIN | POLLOUT; | 696 pollfd.events = POLLIN | POLLOUT; |
| 675 ASSERT_EQ(0, ki_poll(&pollfd, 1, 0)); | 697 ASSERT_EQ(0, ki_poll(&pollfd, 1, 0)); |
| 676 } | 698 } |
| 677 | 699 |
| 678 TEST_F(SocketTestTCP, SendRecvAfterRemoteShutdown) { | 700 TEST_F(SocketTestTCP, SendRecvAfterRemoteShutdown) { |
| 679 sockaddr_in addr; | 701 sockaddr_in addr; |
| 680 socklen_t addrlen = sizeof(addr); | 702 socklen_t addrlen = sizeof(addr); |
| 681 | 703 |
| 682 int server_sock = sock1_; | 704 int server_sock = sock1_; |
| 683 int client_sock = sock2_; | 705 int client_sock = sock2_; |
| 684 | 706 |
| 685 // bind and listen | 707 // bind and listen |
| 686 ASSERT_EQ(0, Bind(server_sock, LOCAL_HOST, PORT1)); | 708 ASSERT_EQ(0, Bind(server_sock, LOCAL_HOST, PORT1)); |
| 687 ASSERT_EQ(0, ki_listen(server_sock, 10)) | 709 ASSERT_EQ(0, ki_listen(server_sock, 10)) |
| 688 << "listen failed with: " << strerror(errno); | 710 << "listen failed with: " << strerror(errno); |
| 689 | 711 |
| 690 // connect to listening socket | 712 // connect to listening socket |
| 691 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); | 713 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); |
| 692 ASSERT_EQ(0, ki_connect(client_sock, (sockaddr*)&addr, addrlen)) | 714 ASSERT_EQ(0, ki_connect(client_sock, (sockaddr*)&addr, addrlen)) |
| 693 << "Failed with " << errno << ": " << strerror(errno) << "\n"; | 715 << "Failed with " << errno << ": " << strerror(errno); |
| 694 | 716 |
| 695 addrlen = sizeof(addr); | 717 addrlen = sizeof(addr); |
| 696 int new_sock = accept(server_sock, (sockaddr*)&addr, &addrlen); | 718 int new_sock = accept(server_sock, (sockaddr*)&addr, &addrlen); |
| 697 ASSERT_NE(-1, new_sock); | 719 ASSERT_NE(-1, new_sock); |
| 698 | 720 |
| 699 const char* send_buf = "hello world"; | 721 const char* send_buf = "hello world"; |
| 700 ASSERT_EQ(strlen(send_buf), ki_send(new_sock, send_buf, strlen(send_buf), 0)); | 722 ASSERT_EQ(strlen(send_buf), ki_send(new_sock, send_buf, strlen(send_buf), 0)); |
| 701 | 723 |
| 702 // Recv first 10 bytes | 724 // Recv first 10 bytes |
| 703 char buf[256]; | 725 char buf[256]; |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 725 int client_sock = sock2_; | 747 int client_sock = sock2_; |
| 726 | 748 |
| 727 // bind and listen | 749 // bind and listen |
| 728 ASSERT_EQ(0, Bind(server_sock, LOCAL_HOST, PORT1)); | 750 ASSERT_EQ(0, Bind(server_sock, LOCAL_HOST, PORT1)); |
| 729 ASSERT_EQ(0, ki_listen(server_sock, 10)) | 751 ASSERT_EQ(0, ki_listen(server_sock, 10)) |
| 730 << "listen failed with: " << strerror(errno); | 752 << "listen failed with: " << strerror(errno); |
| 731 | 753 |
| 732 // connect to listening socket | 754 // connect to listening socket |
| 733 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); | 755 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); |
| 734 ASSERT_EQ(0, ki_connect(client_sock, (sockaddr*)&addr, addrlen)) | 756 ASSERT_EQ(0, ki_connect(client_sock, (sockaddr*)&addr, addrlen)) |
| 735 << "Failed with " << errno << ": " << strerror(errno) << "\n"; | 757 << "Failed with " << errno << ": " << strerror(errno); |
| 736 | 758 |
| 737 addrlen = sizeof(addr); | 759 addrlen = sizeof(addr); |
| 738 int new_sock = accept(server_sock, (sockaddr*)&addr, &addrlen); | 760 int new_sock = accept(server_sock, (sockaddr*)&addr, &addrlen); |
| 739 ASSERT_NE(-1, new_sock); | 761 ASSERT_NE(-1, new_sock); |
| 740 | 762 |
| 741 // Close the new socket | 763 // Close the new socket |
| 742 ASSERT_EQ(0, ki_shutdown(client_sock, SHUT_RDWR)); | 764 ASSERT_EQ(0, ki_shutdown(client_sock, SHUT_RDWR)); |
| 743 | 765 |
| 744 // Attempt to read/write after shutdown | 766 // Attempt to read/write after shutdown |
| 745 char buffer[10]; | 767 char buffer[10]; |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 757 int client_sock = sock2_; | 779 int client_sock = sock2_; |
| 758 | 780 |
| 759 // bind and listen | 781 // bind and listen |
| 760 ASSERT_EQ(0, Bind(server_sock, LOCAL_HOST, PORT1)); | 782 ASSERT_EQ(0, Bind(server_sock, LOCAL_HOST, PORT1)); |
| 761 ASSERT_EQ(0, ki_listen(server_sock, 10)) | 783 ASSERT_EQ(0, ki_listen(server_sock, 10)) |
| 762 << "listen failed with: " << strerror(errno); | 784 << "listen failed with: " << strerror(errno); |
| 763 | 785 |
| 764 // connect to listening socket | 786 // connect to listening socket |
| 765 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); | 787 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); |
| 766 ASSERT_EQ(0, ki_connect(client_sock, (sockaddr*)&addr, addrlen)) | 788 ASSERT_EQ(0, ki_connect(client_sock, (sockaddr*)&addr, addrlen)) |
| 767 << "Failed with " << errno << ": " << strerror(errno) << "\n"; | 789 << "Failed with " << errno << ": " << strerror(errno); |
| 768 | 790 |
| 769 addrlen = sizeof(addr); | 791 addrlen = sizeof(addr); |
| 770 int new_sock = accept(server_sock, (sockaddr*)&addr, &addrlen); | 792 int new_sock = accept(server_sock, (sockaddr*)&addr, &addrlen); |
| 771 ASSERT_NE(-1, new_sock); | 793 ASSERT_NE(-1, new_sock); |
| 772 | 794 |
| 773 // send a fairly large amount of data and immediately close | 795 // send a fairly large amount of data and immediately close |
| 774 // the socket. | 796 // the socket. |
| 775 void* buffer = alloca(SEND_BYTES); | 797 void* buffer = alloca(SEND_BYTES); |
| 776 ASSERT_EQ(SEND_BYTES, ki_send(client_sock, buffer, SEND_BYTES, 0)); | 798 ASSERT_EQ(SEND_BYTES, ki_send(client_sock, buffer, SEND_BYTES, 0)); |
| 777 ASSERT_EQ(0, ki_close(client_sock)); | 799 ASSERT_EQ(0, ki_close(client_sock)); |
| 778 | 800 |
| 779 // avoid double close of sock2_ | 801 // avoid double close of sock2_ |
| 780 sock2_ = -1; | 802 sock2_ = -1; |
| 781 | 803 |
| 782 // Attempt to recv() all the sent data. None should be lost. | 804 // Attempt to recv() all the sent data. None should be lost. |
| 783 int remainder = SEND_BYTES; | 805 int remainder = SEND_BYTES; |
| 784 while (remainder > 0) { | 806 while (remainder > 0) { |
| 785 int rtn = ki_recv(new_sock, buffer, remainder, 0); | 807 int rtn = ki_recv(new_sock, buffer, remainder, 0); |
| 786 ASSERT_GT(rtn, 0); | 808 ASSERT_GT(rtn, 0); |
| 787 remainder -= rtn; | 809 remainder -= rtn; |
| 788 } | 810 } |
| 789 | 811 |
| 790 ASSERT_EQ(0, ki_close(new_sock)); | 812 ASSERT_EQ(0, ki_close(new_sock)); |
| 791 } | 813 } |
| 792 | 814 |
| 793 #endif // PROVIDES_SOCKET_API | 815 #endif // PROVIDES_SOCKET_API |
| OLD | NEW |