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