aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--Makefile.am60
-rw-r--r--configure.ac5
-rw-r--r--src/blogc/sysinfo.c2
-rw-r--r--tests/blogc/check_funcvars.c4
-rw-r--r--tests/blogc/check_sysinfo.c187
-rw-r--r--tests/blogc/check_sysinfo2.c49
7 files changed, 304 insertions, 5 deletions
diff --git a/.gitignore b/.gitignore
index 104d634..1b816ef 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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);
+}