Skip to content

Conversation

@vonosmas
Copy link
Contributor

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.

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.
@vonosmas vonosmas added the libc label Mar 19, 2025
@vonosmas vonosmas requested a review from lntue March 19, 2025 21:48
@llvmbot llvmbot added the bazel "Peripheral" support tier build system: utils/bazel label Mar 19, 2025
@llvmbot
Copy link
Member

llvmbot commented Mar 19, 2025

@llvm/pr-subscribers-libc

Author: Alexey Samsonov (vonosmas)

Changes

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.


Full diff: https://github.com/llvm/llvm-project/pull/132107.diff

9 Files Affected:

  • (modified) libc/test/UnitTest/ErrnoSetterMatcher.h (+7-3)
  • (modified) libc/test/src/sys/socket/linux/CMakeLists.txt (+12)
  • (modified) libc/test/src/sys/socket/linux/bind_test.cpp (+11-11)
  • (modified) libc/test/src/sys/socket/linux/send_recv_test.cpp (+21-32)
  • (modified) libc/test/src/sys/socket/linux/sendmsg_recvmsg_test.cpp (+19-30)
  • (modified) libc/test/src/sys/socket/linux/sendto_recvfrom_test.cpp (+25-34)
  • (modified) libc/test/src/sys/socket/linux/socket_test.cpp (+7-3)
  • (modified) libc/test/src/sys/socket/linux/socketpair_test.cpp (+13-12)
  • (modified) utils/bazel/llvm-project-overlay/libc/test/src/sys/socket/BUILD.bazel (+15)
diff --git a/libc/test/UnitTest/ErrnoSetterMatcher.h b/libc/test/UnitTest/ErrnoSetterMatcher.h
index a895c5044b0ad..937e2ffeafd11 100644
--- a/libc/test/UnitTest/ErrnoSetterMatcher.h
+++ b/libc/test/UnitTest/ErrnoSetterMatcher.h
@@ -101,9 +101,13 @@ template <typename T> class ErrnoSetterMatcher : public Matcher<T> {
 
     if constexpr (!ignore_errno()) {
       if (!errno_cmp.compare(actual_errno)) {
-        tlog << "Expected errno to be " << errno_cmp.str() << " \""
-             << get_error_string(errno_cmp.expected) << "\" but got \""
-             << get_error_string(actual_errno) << "\".\n";
+        auto expected_str = try_get_errno_name(errno_cmp.expected);
+        auto actual_str = try_get_errno_name(actual_errno);
+        tlog << "Expected errno to be " << errno_cmp.str() << " "
+             << (expected_str ? *expected_str : "<unknown>")
+             << "(" << errno_cmp.expected << ") but got "
+             << (actual_str? *actual_str : "<unknown>")
+             << "(" << actual_errno << ").\n";
       }
     }
   }
diff --git a/libc/test/src/sys/socket/linux/CMakeLists.txt b/libc/test/src/sys/socket/linux/CMakeLists.txt
index 9149b78631f29..de67040122138 100644
--- a/libc/test/src/sys/socket/linux/CMakeLists.txt
+++ b/libc/test/src/sys/socket/linux/CMakeLists.txt
@@ -11,6 +11,8 @@ add_libc_unittest(
     libc.src.errno.errno
     libc.src.sys.socket.socket
     libc.src.unistd.close
+    libc.test.UnitTest.ErrnoCheckingTest
+    libc.test.UnitTest.ErrnoSetterMatcher
 )
 
 add_libc_unittest(
@@ -26,6 +28,8 @@ add_libc_unittest(
     libc.src.sys.socket.bind
     libc.src.stdio.remove
     libc.src.unistd.close
+    libc.test.UnitTest.ErrnoCheckingTest
+    libc.test.UnitTest.ErrnoSetterMatcher
 )
 
 add_libc_unittest(
@@ -39,6 +43,8 @@ add_libc_unittest(
     libc.src.errno.errno
     libc.src.sys.socket.socketpair
     libc.src.unistd.close
+    libc.test.UnitTest.ErrnoCheckingTest
+    libc.test.UnitTest.ErrnoSetterMatcher
 )
 
 add_libc_unittest(
@@ -54,6 +60,8 @@ add_libc_unittest(
     libc.src.sys.socket.send
     libc.src.sys.socket.recv
     libc.src.unistd.close
+    libc.test.UnitTest.ErrnoCheckingTest
+    libc.test.UnitTest.ErrnoSetterMatcher
 )
 
 add_libc_unittest(
@@ -69,6 +77,8 @@ add_libc_unittest(
     libc.src.sys.socket.sendto
     libc.src.sys.socket.recvfrom
     libc.src.unistd.close
+    libc.test.UnitTest.ErrnoCheckingTest
+    libc.test.UnitTest.ErrnoSetterMatcher
 )
 
 add_libc_unittest(
@@ -84,4 +94,6 @@ add_libc_unittest(
     libc.src.sys.socket.sendmsg
     libc.src.sys.socket.recvmsg
     libc.src.unistd.close
+    libc.test.UnitTest.ErrnoCheckingTest
+    libc.test.UnitTest.ErrnoSetterMatcher
 )
diff --git a/libc/test/src/sys/socket/linux/bind_test.cpp b/libc/test/src/sys/socket/linux/bind_test.cpp
index e70cbd578290b..60cd7c0df10f2 100644
--- a/libc/test/src/sys/socket/linux/bind_test.cpp
+++ b/libc/test/src/sys/socket/linux/bind_test.cpp
@@ -12,12 +12,16 @@
 #include "src/stdio/remove.h"
 #include "src/unistd/close.h"
 
-#include "src/errno/libc_errno.h"
+#include "test/UnitTest/ErrnoCheckingTest.h"
+#include "test/UnitTest/ErrnoSetterMatcher.h"
 #include "test/UnitTest/Test.h"
 
 #include <sys/socket.h> // For AF_UNIX and SOCK_DGRAM
 
-TEST(LlvmLibcSocketTest, BindLocalSocket) {
+using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
+using LlvmLibcBindTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;
+
+TEST_F(LlvmLibcBindTest, BindLocalSocket) {
 
   const char *FILENAME = "bind_file.test";
   auto SOCK_PATH = libc_make_test_file_path(FILENAME);
@@ -41,14 +45,10 @@ TEST(LlvmLibcSocketTest, BindLocalSocket) {
   ASSERT_LT(
       i, static_cast<unsigned int>(sizeof(sockaddr_un) - sizeof(sa_family_t)));
 
-  int result =
+  ASSERT_THAT(
       LIBC_NAMESPACE::bind(sock, reinterpret_cast<struct sockaddr *>(&my_addr),
-                           sizeof(struct sockaddr_un));
-
-  ASSERT_EQ(result, 0);
-  ASSERT_ERRNO_SUCCESS();
-
-  LIBC_NAMESPACE::close(sock);
-
-  LIBC_NAMESPACE::remove(SOCK_PATH);
+                           sizeof(struct sockaddr_un)),
+      Succeeds(0));
+  ASSERT_THAT(LIBC_NAMESPACE::close(sock), Succeeds(0));
+  ASSERT_THAT(LIBC_NAMESPACE::remove(SOCK_PATH), Succeeds(0));
 }
diff --git a/libc/test/src/sys/socket/linux/send_recv_test.cpp b/libc/test/src/sys/socket/linux/send_recv_test.cpp
index a5d4880d934cc..46f73a29d6f7a 100644
--- a/libc/test/src/sys/socket/linux/send_recv_test.cpp
+++ b/libc/test/src/sys/socket/linux/send_recv_test.cpp
@@ -12,62 +12,51 @@
 
 #include "src/unistd/close.h"
 
-#include "src/errno/libc_errno.h"
+#include "test/UnitTest/ErrnoCheckingTest.h"
+#include "test/UnitTest/ErrnoSetterMatcher.h"
 #include "test/UnitTest/Test.h"
 
 #include <sys/socket.h> // For AF_UNIX and SOCK_DGRAM
 
-TEST(LlvmLibcSendRecvTest, SucceedsWithSocketPair) {
+using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
+using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
+using LlvmLibcSendRecvTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;
+
+TEST_F(LlvmLibcSendRecvTest, SucceedsWithSocketPair) {
   const char TEST_MESSAGE[] = "connection successful";
   const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE);
 
   int sockpair[2] = {0, 0};
 
-  int result = LIBC_NAMESPACE::socketpair(AF_UNIX, SOCK_STREAM, 0, sockpair);
-  ASSERT_EQ(result, 0);
-  ASSERT_ERRNO_SUCCESS();
+  ASSERT_THAT(LIBC_NAMESPACE::socketpair(AF_UNIX, SOCK_STREAM, 0, sockpair),
+              Succeeds(0));
 
-  ssize_t send_result =
-      LIBC_NAMESPACE::send(sockpair[0], TEST_MESSAGE, MESSAGE_LEN, 0);
-  EXPECT_EQ(send_result, static_cast<ssize_t>(MESSAGE_LEN));
-  ASSERT_ERRNO_SUCCESS();
+  ASSERT_THAT(LIBC_NAMESPACE::send(sockpair[0], TEST_MESSAGE, MESSAGE_LEN, 0),
+              Succeeds(static_cast<ssize_t>(MESSAGE_LEN)));
 
   char buffer[256];
 
-  ssize_t recv_result =
-      LIBC_NAMESPACE::recv(sockpair[1], buffer, sizeof(buffer), 0);
-  ASSERT_EQ(recv_result, static_cast<ssize_t>(MESSAGE_LEN));
-  ASSERT_ERRNO_SUCCESS();
+  ASSERT_THAT(LIBC_NAMESPACE::recv(sockpair[1], buffer, sizeof(buffer), 0),
+              Succeeds(static_cast<ssize_t>(MESSAGE_LEN)));
 
   ASSERT_STREQ(buffer, TEST_MESSAGE);
 
   // close both ends of the socket
-  result = LIBC_NAMESPACE::close(sockpair[0]);
-  ASSERT_EQ(result, 0);
-  ASSERT_ERRNO_SUCCESS();
-
-  result = LIBC_NAMESPACE::close(sockpair[1]);
-  ASSERT_EQ(result, 0);
-  ASSERT_ERRNO_SUCCESS();
+  ASSERT_THAT(LIBC_NAMESPACE::close(sockpair[0]), Succeeds(0));
+  ASSERT_THAT(LIBC_NAMESPACE::close(sockpair[1]), Succeeds(0));
 }
 
-TEST(LlvmLibcSendRecvTest, SendFails) {
+TEST_F(LlvmLibcSendRecvTest, SendFails) {
   const char TEST_MESSAGE[] = "connection terminated";
   const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE);
 
-  ssize_t send_result = LIBC_NAMESPACE::send(-1, TEST_MESSAGE, MESSAGE_LEN, 0);
-  EXPECT_EQ(send_result, ssize_t(-1));
-  ASSERT_ERRNO_FAILURE();
-
-  LIBC_NAMESPACE::libc_errno = 0; // reset errno to avoid test ordering issues.
+  ASSERT_THAT(LIBC_NAMESPACE::send(-1, TEST_MESSAGE, MESSAGE_LEN, 0),
+              Fails(EBADF));
 }
 
-TEST(LlvmLibcSendRecvTest, RecvFails) {
+TEST_F(LlvmLibcSendRecvTest, RecvFails) {
   char buffer[256];
 
-  ssize_t recv_result = LIBC_NAMESPACE::recv(-1, buffer, sizeof(buffer), 0);
-  ASSERT_EQ(recv_result, ssize_t(-1));
-  ASSERT_ERRNO_FAILURE();
-
-  LIBC_NAMESPACE::libc_errno = 0; // reset errno to avoid test ordering issues.
+  ASSERT_THAT(LIBC_NAMESPACE::recv(-1, buffer, sizeof(buffer), 0),
+              Fails(EBADF));
 }
diff --git a/libc/test/src/sys/socket/linux/sendmsg_recvmsg_test.cpp b/libc/test/src/sys/socket/linux/sendmsg_recvmsg_test.cpp
index abcb0a3e6e506..7ed94b20c564a 100644
--- a/libc/test/src/sys/socket/linux/sendmsg_recvmsg_test.cpp
+++ b/libc/test/src/sys/socket/linux/sendmsg_recvmsg_test.cpp
@@ -12,20 +12,24 @@
 
 #include "src/unistd/close.h"
 
-#include "src/errno/libc_errno.h"
+#include "test/UnitTest/ErrnoCheckingTest.h"
+#include "test/UnitTest/ErrnoSetterMatcher.h"
 #include "test/UnitTest/Test.h"
 
 #include <sys/socket.h> // For AF_UNIX and SOCK_DGRAM
 
-TEST(LlvmLibcSendMsgRecvMsgTest, SucceedsWithSocketPair) {
+using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
+using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
+using LlvmLibcSendMsgRecvMsgTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;
+
+TEST_F(LlvmLibcSendMsgRecvMsgTest, SucceedsWithSocketPair) {
   const char TEST_MESSAGE[] = "connection successful";
   const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE);
 
   int sockpair[2] = {0, 0};
 
-  int result = LIBC_NAMESPACE::socketpair(AF_UNIX, SOCK_STREAM, 0, sockpair);
-  ASSERT_EQ(result, 0);
-  ASSERT_ERRNO_SUCCESS();
+  ASSERT_THAT(LIBC_NAMESPACE::socketpair(AF_UNIX, SOCK_STREAM, 0, sockpair),
+              Succeeds(0));
 
   iovec send_msg_text;
   send_msg_text.iov_base =
@@ -41,9 +45,8 @@ TEST(LlvmLibcSendMsgRecvMsgTest, SucceedsWithSocketPair) {
   send_message.msg_controllen = 0;
   send_message.msg_flags = 0;
 
-  ssize_t send_result = LIBC_NAMESPACE::sendmsg(sockpair[0], &send_message, 0);
-  EXPECT_EQ(send_result, static_cast<ssize_t>(MESSAGE_LEN));
-  ASSERT_ERRNO_SUCCESS();
+  ASSERT_THAT(LIBC_NAMESPACE::sendmsg(sockpair[0], &send_message, 0),
+              Succeeds(static_cast<ssize_t>(MESSAGE_LEN)));
 
   char buffer[256];
 
@@ -60,23 +63,17 @@ TEST(LlvmLibcSendMsgRecvMsgTest, SucceedsWithSocketPair) {
   recv_message.msg_controllen = 0;
   recv_message.msg_flags = 0;
 
-  ssize_t recv_result = LIBC_NAMESPACE::recvmsg(sockpair[1], &recv_message, 0);
-  ASSERT_EQ(recv_result, static_cast<ssize_t>(MESSAGE_LEN));
-  ASSERT_ERRNO_SUCCESS();
+  ASSERT_THAT(LIBC_NAMESPACE::recvmsg(sockpair[1], &recv_message, 0),
+              Succeeds(static_cast<ssize_t>(MESSAGE_LEN)));
 
   ASSERT_STREQ(buffer, TEST_MESSAGE);
 
   // close both ends of the socket
-  result = LIBC_NAMESPACE::close(sockpair[0]);
-  ASSERT_EQ(result, 0);
-  ASSERT_ERRNO_SUCCESS();
-
-  result = LIBC_NAMESPACE::close(sockpair[1]);
-  ASSERT_EQ(result, 0);
-  ASSERT_ERRNO_SUCCESS();
+  ASSERT_THAT(LIBC_NAMESPACE::close(sockpair[0]), Succeeds(0));
+  ASSERT_THAT(LIBC_NAMESPACE::close(sockpair[1]), Succeeds(0));
 }
 
-TEST(LlvmLibcSendMsgRecvMsgTest, SendFails) {
+TEST_F(LlvmLibcSendMsgRecvMsgTest, SendFails) {
   const char TEST_MESSAGE[] = "connection terminated";
   const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE);
 
@@ -94,14 +91,10 @@ TEST(LlvmLibcSendMsgRecvMsgTest, SendFails) {
   send_message.msg_controllen = 0;
   send_message.msg_flags = 0;
 
-  ssize_t send_result = LIBC_NAMESPACE::sendmsg(-1, &send_message, 0);
-  EXPECT_EQ(send_result, ssize_t(-1));
-  ASSERT_ERRNO_FAILURE();
-
-  LIBC_NAMESPACE::libc_errno = 0; // reset errno to avoid test ordering issues.
+  ASSERT_THAT(LIBC_NAMESPACE::sendmsg(-1, &send_message, 0), Fails(EBADF));
 }
 
-TEST(LlvmLibcSendMsgRecvMsgTest, RecvFails) {
+TEST_F(LlvmLibcSendMsgRecvMsgTest, RecvFails) {
   char buffer[256];
 
   iovec recv_msg_text;
@@ -117,9 +110,5 @@ TEST(LlvmLibcSendMsgRecvMsgTest, RecvFails) {
   recv_message.msg_controllen = 0;
   recv_message.msg_flags = 0;
 
-  ssize_t recv_result = LIBC_NAMESPACE::recvmsg(-1, &recv_message, 0);
-  ASSERT_EQ(recv_result, ssize_t(-1));
-  ASSERT_ERRNO_FAILURE();
-
-  LIBC_NAMESPACE::libc_errno = 0; // reset errno to avoid test ordering issues.
+  ASSERT_THAT(LIBC_NAMESPACE::recvmsg(-1, &recv_message, 0), Fails(EBADF));
 }
diff --git a/libc/test/src/sys/socket/linux/sendto_recvfrom_test.cpp b/libc/test/src/sys/socket/linux/sendto_recvfrom_test.cpp
index e91b333deac58..8377260252c37 100644
--- a/libc/test/src/sys/socket/linux/sendto_recvfrom_test.cpp
+++ b/libc/test/src/sys/socket/linux/sendto_recvfrom_test.cpp
@@ -12,64 +12,55 @@
 
 #include "src/unistd/close.h"
 
-#include "src/errno/libc_errno.h"
+#include "test/UnitTest/ErrnoCheckingTest.h"
+#include "test/UnitTest/ErrnoSetterMatcher.h"
 #include "test/UnitTest/Test.h"
 
 #include <sys/socket.h> // For AF_UNIX and SOCK_DGRAM
 
-TEST(LlvmLibcSendToRecvFromTest, SucceedsWithSocketPair) {
+using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
+using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
+using LlvmLibcSendToRecvFromTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;
+
+TEST_F(LlvmLibcSendToRecvFromTest, SucceedsWithSocketPair) {
   const char TEST_MESSAGE[] = "connection successful";
   const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE);
 
   int sockpair[2] = {0, 0};
 
-  int result = LIBC_NAMESPACE::socketpair(AF_UNIX, SOCK_STREAM, 0, sockpair);
-  ASSERT_EQ(result, 0);
-  ASSERT_ERRNO_SUCCESS();
+  ASSERT_THAT(LIBC_NAMESPACE::socketpair(AF_UNIX, SOCK_STREAM, 0, sockpair),
+              Succeeds(0));
 
-  ssize_t send_result = LIBC_NAMESPACE::sendto(sockpair[0], TEST_MESSAGE,
-                                               MESSAGE_LEN, 0, nullptr, 0);
-  EXPECT_EQ(send_result, static_cast<ssize_t>(MESSAGE_LEN));
-  ASSERT_ERRNO_SUCCESS();
+  ASSERT_THAT(LIBC_NAMESPACE::sendto(sockpair[0], TEST_MESSAGE, MESSAGE_LEN, 0,
+                                     nullptr, 0),
+              Succeeds(static_cast<ssize_t>(MESSAGE_LEN)));
 
   char buffer[256];
 
-  ssize_t recv_result = LIBC_NAMESPACE::recvfrom(sockpair[1], buffer,
-                                                 sizeof(buffer), 0, nullptr, 0);
-  ASSERT_EQ(recv_result, static_cast<ssize_t>(MESSAGE_LEN));
-  ASSERT_ERRNO_SUCCESS();
+  ASSERT_THAT(LIBC_NAMESPACE::recvfrom(sockpair[1], buffer, sizeof(buffer), 0,
+                                       nullptr, 0),
+              Succeeds(static_cast<ssize_t>(MESSAGE_LEN)));
 
   ASSERT_STREQ(buffer, TEST_MESSAGE);
 
   // close both ends of the socket
-  result = LIBC_NAMESPACE::close(sockpair[0]);
-  ASSERT_EQ(result, 0);
-  ASSERT_ERRNO_SUCCESS();
-
-  result = LIBC_NAMESPACE::close(sockpair[1]);
-  ASSERT_EQ(result, 0);
-  ASSERT_ERRNO_SUCCESS();
+  ASSERT_THAT(LIBC_NAMESPACE::close(sockpair[0]), Succeeds(0));
+  ASSERT_THAT(LIBC_NAMESPACE::close(sockpair[1]), Succeeds(0));
 }
 
-TEST(LlvmLibcSendToRecvFromTest, SendToFails) {
+TEST_F(LlvmLibcSendToRecvFromTest, SendToFails) {
   const char TEST_MESSAGE[] = "connection terminated";
   const size_t MESSAGE_LEN = sizeof(TEST_MESSAGE);
 
-  ssize_t send_result =
-      LIBC_NAMESPACE::sendto(-1, TEST_MESSAGE, MESSAGE_LEN, 0, nullptr, 0);
-  EXPECT_EQ(send_result, ssize_t(-1));
-  ASSERT_ERRNO_FAILURE();
-
-  LIBC_NAMESPACE::libc_errno = 0; // reset errno to avoid test ordering issues.
+  ASSERT_THAT(
+      LIBC_NAMESPACE::sendto(-1, TEST_MESSAGE, MESSAGE_LEN, 0, nullptr, 0),
+      Fails(EBADF));
 }
 
-TEST(LlvmLibcSendToRecvFromTest, RecvFromFails) {
+TEST_F(LlvmLibcSendToRecvFromTest, RecvFromFails) {
   char buffer[256];
 
-  ssize_t recv_result =
-      LIBC_NAMESPACE::recvfrom(-1, buffer, sizeof(buffer), 0, nullptr, 0);
-  ASSERT_EQ(recv_result, ssize_t(-1));
-  ASSERT_ERRNO_FAILURE();
-
-  LIBC_NAMESPACE::libc_errno = 0; // reset errno to avoid test ordering issues.
+  ASSERT_THAT(
+      LIBC_NAMESPACE::recvfrom(-1, buffer, sizeof(buffer), 0, nullptr, 0),
+      Fails(EBADF));
 }
diff --git a/libc/test/src/sys/socket/linux/socket_test.cpp b/libc/test/src/sys/socket/linux/socket_test.cpp
index d1197fa3ef7c6..9f16be97e926a 100644
--- a/libc/test/src/sys/socket/linux/socket_test.cpp
+++ b/libc/test/src/sys/socket/linux/socket_test.cpp
@@ -10,15 +10,19 @@
 
 #include "src/unistd/close.h"
 
-#include "src/errno/libc_errno.h"
+#include "test/UnitTest/ErrnoCheckingTest.h"
+#include "test/UnitTest/ErrnoSetterMatcher.h"
 #include "test/UnitTest/Test.h"
 
 #include <sys/socket.h> // For AF_UNIX and SOCK_DGRAM
 
-TEST(LlvmLibcSocketTest, LocalSocket) {
+using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
+using LlvmLibcSocketTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;
+
+TEST_F(LlvmLibcSocketTest, LocalSocket) {
   int sock = LIBC_NAMESPACE::socket(AF_UNIX, SOCK_DGRAM, 0);
   ASSERT_GE(sock, 0);
   ASSERT_ERRNO_SUCCESS();
 
-  LIBC_NAMESPACE::close(sock);
+  ASSERT_THAT(LIBC_NAMESPACE::close(sock), Succeeds(0));
 }
diff --git a/libc/test/src/sys/socket/linux/socketpair_test.cpp b/libc/test/src/sys/socket/linux/socketpair_test.cpp
index 9393ddd5c19d8..94b7412f8c061 100644
--- a/libc/test/src/sys/socket/linux/socketpair_test.cpp
+++ b/libc/test/src/sys/socket/linux/socketpair_test.cpp
@@ -10,28 +10,29 @@
 
 #include "src/unistd/close.h"
 
-#include "src/errno/libc_errno.h"
+#include "test/UnitTest/ErrnoCheckingTest.h"
+#include "test/UnitTest/ErrnoSetterMatcher.h"
 #include "test/UnitTest/Test.h"
 
 #include <sys/socket.h> // For AF_UNIX and SOCK_DGRAM
 
-TEST(LlvmLibcSocketPairTest, LocalSocket) {
+using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
+using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
+using LlvmLibcSocketPairTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;
+
+TEST_F(LlvmLibcSocketPairTest, LocalSocket) {
   int sockpair[2] = {-1, -1};
-  int result = LIBC_NAMESPACE::socketpair(AF_UNIX, SOCK_DGRAM, 0, sockpair);
-  ASSERT_EQ(result, 0);
-  ASSERT_ERRNO_SUCCESS();
+  ASSERT_THAT(LIBC_NAMESPACE::socketpair(AF_UNIX, SOCK_DGRAM, 0, sockpair),
+              Succeeds(0));
 
   ASSERT_GE(sockpair[0], 0);
   ASSERT_GE(sockpair[1], 0);
 
-  LIBC_NAMESPACE::close(sockpair[0]);
-  LIBC_NAMESPACE::close(sockpair[1]);
-  ASSERT_ERRNO_SUCCESS();
+  ASSERT_THAT(LIBC_NAMESPACE::close(sockpair[0]), Succeeds(0));
+  ASSERT_THAT(LIBC_NAMESPACE::close(sockpair[1]), Succeeds(0));
 }
 
-TEST(LlvmLibcSocketPairTest, SocketFails) {
+TEST_F(LlvmLibcSocketPairTest, SocketFails) {
   int sockpair[2] = {-1, -1};
-  int result = LIBC_NAMESPACE::socketpair(-1, -1, -1, sockpair);
-  ASSERT_EQ(result, -1);
-  ASSERT_ERRNO_FAILURE();
+  ASSERT_THAT(LIBC_NAMESPACE::socketpair(-1, -1, -1, sockpair), Fails(EINVAL));
 }
diff --git a/utils/bazel/llvm-project-overlay/libc/test/src/sys/socket/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/test/src/sys/socket/BUILD.bazel
index f7bce45d07da6..ac7f48d0aeebb 100644
--- a/utils/bazel/llvm-project-overlay/libc/test/src/sys/socket/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/libc/test/src/sys/socket/BUILD.bazel
@@ -17,6 +17,9 @@ libc_test(
         "//libc:socket",
         "//libc:close",
     ],
+    deps = [
+        "//libc/test/UnitTest:errno_test_helpers",
+    ],
 )
 
 libc_test(
@@ -26,6 +29,9 @@ libc_test(
         "//libc:socketpair",
         "//libc:close",
     ],
+    deps = [
+        "//libc/test/UnitTest:errno_test_helpers",
+    ],
 )
 
 libc_test(
@@ -37,6 +43,9 @@ libc_test(
         "//libc:recv",
         "//libc:close",
     ],
+    deps = [
+        "//libc/test/UnitTest:errno_test_helpers",
+    ],
 )
 
 libc_test(
@@ -48,6 +57,9 @@ libc_test(
         "//libc:recvfrom",
         "//libc:close",
     ],
+    deps = [
+        "//libc/test/UnitTest:errno_test_helpers",
+    ],
 )
 
 libc_test(
@@ -59,4 +71,7 @@ libc_test(
         "//libc:recvmsg",
         "//libc:close",
     ],
+    deps = [
+        "//libc/test/UnitTest:errno_test_helpers",
+    ],
 )

@github-actions
Copy link

github-actions bot commented Mar 19, 2025

✅ With the latest revision this PR passed the C/C++ code formatter.

@vonosmas vonosmas merged commit 4c36c42 into llvm:main Mar 19, 2025
13 of 15 checks passed
@llvm-ci
Copy link
Collaborator

llvm-ci commented Mar 19, 2025

LLVM Buildbot has detected a new failure on builder libc-riscv32-qemu-yocto-fullbuild-dbg running on rv32gc-qemu-system while building libc,utils at step 4 "annotate".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/196/builds/6218

Here is the relevant piece of the build log for the reference
Step 4 (annotate) failure: 'python ../llvm-zorg/zorg/buildbot/builders/annotated/libc-linux.py ...' (failure) (timed out)
...
[       OK ] LlvmLibcSqrtTest.NormalRange (343086 ms)
Ran 2 tests.  PASS: 2  FAIL: 0
[1141/1145] Running unit test libc.test.src.math.sqrtl_test.__unit__
sh: line 1: /timer.17398: Permission denied
[==========] Running 2 tests from 1 test suite.
[ RUN      ] LlvmLibcSqrtTest.DenormalValues
[       OK ] LlvmLibcSqrtTest.DenormalValues (784535 ms)
[ RUN      ] LlvmLibcSqrtTest.NormalRange
[       OK ] LlvmLibcSqrtTest.NormalRange (366304 ms)
Ran 2 tests.  PASS: 2  FAIL: 0
command timed out: 1200 seconds without output running [b'python', b'../llvm-zorg/zorg/buildbot/builders/annotated/libc-linux.py', b'--debug'], attempting to kill
process killed by signal 9
program finished with exit code -1
elapsedTime=3467.458992
Step 8 (libc-unit-tests) failure: libc-unit-tests (failure)
...
[ RUN      ] LlvmLibcAddTestFloat.NormalRange
[       OK ] LlvmLibcAddTestFloat.NormalRange (12662 ms)
[ RUN      ] LlvmLibcAddTestLongDouble.SubnormalRange
[       OK ] LlvmLibcAddTestLongDouble.SubnormalRange (63529 ms)
[ RUN      ] LlvmLibcAddTestLongDouble.NormalRange
[       OK ] LlvmLibcAddTestLongDouble.NormalRange (81739 ms)
[ RUN      ] LlvmLibcAddTestFloat128.SubnormalRange
[       OK ] LlvmLibcAddTestFloat128.SubnormalRange (65416 ms)
[ RUN      ] LlvmLibcAddTestFloat128.NormalRange
[       OK ] LlvmLibcAddTestFloat128.NormalRange (73614 ms)
Ran 8 tests.  PASS: 8  FAIL: 0
[1138/1145] Running unit test libc.test.src.math.sqrtf128_test.__unit__
sh: line 1: /timer.17397: Permission denied
[==========] Running 3 tests from 1 test suite.
[ RUN      ] LlvmLibcSqrtTest.DenormalValues
[       OK ] LlvmLibcSqrtTest.DenormalValues (291829 ms)
[ RUN      ] LlvmLibcSqrtTest.NormalRange
[       OK ] LlvmLibcSqrtTest.NormalRange (135205 ms)
[ RUN      ] LlvmLibcSqrtTest.SpecialInputs
[       OK ] LlvmLibcSqrtTest.SpecialInputs (27 ms)
Ran 3 tests.  PASS: 3  FAIL: 0
[1139/1145] Running unit test libc.test.src.math.fsqrtl_test.__unit__
sh: line 1: /timer.17866: Permission denied
[==========] Running 2 tests from 1 test suite.
[ RUN      ] LlvmLibcSqrtTest.DenormalValues
[       OK ] LlvmLibcSqrtTest.DenormalValues (702936 ms)
[ RUN      ] LlvmLibcSqrtTest.NormalRange
[       OK ] LlvmLibcSqrtTest.NormalRange (327185 ms)
Ran 2 tests.  PASS: 2  FAIL: 0
[1140/1145] Running unit test libc.test.src.math.dsqrtl_test.__unit__
sh: line 1: /timer.17888: Permission denied
[==========] Running 2 tests from 1 test suite.
[ RUN      ] LlvmLibcSqrtTest.DenormalValues
[       OK ] LlvmLibcSqrtTest.DenormalValues (735047 ms)
[ RUN      ] LlvmLibcSqrtTest.NormalRange
[       OK ] LlvmLibcSqrtTest.NormalRange (343086 ms)
Ran 2 tests.  PASS: 2  FAIL: 0
[1141/1145] Running unit test libc.test.src.math.sqrtl_test.__unit__
sh: line 1: /timer.17398: Permission denied
[==========] Running 2 tests from 1 test suite.
[ RUN      ] LlvmLibcSqrtTest.DenormalValues
[       OK ] LlvmLibcSqrtTest.DenormalValues (784535 ms)
[ RUN      ] LlvmLibcSqrtTest.NormalRange
[       OK ] LlvmLibcSqrtTest.NormalRange (366304 ms)
Ran 2 tests.  PASS: 2  FAIL: 0

command timed out: 1200 seconds without output running [b'python', b'../llvm-zorg/zorg/buildbot/builders/annotated/libc-linux.py', b'--debug'], attempting to kill
process killed by signal 9
program finished with exit code -1
elapsedTime=3467.458992

vonosmas added a commit that referenced this pull request Mar 24, 2025
This is similar to PR #132107 but for tests for sys/epoll.h functions.

ErrnoCheckingTest ensures that errno is properly reset at the beginning
of the test case, and is validated at the end of it, so that the manual
code such as the one proposed in PR #131650 would not be necessary.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bazel "Peripheral" support tier build system: utils/bazel libc

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants