1 //===-- Unittests for sendto/recvfrom -------------------------------------===// 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/recvfrom.h" 10 #include "src/sys/socket/sendto.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(LlvmLibcSendToRecvFromTest, 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 = LIBC_NAMESPACE::sendto(sockpair[0], TEST_MESSAGE, 31 MESSAGE_LEN, 0, nullptr, 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 = LIBC_NAMESPACE::recvfrom(sockpair[1], buffer, 38 sizeof(buffer), 0, nullptr, 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(LlvmLibcSendToRecvFromTest, SendToFails) { 55 const char TEST_MESSAGE[] = "connection terminated"; 56 const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE); 57 58 ssize_t send_result = 59 LIBC_NAMESPACE::sendto(-1, TEST_MESSAGE, MESSAGE_LEN, 0, nullptr, 0); 60 EXPECT_EQ(send_result, ssize_t(-1)); 61 ASSERT_ERRNO_FAILURE(); 62 63 LIBC_NAMESPACE::libc_errno = 0; // reset errno to avoid test ordering issues. 64 } 65 66 TEST(LlvmLibcSendToRecvFromTest, RecvFromFails) { 67 char buffer[256]; 68 69 ssize_t recv_result = 70 LIBC_NAMESPACE::recvfrom(-1, buffer, sizeof(buffer), 0, nullptr, 0); 71 ASSERT_EQ(recv_result, ssize_t(-1)); 72 ASSERT_ERRNO_FAILURE(); 73 74 LIBC_NAMESPACE::libc_errno = 0; // reset errno to avoid test ordering issues. 75 } 76