xref: /llvm-project/libc/test/src/sys/socket/linux/send_recv_test.cpp (revision f6b4c34d4f96ca705409f76b9bb48de7d2bec9bd)
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