diff options
Diffstat (limited to 'src/test/test.c')
-rw-r--r-- | src/test/test.c | 65 |
1 files changed, 63 insertions, 2 deletions
diff --git a/src/test/test.c b/src/test/test.c index c1d2ecbfb9..5a37f1da8d 100644 --- a/src/test/test.c +++ b/src/test/test.c @@ -70,6 +70,7 @@ int have_failed = 0; /** Temporary directory (set up by setup_directory) under which we store all * our files during testing. */ static char temp_dir[256]; +static pid_t temp_dir_setup_in_pid = 0; /** Select and create the temporary directory we'll use to run our unit tests. * Store it in <b>temp_dir</b>. Exit immediately if we can't create it. @@ -96,6 +97,7 @@ setup_directory(void) exit(1); } is_setup = 1; + temp_dir_setup_in_pid = getpid(); } /** Return a filename relative to our testing temporary directory */ @@ -109,11 +111,16 @@ get_fname(const char *name) } /** Remove all files stored under the temporary directory, and the directory - * itself. */ + * itself. Called by atexit(). */ static void remove_directory(void) { - smartlist_t *elements = tor_listdir(temp_dir); + smartlist_t *elements; + if (getpid() != temp_dir_setup_in_pid) { + /* Only clean out the tempdir when the main process is exiting. */ + return; + } + elements = tor_listdir(temp_dir); if (elements) { SMARTLIST_FOREACH(elements, const char *, cp, { @@ -1149,6 +1156,57 @@ test_geoip(void) tor_free(s); } +/** Run unit tests for stats code. */ +static void +test_stats(void) +{ + time_t now = 1281533250; /* 2010-08-11 13:27:30 UTC */ + char *s = NULL; + + /* We shouldn't collect exit stats without initializing them. */ + rep_hist_note_exit_stream_opened(80); + rep_hist_note_exit_bytes(80, 100, 10000); + s = rep_hist_format_exit_stats(now + 86400); + test_assert(!s); + + /* Initialize stats, note some streams and bytes, and generate history + * string. */ + rep_hist_exit_stats_init(now); + rep_hist_note_exit_stream_opened(80); + rep_hist_note_exit_bytes(80, 100, 10000); + rep_hist_note_exit_stream_opened(443); + rep_hist_note_exit_bytes(443, 100, 10000); + rep_hist_note_exit_bytes(443, 100, 10000); + s = rep_hist_format_exit_stats(now + 86400); + test_streq("exit-stats-end 2010-08-12 13:27:30 (86400 s)\n" + "exit-kibibytes-written 80=1,443=1,other=0\n" + "exit-kibibytes-read 80=10,443=20,other=0\n" + "exit-streams-opened 80=4,443=4,other=0\n", s); + tor_free(s); + + /* Stop collecting stats, add some bytes, and ensure we don't generate + * a history string. */ + rep_hist_exit_stats_term(); + rep_hist_note_exit_bytes(80, 100, 10000); + s = rep_hist_format_exit_stats(now + 86400); + test_assert(!s); + + /* Re-start stats, add some bytes, reset stats, and see what history we + * get when observing no streams or bytes at all. */ + rep_hist_exit_stats_init(now); + rep_hist_note_exit_stream_opened(80); + rep_hist_note_exit_bytes(80, 100, 10000); + rep_hist_reset_exit_stats(now); + s = rep_hist_format_exit_stats(now + 86400); + test_streq("exit-stats-end 2010-08-12 13:27:30 (86400 s)\n" + "exit-kibibytes-written other=0\n" + "exit-kibibytes-read other=0\n" + "exit-streams-opened other=0\n", s); + + done: + tor_free(s); +} + static void * legacy_test_setup(const struct testcase_t *testcase) { @@ -1181,6 +1239,8 @@ const struct testcase_setup_t legacy_setup = { test_ ## group ## _ ## name } #define DISABLED(name) \ { #name, legacy_test_helper, TT_SKIP, &legacy_setup, name } +#define FORK(name) \ + { #name, legacy_test_helper, TT_FORK, &legacy_setup, test_ ## name } static struct testcase_t test_array[] = { ENT(buffers), @@ -1189,6 +1249,7 @@ static struct testcase_t test_array[] = { ENT(policies), ENT(rend_fns), ENT(geoip), + FORK(stats), DISABLED(bench_aes), DISABLED(bench_dmap), |