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 |