| 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 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 // at the time of the first send. | 263 // at the time of the first send. |
| 264 EXPECT_EQ(0, Bind(sock2_, LOCAL_HOST, PORT2)); | 264 EXPECT_EQ(0, Bind(sock2_, LOCAL_HOST, PORT2)); |
| 265 | 265 |
| 266 sockaddr_in addr; | 266 sockaddr_in addr; |
| 267 sockaddr_in addr2; | 267 sockaddr_in addr2; |
| 268 socklen_t addrlen = sizeof(addr2); | 268 socklen_t addrlen = sizeof(addr2); |
| 269 IP4ToSockAddr(LOCAL_HOST, PORT2, &addr2); | 269 IP4ToSockAddr(LOCAL_HOST, PORT2, &addr2); |
| 270 | 270 |
| 271 // The first send hasn't occurred, so the socket is not yet bound. | 271 // The first send hasn't occurred, so the socket is not yet bound. |
| 272 socklen_t out_addrlen = sizeof(addr); | 272 socklen_t out_addrlen = sizeof(addr); |
| 273 ASSERT_EQ(0, getsockname(sock1_, (sockaddr*)&addr, &out_addrlen)); | 273 ASSERT_EQ(0, ki_getsockname(sock1_, (sockaddr*)&addr, &out_addrlen)); |
| 274 EXPECT_EQ(addrlen, out_addrlen); | 274 EXPECT_EQ(addrlen, out_addrlen); |
| 275 EXPECT_EQ(0, htonl(addr.sin_addr.s_addr)); | 275 EXPECT_EQ(0, htonl(addr.sin_addr.s_addr)); |
| 276 EXPECT_EQ(0, htons(addr.sin_port)); | 276 EXPECT_EQ(0, htons(addr.sin_port)); |
| 277 | 277 |
| 278 int len1 = | 278 int len1 = |
| 279 sendto(sock1_, outbuf, sizeof(outbuf), 0, (sockaddr*) &addr2, addrlen); | 279 ki_sendto(sock1_, outbuf, sizeof(outbuf), 0, (sockaddr*) &addr2, addrlen); |
| 280 EXPECT_EQ(sizeof(outbuf), len1); | 280 EXPECT_EQ(sizeof(outbuf), len1); |
| 281 | 281 |
| 282 // After the first send, the socket should be bound; the port is set, but | 282 // After the first send, the socket should be bound; the port is set, but |
| 283 // the address is still 0. | 283 // the address is still 0. |
| 284 ASSERT_EQ(0, getsockname(sock1_, (sockaddr*)&addr, &out_addrlen)); | 284 ASSERT_EQ(0, ki_getsockname(sock1_, (sockaddr*)&addr, &out_addrlen)); |
| 285 EXPECT_EQ(addrlen, out_addrlen); | 285 EXPECT_EQ(addrlen, out_addrlen); |
| 286 EXPECT_EQ(0, htonl(addr.sin_addr.s_addr)); | 286 EXPECT_EQ(0, htonl(addr.sin_addr.s_addr)); |
| 287 EXPECT_NE(0, htons(addr.sin_port)); | 287 EXPECT_NE(0, htons(addr.sin_port)); |
| 288 | 288 |
| 289 // Ensure the buffers are different | 289 // Ensure the buffers are different |
| 290 EXPECT_NE(0, memcmp(outbuf, inbuf, sizeof(outbuf))); | 290 EXPECT_NE(0, memcmp(outbuf, inbuf, sizeof(outbuf))); |
| 291 | 291 |
| 292 // Try to receive the previously sent packet | 292 // Try to receive the previously sent packet |
| 293 int len2 = | 293 int len2 = |
| 294 recvfrom(sock2_, inbuf, sizeof(inbuf), 0, (sockaddr*) &addr, &addrlen); | 294 ki_recvfrom(sock2_, inbuf, sizeof(inbuf), 0, (sockaddr*) &addr, &addrlen); |
| 295 EXPECT_EQ(sizeof(outbuf), len2); | 295 EXPECT_EQ(sizeof(outbuf), len2); |
| 296 EXPECT_EQ(sizeof(sockaddr_in), addrlen); | 296 EXPECT_EQ(sizeof(sockaddr_in), addrlen); |
| 297 EXPECT_EQ(LOCAL_HOST, htonl(addr.sin_addr.s_addr)); | 297 EXPECT_EQ(LOCAL_HOST, htonl(addr.sin_addr.s_addr)); |
| 298 EXPECT_NE(0, htons(addr.sin_port)); | 298 EXPECT_NE(0, htons(addr.sin_port)); |
| 299 | 299 |
| 300 // Now they should be the same | 300 // Now they should be the same |
| 301 EXPECT_EQ(0, memcmp(outbuf, inbuf, sizeof(outbuf))); | 301 EXPECT_EQ(0, memcmp(outbuf, inbuf, sizeof(outbuf))); |
| 302 } | 302 } |
| 303 | 303 |
| 304 const size_t kQueueSize = 65536 * 8; | 304 const size_t kQueueSize = 65536 * 8; |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 | 424 |
| 425 TEST_F(SocketTest, Sockopt_TCP_NODELAY) { | 425 TEST_F(SocketTest, Sockopt_TCP_NODELAY) { |
| 426 int option = 0; | 426 int option = 0; |
| 427 socklen_t len = sizeof(option); | 427 socklen_t len = sizeof(option); |
| 428 // Getting and setting TCP_NODELAY on UDP socket should fail | 428 // Getting and setting TCP_NODELAY on UDP socket should fail |
| 429 sock1_ = socket(AF_INET, SOCK_DGRAM, 0); | 429 sock1_ = ki_socket(AF_INET, SOCK_DGRAM, 0); |
| 430 ASSERT_EQ(-1, ki_setsockopt(sock1_, IPPROTO_TCP, TCP_NODELAY, &option, len)); | 430 ASSERT_EQ(-1, ki_setsockopt(sock1_, IPPROTO_TCP, TCP_NODELAY, &option, len)); |
| 431 ASSERT_EQ(ENOPROTOOPT, errno); | 431 ASSERT_EQ(ENOPROTOOPT, errno); |
| 432 ASSERT_EQ(-1, ki_getsockopt(sock1_, IPPROTO_TCP, TCP_NODELAY, &option, &len)); | 432 ASSERT_EQ(-1, ki_getsockopt(sock1_, IPPROTO_TCP, TCP_NODELAY, &option, &len)); |
| 433 ASSERT_EQ(ENOPROTOOPT, errno); | 433 ASSERT_EQ(ENOPROTOOPT, errno); |
| 434 | 434 |
| 435 // Getting and setting TCP_NODELAY on TCP socket should preserve value | 435 // Getting and setting TCP_NODELAY on TCP socket should preserve value |
| 436 sock2_ = socket(AF_INET, SOCK_STREAM, 0); | 436 sock2_ = ki_socket(AF_INET, SOCK_STREAM, 0); |
| 437 ASSERT_EQ(0, ki_getsockopt(sock2_, IPPROTO_TCP, TCP_NODELAY, &option, &len)); | 437 ASSERT_EQ(0, ki_getsockopt(sock2_, IPPROTO_TCP, TCP_NODELAY, &option, &len)); |
| 438 ASSERT_EQ(0, option); | 438 ASSERT_EQ(0, option); |
| 439 ASSERT_EQ(sizeof(option), len); | 439 ASSERT_EQ(sizeof(option), len); |
| 440 | 440 |
| 441 option = 1; | 441 option = 1; |
| 442 len = sizeof(option); | 442 len = sizeof(option); |
| 443 ASSERT_EQ(0, ki_setsockopt(sock2_, IPPROTO_TCP, TCP_NODELAY, &option, len)) | 443 ASSERT_EQ(0, ki_setsockopt(sock2_, IPPROTO_TCP, TCP_NODELAY, &option, len)) |
| 444 << "Failed with " << errno << ": " << strerror(errno); | 444 << "Failed with " << errno << ": " << strerror(errno); |
| 445 ASSERT_EQ(1, option); | 445 ASSERT_EQ(1, option); |
| 446 } | 446 } |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 588 sockaddr_in addr; | 588 sockaddr_in addr; |
| 589 socklen_t addrlen = sizeof(addr); | 589 socklen_t addrlen = sizeof(addr); |
| 590 const char* client_greeting = "hello"; | 590 const char* client_greeting = "hello"; |
| 591 const char* server_reply = "reply"; | 591 const char* server_reply = "reply"; |
| 592 const int greeting_len = strlen(client_greeting); | 592 const int greeting_len = strlen(client_greeting); |
| 593 const int reply_len = strlen(server_reply); | 593 const int reply_len = strlen(server_reply); |
| 594 | 594 |
| 595 int server_sock = sock1_; | 595 int server_sock = sock1_; |
| 596 | 596 |
| 597 // Accept before listen should fail | 597 // Accept before listen should fail |
| 598 ASSERT_EQ(-1, accept(server_sock, (sockaddr*)&addr, &addrlen)); | 598 ASSERT_EQ(-1, ki_accept(server_sock, (sockaddr*)&addr, &addrlen)); |
| 599 | 599 |
| 600 // Listen should fail on unbound socket | 600 // Listen should fail on unbound socket |
| 601 ASSERT_EQ(-1, ki_listen(server_sock, 10)); | 601 ASSERT_EQ(-1, ki_listen(server_sock, 10)); |
| 602 | 602 |
| 603 // Bind and Listen | 603 // Bind and Listen |
| 604 ASSERT_EQ(0, Bind(server_sock, LOCAL_HOST, PORT1)); | 604 ASSERT_EQ(0, Bind(server_sock, LOCAL_HOST, PORT1)); |
| 605 ASSERT_EQ(0, ki_listen(server_sock, 10)) | 605 ASSERT_EQ(0, ki_listen(server_sock, 10)) |
| 606 << "listen failed with: " << strerror(errno); | 606 << "listen failed with: " << strerror(errno); |
| 607 | 607 |
| 608 // Connect to listening socket, and send greeting | 608 // Connect to listening socket, and send greeting |
| 609 int client_sock = sock2_; | 609 int client_sock = sock2_; |
| 610 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); | 610 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); |
| 611 addrlen = sizeof(addr); | 611 addrlen = sizeof(addr); |
| 612 ASSERT_EQ(0, ki_connect(client_sock, (sockaddr*)&addr, addrlen)) | 612 ASSERT_EQ(0, ki_connect(client_sock, (sockaddr*)&addr, addrlen)) |
| 613 << "Failed with " << errno << ": " << strerror(errno); | 613 << "Failed with " << errno << ": " << strerror(errno); |
| 614 | 614 |
| 615 ASSERT_EQ(greeting_len, ki_send(client_sock, client_greeting, | 615 ASSERT_EQ(greeting_len, ki_send(client_sock, client_greeting, |
| 616 greeting_len, 0)); | 616 greeting_len, 0)); |
| 617 | 617 |
| 618 // 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 |
| 619 // sure that it is correctly set back to sizeof(sockaddr_in) | 619 // sure that it is correctly set back to sizeof(sockaddr_in) |
| 620 addrlen = sizeof(addr) + 10; | 620 addrlen = sizeof(addr) + 10; |
| 621 int new_socket = accept(server_sock, (sockaddr*)&addr, &addrlen); | 621 int new_socket = ki_accept(server_sock, (sockaddr*)&addr, &addrlen); |
| 622 ASSERT_GT(new_socket, -1) | 622 ASSERT_GT(new_socket, -1) |
| 623 << "accept failed with " << errno << ": " << strerror(errno); | 623 << "accept failed with " << errno << ": " << strerror(errno); |
| 624 | 624 |
| 625 // Verify addr and addrlen were set correctly | 625 // Verify addr and addrlen were set correctly |
| 626 ASSERT_EQ(addrlen, sizeof(sockaddr_in)); | 626 ASSERT_EQ(addrlen, sizeof(sockaddr_in)); |
| 627 sockaddr_in client_addr; | 627 sockaddr_in client_addr; |
| 628 ASSERT_EQ(0, ki_getsockname(client_sock, (sockaddr*)&client_addr, &addrlen)); | 628 ASSERT_EQ(0, ki_getsockname(client_sock, (sockaddr*)&client_addr, &addrlen)); |
| 629 ASSERT_EQ(client_addr.sin_family, addr.sin_family); | 629 ASSERT_EQ(client_addr.sin_family, addr.sin_family); |
| 630 ASSERT_EQ(client_addr.sin_port, addr.sin_port); | 630 ASSERT_EQ(client_addr.sin_port, addr.sin_port); |
| 631 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); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 653 | 653 |
| 654 // bind and listen | 654 // bind and listen |
| 655 ASSERT_EQ(0, Bind(server_sock, LOCAL_HOST, PORT1)); | 655 ASSERT_EQ(0, Bind(server_sock, LOCAL_HOST, PORT1)); |
| 656 ASSERT_EQ(0, ki_listen(server_sock, 10)) | 656 ASSERT_EQ(0, ki_listen(server_sock, 10)) |
| 657 << "listen failed with: " << strerror(errno); | 657 << "listen failed with: " << strerror(errno); |
| 658 | 658 |
| 659 // Accept should fail with EAGAIN since there is no incomming | 659 // Accept should fail with EAGAIN since there is no incomming |
| 660 // connection. | 660 // connection. |
| 661 sockaddr_in addr; | 661 sockaddr_in addr; |
| 662 socklen_t addrlen = sizeof(addr); | 662 socklen_t addrlen = sizeof(addr); |
| 663 ASSERT_EQ(-1, accept(server_sock, (sockaddr*)&addr, &addrlen)); | 663 ASSERT_EQ(-1, ki_accept(server_sock, (sockaddr*)&addr, &addrlen)); |
| 664 ASSERT_EQ(EAGAIN, errno); | 664 ASSERT_EQ(EAGAIN, errno); |
| 665 | 665 |
| 666 // If we poll the listening socket it should also return | 666 // If we poll the listening socket it should also return |
| 667 // not readable to indicate that no connections are available | 667 // not readable to indicate that no connections are available |
| 668 // to accept. | 668 // to accept. |
| 669 struct pollfd pollfd = { server_sock, POLLIN|POLLOUT, 0 }; | 669 struct pollfd pollfd = { server_sock, POLLIN|POLLOUT, 0 }; |
| 670 ASSERT_EQ(0, ki_poll(&pollfd, 1, 0)); | 670 ASSERT_EQ(0, ki_poll(&pollfd, 1, 0)); |
| 671 | 671 |
| 672 // Connect to listening socket | 672 // Connect to listening socket |
| 673 int client_sock = sock2_; | 673 int client_sock = sock2_; |
| 674 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); | 674 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); |
| 675 addrlen = sizeof(addr); | 675 addrlen = sizeof(addr); |
| 676 ASSERT_EQ(0, ki_connect(client_sock, (sockaddr*)&addr, addrlen)) | 676 ASSERT_EQ(0, ki_connect(client_sock, (sockaddr*)&addr, addrlen)) |
| 677 << "Failed with " << errno << ": " << strerror(errno); | 677 << "Failed with " << errno << ": " << strerror(errno); |
| 678 | 678 |
| 679 // Not poll again but with an infintie timeout. | 679 // Not poll again but with an infintie timeout. |
| 680 pollfd.fd = server_sock; | 680 pollfd.fd = server_sock; |
| 681 pollfd.events = POLLIN | POLLOUT; | 681 pollfd.events = POLLIN | POLLOUT; |
| 682 ASSERT_EQ(1, ki_poll(&pollfd, 1, -1)); | 682 ASSERT_EQ(1, ki_poll(&pollfd, 1, -1)); |
| 683 | 683 |
| 684 // Now non-blocking accept should return the new socket | 684 // Now non-blocking accept should return the new socket |
| 685 int new_socket = accept(server_sock, (sockaddr*)&addr, &addrlen); | 685 int new_socket = ki_accept(server_sock, (sockaddr*)&addr, &addrlen); |
| 686 ASSERT_NE(-1, new_socket) | 686 ASSERT_NE(-1, new_socket) |
| 687 << "accept failed with: " << strerror(errno); | 687 << "accept failed with: " << strerror(errno); |
| 688 ASSERT_EQ(0, ki_close(new_socket)); | 688 ASSERT_EQ(0, ki_close(new_socket)); |
| 689 | 689 |
| 690 // Accept calls should once again fail with EAGAIN | 690 // Accept calls should once again fail with EAGAIN |
| 691 ASSERT_EQ(-1, accept(server_sock, (sockaddr*)&addr, &addrlen)); | 691 ASSERT_EQ(-1, ki_accept(server_sock, (sockaddr*)&addr, &addrlen)); |
| 692 ASSERT_EQ(EAGAIN, errno); | 692 ASSERT_EQ(EAGAIN, errno); |
| 693 | 693 |
| 694 // As should polling the listening socket | 694 // As should polling the listening socket |
| 695 pollfd.fd = server_sock; | 695 pollfd.fd = server_sock; |
| 696 pollfd.events = POLLIN | POLLOUT; | 696 pollfd.events = POLLIN | POLLOUT; |
| 697 ASSERT_EQ(0, ki_poll(&pollfd, 1, 0)); | 697 ASSERT_EQ(0, ki_poll(&pollfd, 1, 0)); |
| 698 } | 698 } |
| 699 | 699 |
| 700 TEST_F(SocketTestTCP, SendRecvAfterRemoteShutdown) { | 700 TEST_F(SocketTestTCP, SendRecvAfterRemoteShutdown) { |
| 701 sockaddr_in addr; | 701 sockaddr_in addr; |
| 702 socklen_t addrlen = sizeof(addr); | 702 socklen_t addrlen = sizeof(addr); |
| 703 | 703 |
| 704 int server_sock = sock1_; | 704 int server_sock = sock1_; |
| 705 int client_sock = sock2_; | 705 int client_sock = sock2_; |
| 706 | 706 |
| 707 // bind and listen | 707 // bind and listen |
| 708 ASSERT_EQ(0, Bind(server_sock, LOCAL_HOST, PORT1)); | 708 ASSERT_EQ(0, Bind(server_sock, LOCAL_HOST, PORT1)); |
| 709 ASSERT_EQ(0, ki_listen(server_sock, 10)) | 709 ASSERT_EQ(0, ki_listen(server_sock, 10)) |
| 710 << "listen failed with: " << strerror(errno); | 710 << "listen failed with: " << strerror(errno); |
| 711 | 711 |
| 712 // connect to listening socket | 712 // connect to listening socket |
| 713 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); | 713 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); |
| 714 ASSERT_EQ(0, ki_connect(client_sock, (sockaddr*)&addr, addrlen)) | 714 ASSERT_EQ(0, ki_connect(client_sock, (sockaddr*)&addr, addrlen)) |
| 715 << "Failed with " << errno << ": " << strerror(errno); | 715 << "Failed with " << errno << ": " << strerror(errno); |
| 716 | 716 |
| 717 addrlen = sizeof(addr); | 717 addrlen = sizeof(addr); |
| 718 int new_sock = accept(server_sock, (sockaddr*)&addr, &addrlen); | 718 int new_sock = ki_accept(server_sock, (sockaddr*)&addr, &addrlen); |
| 719 ASSERT_NE(-1, new_sock); | 719 ASSERT_NE(-1, new_sock); |
| 720 | 720 |
| 721 const char* send_buf = "hello world"; | 721 const char* send_buf = "hello world"; |
| 722 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)); |
| 723 | 723 |
| 724 // Recv first 10 bytes | 724 // Recv first 10 bytes |
| 725 char buf[256]; | 725 char buf[256]; |
| 726 ASSERT_EQ(10, ki_recv(client_sock, buf, 10, 0)); | 726 ASSERT_EQ(10, ki_recv(client_sock, buf, 10, 0)); |
| 727 | 727 |
| 728 // Close the new socket | 728 // Close the new socket |
| (...skipping 21 matching lines...) Expand all Loading... |
| 750 ASSERT_EQ(0, Bind(server_sock, LOCAL_HOST, PORT1)); | 750 ASSERT_EQ(0, Bind(server_sock, LOCAL_HOST, PORT1)); |
| 751 ASSERT_EQ(0, ki_listen(server_sock, 10)) | 751 ASSERT_EQ(0, ki_listen(server_sock, 10)) |
| 752 << "listen failed with: " << strerror(errno); | 752 << "listen failed with: " << strerror(errno); |
| 753 | 753 |
| 754 // connect to listening socket | 754 // connect to listening socket |
| 755 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); | 755 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); |
| 756 ASSERT_EQ(0, ki_connect(client_sock, (sockaddr*)&addr, addrlen)) | 756 ASSERT_EQ(0, ki_connect(client_sock, (sockaddr*)&addr, addrlen)) |
| 757 << "Failed with " << errno << ": " << strerror(errno); | 757 << "Failed with " << errno << ": " << strerror(errno); |
| 758 | 758 |
| 759 addrlen = sizeof(addr); | 759 addrlen = sizeof(addr); |
| 760 int new_sock = accept(server_sock, (sockaddr*)&addr, &addrlen); | 760 int new_sock = ki_accept(server_sock, (sockaddr*)&addr, &addrlen); |
| 761 ASSERT_NE(-1, new_sock); | 761 ASSERT_NE(-1, new_sock); |
| 762 | 762 |
| 763 // Close the new socket | 763 // Close the new socket |
| 764 ASSERT_EQ(0, ki_shutdown(client_sock, SHUT_RDWR)); | 764 ASSERT_EQ(0, ki_shutdown(client_sock, SHUT_RDWR)); |
| 765 | 765 |
| 766 // Attempt to read/write after shutdown | 766 // Attempt to read/write after shutdown |
| 767 char buffer[10]; | 767 char buffer[10]; |
| 768 ASSERT_EQ(0, ki_recv(client_sock, buffer, sizeof(buffer), 0)); | 768 ASSERT_EQ(0, ki_recv(client_sock, buffer, sizeof(buffer), 0)); |
| 769 ASSERT_EQ(-1, ki_send(client_sock, buffer, sizeof(buffer), 0)); | 769 ASSERT_EQ(-1, ki_send(client_sock, buffer, sizeof(buffer), 0)); |
| 770 ASSERT_EQ(errno, EPIPE); | 770 ASSERT_EQ(errno, EPIPE); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 782 ASSERT_EQ(0, Bind(server_sock, LOCAL_HOST, PORT1)); | 782 ASSERT_EQ(0, Bind(server_sock, LOCAL_HOST, PORT1)); |
| 783 ASSERT_EQ(0, ki_listen(server_sock, 10)) | 783 ASSERT_EQ(0, ki_listen(server_sock, 10)) |
| 784 << "listen failed with: " << strerror(errno); | 784 << "listen failed with: " << strerror(errno); |
| 785 | 785 |
| 786 // connect to listening socket | 786 // connect to listening socket |
| 787 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); | 787 IP4ToSockAddr(LOCAL_HOST, PORT1, &addr); |
| 788 ASSERT_EQ(0, ki_connect(client_sock, (sockaddr*)&addr, addrlen)) | 788 ASSERT_EQ(0, ki_connect(client_sock, (sockaddr*)&addr, addrlen)) |
| 789 << "Failed with " << errno << ": " << strerror(errno); | 789 << "Failed with " << errno << ": " << strerror(errno); |
| 790 | 790 |
| 791 addrlen = sizeof(addr); | 791 addrlen = sizeof(addr); |
| 792 int new_sock = accept(server_sock, (sockaddr*)&addr, &addrlen); | 792 int new_sock = ki_accept(server_sock, (sockaddr*)&addr, &addrlen); |
| 793 ASSERT_NE(-1, new_sock); | 793 ASSERT_NE(-1, new_sock); |
| 794 | 794 |
| 795 // send a fairly large amount of data and immediately close | 795 // send a fairly large amount of data and immediately close |
| 796 // the socket. | 796 // the socket. |
| 797 void* buffer = alloca(SEND_BYTES); | 797 void* buffer = alloca(SEND_BYTES); |
| 798 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)); |
| 799 ASSERT_EQ(0, ki_close(client_sock)); | 799 ASSERT_EQ(0, ki_close(client_sock)); |
| 800 | 800 |
| 801 // avoid double close of sock2_ | 801 // avoid double close of sock2_ |
| 802 sock2_ = -1; | 802 sock2_ = -1; |
| 803 | 803 |
| 804 // Attempt to recv() all the sent data. None should be lost. | 804 // Attempt to recv() all the sent data. None should be lost. |
| 805 int remainder = SEND_BYTES; | 805 int remainder = SEND_BYTES; |
| 806 while (remainder > 0) { | 806 while (remainder > 0) { |
| 807 int rtn = ki_recv(new_sock, buffer, remainder, 0); | 807 int rtn = ki_recv(new_sock, buffer, remainder, 0); |
| 808 ASSERT_GT(rtn, 0); | 808 ASSERT_GT(rtn, 0); |
| 809 remainder -= rtn; | 809 remainder -= rtn; |
| 810 } | 810 } |
| 811 | 811 |
| 812 ASSERT_EQ(0, ki_close(new_sock)); | 812 ASSERT_EQ(0, ki_close(new_sock)); |
| 813 } | 813 } |
| 814 | 814 |
| 815 #endif // PROVIDES_SOCKET_API | 815 #endif // PROVIDES_SOCKET_API |
| OLD | NEW |