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