Skip to content

Commit 4c36c42

Browse files
authored
[libc] Migrate sys/socket tests to use ErrnoCheckingTest. (#132107)
Also use ErrnoSetterMatcher to verify the function return values and verify/clear out errno values. Fix the bug in ErrnoSetterMatcher error reporting machinery to properly convert errno values into errno names to make error messages easier to debug.
1 parent 2e13ec5 commit 4c36c42

File tree

9 files changed

+130
-125
lines changed

9 files changed

+130
-125
lines changed

libc/test/UnitTest/ErrnoSetterMatcher.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,13 @@ template <typename T> class ErrnoSetterMatcher : public Matcher<T> {
101101

102102
if constexpr (!ignore_errno()) {
103103
if (!errno_cmp.compare(actual_errno)) {
104-
tlog << "Expected errno to be " << errno_cmp.str() << " \""
105-
<< get_error_string(errno_cmp.expected) << "\" but got \""
106-
<< get_error_string(actual_errno) << "\".\n";
104+
auto expected_str = try_get_errno_name(errno_cmp.expected);
105+
auto actual_str = try_get_errno_name(actual_errno);
106+
tlog << "Expected errno to be " << errno_cmp.str() << " "
107+
<< (expected_str ? *expected_str : "<unknown>") << "("
108+
<< errno_cmp.expected << ") but got "
109+
<< (actual_str ? *actual_str : "<unknown>") << "(" << actual_errno
110+
<< ").\n";
107111
}
108112
}
109113
}

libc/test/src/sys/socket/linux/CMakeLists.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ add_libc_unittest(
1111
libc.src.errno.errno
1212
libc.src.sys.socket.socket
1313
libc.src.unistd.close
14+
libc.test.UnitTest.ErrnoCheckingTest
15+
libc.test.UnitTest.ErrnoSetterMatcher
1416
)
1517

1618
add_libc_unittest(
@@ -26,6 +28,8 @@ add_libc_unittest(
2628
libc.src.sys.socket.bind
2729
libc.src.stdio.remove
2830
libc.src.unistd.close
31+
libc.test.UnitTest.ErrnoCheckingTest
32+
libc.test.UnitTest.ErrnoSetterMatcher
2933
)
3034

3135
add_libc_unittest(
@@ -39,6 +43,8 @@ add_libc_unittest(
3943
libc.src.errno.errno
4044
libc.src.sys.socket.socketpair
4145
libc.src.unistd.close
46+
libc.test.UnitTest.ErrnoCheckingTest
47+
libc.test.UnitTest.ErrnoSetterMatcher
4248
)
4349

4450
add_libc_unittest(
@@ -54,6 +60,8 @@ add_libc_unittest(
5460
libc.src.sys.socket.send
5561
libc.src.sys.socket.recv
5662
libc.src.unistd.close
63+
libc.test.UnitTest.ErrnoCheckingTest
64+
libc.test.UnitTest.ErrnoSetterMatcher
5765
)
5866

5967
add_libc_unittest(
@@ -69,6 +77,8 @@ add_libc_unittest(
6977
libc.src.sys.socket.sendto
7078
libc.src.sys.socket.recvfrom
7179
libc.src.unistd.close
80+
libc.test.UnitTest.ErrnoCheckingTest
81+
libc.test.UnitTest.ErrnoSetterMatcher
7282
)
7383

7484
add_libc_unittest(
@@ -84,4 +94,6 @@ add_libc_unittest(
8494
libc.src.sys.socket.sendmsg
8595
libc.src.sys.socket.recvmsg
8696
libc.src.unistd.close
97+
libc.test.UnitTest.ErrnoCheckingTest
98+
libc.test.UnitTest.ErrnoSetterMatcher
8799
)

libc/test/src/sys/socket/linux/bind_test.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,16 @@
1212
#include "src/stdio/remove.h"
1313
#include "src/unistd/close.h"
1414

15-
#include "src/errno/libc_errno.h"
15+
#include "test/UnitTest/ErrnoCheckingTest.h"
16+
#include "test/UnitTest/ErrnoSetterMatcher.h"
1617
#include "test/UnitTest/Test.h"
1718

1819
#include <sys/socket.h> // For AF_UNIX and SOCK_DGRAM
1920

20-
TEST(LlvmLibcSocketTest, BindLocalSocket) {
21+
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
22+
using LlvmLibcBindTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;
23+
24+
TEST_F(LlvmLibcBindTest, BindLocalSocket) {
2125

2226
const char *FILENAME = "bind_file.test";
2327
auto SOCK_PATH = libc_make_test_file_path(FILENAME);
@@ -41,14 +45,10 @@ TEST(LlvmLibcSocketTest, BindLocalSocket) {
4145
ASSERT_LT(
4246
i, static_cast<unsigned int>(sizeof(sockaddr_un) - sizeof(sa_family_t)));
4347

44-
int result =
48+
ASSERT_THAT(
4549
LIBC_NAMESPACE::bind(sock, reinterpret_cast<struct sockaddr *>(&my_addr),
46-
sizeof(struct sockaddr_un));
47-
48-
ASSERT_EQ(result, 0);
49-
ASSERT_ERRNO_SUCCESS();
50-
51-
LIBC_NAMESPACE::close(sock);
52-
53-
LIBC_NAMESPACE::remove(SOCK_PATH);
50+
sizeof(struct sockaddr_un)),
51+
Succeeds(0));
52+
ASSERT_THAT(LIBC_NAMESPACE::close(sock), Succeeds(0));
53+
ASSERT_THAT(LIBC_NAMESPACE::remove(SOCK_PATH), Succeeds(0));
5454
}

libc/test/src/sys/socket/linux/send_recv_test.cpp

Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -12,62 +12,51 @@
1212

1313
#include "src/unistd/close.h"
1414

15-
#include "src/errno/libc_errno.h"
15+
#include "test/UnitTest/ErrnoCheckingTest.h"
16+
#include "test/UnitTest/ErrnoSetterMatcher.h"
1617
#include "test/UnitTest/Test.h"
1718

1819
#include <sys/socket.h> // For AF_UNIX and SOCK_DGRAM
1920

20-
TEST(LlvmLibcSendRecvTest, SucceedsWithSocketPair) {
21+
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
22+
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
23+
using LlvmLibcSendRecvTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;
24+
25+
TEST_F(LlvmLibcSendRecvTest, SucceedsWithSocketPair) {
2126
const char TEST_MESSAGE[] = "connection successful";
2227
const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE);
2328

2429
int sockpair[2] = {0, 0};
2530

26-
int result = LIBC_NAMESPACE::socketpair(AF_UNIX, SOCK_STREAM, 0, sockpair);
27-
ASSERT_EQ(result, 0);
28-
ASSERT_ERRNO_SUCCESS();
31+
ASSERT_THAT(LIBC_NAMESPACE::socketpair(AF_UNIX, SOCK_STREAM, 0, sockpair),
32+
Succeeds(0));
2933

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+
ASSERT_THAT(LIBC_NAMESPACE::send(sockpair[0], TEST_MESSAGE, MESSAGE_LEN, 0),
35+
Succeeds(static_cast<ssize_t>(MESSAGE_LEN)));
3436

3537
char buffer[256];
3638

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();
39+
ASSERT_THAT(LIBC_NAMESPACE::recv(sockpair[1], buffer, sizeof(buffer), 0),
40+
Succeeds(static_cast<ssize_t>(MESSAGE_LEN)));
4141

4242
ASSERT_STREQ(buffer, TEST_MESSAGE);
4343

4444
// 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();
45+
ASSERT_THAT(LIBC_NAMESPACE::close(sockpair[0]), Succeeds(0));
46+
ASSERT_THAT(LIBC_NAMESPACE::close(sockpair[1]), Succeeds(0));
5247
}
5348

54-
TEST(LlvmLibcSendRecvTest, SendFails) {
49+
TEST_F(LlvmLibcSendRecvTest, SendFails) {
5550
const char TEST_MESSAGE[] = "connection terminated";
5651
const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE);
5752

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.
53+
ASSERT_THAT(LIBC_NAMESPACE::send(-1, TEST_MESSAGE, MESSAGE_LEN, 0),
54+
Fails(EBADF));
6355
}
6456

65-
TEST(LlvmLibcSendRecvTest, RecvFails) {
57+
TEST_F(LlvmLibcSendRecvTest, RecvFails) {
6658
char buffer[256];
6759

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.
60+
ASSERT_THAT(LIBC_NAMESPACE::recv(-1, buffer, sizeof(buffer), 0),
61+
Fails(EBADF));
7362
}

libc/test/src/sys/socket/linux/sendmsg_recvmsg_test.cpp

Lines changed: 19 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,24 @@
1212

1313
#include "src/unistd/close.h"
1414

15-
#include "src/errno/libc_errno.h"
15+
#include "test/UnitTest/ErrnoCheckingTest.h"
16+
#include "test/UnitTest/ErrnoSetterMatcher.h"
1617
#include "test/UnitTest/Test.h"
1718

1819
#include <sys/socket.h> // For AF_UNIX and SOCK_DGRAM
1920

20-
TEST(LlvmLibcSendMsgRecvMsgTest, SucceedsWithSocketPair) {
21+
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
22+
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
23+
using LlvmLibcSendMsgRecvMsgTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;
24+
25+
TEST_F(LlvmLibcSendMsgRecvMsgTest, SucceedsWithSocketPair) {
2126
const char TEST_MESSAGE[] = "connection successful";
2227
const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE);
2328

2429
int sockpair[2] = {0, 0};
2530

26-
int result = LIBC_NAMESPACE::socketpair(AF_UNIX, SOCK_STREAM, 0, sockpair);
27-
ASSERT_EQ(result, 0);
28-
ASSERT_ERRNO_SUCCESS();
31+
ASSERT_THAT(LIBC_NAMESPACE::socketpair(AF_UNIX, SOCK_STREAM, 0, sockpair),
32+
Succeeds(0));
2933

3034
iovec send_msg_text;
3135
send_msg_text.iov_base =
@@ -41,9 +45,8 @@ TEST(LlvmLibcSendMsgRecvMsgTest, SucceedsWithSocketPair) {
4145
send_message.msg_controllen = 0;
4246
send_message.msg_flags = 0;
4347

44-
ssize_t send_result = LIBC_NAMESPACE::sendmsg(sockpair[0], &send_message, 0);
45-
EXPECT_EQ(send_result, static_cast<ssize_t>(MESSAGE_LEN));
46-
ASSERT_ERRNO_SUCCESS();
48+
ASSERT_THAT(LIBC_NAMESPACE::sendmsg(sockpair[0], &send_message, 0),
49+
Succeeds(static_cast<ssize_t>(MESSAGE_LEN)));
4750

4851
char buffer[256];
4952

@@ -60,23 +63,17 @@ TEST(LlvmLibcSendMsgRecvMsgTest, SucceedsWithSocketPair) {
6063
recv_message.msg_controllen = 0;
6164
recv_message.msg_flags = 0;
6265

63-
ssize_t recv_result = LIBC_NAMESPACE::recvmsg(sockpair[1], &recv_message, 0);
64-
ASSERT_EQ(recv_result, static_cast<ssize_t>(MESSAGE_LEN));
65-
ASSERT_ERRNO_SUCCESS();
66+
ASSERT_THAT(LIBC_NAMESPACE::recvmsg(sockpair[1], &recv_message, 0),
67+
Succeeds(static_cast<ssize_t>(MESSAGE_LEN)));
6668

6769
ASSERT_STREQ(buffer, TEST_MESSAGE);
6870

6971
// close both ends of the socket
70-
result = LIBC_NAMESPACE::close(sockpair[0]);
71-
ASSERT_EQ(result, 0);
72-
ASSERT_ERRNO_SUCCESS();
73-
74-
result = LIBC_NAMESPACE::close(sockpair[1]);
75-
ASSERT_EQ(result, 0);
76-
ASSERT_ERRNO_SUCCESS();
72+
ASSERT_THAT(LIBC_NAMESPACE::close(sockpair[0]), Succeeds(0));
73+
ASSERT_THAT(LIBC_NAMESPACE::close(sockpair[1]), Succeeds(0));
7774
}
7875

79-
TEST(LlvmLibcSendMsgRecvMsgTest, SendFails) {
76+
TEST_F(LlvmLibcSendMsgRecvMsgTest, SendFails) {
8077
const char TEST_MESSAGE[] = "connection terminated";
8178
const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE);
8279

@@ -94,14 +91,10 @@ TEST(LlvmLibcSendMsgRecvMsgTest, SendFails) {
9491
send_message.msg_controllen = 0;
9592
send_message.msg_flags = 0;
9693

97-
ssize_t send_result = LIBC_NAMESPACE::sendmsg(-1, &send_message, 0);
98-
EXPECT_EQ(send_result, ssize_t(-1));
99-
ASSERT_ERRNO_FAILURE();
100-
101-
LIBC_NAMESPACE::libc_errno = 0; // reset errno to avoid test ordering issues.
94+
ASSERT_THAT(LIBC_NAMESPACE::sendmsg(-1, &send_message, 0), Fails(EBADF));
10295
}
10396

104-
TEST(LlvmLibcSendMsgRecvMsgTest, RecvFails) {
97+
TEST_F(LlvmLibcSendMsgRecvMsgTest, RecvFails) {
10598
char buffer[256];
10699

107100
iovec recv_msg_text;
@@ -117,9 +110,5 @@ TEST(LlvmLibcSendMsgRecvMsgTest, RecvFails) {
117110
recv_message.msg_controllen = 0;
118111
recv_message.msg_flags = 0;
119112

120-
ssize_t recv_result = LIBC_NAMESPACE::recvmsg(-1, &recv_message, 0);
121-
ASSERT_EQ(recv_result, ssize_t(-1));
122-
ASSERT_ERRNO_FAILURE();
123-
124-
LIBC_NAMESPACE::libc_errno = 0; // reset errno to avoid test ordering issues.
113+
ASSERT_THAT(LIBC_NAMESPACE::recvmsg(-1, &recv_message, 0), Fails(EBADF));
125114
}

libc/test/src/sys/socket/linux/sendto_recvfrom_test.cpp

Lines changed: 25 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -12,64 +12,55 @@
1212

1313
#include "src/unistd/close.h"
1414

15-
#include "src/errno/libc_errno.h"
15+
#include "test/UnitTest/ErrnoCheckingTest.h"
16+
#include "test/UnitTest/ErrnoSetterMatcher.h"
1617
#include "test/UnitTest/Test.h"
1718

1819
#include <sys/socket.h> // For AF_UNIX and SOCK_DGRAM
1920

20-
TEST(LlvmLibcSendToRecvFromTest, SucceedsWithSocketPair) {
21+
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
22+
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
23+
using LlvmLibcSendToRecvFromTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;
24+
25+
TEST_F(LlvmLibcSendToRecvFromTest, SucceedsWithSocketPair) {
2126
const char TEST_MESSAGE[] = "connection successful";
2227
const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE);
2328

2429
int sockpair[2] = {0, 0};
2530

26-
int result = LIBC_NAMESPACE::socketpair(AF_UNIX, SOCK_STREAM, 0, sockpair);
27-
ASSERT_EQ(result, 0);
28-
ASSERT_ERRNO_SUCCESS();
31+
ASSERT_THAT(LIBC_NAMESPACE::socketpair(AF_UNIX, SOCK_STREAM, 0, sockpair),
32+
Succeeds(0));
2933

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+
ASSERT_THAT(LIBC_NAMESPACE::sendto(sockpair[0], TEST_MESSAGE, MESSAGE_LEN, 0,
35+
nullptr, 0),
36+
Succeeds(static_cast<ssize_t>(MESSAGE_LEN)));
3437

3538
char buffer[256];
3639

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();
40+
ASSERT_THAT(LIBC_NAMESPACE::recvfrom(sockpair[1], buffer, sizeof(buffer), 0,
41+
nullptr, 0),
42+
Succeeds(static_cast<ssize_t>(MESSAGE_LEN)));
4143

4244
ASSERT_STREQ(buffer, TEST_MESSAGE);
4345

4446
// 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();
47+
ASSERT_THAT(LIBC_NAMESPACE::close(sockpair[0]), Succeeds(0));
48+
ASSERT_THAT(LIBC_NAMESPACE::close(sockpair[1]), Succeeds(0));
5249
}
5350

54-
TEST(LlvmLibcSendToRecvFromTest, SendToFails) {
51+
TEST_F(LlvmLibcSendToRecvFromTest, SendToFails) {
5552
const char TEST_MESSAGE[] = "connection terminated";
5653
const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE);
5754

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.
55+
ASSERT_THAT(
56+
LIBC_NAMESPACE::sendto(-1, TEST_MESSAGE, MESSAGE_LEN, 0, nullptr, 0),
57+
Fails(EBADF));
6458
}
6559

66-
TEST(LlvmLibcSendToRecvFromTest, RecvFromFails) {
60+
TEST_F(LlvmLibcSendToRecvFromTest, RecvFromFails) {
6761
char buffer[256];
6862

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.
63+
ASSERT_THAT(
64+
LIBC_NAMESPACE::recvfrom(-1, buffer, sizeof(buffer), 0, nullptr, 0),
65+
Fails(EBADF));
7566
}

0 commit comments

Comments
 (0)