summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <m@maandree.se>2025-02-22 00:54:23 +0100
committerMattias Andrée <m@maandree.se>2025-02-22 00:54:23 +0100
commit1aa5c5fcc55f65bb48396a6fb45af060eb24b8e6 (patch)
tree21d6c69c2f64226e98c28413a8e95534c36f939f
parentFix doc style (diff)
downloadliblog-1aa5c5fcc55f65bb48396a6fb45af060eb24b8e6.tar.gz
liblog-1aa5c5fcc55f65bb48396a6fb45af060eb24b8e6.tar.bz2
liblog-1aa5c5fcc55f65bb48396a6fb45af060eb24b8e6.tar.xz
m fix + add testsHEADmaster
Signed-off-by: Mattias Andrée <m@maandree.se>
-rw-r--r--Makefile1
-rw-r--r--common.h14
-rw-r--r--liblog.h1
-rw-r--r--liblog_apply_env_mask.c26
-rw-r--r--liblog_destroy_context.c16
-rw-r--r--liblog_init_context.c21
-rw-r--r--liblog_use_fd.c45
-rw-r--r--liblog_use_fd_for_range.c49
-rw-r--r--liblog_use_output.c75
-rw-r--r--liblog_use_stderr.c42
-rw-r--r--liblog_use_stderr_for_range.c46
-rw-r--r--liblog_use_stream.c42
-rw-r--r--liblog_use_stream_for_range.c46
-rw-r--r--liblog_vlog_cork.c3
-rw-r--r--liblog_vlog_no_backtrace_cork.c3
15 files changed, 418 insertions, 12 deletions
diff --git a/Makefile b/Makefile
index cef8c52..3dbc223 100644
--- a/Makefile
+++ b/Makefile
@@ -151,6 +151,7 @@ check: $(TEST)
fi;\
if ! $(CHECK_PREFIX) ./$$t; then\
status=1;\
+ printf '\033[1;31mfailed\033[m\n';\
fi;\
done;\
exit $$status
diff --git a/common.h b/common.h
index 277c3d5..fc403dc 100644
--- a/common.h
+++ b/common.h
@@ -15,6 +15,10 @@
#if defined(__GNUC__)
+# pragma GCC diagnostic ignored "-Winline"
+#endif
+
+#if defined(__GNUC__)
# define WEAK_LINKING __attribute__((__weak__))
#else
# define WEAK_LINKING
@@ -24,7 +28,8 @@
#define MIN(A, B) ((A) < (B) ? (A) : (B))
#define MAX(A, B) ((A) > (B) ? (A) : (B))
-#define NEXT_LOGLEVEL(LVL) ((enum liblog_level)(LVL) + (enum liblog_level)100)
+#define LOGLEVEL_DELTA 100
+#define NEXT_LOGLEVEL(LVL) ((enum liblog_level)(LVL) + (enum liblog_level)LOGLEVEL_DELTA)
#define XLOG_NOT_INLINE 0x0100
@@ -314,3 +319,10 @@ void test_assert(const char *file, int line, enum assert_type type, enum assert_
ASSERT_EQ_INT(HAVE, 0)
#endif
+
+
+#if !defined(TEST) && !defined(USE_EXTERN_INLINE)
+# if defined(__GNUC__)
+# pragma GCC diagnostic ignored "-Wmissing-prototypes"
+# endif
+#endif
diff --git a/liblog.h b/liblog.h
index fb5f097..1192ead 100644
--- a/liblog.h
+++ b/liblog.h
@@ -15,6 +15,7 @@
#elif defined(__GNUC__)
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wformat-nonliteral"
+# pragma GCC diagnostic ignored "-Winline"
#endif
diff --git a/liblog_apply_env_mask.c b/liblog_apply_env_mask.c
index 1fceae0..67cd2fb 100644
--- a/liblog_apply_env_mask.c
+++ b/liblog_apply_env_mask.c
@@ -7,7 +7,7 @@ liblog_apply_env_mask(struct liblog_context *ctx)
{
const char *env = getenv("LIBLOG_LOGMASK");
- if (*env || !*env) {
+ if (!env || !*env) {
liblog_mask_verbose(ctx, NEXT_LOGLEVEL(LIBLOG_WARNING));
return;
}
@@ -17,6 +17,28 @@ liblog_apply_env_mask(struct liblog_context *ctx)
#else
-int main(void) {return 0;} /* TODO test */
+int
+main(void)
+{
+ struct liblog_context ctx;
+ char nullmask[] = "LIBLOG_LOGMASK=";
+ char *nullenv[] = {NULL};
+ char *nullmaskenv[] = {nullmask, NULL};
+ unsigned defaultmask = ((1U << 9) - 1U) ^ ((1U << ((int)LIBLOG_WARNING / LOGLEVEL_DELTA + 1)) - 1U);
+
+ environ = nullenv;
+
+ ctx.logmask = 0;
+ liblog_apply_env_mask(&ctx);
+ ASSERT_EQ_UINT(ctx.logmask, defaultmask);
+
+ environ = nullmaskenv;
+
+ ctx.logmask = 0;
+ liblog_apply_env_mask(&ctx);
+ ASSERT_EQ_UINT(ctx.logmask, defaultmask);
+
+ return 0;
+}
#endif
diff --git a/liblog_destroy_context.c b/liblog_destroy_context.c
index 57192ac..6a3fa09 100644
--- a/liblog_destroy_context.c
+++ b/liblog_destroy_context.c
@@ -27,6 +27,20 @@ liblog_destroy_context(struct liblog_context *ctx)
#else
-int main(void) {return 0;} /* TODO test */
+int
+main(void)
+{
+ struct liblog_context ctx;
+ char *nullenv[] = {NULL};
+
+ environ = nullenv;
+
+ ASSERT_ZERO(liblog_destroy_context(NULL));
+
+ ASSERT_ZERO(liblog_init_context(&ctx));
+ ASSERT_ZERO(liblog_destroy_context(&ctx));
+
+ return 0;
+}
#endif
diff --git a/liblog_init_context.c b/liblog_init_context.c
index 0137248..ff3f574 100644
--- a/liblog_init_context.c
+++ b/liblog_init_context.c
@@ -19,6 +19,25 @@ liblog_init_context(struct liblog_context *ctx)
#else
-int main(void) {return 0;} /* TODO test */
+int
+main(void)
+{
+ struct liblog_context ctx;
+ char *nullenv[] = {NULL};
+
+ environ = nullenv;
+
+ errno = 0;
+ ASSERT_EQ_INT(liblog_init_context(NULL), -1);
+ ASSERT_EQ_INT(errno, EINVAL);
+
+ ASSERT_ZERO(liblog_init_context(&ctx));
+ ASSERT_IS_NULL(ctx.internal_state);
+ ASSERT_IS_NULL(ctx.outputs);
+ ASSERT_ZERO(ctx.noutputs);
+ ASSERT_EQ_UINT(ctx.logmask, ((1U << 9) - 1U) ^ ((1U << ((int)LIBLOG_WARNING / LOGLEVEL_DELTA + 1)) - 1U));
+
+ return 0;
+}
#endif
diff --git a/liblog_use_fd.c b/liblog_use_fd.c
index 52687c7..4ab2066 100644
--- a/liblog_use_fd.c
+++ b/liblog_use_fd.c
@@ -6,6 +6,49 @@ extern inline struct liblog_output *liblog_use_fd(struct liblog_context *, int,
#else
-int main(void) {return 0;} /* TODO test */
+int
+main(void)
+{
+ struct liblog_context ctx;
+ struct liblog_output *output;
+
+ ASSERT_ZERO(liblog_init_context(&ctx));
+
+ errno = 0;
+ ASSERT_IS_NULL(liblog_use_fd(NULL, 0, NULL, 0));
+ ASSERT_EQ_INT(errno, EINVAL);
+
+ output = liblog_use_fd(&ctx, 5, "prefix", 1);
+ ASSERT_NOT_NULL(output);
+ ASSERT_NOT_NULL(output->prefixfmt);
+ ASSERT_EQ_STR(output->prefixfmt, "prefix");
+ ASSERT_EQ_UINT(output->lowest_verbosity_unlimited, 1);
+ ASSERT_EQ_UINT(output->highest_verbosity_unlimited, 1);
+ ASSERT_EQ_UINT(output->use_backtrace, 1);
+ ASSERT_EQ_ENUM(output->sink_type, LIBLOG_FILE);
+ ASSERT_EQ_INT(output->sink.file.fd, 5);
+ ASSERT_EQ_INT(output->sink.file.owns_fd, 0);
+ ASSERT_EQ_UINT(ctx.noutputs, 1);
+ ASSERT_NOT_NULL(ctx.outputs);
+
+ output = liblog_use_fd(&ctx, -1, NULL, 0);
+ ASSERT_NOT_NULL(output);
+ ASSERT_NOT_NULL(output->prefixfmt);
+ ASSERT_EQ_STR(output->prefixfmt, DEFAULT_PREFIXFMT);
+ ASSERT_EQ_UINT(output->lowest_verbosity_unlimited, 1);
+ ASSERT_EQ_UINT(output->highest_verbosity_unlimited, 1);
+ ASSERT_EQ_UINT(output->use_backtrace, 0);
+ ASSERT_EQ_ENUM(output->sink_type, LIBLOG_FILE);
+ ASSERT_EQ_INT(output->sink.file.fd, -1);
+ ASSERT_EQ_INT(output->sink.file.owns_fd, 0);
+ ASSERT_EQ_UINT(ctx.noutputs, 2);
+ ASSERT_NOT_NULL(ctx.outputs);
+
+ ASSERT_EQ_INT(ctx.outputs[0].sink.file.fd, 5);
+ ASSERT_EQ_INT(ctx.outputs[1].sink.file.fd, -1);
+
+ liblog_destroy_context(&ctx);
+ return 0;
+}
#endif
diff --git a/liblog_use_fd_for_range.c b/liblog_use_fd_for_range.c
index 8460d5e..d4e3aec 100644
--- a/liblog_use_fd_for_range.c
+++ b/liblog_use_fd_for_range.c
@@ -7,6 +7,53 @@ extern inline struct liblog_output *liblog_use_fd_for_range(struct liblog_contex
#else
-int main(void) {return 0;} /* TODO test */
+int
+main(void)
+{
+ struct liblog_context ctx;
+ struct liblog_output *output;
+
+ ASSERT_ZERO(liblog_init_context(&ctx));
+
+ errno = 0;
+ ASSERT_IS_NULL(liblog_use_fd_for_range(NULL, 0, NULL, 0, LIBLOG_CRITICAL, LIBLOG_INFO));
+ ASSERT_EQ_INT(errno, EINVAL);
+
+ output = liblog_use_fd_for_range(&ctx, 5, "prefix", 1, LIBLOG_CRITICAL, LIBLOG_INFO);
+ ASSERT_NOT_NULL(output);
+ ASSERT_NOT_NULL(output->prefixfmt);
+ ASSERT_EQ_STR(output->prefixfmt, "prefix");
+ ASSERT_EQ_UINT(output->lowest_verbosity_unlimited, 0);
+ ASSERT_EQ_UINT(output->highest_verbosity_unlimited, 0);
+ ASSERT_EQ_ENUM(output->lowest_verbosity, LIBLOG_CRITICAL);
+ ASSERT_EQ_ENUM(output->highest_verbosity, LIBLOG_INFO);
+ ASSERT_EQ_UINT(output->use_backtrace, 1);
+ ASSERT_EQ_ENUM(output->sink_type, LIBLOG_FILE);
+ ASSERT_EQ_INT(output->sink.file.fd, 5);
+ ASSERT_EQ_INT(output->sink.file.owns_fd, 0);
+ ASSERT_EQ_UINT(ctx.noutputs, 1);
+ ASSERT_NOT_NULL(ctx.outputs);
+
+ output = liblog_use_fd_for_range(&ctx, -1, NULL, 0, LIBLOG_ERROR, LIBLOG_TRACE);
+ ASSERT_NOT_NULL(output);
+ ASSERT_NOT_NULL(output->prefixfmt);
+ ASSERT_EQ_STR(output->prefixfmt, DEFAULT_PREFIXFMT);
+ ASSERT_EQ_UINT(output->lowest_verbosity_unlimited, 0);
+ ASSERT_EQ_UINT(output->highest_verbosity_unlimited, 0);
+ ASSERT_EQ_ENUM(output->lowest_verbosity, LIBLOG_ERROR);
+ ASSERT_EQ_ENUM(output->highest_verbosity, LIBLOG_TRACE);
+ ASSERT_EQ_UINT(output->use_backtrace, 0);
+ ASSERT_EQ_ENUM(output->sink_type, LIBLOG_FILE);
+ ASSERT_EQ_INT(output->sink.file.fd, -1);
+ ASSERT_EQ_INT(output->sink.file.owns_fd, 0);
+ ASSERT_EQ_UINT(ctx.noutputs, 2);
+ ASSERT_NOT_NULL(ctx.outputs);
+
+ ASSERT_EQ_INT(ctx.outputs[0].sink.file.fd, 5);
+ ASSERT_EQ_INT(ctx.outputs[1].sink.file.fd, -1);
+
+ liblog_destroy_context(&ctx);
+ return 0;
+}
#endif
diff --git a/liblog_use_output.c b/liblog_use_output.c
index 3471722..b2c3ec4 100644
--- a/liblog_use_output.c
+++ b/liblog_use_output.c
@@ -38,6 +38,7 @@ liblog_use_output(struct liblog_context *ctx, const struct liblog_output *output
errno = ENOMEM;
return NULL;
}
+ ctx->outputs = new;
memcpy(&ctx->outputs[ctx->noutputs], output, sizeof(*output));
@@ -49,6 +50,78 @@ liblog_use_output(struct liblog_context *ctx, const struct liblog_output *output
#else
-int main(void) {return 0;} /* TODO test */
+int
+main(void)
+{
+ struct liblog_context ctx;
+ struct liblog_output output;
+ struct liblog_output *new_output;
+
+ ASSERT_ZERO(liblog_init_context(&ctx));
+
+ errno = 0;
+ ASSERT_IS_NULL(liblog_use_output(NULL, NULL));
+ ASSERT_EQ_INT(errno, EINVAL);
+
+ errno = 0;
+ ASSERT_IS_NULL(liblog_use_output(&ctx, NULL));
+ ASSERT_EQ_INT(errno, EINVAL);
+
+ errno = 0;
+ ASSERT_IS_NULL(liblog_use_output(NULL, &output));
+ ASSERT_EQ_INT(errno, EINVAL);
+
+ memset(&ctx, 0, sizeof(ctx));
+
+ errno = 0;
+ output.lowest_verbosity_unlimited = 1;
+ output.highest_verbosity_unlimited = 1;
+ output.lowest_verbosity = (enum liblog_level)400;
+ output.highest_verbosity = (enum liblog_level)100;
+ ASSERT_IS_NULL(liblog_use_output(&ctx, &output));
+ ASSERT_EQ_INT(errno, EINVAL);
+ memset(&output, 0, sizeof(output));
+
+ errno = 0;
+ output.sink_type = (enum liblog_sink)99;
+ ASSERT_IS_NULL(liblog_use_output(&ctx, &output));
+ ASSERT_EQ_INT(errno, EINVAL);
+
+ errno = 0;
+ output.sink_type = (enum liblog_sink)-1;
+ ASSERT_IS_NULL(liblog_use_output(&ctx, &output));
+ ASSERT_EQ_INT(errno, EINVAL);
+
+ errno = 0;
+ output.sink_type = LIBLOG_STREAM;
+ output.sink.stream.stream = NULL;
+ ASSERT_IS_NULL(liblog_use_output(&ctx, &output));
+ ASSERT_EQ_INT(errno, EINVAL);
+
+ errno = 0;
+ output.sink_type = LIBLOG_FILE;
+ ctx.noutputs = SIZE_MAX / sizeof(*ctx.outputs);
+ ASSERT_IS_NULL(liblog_use_output(&ctx, &output));
+ ASSERT_EQ_INT(errno, ENOMEM);
+ ctx.noutputs = 0;
+
+ output.sink_type = LIBLOG_FILE;
+ output.sink.file.fd = 0;
+ output.sink.file.owns_fd = 0;
+ output.prefixfmt = NULL;
+ new_output = liblog_use_output(&ctx, &output);
+ ASSERT_NOT_NULL(new_output);
+ ASSERT_IS_NULL(output.prefixfmt);
+ ASSERT_NOT_NULL(new_output->prefixfmt);
+ ASSERT_EQ_STR(new_output->prefixfmt, DEFAULT_PREFIXFMT);
+ ASSERT_EQ_INT(new_output->sink_type, output.sink_type);
+ ASSERT_EQ_INT(new_output->sink.file.fd, output.sink.file.fd);
+ ASSERT_EQ_INT(new_output->sink.file.owns_fd, output.sink.file.owns_fd);
+ ASSERT_EQ_UINT(ctx.noutputs, 1);
+ ASSERT_NOT_NULL(ctx.outputs);
+
+ liblog_destroy_context(&ctx);
+ return 0;
+}
#endif
diff --git a/liblog_use_stderr.c b/liblog_use_stderr.c
index f66d953..d8302b4 100644
--- a/liblog_use_stderr.c
+++ b/liblog_use_stderr.c
@@ -6,6 +6,46 @@ extern inline struct liblog_output *liblog_use_stderr(struct liblog_context *, c
#else
-int main(void) {return 0;} /* TODO test */
+int
+main(void)
+{
+ struct liblog_context ctx;
+ struct liblog_output *output;
+
+ ASSERT_ZERO(liblog_init_context(&ctx));
+
+ errno = 0;
+ ASSERT_IS_NULL(liblog_use_stderr(NULL, NULL, 0));
+ ASSERT_EQ_INT(errno, EINVAL);
+
+ output = liblog_use_stderr(&ctx, "prefix", 1);
+ ASSERT_NOT_NULL(output);
+ ASSERT_NOT_NULL(output->prefixfmt);
+ ASSERT_EQ_STR(output->prefixfmt, "prefix");
+ ASSERT_EQ_UINT(output->lowest_verbosity_unlimited, 1);
+ ASSERT_EQ_UINT(output->highest_verbosity_unlimited, 1);
+ ASSERT_EQ_UINT(output->use_backtrace, 1);
+ ASSERT_EQ_ENUM(output->sink_type, LIBLOG_FILE);
+ ASSERT_EQ_INT(output->sink.file.fd, STDERR_FILENO);
+ ASSERT_EQ_INT(output->sink.file.owns_fd, 0);
+ ASSERT_EQ_UINT(ctx.noutputs, 1);
+ ASSERT_NOT_NULL(ctx.outputs);
+
+ output = liblog_use_stderr(&ctx, NULL, 0);
+ ASSERT_NOT_NULL(output);
+ ASSERT_NOT_NULL(output->prefixfmt);
+ ASSERT_EQ_STR(output->prefixfmt, DEFAULT_PREFIXFMT);
+ ASSERT_EQ_UINT(output->lowest_verbosity_unlimited, 1);
+ ASSERT_EQ_UINT(output->highest_verbosity_unlimited, 1);
+ ASSERT_EQ_UINT(output->use_backtrace, 0);
+ ASSERT_EQ_ENUM(output->sink_type, LIBLOG_FILE);
+ ASSERT_EQ_INT(output->sink.file.fd, STDERR_FILENO);
+ ASSERT_EQ_INT(output->sink.file.owns_fd, 0);
+ ASSERT_EQ_UINT(ctx.noutputs, 2);
+ ASSERT_NOT_NULL(ctx.outputs);
+
+ liblog_destroy_context(&ctx);
+ return 0;
+}
#endif
diff --git a/liblog_use_stderr_for_range.c b/liblog_use_stderr_for_range.c
index 1ffaee1..ba9bfc8 100644
--- a/liblog_use_stderr_for_range.c
+++ b/liblog_use_stderr_for_range.c
@@ -7,6 +7,50 @@ extern inline struct liblog_output *liblog_use_stderr_for_range(struct liblog_co
#else
-int main(void) {return 0;} /* TODO test */
+int
+main(void)
+{
+ struct liblog_context ctx;
+ struct liblog_output *output;
+
+ ASSERT_ZERO(liblog_init_context(&ctx));
+
+ errno = 0;
+ ASSERT_IS_NULL(liblog_use_stderr_for_range(NULL, NULL, 0, LIBLOG_CRITICAL, LIBLOG_INFO));
+ ASSERT_EQ_INT(errno, EINVAL);
+
+ output = liblog_use_stderr_for_range(&ctx, "prefix", 1, LIBLOG_CRITICAL, LIBLOG_INFO);
+ ASSERT_NOT_NULL(output);
+ ASSERT_NOT_NULL(output->prefixfmt);
+ ASSERT_EQ_STR(output->prefixfmt, "prefix");
+ ASSERT_EQ_UINT(output->lowest_verbosity_unlimited, 0);
+ ASSERT_EQ_UINT(output->highest_verbosity_unlimited, 0);
+ ASSERT_EQ_ENUM(output->lowest_verbosity, LIBLOG_CRITICAL);
+ ASSERT_EQ_ENUM(output->highest_verbosity, LIBLOG_INFO);
+ ASSERT_EQ_UINT(output->use_backtrace, 1);
+ ASSERT_EQ_ENUM(output->sink_type, LIBLOG_FILE);
+ ASSERT_EQ_INT(output->sink.file.fd, STDERR_FILENO);
+ ASSERT_EQ_INT(output->sink.file.owns_fd, 0);
+ ASSERT_EQ_UINT(ctx.noutputs, 1);
+ ASSERT_NOT_NULL(ctx.outputs);
+
+ output = liblog_use_stderr_for_range(&ctx, NULL, 0, LIBLOG_ERROR, LIBLOG_TRACE);
+ ASSERT_NOT_NULL(output);
+ ASSERT_NOT_NULL(output->prefixfmt);
+ ASSERT_EQ_STR(output->prefixfmt, DEFAULT_PREFIXFMT);
+ ASSERT_EQ_UINT(output->lowest_verbosity_unlimited, 0);
+ ASSERT_EQ_UINT(output->highest_verbosity_unlimited, 0);
+ ASSERT_EQ_ENUM(output->lowest_verbosity, LIBLOG_ERROR);
+ ASSERT_EQ_ENUM(output->highest_verbosity, LIBLOG_TRACE);
+ ASSERT_EQ_UINT(output->use_backtrace, 0);
+ ASSERT_EQ_ENUM(output->sink_type, LIBLOG_FILE);
+ ASSERT_EQ_INT(output->sink.file.fd, STDERR_FILENO);
+ ASSERT_EQ_INT(output->sink.file.owns_fd, 0);
+ ASSERT_EQ_UINT(ctx.noutputs, 2);
+ ASSERT_NOT_NULL(ctx.outputs);
+
+ liblog_destroy_context(&ctx);
+ return 0;
+}
#endif
diff --git a/liblog_use_stream.c b/liblog_use_stream.c
index c415627..c8506d6 100644
--- a/liblog_use_stream.c
+++ b/liblog_use_stream.c
@@ -6,6 +6,46 @@ extern inline struct liblog_output *liblog_use_stream(struct liblog_context *, F
#else
-int main(void) {return 0;} /* TODO test */
+int
+main(void)
+{
+ struct liblog_context ctx;
+ struct liblog_output *output;
+
+ ASSERT_ZERO(liblog_init_context(&ctx));
+
+ errno = 0;
+ ASSERT_IS_NULL(liblog_use_stream(NULL, stderr, NULL, 0));
+ ASSERT_EQ_INT(errno, EINVAL);
+
+ output = liblog_use_stream(&ctx, stderr, "prefix", 1);
+ ASSERT_NOT_NULL(output);
+ ASSERT_NOT_NULL(output->prefixfmt);
+ ASSERT_EQ_STR(output->prefixfmt, "prefix");
+ ASSERT_EQ_UINT(output->lowest_verbosity_unlimited, 1);
+ ASSERT_EQ_UINT(output->highest_verbosity_unlimited, 1);
+ ASSERT_EQ_UINT(output->use_backtrace, 1);
+ ASSERT_EQ_ENUM(output->sink_type, LIBLOG_STREAM);
+ ASSERT_IS_PTR(output->sink.stream.stream, stderr);
+ ASSERT_EQ_INT(output->sink.stream.owns_stream, 0);
+ ASSERT_EQ_UINT(ctx.noutputs, 1);
+ ASSERT_NOT_NULL(ctx.outputs);
+
+ output = liblog_use_stream(&ctx, stdout, NULL, 0);
+ ASSERT_NOT_NULL(output);
+ ASSERT_NOT_NULL(output->prefixfmt);
+ ASSERT_EQ_STR(output->prefixfmt, DEFAULT_PREFIXFMT);
+ ASSERT_EQ_UINT(output->lowest_verbosity_unlimited, 1);
+ ASSERT_EQ_UINT(output->highest_verbosity_unlimited, 1);
+ ASSERT_EQ_UINT(output->use_backtrace, 0);
+ ASSERT_EQ_ENUM(output->sink_type, LIBLOG_STREAM);
+ ASSERT_IS_PTR(output->sink.stream.stream, stdout);
+ ASSERT_EQ_INT(output->sink.stream.owns_stream, 0);
+ ASSERT_EQ_UINT(ctx.noutputs, 2);
+ ASSERT_NOT_NULL(ctx.outputs);
+
+ liblog_destroy_context(&ctx);
+ return 0;
+}
#endif
diff --git a/liblog_use_stream_for_range.c b/liblog_use_stream_for_range.c
index 6749b26..98e6091 100644
--- a/liblog_use_stream_for_range.c
+++ b/liblog_use_stream_for_range.c
@@ -7,6 +7,50 @@ extern inline struct liblog_output *liblog_use_stream_for_range(struct liblog_co
#else
-int main(void) {return 0;} /* TODO test */
+int
+main(void)
+{
+ struct liblog_context ctx;
+ struct liblog_output *output;
+
+ ASSERT_ZERO(liblog_init_context(&ctx));
+
+ errno = 0;
+ ASSERT_IS_NULL(liblog_use_stream_for_range(NULL, stderr, NULL, 0, LIBLOG_CRITICAL, LIBLOG_INFO));
+ ASSERT_EQ_INT(errno, EINVAL);
+
+ output = liblog_use_stream_for_range(&ctx, stderr, "prefix", 1, LIBLOG_CRITICAL, LIBLOG_INFO);
+ ASSERT_NOT_NULL(output);
+ ASSERT_NOT_NULL(output->prefixfmt);
+ ASSERT_EQ_STR(output->prefixfmt, "prefix");
+ ASSERT_EQ_UINT(output->lowest_verbosity_unlimited, 0);
+ ASSERT_EQ_UINT(output->highest_verbosity_unlimited, 0);
+ ASSERT_EQ_ENUM(output->lowest_verbosity, LIBLOG_CRITICAL);
+ ASSERT_EQ_ENUM(output->highest_verbosity, LIBLOG_INFO);
+ ASSERT_EQ_UINT(output->use_backtrace, 1);
+ ASSERT_EQ_ENUM(output->sink_type, LIBLOG_STREAM);
+ ASSERT_EQ_INT(output->sink.stream.stream, stderr);
+ ASSERT_EQ_INT(output->sink.stream.owns_stream, 0);
+ ASSERT_EQ_UINT(ctx.noutputs, 1);
+ ASSERT_NOT_NULL(ctx.outputs);
+
+ output = liblog_use_stream_for_range(&ctx, stdout, NULL, 0, LIBLOG_ERROR, LIBLOG_TRACE);
+ ASSERT_NOT_NULL(output);
+ ASSERT_NOT_NULL(output->prefixfmt);
+ ASSERT_EQ_STR(output->prefixfmt, DEFAULT_PREFIXFMT);
+ ASSERT_EQ_UINT(output->lowest_verbosity_unlimited, 0);
+ ASSERT_EQ_UINT(output->highest_verbosity_unlimited, 0);
+ ASSERT_EQ_ENUM(output->lowest_verbosity, LIBLOG_ERROR);
+ ASSERT_EQ_ENUM(output->highest_verbosity, LIBLOG_TRACE);
+ ASSERT_EQ_UINT(output->use_backtrace, 0);
+ ASSERT_EQ_ENUM(output->sink_type, LIBLOG_STREAM);
+ ASSERT_EQ_INT(output->sink.stream.stream, stdout);
+ ASSERT_EQ_INT(output->sink.stream.owns_stream, 0);
+ ASSERT_EQ_UINT(ctx.noutputs, 2);
+ ASSERT_NOT_NULL(ctx.outputs);
+
+ liblog_destroy_context(&ctx);
+ return 0;
+}
#endif
diff --git a/liblog_vlog_cork.c b/liblog_vlog_cork.c
index f7bf4e9..fd191d3 100644
--- a/liblog_vlog_cork.c
+++ b/liblog_vlog_cork.c
@@ -10,6 +10,9 @@ extern inline int liblog_vlog_cork(struct liblog_context *, enum liblog_level, c
# define liblog_vlog_cork liblog__dont_want__
# include "common.h"
# undef liblog_vlog_cork
+# if defined(__GNUC__)
+# pragma GCC diagnostic ignored "-Wformat-nonliteral"
+# endif
LIBLOG_VPRINTF__(3) int
liblog_vlog_cork(struct liblog_context *ctx, enum liblog_level level, const char *fmt, va_list args)
diff --git a/liblog_vlog_no_backtrace_cork.c b/liblog_vlog_no_backtrace_cork.c
index a18b220..cbeb9a4 100644
--- a/liblog_vlog_no_backtrace_cork.c
+++ b/liblog_vlog_no_backtrace_cork.c
@@ -10,6 +10,9 @@ extern inline int liblog_vlog_no_backtrace_cork(struct liblog_context *, enum li
# define liblog_vlog_no_backtrace_cork liblog__dont_want__
# include "common.h"
# undef liblog_vlog_no_backtrace_cork
+# if defined(__GNUC__)
+# pragma GCC diagnostic ignored "-Wformat-nonliteral"
+# endif
LIBLOG_VPRINTF__(3) int
liblog_vlog_no_backtrace_cork(struct liblog_context *ctx, enum liblog_level level, const char *fmt, va_list args)