Skip to content
Snippets Groups Projects
Commit 1d16b712 authored by Nick Mathewson's avatar Nick Mathewson :game_die:
Browse files

Basic unit tests for update_current_time().

This function is about to get more complicated, so we should track
how it's working.
parent b0598f2a
No related branches found
No related tags found
No related merge requests found
......@@ -139,6 +139,7 @@ src_test_test_SOURCES = \
src/test/test_keypin.c \
src/test/test_link_handshake.c \
src/test/test_logging.c \
src/test/test_mainloop.c \
src/test/test_microdesc.c \
src/test/test_nodelist.c \
src/test/test_oom.c \
......
......@@ -859,6 +859,7 @@ struct testgroup_t testgroups[] = {
{ "introduce/", introduce_tests },
{ "keypin/", keypin_tests },
{ "link-handshake/", link_handshake_tests },
{ "mainloop/", mainloop_tests },
{ "nodelist/", nodelist_tests },
{ "oom/", oom_tests },
{ "oos/", oos_tests },
......
......@@ -234,6 +234,7 @@ extern struct testcase_t introduce_tests[];
extern struct testcase_t keypin_tests[];
extern struct testcase_t link_handshake_tests[];
extern struct testcase_t logging_tests[];
extern struct testcase_t mainloop_tests[];
extern struct testcase_t microdesc_tests[];
extern struct testcase_t nodelist_tests[];
extern struct testcase_t oom_tests[];
......
/* Copyright (c) 2018, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
* \file test_mainloop.c
* \brief Tests for functions closely related to the Tor main loop
*/
#include "test.h"
#include "log_test_helpers.h"
#include "or.h"
#include "main.h"
static void
test_mainloop_update_time_normal(void *arg)
{
(void)arg;
/* This time is in the past as of when this test was written. */
time_t now = 1525272090;
reset_uptime();
update_current_time(now);
tt_int_op(approx_time(), OP_EQ, now);
tt_int_op(get_uptime(), OP_EQ, 0);
update_current_time(now); // Same time as before is a no-op.
tt_int_op(get_uptime(), OP_EQ, 0);
now += 1;
update_current_time(now);
tt_int_op(approx_time(), OP_EQ, now);
tt_int_op(get_uptime(), OP_EQ, 1);
now += 2; // two-second jump is unremarkable.
update_current_time(now);
tt_int_op(approx_time(), OP_EQ, now);
tt_int_op(get_uptime(), OP_EQ, 3);
now -= 1; // a one-second hop backwards is also unremarkable.
update_current_time(now);
tt_int_op(approx_time(), OP_EQ, now); // it changes the approx time...
tt_int_op(get_uptime(), OP_EQ, 3); // but it doesn't roll back our uptime
done:
;
}
static void
test_mainloop_update_time_jumps(void *arg)
{
(void)arg;
/* This time is in the past as of when this test was written. */
time_t now = 220897152;
reset_uptime();
update_current_time(now);
tt_int_op(approx_time(), OP_EQ, now);
tt_int_op(get_uptime(), OP_EQ, 0);
/* Put some uptime on the clock.. */
now += 3;
update_current_time(now);
tt_int_op(approx_time(), OP_EQ, now);
tt_int_op(get_uptime(), OP_EQ, 3);
/* Now try jumping forward. */
setup_capture_of_logs(LOG_NOTICE);
now += 3600;
update_current_time(now);
expect_single_log_msg_containing(
"Your system clock just jumped 3600 seconds forward");
tt_int_op(approx_time(), OP_EQ, now);
tt_int_op(get_uptime(), OP_EQ, 3); // no uptime change.
mock_clean_saved_logs();
now -= 600;
update_current_time(now);
expect_single_log_msg_containing(
"Your system clock just jumped 600 seconds backward");
tt_int_op(approx_time(), OP_EQ, now);
tt_int_op(get_uptime(), OP_EQ, 3); // no uptime change.
/* uptime tracking should go normally now if the clock moves sensibly. */
now += 2;
update_current_time(now);
tt_int_op(approx_time(), OP_EQ, now);
tt_int_op(get_uptime(), OP_EQ, 5);
done:
teardown_capture_of_logs();
}
#define MAINLOOP_TEST(name) \
{ #name, test_mainloop_## name , TT_FORK, NULL, NULL }
struct testcase_t mainloop_tests[] = {
MAINLOOP_TEST(update_time_normal),
MAINLOOP_TEST(update_time_jumps),
END_OF_TESTCASES
};
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment