diff options
Diffstat (limited to 'libmisc/tests/test_log.c')
-rw-r--r-- | libmisc/tests/test_log.c | 95 |
1 files changed, 70 insertions, 25 deletions
diff --git a/libmisc/tests/test_log.c b/libmisc/tests/test_log.c index 1468b5a..e5abb61 100644 --- a/libmisc/tests/test_log.c +++ b/libmisc/tests/test_log.c @@ -4,11 +4,10 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -#define _GNU_SOURCE /* for vasprintf() */ #include <stdarg.h> /* for va_list */ -#include <stdio.h> /* for vasprintf() */ -#include <stdlib.h> /* for free() */ -#include <string.h> /* for strcmp() */ +#include <stdio.h> /* for vsnprintf() */ +#include <stdlib.h> /* for realloc(), free() */ +#include <string.h> /* for strlen(), strcmp() */ #define LOG_NAME FROBNICATE #include <libmisc/log.h> @@ -19,40 +18,63 @@ /* Intercept output ***********************************************************/ -static char *log_output = NULL; +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) vasprintf(&log_output, format, va); + 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); \ - cmd; \ - if (!exp) \ - test_assert(!log_output); \ - else { \ - test_assert(log_output); \ - if (strcmp(log_output, exp)) { \ - printf("exp = \"%s\"\n" \ - "act = \"%s\"\n", \ - exp, log_output); \ - test_assert(0); \ - } \ - } \ - if (log_output) { \ - free(log_output); \ - log_output = NULL; \ - } \ +#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", @@ -65,6 +87,29 @@ int main() { #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; } |