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); |
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); |
| 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); |
| 445 ASSERT_EQ(1, option); |
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 |