summaryrefslogtreecommitdiff
path: root/libmisc/tests/test_log.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmisc/tests/test_log.c')
-rw-r--r--libmisc/tests/test_log.c95
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;
}