1 //===-- Unittests for send/recv -------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "src/sys/socket/recv.h" 10 #include "src/sys/socket/send.h" 11 #include "src/sys/socket/socketpair.h" 12 13 #include "src/unistd/close.h" 14 15 #include "src/errno/libc_errno.h" 16 #include "test/UnitTest/Test.h" 17 18 #include <sys/socket.h> // For AF_UNIX and SOCK_DGRAM 19 20 TEST(LlvmLibcSendRecvTest, SucceedsWithSocketPair) { 21 const char TEST_MESSAGE[] = "connection successful"; 22 const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE); 23 24 int sockpair[2] = {0, 0}; 25 26 int result = LIBC_NAMESPACE::socketpair(AF_UNIX, SOCK_STREAM, 0, sockpair); 27 ASSERT_EQ(result, 0); 28 ASSERT_ERRNO_SUCCESS(); 29 30 ssize_t send_result = 31 LIBC_NAMESPACE::send(sockpair[0], TEST_MESSAGE, MESSAGE_LEN, 0); 32 EXPECT_EQ(send_result, static_cast<ssize_t>(MESSAGE_LEN)); 33 ASSERT_ERRNO_SUCCESS(); 34 35 char buffer[256]; 36 37 ssize_t recv_result = 38 LIBC_NAMESPACE::recv(sockpair[1], buffer, sizeof(buffer), 0); 39 ASSERT_EQ(recv_result, static_cast<ssize_t>(MESSAGE_LEN)); 40 ASSERT_ERRNO_SUCCESS(); 41 42 ASSERT_STREQ(buffer, TEST_MESSAGE); 43 44 // close both ends of the socket 45 result = LIBC_NAMESPACE::close(sockpair[0]); 46 ASSERT_EQ(result, 0); 47 ASSERT_ERRNO_SUCCESS(); 48 49 result = LIBC_NAMESPACE::close(sockpair[1]); 50 ASSERT_EQ(result, 0); 51 ASSERT_ERRNO_SUCCESS(); 52 } 53 54 TEST(LlvmLibcSendRecvTest, SendFails) { 55 const char TEST_MESSAGE[] = "connection terminated"; 56 const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE); 57 58 ssize_t send_result = LIBC_NAMESPACE::send(-1, TEST_MESSAGE, MESSAGE_LEN, 0); 59 EXPECT_EQ(send_result, ssize_t(-1)); 60 ASSERT_ERRNO_FAILURE(); 61 62 LIBC_NAMESPACE::libc_errno = 0; // reset errno to avoid test ordering issues. 63 } 64 65 TEST(LlvmLibcSendRecvTest, RecvFails) { 66 char buffer[256]; 67 68 ssize_t recv_result = LIBC_NAMESPACE::recv(-1, buffer, sizeof(buffer), 0); 69 ASSERT_EQ(recv_result, ssize_t(-1)); 70 ASSERT_ERRNO_FAILURE(); 71 72 LIBC_NAMESPACE::libc_errno = 0; // reset errno to avoid test ordering issues. 73 } 74