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