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