diff options
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | Makefile.am | 60 | ||||
-rw-r--r-- | configure.ac | 5 | ||||
-rw-r--r-- | src/blogc/sysinfo.c | 2 | ||||
-rw-r--r-- | tests/blogc/check_funcvars.c | 4 | ||||
-rw-r--r-- | tests/blogc/check_sysinfo.c | 187 | ||||
-rw-r--r-- | tests/blogc/check_sysinfo2.c | 49 |
7 files changed, 304 insertions, 5 deletions
@@ -61,6 +61,8 @@ blogc*.html /tests/blogc/check_loader /tests/blogc/check_renderer /tests/blogc/check_source_parser +/tests/blogc/check_sysinfo +/tests/blogc/check_sysinfo2 /tests/blogc/check_template_parser /tests/blogc-git-receiver/check_pre_receive_parser /tests/blogc-git-receiver/check_pre_receive.sh diff --git a/Makefile.am b/Makefile.am index f83d6ed..c75fc30 100644 --- a/Makefile.am +++ b/Makefile.am @@ -480,6 +480,8 @@ if USE_LD_WRAP check_PROGRAMS += \ tests/blogc/check_funcvars \ tests/blogc/check_loader \ + tests/blogc/check_sysinfo \ + tests/blogc/check_sysinfo2 \ tests/common/check_stdin \ $(NULL) @@ -495,7 +497,6 @@ tests_blogc_check_funcvars_LDFLAGS = \ -no-install \ -Wl,--wrap=bc_file_get_contents \ $(NULL) -#-Wl,--wrap=bc_file_get_contents tests_blogc_check_funcvars_LDADD = \ $(CMOCKA_LIBS) \ @@ -522,6 +523,63 @@ tests_blogc_check_loader_LDADD = \ libblogc_common.la \ $(NULL) +tests_blogc_check_sysinfo_SOURCES = \ + tests/blogc/check_sysinfo.c \ + $(NULL) + +tests_blogc_check_sysinfo_CFLAGS = \ + $(CMOCKA_CFLAGS) \ + $(NULL) + +tests_blogc_check_sysinfo_LDFLAGS = \ + -no-install \ + -Wl,--wrap=bc_file_get_contents \ + -Wl,--wrap=gethostname \ + $(NULL) + +if HAVE_UNISTD_H +if HAVE_SYS_TYPES_H +if HAVE_PWD_H +tests_blogc_check_sysinfo_LDFLAGS += \ + -Wl,--wrap=geteuid \ + -Wl,--wrap=getpwuid \ + $(NULL) +endif +endif +endif + +if HAVE_TIME_H +tests_blogc_check_sysinfo_LDFLAGS += \ + -Wl,--wrap=time \ + -Wl,--wrap=gmtime \ + $(NULL) +endif + +tests_blogc_check_sysinfo_LDADD = \ + $(CMOCKA_LIBS) \ + libblogc.la \ + libblogc_common.la \ + $(NULL) + +tests_blogc_check_sysinfo2_SOURCES = \ + tests/blogc/check_sysinfo2.c \ + $(NULL) + +tests_blogc_check_sysinfo2_CFLAGS = \ + $(CMOCKA_CFLAGS) \ + $(NULL) + +tests_blogc_check_sysinfo2_LDFLAGS = \ + -no-install \ + -Wl,--wrap=bc_file_get_contents \ + $(NULL) + +tests_blogc_check_sysinfo2_LDADD = \ + $(CMOCKA_LIBS) \ + libblogc.la \ + libblogc_common.la \ + $(NULL) + tests_common_check_stdin_SOURCES = \ tests/common/check_stdin.c \ $(NULL) diff --git a/configure.ac b/configure.ac index 809082a..9239976 100644 --- a/configure.ac +++ b/configure.ac @@ -223,6 +223,11 @@ AC_SUBST(BASH) AC_CHECK_HEADERS([sys/resource.h sys/stat.h sys/time.h sys/wait.h time.h unistd.h pwd.h]) AC_CHECK_FUNCS([gethostname]) +AM_CONDITIONAL([HAVE_UNISTD_H], [test "x$ac_cv_header_unistd_h" = "xyes"]) +AM_CONDITIONAL([HAVE_SYS_TYPES_H], [test "x$ac_cv_header_sys_types_h" = "xyes"]) +AM_CONDITIONAL([HAVE_PWD_H], [test "x$ac_cv_header_pwd_h" = "xyes"]) +AM_CONDITIONAL([HAVE_TIME_H], [test "x$ac_cv_header_time_h" = "xyes"]) + LT_LIB_M AC_CONFIG_FILES([ diff --git a/src/blogc/sysinfo.c b/src/blogc/sysinfo.c index 8d9a810..4ec1411 100644 --- a/src/blogc/sysinfo.c +++ b/src/blogc/sysinfo.c @@ -101,6 +101,8 @@ blogc_sysinfo_get_datetime(void) return NULL; struct tm *t = gmtime(&tmp); + if (t == NULL) + return NULL; char buf[1024]; if (0 == strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", t)) diff --git a/tests/blogc/check_funcvars.c b/tests/blogc/check_funcvars.c index 153a870..9d094d5 100644 --- a/tests/blogc/check_funcvars.c +++ b/tests/blogc/check_funcvars.c @@ -25,9 +25,6 @@ __wrap_bc_file_get_contents(const char *path, bool utf8, size_t *len, bc_error_t assert_false(utf8); char *rv = mock_type(char*); *len = strlen(rv); - bc_error_t *e = mock_type(bc_error_t*); - if (e != NULL) - *err = e; return rv; } @@ -58,7 +55,6 @@ test_funcvars_eval_mocked(void **state) // as of when this test was written. the other functions should be tested // separately will_return(__wrap_bc_file_get_contents, bc_strdup("asd/docker/asd")); - will_return(__wrap_bc_file_get_contents, NULL); blogc_funcvars_eval(t, "BLOGC_SYSINFO_INSIDE_DOCKER"); assert_string_equal(bc_trie_lookup(t, "BLOGC_SYSINFO_INSIDE_DOCKER"), "1"); assert_int_equal(bc_trie_size(t), 1); diff --git a/tests/blogc/check_sysinfo.c b/tests/blogc/check_sysinfo.c new file mode 100644 index 0000000..af19fb1 --- /dev/null +++ b/tests/blogc/check_sysinfo.c @@ -0,0 +1,187 @@ +/* + * blogc: A blog compiler. + * Copyright (C) 2014-2019 Rafael G. Martins <rafael@rafaelmartins.eng.br> + * + * This program can be distributed under the terms of the BSD License. + * See the file LICENSE. + */ + +#include <stdarg.h> +#include <stddef.h> +#include <setjmp.h> +#include <cmocka.h> +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include "../../src/common/error.h" +#include "../../src/common/utils.h" +#include "../../src/blogc/sysinfo.h" + +#ifdef HAVE_SYSINFO_HOSTNAME +#include <unistd.h> +#include <sys/types.h> +#include <pwd.h> +#endif + +#ifdef HAVE_SYSINFO_DATETIME +#include <time.h> +#endif + +int +__wrap_gethostname(char *name, size_t len) +{ + assert_int_equal(len, 1024); + const char *f = mock_type(const char*); + if (f != NULL) + strcpy(name, f); + return mock_type(int); +} + + +#ifdef HAVE_SYSINFO_HOSTNAME +uid_t +__wrap_geteuid(void) +{ + return 1234; +} + + +static struct passwd pw; + +struct passwd* +__wrap_getpwuid(uid_t uid) +{ + assert_int_equal(uid, 1234); + char *n = mock_type(char*); + if (n == NULL) + return NULL; + pw.pw_name = n; + return &pw; +} +#endif + + +#ifdef HAVE_SYSINFO_DATETIME +time_t +__wrap_time(time_t *tloc) +{ + *tloc = mock_type(time_t); + return *tloc; +} + + +static struct tm tm = { + .tm_sec = 1, + .tm_min = 2, + .tm_hour = 3, + .tm_mday = 4, + .tm_mon = 5, + .tm_year = 6, + .tm_wday = 6, + .tm_yday = 7, + .tm_isdst = 0, +}; + +struct tm* +__wrap_gmtime(const time_t *timep) +{ + if (*timep == 2) + return NULL; + return &tm; +} +#endif + + +char* +__wrap_bc_file_get_contents(const char *path, bool utf8, size_t *len, bc_error_t **err) +{ + assert_string_equal(path, "/proc/1/cgroup"); + assert_false(utf8); + char *rv = mock_type(char*); + *len = strlen(rv); + return rv; +} + + +static void +test_sysinfo_get_hostname(void **state) +{ + will_return(__wrap_gethostname, NULL); + will_return(__wrap_gethostname, -1); + char *f = blogc_sysinfo_get_hostname(); + assert_null(f); + + will_return(__wrap_gethostname, "bola"); + will_return(__wrap_gethostname, 0); + f = blogc_sysinfo_get_hostname(); + assert_non_null(f); + assert_string_equal(f, "bola"); + free(f); +} + + +static void +test_sysinfo_get_username(void **state) +{ + will_return(__wrap_getpwuid, NULL); + char *f = blogc_sysinfo_get_username(); + assert_null(f); + + will_return(__wrap_getpwuid, "bola"); + f = blogc_sysinfo_get_username(); + assert_non_null(f); + assert_string_equal(f, "bola"); + free(f); +} + + +static void +test_sysinfo_get_datetime(void **state) +{ + will_return(__wrap_time, -1); + char *f = blogc_sysinfo_get_datetime(); + assert_null(f); + + will_return(__wrap_time, 2); + f = blogc_sysinfo_get_datetime(); + assert_null(f); + + will_return(__wrap_time, 1); + f = blogc_sysinfo_get_datetime(); + assert_non_null(f); + assert_string_equal(f, "1906-06-04 03:02:01"); + free(f); +} + + +static void +test_sysinfo_get_inside_docker(void **state) +{ + // the "positive" case was already tested in check_funcvars. this is done + // this way because this function caches the results in a global variable. + will_return(__wrap_bc_file_get_contents, bc_strdup("bola")); + assert_false(blogc_sysinfo_get_inside_docker()); +} + + +int +main(void) +{ + const UnitTest tests[] = { + +#ifdef HAVE_SYSINFO_HOSTNAME + unit_test(test_sysinfo_get_hostname), +#endif + +#ifdef HAVE_SYSINFO_USERNAME + unit_test(test_sysinfo_get_username), +#endif + +#ifdef HAVE_SYSINFO_DATETIME + unit_test(test_sysinfo_get_datetime), +#endif + + unit_test(test_sysinfo_get_inside_docker), + }; + return run_tests(tests); +} diff --git a/tests/blogc/check_sysinfo2.c b/tests/blogc/check_sysinfo2.c new file mode 100644 index 0000000..2bb4273 --- /dev/null +++ b/tests/blogc/check_sysinfo2.c @@ -0,0 +1,49 @@ +/* + * blogc: A blog compiler. + * Copyright (C) 2014-2019 Rafael G. Martins <rafael@rafaelmartins.eng.br> + * + * This program can be distributed under the terms of the BSD License. + * See the file LICENSE. + */ + +#include <stdarg.h> +#include <stddef.h> +#include <setjmp.h> +#include <cmocka.h> +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include "../../src/common/error.h" +#include "../../src/common/utils.h" +#include "../../src/blogc/sysinfo.h" + +// this test exists because we can't test more than one return values for +// blogc_sysinfo_get_inside_docker() in the same binary, because the results +// are cached globally for performance. + + +char* +__wrap_bc_file_get_contents(const char *path, bool utf8, size_t *len, bc_error_t **err) +{ + assert_string_equal(path, "/proc/1/cgroup"); + assert_false(utf8); + *err = bc_error_new(0, ""); + return NULL; +} + + +static void +test_sysinfo_get_inside_docker(void **state) +{ + assert_false(blogc_sysinfo_get_inside_docker()); +} + + +int +main(void) +{ + const UnitTest tests[] = { + unit_test(test_sysinfo_get_inside_docker), + }; + return run_tests(tests); +} |