]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Add ASSERT_OK_ZERO_ERRNO() and ASSERT_OK_EQ_ERRNO()
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 19 Sep 2024 09:38:47 +0000 (11:38 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 19 Sep 2024 09:38:47 +0000 (11:38 +0200)
src/shared/tests.h
src/test/test-macro.c

index 0c1b8cfa7808ad18d23b15f81266b54201fd59ea..33180e7b371aa9527b7826f8a4766aa667695f6f 100644 (file)
@@ -281,6 +281,44 @@ static inline int run_test_table(void) {
                 }                                                                                               \
         })
 
+#define ASSERT_OK_ZERO_ERRNO(expr)                                                                              \
+        ({                                                                                                      \
+                typeof(expr) _result = (expr);                                                                  \
+                if (_result < 0) {                                                                              \
+                        log_error_errno(errno, "%s:%i: Assertion failed: expected \"%s\" to succeed but got the following error: %m", \
+                                        PROJECT_FILE, __LINE__, #expr);                                         \
+                        abort();                                                                                \
+                }                                                                                               \
+                if (_result != 0) {                                                                             \
+                        char _sexpr[DECIMAL_STR_MAX(typeof(expr))];                                             \
+                        xsprintf(_sexpr, DECIMAL_STR_FMT(_result), _result);                                    \
+                        log_error("%s:%i: Assertion failed: expected \"%s\" to be zero, but it is %s.",         \
+                                  PROJECT_FILE, __LINE__, #expr, _sexpr);                                       \
+                        abort();                                                                                \
+                }                                                                                               \
+        })
+
+#define ASSERT_OK_EQ_ERRNO(expr1, expr2)                                                                        \
+        ({                                                                                                      \
+                typeof(expr1) _expr1 = (expr1);                                                                 \
+                typeof(expr2) _expr2 = (expr2);                                                                 \
+                if (_expr1 < 0) {                                                                               \
+                        log_error_errno(errno, "%s:%i: Assertion failed: expected \"%s\" to succeed but got the following error: %m", \
+                                        PROJECT_FILE, __LINE__, #expr1);                                        \
+                        abort();                                                                                \
+                }                                                                                               \
+                if (_expr1 != _expr2) {                                                                         \
+                        char _sexpr1[DECIMAL_STR_MAX(typeof(expr1))];                                           \
+                        char _sexpr2[DECIMAL_STR_MAX(typeof(expr2))];                                           \
+                        xsprintf(_sexpr1, DECIMAL_STR_FMT(_expr1), _expr1);                                     \
+                        xsprintf(_sexpr2, DECIMAL_STR_FMT(_expr2), _expr2);                                     \
+                        log_error("%s:%i: Assertion failed: expected \"%s == %s\", but %s != %s",               \
+                                  PROJECT_FILE, __LINE__, #expr1, #expr2, _sexpr1, _sexpr2);                    \
+                        abort();                                                                                \
+                }                                                                                               \
+        })
+
+
 #define ASSERT_FAIL(expr)                                                                                       \
         ({                                                                                                      \
                 typeof(expr) _result = (expr);                                                                  \
index 69df6bc56740d23a9899181ad9fc43fa8ba1220b..c4c533777dc4a54c984d5fc334d68ac1bf045273 100644 (file)
@@ -1141,6 +1141,18 @@ TEST(ASSERT) {
         ASSERT_SIGNAL(ASSERT_OK_ERRNO(-1), SIGABRT);
         ASSERT_SIGNAL(ASSERT_OK_ERRNO(-ENOANO), SIGABRT);
 
+        ASSERT_OK_ZERO_ERRNO(0);
+        ASSERT_SIGNAL(ASSERT_OK_ZERO_ERRNO(1), SIGABRT);
+        ASSERT_SIGNAL(ASSERT_OK_ZERO_ERRNO(255), SIGABRT);
+        ASSERT_SIGNAL(ASSERT_OK_ZERO_ERRNO(-1), SIGABRT);
+        ASSERT_SIGNAL(ASSERT_OK_ZERO_ERRNO(-ENOANO), SIGABRT);
+
+        ASSERT_OK_EQ_ERRNO(0, 0);
+        ASSERT_SIGNAL(ASSERT_OK_EQ_ERRNO(1, 0), SIGABRT);
+        ASSERT_SIGNAL(ASSERT_OK_EQ_ERRNO(255, 5), SIGABRT);
+        ASSERT_SIGNAL(ASSERT_OK_EQ_ERRNO(-1, 0), SIGABRT);
+        ASSERT_SIGNAL(ASSERT_OK_EQ_ERRNO(-ENOANO, 0), SIGABRT);
+
         ASSERT_FAIL(-ENOENT);
         ASSERT_FAIL(-EPERM);
         ASSERT_SIGNAL(ASSERT_FAIL(0), SIGABRT);