1*f6b4c34dSMichael Jones //===-- Unittests for send/recv -------------------------------------------===// 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/recv.h" 10*f6b4c34dSMichael Jones #include "src/sys/socket/send.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(LlvmLibcSendRecvTest, 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 = 31*f6b4c34dSMichael Jones LIBC_NAMESPACE::send(sockpair[0], TEST_MESSAGE, MESSAGE_LEN, 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 = 38*f6b4c34dSMichael Jones LIBC_NAMESPACE::recv(sockpair[1], buffer, sizeof(buffer), 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(LlvmLibcSendRecvTest, SendFails) { 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 = LIBC_NAMESPACE::send(-1, TEST_MESSAGE, MESSAGE_LEN, 0); 59*f6b4c34dSMichael Jones EXPECT_EQ(send_result, ssize_t(-1)); 60*f6b4c34dSMichael Jones ASSERT_ERRNO_FAILURE(); 61*f6b4c34dSMichael Jones 62*f6b4c34dSMichael Jones LIBC_NAMESPACE::libc_errno = 0; // reset errno to avoid test ordering issues. 63*f6b4c34dSMichael Jones } 64*f6b4c34dSMichael Jones 65*f6b4c34dSMichael Jones TEST(LlvmLibcSendRecvTest, RecvFails) { 66*f6b4c34dSMichael Jones char buffer[256]; 67*f6b4c34dSMichael Jones 68*f6b4c34dSMichael Jones ssize_t recv_result = LIBC_NAMESPACE::recv(-1, buffer, sizeof(buffer), 0); 69*f6b4c34dSMichael Jones ASSERT_EQ(recv_result, ssize_t(-1)); 70*f6b4c34dSMichael Jones ASSERT_ERRNO_FAILURE(); 71*f6b4c34dSMichael Jones 72*f6b4c34dSMichael Jones LIBC_NAMESPACE::libc_errno = 0; // reset errno to avoid test ordering issues. 73*f6b4c34dSMichael Jones } 74