/* libmisc/tests/test_log.c - Tests for * * Copyright (C) 2024-2025 Luke T. Shumaker * SPDX-License-Identifier: AGPL-3.0-or-later */ #include /* for va_list */ #include /* for vsnprintf() */ #include /* for realloc(), free() */ #include /* for strlen(), strcmp() */ #define LOG_NAME FROBNICATE #include #include #include "test.h" /* Intercept output ***********************************************************/ static struct fmt_buf log_output = {}; size_t __lm_printf(const char *format, ...) { restart: va_list va; va_start(va, format); size_t ret = (size_t) vsnprintf(log_output.dat, log_output.cap, format, va); va_end(va); if (ret > log_output.cap) { log_output.cap = ret+8; log_output.dat = realloc(log_output.dat, log_output.cap); memset(log_output.dat, 0, log_output.cap); goto restart; } log_output.len = ret; return ret; } void __lm_putchar(unsigned char c) { if (log_output.len+1 >= log_output.cap) { log_output.cap += 16; log_output.dat = realloc(log_output.dat, log_output.cap); memset(log_output.dat + log_output.len, 0, log_output.cap - log_output.len); } ((uint8_t *)log_output.dat)[log_output.len++] = (uint8_t)c; } static void log_output_clear(void) { if (log_output.dat) memset(log_output.dat, 0, log_output.cap); log_output.len = 0; } /* Actual tests ***************************************************************/ #define should_print(_exp, cmd) do { \ char *exp = _exp; \ test_assert(log_output.len == 0); \ cmd; \ if (!exp) \ test_assert(log_output.len == 0); \ else { \ test_assert(log_output.dat); \ test_assert(strlen(log_output.dat) == log_output.len); \ if (strcmp(log_output.dat, exp)) { \ printf("exp = \"%s\"\n" \ "act = \"%s\"\n", \ exp, (char *)log_output.dat); \ test_assert(0); \ } \ } \ log_output_clear(); \ } while (0) int main() { /* printf */ should_print("error: FROBNICATE: val=42\n", log_errorf("val=%d", 42)); should_print("info : FROBNICATE: val=0\n", log_infof("val=%d", 0)); #ifndef NDEBUG #define CONFIG_FROBNICATE_DEBUG 1 should_print("debug: FROBNICATE: val=-2\n", log_debugf("val=%d", -2)); #undef CONFIG_FROBNICATE_DEBUG #define CONFIG_FROBNICATE_DEBUG 0 should_print(NULL, log_debugf("val=%d", -2)); #undef CONFIG_FROBNICATE_DEBUG #endif /* libmisc/fmt.h */ should_print("error: FROBNICATE: val=42\n", log_errorln("val=", 42)); should_print("info : FROBNICATE: val=0\n", log_infoln("val=", 0)); #ifndef NDEBUG #define CONFIG_FROBNICATE_DEBUG 1 should_print("debug: FROBNICATE: val=-2\n", log_debugln("val=", -2)); #undef CONFIG_FROBNICATE_DEBUG #define CONFIG_FROBNICATE_DEBUG 0 should_print(NULL, log_debugln("val=", -2)); #undef CONFIG_FROBNICATE_DEBUG #endif if (log_output.dat) { free(log_output.dat); log_output.dat = NULL; log_output.cap = 0; } return 0; }