1 //===-- Unittests for send/recv -------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 #include "src/sys/socket/recv.h"
10 #include "src/sys/socket/send.h"
11 #include "src/sys/socket/socketpair.h"
13 #include "src/unistd/close.h"
15 #include "src/errno/libc_errno.h"
16 #include "test/UnitTest/Test.h"
18 #include <sys/socket.h> // For AF_UNIX and SOCK_DGRAM
20 TEST(LlvmLibcSendRecvTest
, SucceedsWithSocketPair
) {
21 const char TEST_MESSAGE
[] = "connection successful";
22 const size_t MESSAGE_LEN
= sizeof(TEST_MESSAGE
);
24 int sockpair
[2] = {0, 0};
26 int result
= LIBC_NAMESPACE::socketpair(AF_UNIX
, SOCK_STREAM
, 0, sockpair
);
28 ASSERT_ERRNO_SUCCESS();
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();
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();
42 ASSERT_STREQ(buffer
, TEST_MESSAGE
);
44 // close both ends of the socket
45 result
= LIBC_NAMESPACE::close(sockpair
[0]);
47 ASSERT_ERRNO_SUCCESS();
49 result
= LIBC_NAMESPACE::close(sockpair
[1]);
51 ASSERT_ERRNO_SUCCESS();
54 TEST(LlvmLibcSendRecvTest
, SendFails
) {
55 const char TEST_MESSAGE
[] = "connection terminated";
56 const size_t MESSAGE_LEN
= sizeof(TEST_MESSAGE
);
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();
62 LIBC_NAMESPACE::libc_errno
= 0; // reset errno to avoid test ordering issues.
65 TEST(LlvmLibcSendRecvTest
, RecvFails
) {
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();
72 LIBC_NAMESPACE::libc_errno
= 0; // reset errno to avoid test ordering issues.