test: add a couple of sanity tests for ASSERT_*() macros

Also, introduce ASSERT_SIGNAL() macro that should help us test failing
cases of mentioned macros (which usually end with calling abort()).
This commit is contained in:
Frantisek Sumsal
2024-04-09 21:39:46 +02:00
parent 7d7a3d4787
commit 8c33218e9e
2 changed files with 84 additions and 0 deletions
+27
View File
@@ -2,11 +2,15 @@
#pragma once
#include <stdbool.h>
#include <sys/prctl.h>
#include "sd-daemon.h"
#include "argv-util.h"
#include "macro.h"
#include "process-util.h"
#include "rlimit-util.h"
#include "signal-util.h"
#include "static-destruct.h"
#include "strv.h"
@@ -349,3 +353,26 @@ static inline int run_test_table(void) {
abort(); \
} \
})
#define ASSERT_SIGNAL(expr, signal) \
({ \
ASSERT_TRUE(SIGNAL_VALID(signal)); \
siginfo_t _siginfo = {}; \
int _pid = fork(); \
ASSERT_OK(_pid); \
if (_pid == 0) { \
/* Speed things up by never even attempting to generate a coredump */ \
(void) prctl(PR_SET_DUMPABLE, 0); \
/* But still set an rlimit just in case */ \
(void) setrlimit(RLIMIT_CORE, &RLIMIT_MAKE_CONST(0)); \
expr; \
_exit(EXIT_SUCCESS); \
} \
(void) wait_for_terminate(_pid, &_siginfo); \
if (_siginfo.si_status != signal) { \
log_error("%s:%i: Assertion failed: \"%s\" died with signal %s, but %s was expected", \
PROJECT_FILE, __LINE__, #expr, signal_to_string(_siginfo.si_status), \
signal_to_string(signal)); \
abort(); \
} \
})
+57
View File
@@ -1105,4 +1105,61 @@ TEST(u64_multiply_safe) {
assert_se(u64_multiply_safe(UINT64_MAX, UINT64_MAX) == 0);
}
TEST(ASSERT) {
char *null = NULL;
ASSERT_OK(0);
ASSERT_OK(255);
ASSERT_OK(printf("Hello world\n"));
ASSERT_SIGNAL(ASSERT_OK(-1), SIGABRT);
ASSERT_SIGNAL(ASSERT_OK(-ENOANO), SIGABRT);
ASSERT_TRUE(true);
ASSERT_TRUE(255);
ASSERT_TRUE(getpid());
ASSERT_SIGNAL(ASSERT_TRUE(1 == 0), SIGABRT);
ASSERT_FALSE(false);
ASSERT_FALSE(1 == 0);
ASSERT_SIGNAL(ASSERT_FALSE(1 > 0), SIGABRT);
ASSERT_NULL(NULL);
ASSERT_SIGNAL(ASSERT_NULL(signal_to_string(SIGINT)), SIGABRT);
ASSERT_NOT_NULL(signal_to_string(SIGTERM));
ASSERT_SIGNAL(ASSERT_NOT_NULL(NULL), SIGABRT);
ASSERT_STREQ(NULL, null);
ASSERT_STREQ("foo", "foo");
ASSERT_SIGNAL(ASSERT_STREQ(null, "bar"), SIGABRT);
ASSERT_SIGNAL(ASSERT_STREQ("foo", "bar"), SIGABRT);
ASSERT_EQ(0, 0);
ASSERT_EQ(-1, -1);
ASSERT_SIGNAL(ASSERT_EQ(255, -1), SIGABRT);
ASSERT_GE(0, 0);
ASSERT_GE(1, -1);
ASSERT_SIGNAL(ASSERT_GE(-1, 1), SIGABRT);
ASSERT_LE(0, 0);
ASSERT_LE(-1, 1);
ASSERT_SIGNAL(ASSERT_LE(1, -1), SIGABRT);
ASSERT_NE(0, (int64_t) UINT_MAX);
ASSERT_NE(-1, 1);
ASSERT_SIGNAL(ASSERT_NE(0, 0), SIGABRT);
ASSERT_SIGNAL(ASSERT_NE(-1, -1), SIGABRT);
ASSERT_GT(1, 0);
ASSERT_GT(1, -1);
ASSERT_SIGNAL(ASSERT_GT(0, 0), SIGABRT);
ASSERT_SIGNAL(ASSERT_GT(-1, 1), SIGABRT);
ASSERT_LT(0, 1);
ASSERT_LT(-1, 1);
ASSERT_SIGNAL(ASSERT_LT(0, 0), SIGABRT);
ASSERT_SIGNAL(ASSERT_LT(1, -1), SIGABRT);
}
DEFINE_TEST_MAIN(LOG_INFO);