- if [ "${TRAVIS_OS_NAME}" == "osx" ]; then brew install gd sqlite check ; fi
script:
- - ./configure ${CPARAMS} && make check || ( cat test.log ; exit 1 ) && egrep '^[0-9]+%' test.log && ./vnstat --version
+ - ./configure ${CPARAMS} && make check || ( cat test.log ; exit 1 ) && egrep '^[0-9]+%' test.log && CK_FORK=no ./check_vnstat || ( cat test.log ; exit 1 ) && ./vnstat --version
notifications:
email:
fflush(stdout);
len = (int)read(pipe, buffer, 512);
+ close(STDOUT_FILENO);
+ close(pipe);
+
ck_assert_int_gt(len, 1);
ck_assert_ptr_ne(strstr(buffer, "that_func() in 0"), NULL);
}
fflush(stdout);
len = (int)read(pipe, buffer, 512);
+ close(STDOUT_FILENO);
+ close(pipe);
+
ck_assert_int_eq(len, 1);
}
END_TEST
}
END_TEST
-void add_common_tests(Suite *s)
+void add_common_tests(Suite *s, const int can_fork)
{
TCase *tc_common = tcase_create("Common");
+ tcase_add_checked_fixture(tc_common, setup, teardown);
+ tcase_add_unchecked_fixture(tc_common, setup, teardown);
tcase_add_test(tc_common, printe_options);
tcase_add_test(tc_common, logprint_options);
tcase_add_loop_test(tc_common, dmonth_return_within_range, 0, 12);
tcase_add_test(tc_common, timeused_debug_outputs_something_expected_when_debug_is_enabled);
tcase_add_test(tc_common, timeused_debug_does_not_output_anything_when_debug_is_disabled);
tcase_add_test(tc_common, timeused_tracks_used_time);
- tcase_add_exit_test(tc_common, can_panic, 1);
+ if (can_fork) {
+ tcase_add_exit_test(tc_common, can_panic, 1);
+ }
suite_add_tcase(s, tc_common);
}
#ifndef COMMON_TESTS_H
#define COMMON_TESTS_H
-void add_common_tests(Suite *s);
+void add_common_tests(Suite *s, const int can_fork);
#endif
{
uint32_t limit;
cfg.maxbw = 0;
+ ibwflush();
ck_assert_int_eq(ibwget("does_not_exist", &limit), 0);
}
END_TEST
int ret;
uint32_t limit;
cfg.maxbw = 10;
+ ibwflush();
ret = ibwget("does_not_exist", &limit);
ck_assert_int_eq(ret, 1);
ck_assert_int_eq(limit, 10);
void add_config_tests(Suite *s)
{
TCase *tc_config = tcase_create("Config");
+ tcase_add_checked_fixture(tc_config, setup, teardown);
+ tcase_add_unchecked_fixture(tc_config, setup, teardown);
tcase_add_test(tc_config, validatecfg_default);
tcase_add_test(tc_config, validatecfg_does_not_modify_valid_changes);
tcase_add_test(tc_config, validatecfg_restores_invalid_values_back_to_default);
}
END_TEST
+
+START_TEST(initdstate_does_not_crash)
+{
+ DSTATE s;
+ defaultcfg();
+ initdstate(&s);
+}
+END_TEST
+
START_TEST(addinterfaces_does_nothing_with_no_files)
{
DSTATE s;
}
END_TEST
-START_TEST(initdstate_does_not_crash)
-{
- DSTATE s;
- defaultcfg();
- initdstate(&s);
-}
-END_TEST
-
START_TEST(preparedatabases_exits_with_no_database_dir)
{
DSTATE s;
}
END_TEST
-void add_daemon_tests(Suite *s)
+void add_daemon_tests(Suite *s, const int can_fork)
{
TCase *tc_daemon = tcase_create("Daemon");
+ tcase_add_checked_fixture(tc_daemon, setup, teardown);
+ tcase_add_unchecked_fixture(tc_daemon, setup, teardown);
tcase_add_test(tc_daemon, debugtimestamp_does_not_exit);
tcase_add_test(tc_daemon, initdstate_does_not_crash);
tcase_add_test(tc_daemon, addinterfaces_does_nothing_with_no_files);
tcase_add_test(tc_daemon, addinterfaces_adds_interfaces);
tcase_add_test(tc_daemon, addinterfaces_adds_only_new_interfaces);
tcase_add_test(tc_daemon, addinterfaces_adds_to_cache_when_running);
- tcase_add_exit_test(tc_daemon, preparedatabases_exits_with_no_database_dir, 1);
- tcase_add_exit_test(tc_daemon, preparedatabases_exits_with_no_databases, 1);
- tcase_add_exit_test(tc_daemon, preparedatabases_exits_with_no_databases_and_noadd, 1);
+ if (can_fork) {
+ tcase_add_exit_test(tc_daemon, preparedatabases_exits_with_no_database_dir, 1);
+ tcase_add_exit_test(tc_daemon, preparedatabases_exits_with_no_databases, 1);
+ tcase_add_exit_test(tc_daemon, preparedatabases_exits_with_no_databases_and_noadd, 1);
+ }
tcase_add_test(tc_daemon, preparedatabases_with_no_databases_creates_databases);
tcase_add_test(tc_daemon, setsignaltraps_does_not_exit);
- tcase_add_exit_test(tc_daemon, filldatabaselist_exits_with_no_database_dir, 1);
+ if (can_fork) {
+ tcase_add_exit_test(tc_daemon, filldatabaselist_exits_with_no_database_dir, 1);
+ }
tcase_add_test(tc_daemon, filldatabaselist_does_not_exit_with_empty_database_dir);
tcase_add_test(tc_daemon, filldatabaselist_adds_databases);
tcase_add_test(tc_daemon, adjustsaveinterval_with_empty_cache);
tcase_add_test(tc_daemon, detectboot_sets_btime_if_missing_from_database);
tcase_add_test(tc_daemon, detectboot_sets_btime_for_new_database);
tcase_add_test(tc_daemon, detectboot_can_detect_boot);
- tcase_add_exit_test(tc_daemon, handledatabaseerror_exits_on_fatal_error, 1);
+ if (can_fork) {
+ tcase_add_exit_test(tc_daemon, handledatabaseerror_exits_on_fatal_error, 1);
+ }
tcase_add_test(tc_daemon, handledatabaseerror_does_not_exit_if_limit_is_not_reached);
- tcase_add_exit_test(tc_daemon, handledatabaseerror_exits_if_limit_is_reached, 1);
+ if (can_fork) {
+ tcase_add_exit_test(tc_daemon, handledatabaseerror_exits_if_limit_is_reached, 1);
+ }
tcase_add_test(tc_daemon, cleanremovedinterfaces_allows_interfaces_to_be_removed);
tcase_add_test(tc_daemon, processifinfo_syncs_when_needed);
tcase_add_test(tc_daemon, processifinfo_skips_update_if_timestamps_make_no_sense);
- tcase_add_exit_test(tc_daemon, processifinfo_exits_if_timestamps_really_make_no_sense, 1);
+ if (can_fork) {
+ tcase_add_exit_test(tc_daemon, processifinfo_exits_if_timestamps_really_make_no_sense, 1);
+ }
tcase_add_test(tc_daemon, processifinfo_syncs_if_timestamps_match);
tcase_add_test(tc_daemon, processifinfo_adds_traffic);
tcase_add_test(tc_daemon, processifinfo_does_not_add_traffic_when_over_limit);
#ifndef DAEMON_TESTS_H
#define DAEMON_TESTS_H
-void add_daemon_tests(Suite *s);
+void add_daemon_tests(Suite *s, const int can_fork);
#endif
fflush(stdout);
len = (int)read(pipe, buffer, 512);
+ close(STDOUT_FILENO);
+ close(pipe);
ck_assert_str_eq(buffer, " rrrrrrrrrr");
}
END_TEST
fflush(stdout);
len = (int)read(pipe, buffer, 512);
+ close(STDOUT_FILENO);
+ close(pipe);
ck_assert_str_eq(buffer, " tttttttttt");
}
END_TEST
fflush(stdout);
len = (int)read(pipe, buffer, 512);
+ close(STDOUT_FILENO);
+ close(pipe);
ck_assert_str_eq(buffer, " rrrrrttttt");
}
END_TEST
fflush(stdout);
len = (int)read(pipe, buffer, 512);
+ close(STDOUT_FILENO);
+ close(pipe);
ck_assert_str_eq(buffer, " rttttttttt");
}
END_TEST
fflush(stdout);
len = (int)read(pipe, buffer, 512);
+ close(STDOUT_FILENO);
+ close(pipe);
ck_assert_str_eq(buffer, " tttttttttt");
}
END_TEST
fflush(stdout);
len = (int)read(pipe, buffer, 512);
+ close(STDOUT_FILENO);
+ close(pipe);
ck_assert_str_eq(buffer, " rrrttt");
}
END_TEST
void add_database_tests(Suite *s)
{
TCase *tc_db = tcase_create("Database");
+ tcase_add_checked_fixture(tc_db, setup, teardown);
+ tcase_add_unchecked_fixture(tc_db, setup, teardown);
tcase_add_test(tc_db, initdb_activates_database);
tcase_add_test(tc_db, readdb_with_empty_file);
tcase_add_test(tc_db, readdb_with_empty_file_and_backup);
void add_datacache_tests(Suite *s)
{
TCase *tc_datacache = tcase_create("Datacache");
+ tcase_add_checked_fixture(tc_datacache, setup, teardown);
+ tcase_add_unchecked_fixture(tc_datacache, setup, teardown);
tcase_add_test(tc_datacache, datacache_can_clear_empty_cache);
tcase_add_test(tc_datacache, datacache_can_add_to_cache);
tcase_add_test(tc_datacache, datacache_can_add_to_cache_consistently);
int ret;
defaultcfg();
suppress_output();
- debug = 1;
ret = db_open_rw(1);
ck_assert_int_eq(ret, 1);
void add_dbsql_tests(Suite *s)
{
TCase *tc_dbsql = tcase_create("DB SQL");
+ tcase_add_checked_fixture(tc_dbsql, setup, teardown);
+ tcase_add_unchecked_fixture(tc_dbsql, setup, teardown);
tcase_add_test(tc_dbsql, db_close_does_no_harm_when_db_is_already_closed);
tcase_add_test(tc_dbsql, db_open_rw_can_create_database_if_file_does_not_exist);
tcase_add_test(tc_dbsql, db_open_ro_cannot_create_a_database);
void add_fs_tests(Suite *s)
{
TCase *tc_fs = tcase_create("FS");
+ tcase_add_checked_fixture(tc_fs, setup, teardown);
+ tcase_add_unchecked_fixture(tc_fs, setup, teardown);
tcase_add_test(tc_fs, fileexists_with_no_file);
tcase_add_test(tc_fs, fileexists_with_file);
tcase_add_test(tc_fs, direxists_with_no_dir);
}
END_TEST
-void add_id_tests(Suite *s)
+void add_id_tests(Suite *s, const int can_fork)
{
TCase *tc_id = tcase_create("ID");
+ tcase_add_checked_fixture(tc_id, setup, teardown);
+ tcase_add_unchecked_fixture(tc_id, setup, teardown);
tcase_add_test(tc_id, getuser_root_string);
tcase_add_test(tc_id, getuser_root_numeric);
- tcase_add_exit_test(tc_id, getuser_no_such_user_string, 1);
- tcase_add_exit_test(tc_id, getuser_no_such_user_numeric, 1);
+ if (can_fork) {
+ tcase_add_exit_test(tc_id, getuser_no_such_user_string, 1);
+ tcase_add_exit_test(tc_id, getuser_no_such_user_numeric, 1);
+ }
tcase_add_test(tc_id, getgroup_root_string);
tcase_add_test(tc_id, getgroup_root_numeric);
- tcase_add_exit_test(tc_id, getgroup_no_such_user_string, 1);
- tcase_add_exit_test(tc_id, getgroup_no_such_user_numeric, 1);
+ if (can_fork) {
+ tcase_add_exit_test(tc_id, getgroup_no_such_user_string, 1);
+ tcase_add_exit_test(tc_id, getgroup_no_such_user_numeric, 1);
+ }
tcase_add_test(tc_id, setuser_with_empty_user);
tcase_add_test(tc_id, setuser_with_current_user);
tcase_add_test(tc_id, setgroup_with_empty_group);
#ifndef ID_TESTS_H
#define ID_TESTS_H
-void add_id_tests(Suite *s);
+void add_id_tests(Suite *s, const int can_fork);
#endif
{
linuxonly;
+ noexit = 0;
ck_assert_int_eq(remove_directory(TESTDIR), 1);
fake_proc_net_dev("w", "ethwrong", 10, 20, 30, 40);
fake_proc_net_dev("a", "ethunusual", 1, 2, 3, 4);
{
linuxonly;
+ noexit = 0;
ck_assert_int_eq(remove_directory(TESTDIR), 1);
fake_sys_class_net("ethwrong", 10, 20, 30, 40, 50);
fake_sys_class_net("ethunusual", 1, 2, 3, 4, 5);
{
linuxonly;
- suppress_output();
ck_assert_int_eq(remove_directory(TESTDIR), 1);
fake_proc_net_dev("w", "ethwrong", 10, 20, 30, 40);
+ suppress_output();
+
ck_assert_int_eq(getifinfo("ethunusual"), 0);
}
END_TEST
{
linuxonly;
- suppress_output();
-
+ noexit = 0;
ck_assert_int_eq(remove_directory(TESTDIR), 1);
fake_proc_net_dev("w", "ethwrong", 10, 20, 30, 40);
fake_proc_net_dev("a", "ethunusual", 1, 2, 3, 4);
+ suppress_output();
+
ck_assert_int_eq(getifinfo("ethunusual"), 1);
ck_assert_str_eq(ifinfo.name, "ethunusual");
ck_assert_int_eq(ifinfo.filled, 1);
{
linuxonly;
- suppress_output();
-
ck_assert_int_eq(remove_directory(TESTDIR), 1);
fake_proc_net_dev("w", "eth0", 10, 20, 30, 40);
fake_proc_net_dev("a", "eth1", 1, 2, 3, 4);
+ suppress_output();
+
ck_assert_int_eq(isifavailable("eth0"), 1);
ck_assert_int_eq(isifavailable("eth1"), 1);
ck_assert_int_eq(isifavailable("eth2"), 0);
void add_ifinfo_tests(Suite *s)
{
TCase *tc_ifinfo = tcase_create("Ifinfo");
+ tcase_add_checked_fixture(tc_ifinfo, setup, teardown);
+ tcase_add_unchecked_fixture(tc_ifinfo, setup, teardown);
tcase_add_test(tc_ifinfo, getifliststring_no_source);
tcase_add_test(tc_ifinfo, getifliststring_proc_one_interface);
tcase_add_test(tc_ifinfo, getifliststring_proc_one_interface_with_speed);
void add_iflist_tests(Suite *s)
{
TCase *tc_iflist = tcase_create("Iflist");
+ tcase_add_checked_fixture(tc_iflist, setup, teardown);
+ tcase_add_unchecked_fixture(tc_iflist, setup, teardown);
tcase_add_test(tc_iflist, iflistfree_can_free_null);
tcase_add_test(tc_iflist, iflistadd_can_add);
tcase_add_test(tc_iflist, iflistsearch_can_search);
START_TEST(getimagescale_zero)
{
+ cfg.rateunit = 0;
ck_assert_str_eq(getimagescale(0, 0), "--");
ck_assert_str_eq(getimagescale(0, 1), "--");
}
START_TEST(getimagescale_normal)
{
+ cfg.rateunit = 0;
ck_assert_str_eq(getimagescale(1, 0), "B");
ck_assert_str_eq(getimagescale(2, 0), "B");
ck_assert_str_eq(getimagescale(10, 0), "B");
START_TEST(getimagescale_rate)
{
+ cfg.rateunit = 0;
ck_assert_str_eq(getimagescale(1, 1), "B/s");
ck_assert_str_eq(getimagescale(2, 1), "B/s");
ck_assert_str_eq(getimagescale(10, 1), "B/s");
void add_image_tests(Suite *s)
{
TCase *tc_image = tcase_create("Image");
+ tcase_add_checked_fixture(tc_image, setup, teardown);
+ tcase_add_unchecked_fixture(tc_image, setup, teardown);
tcase_set_timeout(tc_image, 10);
tcase_add_test(tc_image, initimagecontent_does_not_crash);
tcase_add_test(tc_image, colorinit_does_not_crash);
void add_misc_tests(Suite *s)
{
TCase *tc_misc = tcase_create("Misc");
+ tcase_add_checked_fixture(tc_misc, setup, teardown);
+ tcase_add_unchecked_fixture(tc_misc, setup, teardown);
tcase_add_test(tc_misc, getbtime_does_not_return_zero);
tcase_add_loop_test(tc_misc, getunitprefix_returns_something_with_all_cfg_combinations, 0, 2);
tcase_add_loop_test(tc_misc, getrateunitprefix_returns_something_with_all_cfg_combinations, 0, 3);
#include "image_tests.h"
#endif
+int output_suppressed = 0;
+
int main(void)
{
int number_failed = 0;
debug = 0;
- Suite *s = test_suite();
+ Suite *s = test_suite(get_fork_status());
SRunner *sr = srunner_create(s);
srunner_set_log(sr, "test.log");
srunner_set_xml(sr, "test.xml");
return number_failed;
}
-Suite *test_suite(void)
+Suite *test_suite(const int can_fork)
{
Suite *s = suite_create("vnStat");
- add_common_tests(s);
+ add_common_tests(s, can_fork);
add_dbsql_tests(s);
add_database_tests(s);
add_config_tests(s);
add_ifinfo_tests(s);
add_misc_tests(s);
- add_daemon_tests(s);
+ add_daemon_tests(s, can_fork);
add_datacache_tests(s);
add_fs_tests(s);
- add_id_tests(s);
+ add_id_tests(s, can_fork);
add_iflist_tests(s);
#if defined(HAVE_IMAGE)
add_image_tests(s);
return s;
}
+/* exit tests can't be executed if check doesn't have forking enabled */
+/* and only SRunner knows that so a dummy runner needs to be created */
+int get_fork_status(void)
+{
+ int can_fork = 0;
+ Suite *s = suite_create("fork status check");
+ SRunner *sr = srunner_create(s);
+ if (srunner_fork_status(sr) != CK_NOFORK) {
+ can_fork = 1;
+ }
+ srunner_free(sr);
+ return can_fork;
+}
+
+void setup(void) {
+ debug = 0;
+}
+
+void teardown(void) {
+ restore_output();
+}
+
void suppress_output(void)
{
- fclose(stdout);
+ if (!output_suppressed) {
+ fclose(stdout);
+ output_suppressed = 1;
+ }
+}
+
+void restore_output(void)
+{
+ if (output_suppressed) {
+ freopen("/dev/tty", "w", stdout);
+ output_suppressed = 0;
+ }
}
int pipe_output(void)
ck_abort_msg("error \"%s\" while creating pipe", strerror(errno));
}
- dup2(out_pipe[1], STDOUT_FILENO);
- close(out_pipe[1]);
+ if (out_pipe[1] != STDOUT_FILENO) {
+ dup2(out_pipe[1], STDOUT_FILENO);
+ close(out_pipe[1]);
+ }
+ output_suppressed = 1;
return out_pipe[0];
}
#include <check.h>
-Suite *test_suite(void);
+extern int output_suppressed;
+
+Suite *test_suite(const int can_fork);
+int get_fork_status(void);
+void setup(void);
+void teardown(void);
void suppress_output(void);
+void restore_output(void);
int pipe_output(void);
void disable_logprints(void);
int clean_testdbdir(void);