Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ticket28668 040 #651

Merged
9 commits merged into from Feb 13, 2019
3 changes: 3 additions & 0 deletions changes/bug29161
@@ -0,0 +1,3 @@
o Minor bugfixes (tests):
- Detect and suppress "bug" warnings from the util/time test on Windows.
Fixes bug 29161; bugfix on 0.2.9.3-alpha.
3 changes: 3 additions & 0 deletions changes/ticket28668
@@ -0,0 +1,3 @@
o Minor features (testing):
- Treat all unexpected ERR and BUG messages as test failures.
Closes ticket 28668.
4 changes: 4 additions & 0 deletions changes/ticket29160
@@ -0,0 +1,4 @@
o Minor bugfixes (tests):
- Do not log an error-level message if we fail to find an IPv6
network interface from the unit tests. Fixes bug 29160; bugfix on
0.2.7.3-rc.
4 changes: 4 additions & 0 deletions src/lib/encoding/time_fmt.c
Expand Up @@ -39,6 +39,8 @@
*
* Convert *<b>timep</b> to a struct tm in local time, and store the value in
* *<b>result</b>. Return the result on success, or NULL on failure.
*
* Treat malformatted inputs localtime outputs as a BUG.
*/
struct tm *
tor_localtime_r(const time_t *timep, struct tm *result)
Expand All @@ -56,6 +58,8 @@ tor_localtime_r(const time_t *timep, struct tm *result)
*
* Convert *<b>timep</b> to a struct tm in UTC, and store the value in
* *<b>result</b>. Return the result on success, or NULL on failure.
*
* Treat malformatted inputs or gmtime outputs as a BUG.
*/
struct tm *
tor_gmtime_r(const time_t *timep, struct tm *result)
Expand Down
2 changes: 1 addition & 1 deletion src/test/test_address.c
Expand Up @@ -1015,7 +1015,7 @@ test_address_get_if_addrs6(void *arg)

(void)arg;

rv = get_interface_address6(LOG_ERR, AF_INET6, &tor_addr);
rv = get_interface_address6(LOG_WARN, AF_INET6, &tor_addr);

/* Work even on systems without IPv6 interfaces */
if (rv == 0) {
Expand Down
6 changes: 6 additions & 0 deletions src/test/test_pt.c
Expand Up @@ -23,6 +23,8 @@

#include "app/config/or_state_st.h"

#include "test/log_test_helpers.h"

static void
reset_mp(managed_proxy_t *mp)
{
Expand Down Expand Up @@ -414,7 +416,10 @@ test_pt_configure_proxy(void *arg)
"650 TRANSPORT_LAUNCHED server mock5 127.0.0.1 5555\r\n");

/* Get the log message out. */
setup_full_capture_of_logs(LOG_ERR);
process_notify_event_stdout(mp->process);
expect_single_log_msg_containing("Oh noes, something bad happened");
teardown_capture_of_logs();

tt_int_op(controlevent_n, OP_EQ, 10);
tt_int_op(controlevent_event, OP_EQ, EVENT_PT_LOG);
Expand Down Expand Up @@ -475,6 +480,7 @@ test_pt_configure_proxy(void *arg)
}

done:
teardown_capture_of_logs();
or_state_free(dummy_state);
UNMOCK(process_read_stdout);
UNMOCK(get_or_state);
Expand Down
24 changes: 24 additions & 0 deletions src/test/test_util.c
Expand Up @@ -712,6 +712,12 @@ test_util_time(void *arg)
expect_single_log_msg_containing(msg); \
teardown_capture_of_logs(); \
} while (0)
#define CHECK_POSSIBLE_EINVAL() do { \
if (mock_saved_log_n_entries()) { \
expect_single_log_msg_containing("Invalid argument"); \
} \
teardown_capture_of_logs(); \
} while (0)

#define CHECK_TIMEGM_ARG_OUT_OF_RANGE(msg) \
CHECK_TIMEGM_WARNING("Out-of-range argument to tor_timegm")
Expand Down Expand Up @@ -907,12 +913,16 @@ test_util_time(void *arg)

if (sizeof(time_t) == 4 || sizeof(time_t) == 8) {
t_res = -1*(1 << 30);
CAPTURE();
tor_gmtime_r(&t_res, &b_time);
CHECK_POSSIBLE_EINVAL();
tt_assert(b_time.tm_year == (1970-1900) ||
b_time.tm_year == (1935-1900));

t_res = INT32_MIN;
CAPTURE();
tor_gmtime_r(&t_res, &b_time);
CHECK_POSSIBLE_EINVAL();
tt_assert(b_time.tm_year == (1970-1900) ||
b_time.tm_year == (1901-1900));
}
Expand All @@ -922,7 +932,9 @@ test_util_time(void *arg)
/* one of the smallest tm_year values my 64 bit system supports:
* b_time.tm_year == (-292275055LL-1900LL) without clamping */
t_res = -9223372036854775LL;
CAPTURE();
tor_gmtime_r(&t_res, &b_time);
CHECK_POSSIBLE_EINVAL();
tt_assert(b_time.tm_year == (1970-1900) ||
b_time.tm_year == (1-1900));

Expand All @@ -948,7 +960,9 @@ test_util_time(void *arg)
{
/* As above, but with localtime. */
t_res = -9223372036854775LL;
CAPTURE();
tor_localtime_r(&t_res, &b_time);
CHECK_POSSIBLE_EINVAL();
tt_assert(b_time.tm_year == (1970-1900) ||
b_time.tm_year == (1-1900));

Expand Down Expand Up @@ -1005,7 +1019,9 @@ test_util_time(void *arg)
/* one of the largest tm_year values my 64 bit system supports:
* b_time.tm_year == (292278994L-1900L) without clamping */
t_res = 9223372036854775LL;
CAPTURE();
tor_gmtime_r(&t_res, &b_time);
CHECK_POSSIBLE_EINVAL();
tt_assert(b_time.tm_year == (2037-1900) ||
b_time.tm_year == (9999-1900));

Expand All @@ -1026,7 +1042,9 @@ test_util_time(void *arg)
{
/* As above but with localtime. */
t_res = 9223372036854775LL;
CAPTURE();
tor_localtime_r(&t_res, &b_time);
CHECK_POSSIBLE_EINVAL();
tt_assert(b_time.tm_year == (2037-1900) ||
b_time.tm_year == (9999-1900));

Expand Down Expand Up @@ -1069,7 +1087,10 @@ test_util_time(void *arg)

/* This value is out of range with 32 bit time_t, but in range for 64 bit
* time_t */
CAPTURE();
format_rfc1123_time(timestr, (time_t)2150000000UL);
CHECK_POSSIBLE_EINVAL();

#if SIZEOF_TIME_T == 4
#if 0
/* Wrapping around will have made it this. */
Expand Down Expand Up @@ -1238,7 +1259,9 @@ test_util_time(void *arg)
/* This value is out of range with 32 bit time_t, but in range for 64 bit
* time_t */
tv.tv_sec = (time_t)2150000000UL;
CAPTURE();
format_iso_time(timestr, (time_t)tv.tv_sec);
CHECK_POSSIBLE_EINVAL();
#if SIZEOF_TIME_T == 4
/* format_iso_time should indicate failure on overflow, but it doesn't yet.
* Hopefully #18480 will improve the failure semantics in this case.
Expand All @@ -1253,6 +1276,7 @@ test_util_time(void *arg)

#undef CAPTURE
#undef CHECK_TIMEGM_ARG_OUT_OF_RANGE
#undef CHECK_POSSIBLE_EINVAL

done:
teardown_capture_of_logs();
Expand Down
18 changes: 18 additions & 0 deletions src/test/testing_common.c
Expand Up @@ -241,6 +241,15 @@ tinytest_postfork(void)
init_pregenerated_keys();
}

static void
log_callback_failure(int severity, uint32_t domain, const char *msg)
{
(void)msg;
if (severity == LOG_ERR || (domain & LD_BUG)) {
tinytest_set_test_failed_();
}
}

/** Main entry point for unit test code: parse the command line, and run
* some unit tests. */
int
Expand Down Expand Up @@ -280,13 +289,22 @@ main(int c, const char **v)
c = i_out;

{
/* setup logs to stdout */
log_severity_list_t s;
memset(&s, 0, sizeof(s));
set_log_severity_config(loglevel, LOG_ERR, &s);
/* ALWAYS log bug warnings. */
s.masks[LOG_WARN-LOG_ERR] |= LD_BUG;
add_stream_log(&s, "", fileno(stdout));
}
{
/* Setup logs that cause failure. */
log_severity_list_t s;
memset(&s, 0, sizeof(s));
set_log_severity_config(LOG_ERR, LOG_ERR, &s);
s.masks[LOG_WARN-LOG_ERR] |= LD_BUG;
add_callback_log(&s, log_callback_failure);
}
flush_log_messages_from_startup();
init_protocol_warning_severity_level();

Expand Down