From: Daan De Meyer Date: Sun, 11 May 2025 19:21:30 +0000 (+0200) Subject: tests.h: Move some implementation details into tests.c. X-Git-Tag: v258-rc1~632^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=22571018e2f267d0fa7b232949502b97c45229ef;p=thirdparty%2Fsystemd.git tests.h: Move some implementation details into tests.c. --- diff --git a/src/shared/tests.c b/src/shared/tests.c index 03ec3ba15eb..c2feab93355 100644 --- a/src/shared/tests.c +++ b/src/shared/tests.c @@ -367,3 +367,89 @@ const char* ci_environment(void) { return (ans = NULL); } + +int run_test_table(const TestFunc *start, const TestFunc *end) { + _cleanup_strv_free_ char **tests = NULL; + int r = EXIT_SUCCESS; + bool ran = false; + const char *e; + + if (!start) + return r; + + e = getenv("TESTFUNCS"); + if (e) { + r = strv_split_full(&tests, e, ":", EXTRACT_DONT_COALESCE_SEPARATORS); + if (r < 0) + return log_error_errno(r, "Failed to parse $TESTFUNCS: %m"); + } + + for (const TestFunc *t = ALIGN_PTR(start); t + 1 <= end; t = ALIGN_PTR(t + 1)) { + + if (tests && !strv_contains(tests, t->name)) + continue; + + if (t->sd_booted && sd_booted() <= 0) { + log_info("/* systemd not booted, skipping %s */", t->name); + if (t->has_ret && r == EXIT_SUCCESS) + r = EXIT_TEST_SKIP; + } else { + log_info("/* %s */", t->name); + + if (t->has_ret) { + int r2 = t->f.int_func(); + if (r == EXIT_SUCCESS) + r = r2; + } else + t->f.void_func(); + } + + ran = true; + } + + if (!ran) + return log_error_errno(SYNTHETIC_ERRNO(ENXIO), "No matching tests found."); + + return r; +} + +void test_prepare(int argc, char *argv[], int log_level) { + save_argc_argv(argc, argv); + test_setup_logging(log_level); +} + +int assert_signal_internal(void) { + siginfo_t siginfo = {}; + int r; + + r = fork(); + if (r < 0) + return -errno; + + if (r == 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)); + return 0; + } + + r = wait_for_terminate(r, &siginfo); + if (r < 0) + return r; + + return siginfo.si_status; +} + + +void log_test_failed_internal(const char *file, int line, const char *func, const char *format, ...) { + va_list ap; + + va_start(ap, format); + DISABLE_WARNING_FORMAT_NONLITERAL; + log_internalv(LOG_ERR, 0, file, line, func, format, ap); + REENABLE_WARNING; + va_end(ap); + + abort(); +} diff --git a/src/shared/tests.h b/src/shared/tests.h index 19a8dd033f3..3a6747ca44d 100644 --- a/src/shared/tests.h +++ b/src/shared/tests.h @@ -138,63 +138,19 @@ extern const TestFunc _weak_ __stop_SYSTEMD_TEST_TABLE[]; #define TEST_LOG_FUNC() \ log_info("/* %s() */", __func__) -static inline int run_test_table(void) { - _cleanup_strv_free_ char **tests = NULL; - int r = EXIT_SUCCESS; - bool ran = false; - const char *e; - - if (!__start_SYSTEMD_TEST_TABLE) - return r; - - e = getenv("TESTFUNCS"); - if (e) { - r = strv_split_full(&tests, e, ":", EXTRACT_DONT_COALESCE_SEPARATORS); - if (r < 0) - return log_error_errno(r, "Failed to parse $TESTFUNCS: %m"); - } - - for (const TestFunc *t = ALIGN_PTR(__start_SYSTEMD_TEST_TABLE); - t + 1 <= __stop_SYSTEMD_TEST_TABLE; - t = ALIGN_PTR(t + 1)) { - - if (tests && !strv_contains(tests, t->name)) - continue; - - if (t->sd_booted && sd_booted() <= 0) { - log_info("/* systemd not booted, skipping %s */", t->name); - if (t->has_ret && r == EXIT_SUCCESS) - r = EXIT_TEST_SKIP; - } else { - log_info("/* %s */", t->name); - - if (t->has_ret) { - int r2 = t->f.int_func(); - if (r == EXIT_SUCCESS) - r = r2; - } else - t->f.void_func(); - } - - ran = true; - } - - if (!ran) - return log_error_errno(SYNTHETIC_ERRNO(ENXIO), "No matching tests found."); +int run_test_table(const TestFunc *start, const TestFunc *end); - return r; -} +void test_prepare(int argc, char *argv[], int log_level); #define DEFINE_TEST_MAIN_FULL(log_level, intro, outro) \ int main(int argc, char *argv[]) { \ int (*_intro)(void) = intro; \ int (*_outro)(void) = outro; \ int _r, _q; \ - test_setup_logging(log_level); \ - save_argc_argv(argc, argv); \ + test_prepare(argc, argv, log_level); \ _r = _intro ? _intro() : EXIT_SUCCESS; \ if (_r == EXIT_SUCCESS) \ - _r = run_test_table(); \ + _r = run_test_table(__start_SYSTEMD_TEST_TABLE, __stop_SYSTEMD_TEST_TABLE); \ _q = _outro ? _outro() : EXIT_SUCCESS; \ static_destruct(); \ if (_r < 0) \ @@ -211,6 +167,11 @@ static inline int run_test_table(void) { #define DEFINE_TEST_MAIN(log_level) \ DEFINE_TEST_MAIN_FULL(log_level, NULL, NULL) +_noreturn_ void log_test_failed_internal(const char *file, int line, const char *func, const char *format, ...) _printf_(4,5); + +#define log_test_failed(format, ...) \ + log_test_failed_internal(PROJECT_FILE, __LINE__, __func__, "%s:%i: Assertion failed: " format, PROJECT_FILE, __LINE__, ##__VA_ARGS__) + #define DECIMAL_STR_FMT(x) _Generic((x), \ char: "%c", \ bool: "%d", \ @@ -227,14 +188,11 @@ static inline int run_test_table(void) { #ifdef __COVERITY__ #define ASSERT_OK(expr) __coverity_check__((expr) >= 0) #else -#define ASSERT_OK(expr) \ - ({ \ - typeof(expr) _result = (expr); \ - if (_result < 0) { \ - log_error_errno(_result, "%s:%i: Assertion failed: expected \"%s\" to succeed, but got error: %m", \ - PROJECT_FILE, __LINE__, #expr); \ - abort(); \ - } \ +#define ASSERT_OK(expr) \ + ({ \ + typeof(expr) _result = (expr); \ + if (_result < 0) \ + log_test_failed("Expected \"%s\" to succeed, but got error: %s", #expr, STRERROR(_result)); \ }) #endif @@ -242,259 +200,204 @@ static inline int run_test_table(void) { #ifdef __COVERITY__ #define ASSERT_OK_POSITIVE(expr) __coverity_check__((expr) > 0) #else -#define ASSERT_OK_POSITIVE(expr) \ - ({ \ - typeof(expr) _result = (expr); \ - if (_result < 0) { \ - log_error_errno(_result, "%s:%i: Assertion failed: expected \"%s\" to succeed, but got error: %m", \ - PROJECT_FILE, __LINE__, #expr); \ - abort(); \ - } \ - if (_result == 0) { \ - log_error("%s:%i: Assertion failed: expected \"%s\" to be positive, but it is zero.", \ - PROJECT_FILE, __LINE__, #expr); \ - abort(); \ - } \ +#define ASSERT_OK_POSITIVE(expr) \ + ({ \ + typeof(expr) _result = (expr); \ + if (_result < 0) \ + log_test_failed("Expected \"%s\" to succeed, but got error: %s", #expr, STRERROR(_result)); \ + if (_result == 0) \ + log_test_failed("Expected \"%s\" to be positive, but it is zero.", #expr); \ }) #endif #ifdef __COVERITY__ #define ASSERT_OK_ZERO(expr) __coverity_check__((expr) == 0) #else -#define ASSERT_OK_ZERO(expr) \ - ({ \ - typeof(expr) _result = (expr); \ - if (_result < 0) { \ - log_error_errno(_result, "%s:%i: Assertion failed: expected \"%s\" to succeed, but got 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_ZERO(expr) \ + ({ \ + typeof(expr) _result = (expr); \ + if (_result < 0) \ + log_test_failed("Expected \"%s\" to succeed, but got error: %s", #expr, STRERROR(_result)); \ + if (_result != 0) { \ + char _sexpr[DECIMAL_STR_MAX(typeof(expr))]; \ + xsprintf(_sexpr, DECIMAL_STR_FMT(_result), _result); \ + log_test_failed("Expected \"%s\" to be zero, but it is %s.", #expr, _sexpr); \ + } \ }) #endif #ifdef __COVERITY__ #define ASSERT_OK_EQ(expr1, expr2) __coverity_check__((expr1) == (expr2)) #else -#define ASSERT_OK_EQ(expr1, expr2) \ - ({ \ - typeof(expr1) _expr1 = (expr1); \ - typeof(expr2) _expr2 = (expr2); \ - if (_expr1 < 0) { \ - log_error_errno(_expr1, "%s:%i: Assertion failed: expected \"%s\" to succeed, but got 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\", got %s != %s", \ - PROJECT_FILE, __LINE__, #expr1, #expr2, _sexpr1, _sexpr2); \ - abort(); \ - } \ +#define ASSERT_OK_EQ(expr1, expr2) \ + ({ \ + typeof(expr1) _expr1 = (expr1); \ + typeof(expr2) _expr2 = (expr2); \ + if (_expr1 < 0) \ + log_test_failed("Expected \"%s\" to succeed, but got error: %s", #expr1, STRERROR(_expr1)); \ + 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_test_failed("Expected \"%s == %s\", got %s != %s", #expr1, #expr2, _sexpr1, _sexpr2); \ + } \ }) #endif #ifdef __COVERITY__ #define ASSERT_OK_ERRNO(expr) __coverity_check__((expr) >= 0) #else -#define ASSERT_OK_ERRNO(expr) \ - ({ \ - typeof(expr) _result = (expr); \ - if (_result < 0) { \ - log_error_errno(errno, "%s:%i: Assertion failed: expected \"%s\" to succeed, but got error: %m", \ - PROJECT_FILE, __LINE__, #expr); \ - abort(); \ - } \ +#define ASSERT_OK_ERRNO(expr) \ + ({ \ + typeof(expr) _result = (expr); \ + if (_result < 0) \ + log_test_failed("Expected \"%s\" to succeed, but got error: %s", #expr, STRERROR(errno)); \ }) #endif #ifdef __COVERITY__ #define ASSERT_OK_ZERO_ERRNO(expr) __coverity_check__((expr) == 0) #else -#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 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_ZERO_ERRNO(expr) \ + ({ \ + typeof(expr) _result = (expr); \ + if (_result < 0) \ + log_test_failed("Expected \"%s\" to succeed, but got error: %s", #expr, STRERROR(errno)); \ + if (_result != 0) { \ + char _sexpr[DECIMAL_STR_MAX(typeof(expr))]; \ + xsprintf(_sexpr, DECIMAL_STR_FMT(_result), _result); \ + log_test_failed("Expected \"%s\" to be zero, but it is %s.", #expr, _sexpr); \ + } \ }) #endif #ifdef __COVERITY__ #define ASSERT_OK_EQ_ERRNO(expr1, expr2) __coverity_check__((expr1) == (expr2)) #else -#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 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_OK_EQ_ERRNO(expr1, expr2) \ + ({ \ + typeof(expr1) _expr1 = (expr1); \ + typeof(expr2) _expr2 = (expr2); \ + if (_expr1 < 0) \ + log_test_failed("Expected \"%s\" to succeed, but got error: %s", #expr1, STRERROR(errno)); \ + 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_test_failed("Expected \"%s == %s\", but %s != %s", #expr1, #expr2, _sexpr1, _sexpr2); \ + } \ }) #endif #ifdef __COVERITY__ #define ASSERT_FAIL(expr) __coverity_check__((expr) < 0) #else -#define ASSERT_FAIL(expr) \ - ({ \ - typeof(expr) _result = (expr); \ - if (_result >= 0) { \ - log_error("%s:%i: Assertion failed: expected \"%s\" to fail, but it succeeded.", \ - PROJECT_FILE, __LINE__, #expr); \ - abort(); \ - } \ +#define ASSERT_FAIL(expr) \ + ({ \ + typeof(expr) _result = (expr); \ + if (_result >= 0) \ + log_test_failed("Expected \"%s\" to fail, but it succeeded.", #expr); \ }) #endif #ifdef __COVERITY__ #define ASSERT_ERROR(expr1, expr2) __coverity_check__((expr1) == -(expr2)) #else -#define ASSERT_ERROR(expr1, expr2) \ - ({ \ - int _expr1 = (expr1); \ - int _expr2 = (expr2); \ - if (_expr1 >= 0) { \ - log_error("%s:%i: Assertion failed: expected \"%s\" to fail with error \"%s\", but it succeeded", \ - PROJECT_FILE, __LINE__, #expr1, STRERROR(_expr2)); \ - abort(); \ - } else if (-_expr1 != _expr2) { \ - log_error_errno(_expr1, "%s:%i: Assertion failed: expected \"%s\" to fail with error \"%s\", but got the following error: %m", \ - PROJECT_FILE, __LINE__, #expr1, STRERROR(_expr2)); \ - abort(); \ - } \ +#define ASSERT_ERROR(expr1, expr2) \ + ({ \ + int _expr1 = (expr1); \ + int _expr2 = (expr2); \ + if (_expr1 >= 0) \ + log_test_failed("Expected \"%s\" to fail with error \"%s\", but it succeeded", \ + #expr1, STRERROR(_expr2)); \ + else if (-_expr1 != _expr2) \ + log_test_failed("Expected \"%s\" to fail with error \"%s\", but got the following error: %s", \ + #expr1, STRERROR(_expr2), STRERROR(_expr1)); \ }) #endif #ifdef __COVERITY__ #define ASSERT_ERROR_ERRNO(expr1, expr2) __coverity_check__((expr1) < 0 && errno == (expr2)) #else -#define ASSERT_ERROR_ERRNO(expr1, expr2) \ - ({ \ - int _expr1 = (expr1); \ - int _expr2 = (expr2); \ - if (_expr1 >= 0) { \ - log_error("%s:%i: Assertion failed: expected \"%s\" to fail with error \"%s\", but it succeeded", \ - PROJECT_FILE, __LINE__, #expr1, STRERROR(_expr2)); \ - abort(); \ - } else if (errno != _expr2) { \ - log_error_errno(errno, "%s:%i: Assertion failed: expected \"%s\" to fail with error \"%s\", but got the following error: %m", \ - PROJECT_FILE, __LINE__, #expr1, STRERROR(errno)); \ - abort(); \ - } \ +#define ASSERT_ERROR_ERRNO(expr1, expr2) \ + ({ \ + int _expr1 = (expr1); \ + int _expr2 = (expr2); \ + if (_expr1 >= 0) \ + log_test_failed("Expected \"%s\" to fail with error \"%s\", but it succeeded", \ + #expr1, STRERROR(_expr2)); \ + else if (errno != _expr2) \ + log_test_failed("Expected \"%s\" to fail with error \"%s\", but got the following error: %s", \ + #expr1, STRERROR(_expr2), STRERROR(errno)); \ }) #endif #ifdef __COVERITY__ #define ASSERT_TRUE(expr) __coverity_check__(!!(expr)) #else -#define ASSERT_TRUE(expr) \ - ({ \ - if (!(expr)) { \ - log_error("%s:%i: Assertion failed: expected \"%s\" to be true", \ - PROJECT_FILE, __LINE__, #expr); \ - abort(); \ - } \ +#define ASSERT_TRUE(expr) \ + ({ \ + if (!(expr)) \ + log_test_failed("Expected \"%s\" to be true", #expr); \ }) #endif #ifdef __COVERITY__ #define ASSERT_FALSE(expr) __coverity_check__(!(expr)) #else -#define ASSERT_FALSE(expr) \ - ({ \ - if ((expr)) { \ - log_error("%s:%i: Assertion failed: expected \"%s\" to be false", \ - PROJECT_FILE, __LINE__, #expr); \ - abort(); \ - } \ +#define ASSERT_FALSE(expr) \ + ({ \ + if ((expr)) \ + log_test_failed("Expected \"%s\" to be false", #expr); \ }) #endif #ifdef __COVERITY__ #define ASSERT_NULL(expr) __coverity_check__((expr) == NULL) #else -#define ASSERT_NULL(expr) \ - ({ \ - typeof(expr) _result = (expr); \ - if (_result != NULL) { \ - log_error("%s:%i: Assertion failed: expected \"%s\" to be NULL, got \"%p\" != NULL", \ - PROJECT_FILE, __LINE__, #expr, _result); \ - abort(); \ - } \ +#define ASSERT_NULL(expr) \ + ({ \ + typeof(expr) _result = (expr); \ + if (_result != NULL) \ + log_test_failed("Expected \"%s\" to be NULL, got \"%p\" != NULL", #expr, _result); \ }) #endif #ifdef __COVERITY__ #define ASSERT_NOT_NULL(expr) __coverity_check__((expr) != NULL) #else -#define ASSERT_NOT_NULL(expr) \ - ({ \ - typeof(expr) _result = (expr); \ - if (_result == NULL) { \ - log_error("%s:%i: Assertion failed: expected \"%s\" to be not NULL", \ - PROJECT_FILE, __LINE__, #expr); \ - abort(); \ - } \ - \ - _result; \ +#define ASSERT_NOT_NULL(expr) \ + ({ \ + typeof(expr) _result = (expr); \ + if (_result == NULL) \ + log_test_failed("Expected \"%s\" to be not NULL", #expr); \ + _result; \ }) #endif #ifdef __COVERITY__ #define ASSERT_STREQ(expr1, expr2) __coverity_check__(streq_ptr((expr1), (expr2))) #else -#define ASSERT_STREQ(expr1, expr2) \ - ({ \ - const char *_expr1 = (expr1), *_expr2 = (expr2); \ - if (!streq_ptr(_expr1, _expr2)) { \ - log_error("%s:%i: Assertion failed: expected \"%s == %s\", got \"%s != %s\"", \ - PROJECT_FILE, __LINE__, #expr1, #expr2, strnull(_expr1), strnull(_expr2)); \ - abort(); \ - } \ +#define ASSERT_STREQ(expr1, expr2) \ + ({ \ + const char *_expr1 = (expr1), *_expr2 = (expr2); \ + if (!streq_ptr(_expr1, _expr2)) \ + log_test_failed("Expected \"%s == %s\", got \"%s != %s\"", \ + #expr1, #expr2, strnull(_expr1), strnull(_expr2)); \ }) #endif #ifdef __COVERITY__ #define ASSERT_PTR_EQ(expr1, expr2) __coverity_check__((expr1) == (expr2)) #else -#define ASSERT_PTR_EQ(expr1, expr2) \ - ({ \ - const void *_expr1 = (expr1), *_expr2 = (expr2); \ - if (_expr1 != _expr2) { \ - log_error("%s:%i: Assertion failed: expected \"%s == %s\", got \"0x%p != 0x%p\"", \ - PROJECT_FILE, __LINE__, #expr1, #expr2, _expr1, _expr2); \ - abort(); \ - } \ +#define ASSERT_PTR_EQ(expr1, expr2) \ + ({ \ + const void *_expr1 = (expr1), *_expr2 = (expr2); \ + if (_expr1 != _expr2) \ + log_test_failed("Expected \"%s == %s\", got \"0x%p != 0x%p\"", \ + #expr1, #expr2, _expr1, _expr2); \ }) #endif @@ -513,9 +416,8 @@ static inline int run_test_table(void) { 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(); \ + log_test_failed("Expected \"%s == %s\", but %s != %s", \ + #expr1, #expr2, _sexpr1, _sexpr2); \ } \ }) #endif @@ -532,9 +434,8 @@ static inline int run_test_table(void) { 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(); \ + log_test_failed("Expected \"%s >= %s\", but %s < %s", \ + #expr1, #expr2, _sexpr1, _sexpr2); \ } \ }) #endif @@ -551,9 +452,8 @@ static inline int run_test_table(void) { 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(); \ + log_test_failed("Expected \"%s <= %s\", but %s > %s", \ + #expr1, #expr2, _sexpr1, _sexpr2); \ } \ }) #endif @@ -570,9 +470,8 @@ static inline int run_test_table(void) { 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(); \ + log_test_failed("Expected \"%s != %s\", but %s == %s", \ + #expr1, #expr2, _sexpr1, _sexpr2); \ } \ }) #endif @@ -589,9 +488,8 @@ static inline int run_test_table(void) { 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(); \ + log_test_failed("Expected \"%s > %s\", but %s <= %s", \ + #expr1, #expr2, _sexpr1, _sexpr2); \ } \ }) #endif @@ -608,37 +506,29 @@ static inline int run_test_table(void) { 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(); \ + log_test_failed("Expected \"%s < %s\", but %s >= %s", \ + #expr1, #expr2, _sexpr1, _sexpr2); \ } \ }) #endif +int assert_signal_internal(void); + #ifdef __COVERITY__ #define ASSERT_SIGNAL(expr, signal) __coverity_check__(((expr), false)) #else #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)); \ + int _r = assert_signal_internal(); \ + ASSERT_OK_ERRNO(_r); \ + if (_r == 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(); \ - } \ + if (_r != signal) \ + log_test_failed("\"%s\" died with signal %s, but %s was expected", \ + #expr, signal_to_string(_r), signal_to_string(signal)); \ }) #endif @@ -649,13 +539,10 @@ static inline int run_test_table(void) { ({ \ typeof(expr1) _expr1 = (expr1); \ typeof(expr2) _expr2 = (expr2); \ - if (!sd_id128_equal(_expr1, _expr2)) { \ - log_error("%s:%i: Assertion failed: \"%s == %s\", but %s != %s", \ - PROJECT_FILE, __LINE__, \ - #expr1, #expr2, \ - SD_ID128_TO_STRING(_expr1), SD_ID128_TO_STRING(_expr2)); \ - abort(); \ - } \ + if (!sd_id128_equal(_expr1, _expr2)) \ + log_test_failed("\"%s == %s\", but %s != %s", \ + #expr1, #expr2, \ + SD_ID128_TO_STRING(_expr1), SD_ID128_TO_STRING(_expr2)); \ }) #endif @@ -666,13 +553,10 @@ static inline int run_test_table(void) { ({ \ typeof(expr1) _expr1 = (expr1); \ typeof(expr2) _expr2 = (expr2); \ - if (sd_id128_equal(_expr1, _expr2)) { \ - log_error("%s:%i: Assertion failed: \"%s != %s\", but %s == %s", \ - PROJECT_FILE, __LINE__, \ - #expr1, #expr2, \ - SD_ID128_TO_STRING(_expr1), SD_ID128_TO_STRING(_expr2)); \ - abort(); \ - } \ + if (sd_id128_equal(_expr1, _expr2)) \ + log_test_failed("\"%s != %s\", but %s == %s", \ + #expr1, #expr2, \ + SD_ID128_TO_STRING(_expr1), SD_ID128_TO_STRING(_expr2)); \ }) #endif @@ -688,13 +572,10 @@ static inline int run_test_table(void) { ({ \ typeof(expr1) _expr1 = (expr1); \ typeof(expr2) _expr2 = (expr2); \ - if (!efi_guid_equal(_expr1, _expr2)) { \ - log_error("%s:%i: Assertion failed: expected \"%s == %s\", but " EFI_GUID_Fmt \ - " != " EFI_GUID_Fmt, \ - PROJECT_FILE, __LINE__, \ - #expr1, #expr2, \ - EFI_GUID_Arg(*_expr1), EFI_GUID_Arg(*_expr2)); \ - abort(); \ - } \ + if (!efi_guid_equal(_expr1, _expr2)) \ + log_test_failed("Expected \"%s == %s\", but " EFI_GUID_Fmt \ + " != " EFI_GUID_Fmt, \ + #expr1, #expr2, \ + EFI_GUID_Arg(*_expr1), EFI_GUID_Arg(*_expr2)); \ }) #endif