From b40bff8e3e292562e38d83d1485fab6107a1d322 Mon Sep 17 00:00:00 2001 From: Michal Bloch Date: Mon, 4 Feb 2019 20:14:43 +0100 Subject: [PATCH] tests: add logutil fd_info unit tests Change-Id: I3de39916bc32dee5a3e1cbde713a0a80fbd90a7f Signed-off-by: Michal Bloch --- Makefile.am | 5 ++ src/tests/fd_info.c | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 src/tests/fd_info.c diff --git a/Makefile.am b/Makefile.am index 1d20810..2d387b5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -189,6 +189,7 @@ check_PROGRAMS = \ src/tests/limiter \ src/tests/dynamic_config \ src/tests/sort_vector \ + src/tests/fd_info \ src/tests/libdlog_pipe \ src/tests/libdlog_android \ src/tests/libdlog_base \ @@ -227,6 +228,10 @@ src_tests_sort_vector_SOURCES = src/tests/sort_vector.c src/logutil/sort_vector. src_tests_sort_vector_CFLAGS = $(check_CFLAGS) src_tests_sort_vector_LDFLAGS = $(AM_LDFLAGS) -Wl,--wrap=log_config_get_int,--wrap=log_should_print_line,--wrap=logfile_write_with_rotation,--wrap=log_entry_is_earlier,--wrap=free +src_tests_fd_info_SOURCES = src/tests/fd_info.c src/logutil/fd_info.c +src_tests_fd_info_CFLAGS = $(check_CFLAGS) +src_tests_fd_info_LDFLAGS = $(AM_LDFLAGS) -Wl,--wrap=sort_vector_push,--wrap=logfile_write_with_rotation,--wrap=malloc,--wrap=free,--wrap=close + src_tests_libdlog_pipe_SOURCES = src/tests/libdlog_pipe.c src/libdlog/log_pipe.c src/shared/logcommon.c src/shared/logconfig.c src/shared/queued_entry.c src/shared/translate_syslog.c src/shared/parsers.c src_tests_libdlog_pipe_CFLAGS = $(check_CFLAGS) src_tests_libdlog_pipe_LDFLAGS = $(AM_LDFLAGS) -Wl,--wrap=syslog_critical_failure,--wrap=connect,--wrap=write,--wrap=recv_pipe,--wrap=dup2,--wrap=socket diff --git a/src/tests/fd_info.c b/src/tests/fd_info.c new file mode 100644 index 0000000..7ab6cd9 --- /dev/null +++ b/src/tests/fd_info.c @@ -0,0 +1,138 @@ +// C +#include + +// DLog +#include "../logutil/fd_info.h" + +static bool use_real_free; +static void *expect_free1, *expect_free2; +void __real_free(void *ptr); +void __wrap_free(void *ptr) +{ + if (use_real_free) + __real_free(ptr); + else + assert(ptr == expect_free1 || ptr == expect_free2); +} + +static bool use_real_malloc; +static void *malloc_ret; +void *__real_malloc(size_t size); +void *__wrap_malloc(size_t size) +{ + return use_real_malloc ? __real_malloc(size) : malloc_ret; +} + +static bool use_real_close; +int __real_close(int fd); +int __wrap_close(int fd) +{ + if (use_real_close) + return __real_close(fd); + + assert(fd == 0xFD); + return 0; +} + +static bool sv_pushed; +int __wrap_sort_vector_push(struct sort_vector *logs, struct logger_entry *p, struct log_file *l_file) +{ + assert(p == (struct logger_entry *) 0xBADFEEL); + assert(l_file == (struct log_file *) 0xDEFACED); + + sv_pushed = true; + return 123; +} + +static bool sv_flushed; +int __wrap_logfile_write_with_rotation(const struct logger_entry *e, struct log_file *file, enum sorting_order sort_by) +{ + assert(e == (struct logger_entry *) 0xBADFEEL); + assert(file == (struct log_file *) 0xDEFACED); + + sv_flushed = true; + return 321; +} + +struct fd_info G_fdi; + +static bool fail_extract; +struct logger_entry *test_extract(struct fd_info *fdi) +{ + assert(fdi == &G_fdi); + return fail_extract ? NULL : (struct logger_entry *) 0xBADFEEL; +} + +void test_destroy(struct fd_info *fdi) +{ + assert(fdi == &G_fdi); +} + +int main() +{ + struct fd_ops fops = { + .destroy = test_destroy, + .extract_entry = test_extract, + }; + + malloc_ret = NULL; + assert(NULL == fdi_create(&fops, "foobar")); + fdi_free(NULL); // shouldn't explode + + malloc_ret = &G_fdi; + G_fdi = (struct fd_info) { + .fd = 52, + .priv_data = (void *) 0x16180339, + .name = (const char *) 0x27182818, + .ops = (struct fd_ops *) 0x31415926, + }; + assert(&G_fdi == fdi_create(&fops, "foobar")); + assert(-1 == G_fdi.fd); + assert(!G_fdi.priv_data); + assert(!strcmp(G_fdi.name, "foobar")); + assert(G_fdi.ops == &fops); + + G_fdi.fd = 0xFD; + expect_free1 = &G_fdi; + fdi_free(&G_fdi); + + struct fd_info **fdi_arr = NULL; + fdi_array_free(&fdi_arr); + + fdi_arr = calloc(3, sizeof **fdi_arr); + assert(fdi_arr); + fdi_arr[0] = &G_fdi; + expect_free1 = fdi_arr; + expect_free2 = &G_fdi; + fdi_array_free(&fdi_arr); + + fdi_arr = calloc(3, sizeof **fdi_arr); + assert(fdi_arr); + fdi_arr[1] = &G_fdi; + expect_free1 = fdi_arr; + expect_free2 = NULL; // shouldn't reach [1] &G_fdi because [0] NULL stops iteration + fdi_array_free(&fdi_arr); + + struct sort_vector sv; + + fail_extract = true; + assert(-ENOMEM == fdi_push_log(&G_fdi, &sv, (struct log_file *) 0xDEFACED)); + fail_extract = false; + + sv.size = 99; + expect_free1 = NULL; + assert(!fdi_push_log(&G_fdi, &sv, (struct log_file *) 0xDEFACED)); + assert(sv_pushed); + assert(!sv_flushed); + sv_pushed = false; + + sv.size = 0; + expect_free1 = (void *) 0xBADFEEL; + assert(!fdi_push_log(&G_fdi, &sv, (struct log_file *) 0xDEFACED)); + assert(!sv_pushed); + assert(sv_flushed); + + use_real_malloc = true; + use_real_free = true; + use_real_close = true; +} -- 2.7.4