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); +} | 
