Document and clean log_test_helpers.c a bit

In addition to documentation, this commit makes a function static,
and removes a weird single-point-of-return-ism, and notes a thing I
should fix.
This commit is contained in:
Nick Mathewson 2016-08-31 13:03:59 -04:00
parent d5614b2102
commit 2df6cdc9f9
2 changed files with 60 additions and 11 deletions

View File

@ -4,10 +4,32 @@
#include "torlog.h" #include "torlog.h"
#include "log_test_helpers.h" #include "log_test_helpers.h"
/**
* \file log_test_helpers.c
* \brief Code to check for expected log messages during testing.
*/
static void mock_saving_logv(int severity, log_domain_mask_t domain,
const char *funcname, const char *suffix,
const char *format, va_list ap)
CHECK_PRINTF(5, 0);
/**
* Smartlist of all the logs we've received since we last set up
* log capture.
*/
static smartlist_t *saved_logs = NULL; static smartlist_t *saved_logs = NULL;
/** Boolean: should we also send messages to the test-runner? */
static int echo_to_real_logs = 1; static int echo_to_real_logs = 1;
/**
* As setup_capture_of_logs, but do not relay log messages into the main
* logging system.
*
* Avoid using this function; use setup_capture_of_logs() instead if you
* can. If you must use this function, then make sure you detect any
* unexpected log messages, and treat them as test failures. */
int int
setup_full_capture_of_logs(int new_level) setup_full_capture_of_logs(int new_level)
{ {
@ -16,10 +38,19 @@ setup_full_capture_of_logs(int new_level)
return result; return result;
} }
/**
* Temporarily capture all the messages logged at severity <b>new_level</b> or
* higher. Return the previous log level; you'll need to pass it into
* teardown_capture_of_logs().
*
* This function does not prevent messages from being sent to the main
* logging system.
*/
int int
setup_capture_of_logs(int new_level) setup_capture_of_logs(int new_level)
{ {
int previous_log = log_global_min_severity_; int previous_log = log_global_min_severity_;
/* XXXX This can suppress, if logging is turned up high. Will fix. -NM*/
log_global_min_severity_ = new_level; log_global_min_severity_ = new_level;
mock_clean_saved_logs(); mock_clean_saved_logs();
saved_logs = smartlist_new(); saved_logs = smartlist_new();
@ -28,6 +59,9 @@ setup_capture_of_logs(int new_level)
return previous_log; return previous_log;
} }
/**
* Undo setup_capture_of_logs().
*/
void void
teardown_capture_of_logs(int prev) teardown_capture_of_logs(int prev)
{ {
@ -36,6 +70,9 @@ teardown_capture_of_logs(int prev)
mock_clean_saved_logs(); mock_clean_saved_logs();
} }
/**
* Clear all messages in mock_saved_logs()
*/
void void
mock_clean_saved_logs(void) mock_clean_saved_logs(void)
{ {
@ -47,29 +84,41 @@ mock_clean_saved_logs(void)
saved_logs = NULL; saved_logs = NULL;
} }
/**
* Return a list of all the messages captured since the last
* setup_[full_]capture_of_logs() call. Each log call is recorded as a
* mock_saved_log_entry_t.
*/
const smartlist_t * const smartlist_t *
mock_saved_logs(void) mock_saved_logs(void)
{ {
return saved_logs; return saved_logs;
} }
/**
* Return true iff there is a message recorded by log capture
* that is exactly equal to <b>msg</b>
*/
int int
mock_saved_log_has_message(const char *msg) mock_saved_log_has_message(const char *msg)
{ {
int has_msg = 0;
if (saved_logs) { if (saved_logs) {
SMARTLIST_FOREACH(saved_logs, mock_saved_log_entry_t *, m, SMARTLIST_FOREACH(saved_logs, mock_saved_log_entry_t *, m,
{ {
if (msg && m->generated_msg && if (msg && m->generated_msg &&
!strcmp(msg, m->generated_msg)) { !strcmp(msg, m->generated_msg)) {
has_msg = 1; return 1;
} }
}); });
} }
return has_msg; return 0;
} }
/**
* Return true iff there is a message recorded by log capture
* that contains <b>msg</b> as a substring.
*/
int int
mock_saved_log_has_message_containing(const char *msg) mock_saved_log_has_message_containing(const char *msg)
{ {
@ -87,7 +136,7 @@ mock_saved_log_has_message_containing(const char *msg)
} }
/* Do the saved logs have any messages with severity? */ /** Return true iff the saved logs have any messages with <b>severity</b> */
int int
mock_saved_log_has_severity(int severity) mock_saved_log_has_severity(int severity)
{ {
@ -104,7 +153,7 @@ mock_saved_log_has_severity(int severity)
return has_sev; return has_sev;
} }
/* Do the saved logs have any messages? */ /** Return true iff the the saved logs have at lease one message */
int int
mock_saved_log_has_entry(void) mock_saved_log_has_entry(void)
{ {
@ -114,7 +163,10 @@ mock_saved_log_has_entry(void)
return 0; return 0;
} }
void /* Replacement for logv: record the log message, and (maybe) send it
* into the logging system again.
*/
static void
mock_saving_logv(int severity, log_domain_mask_t domain, mock_saving_logv(int severity, log_domain_mask_t domain,
const char *funcname, const char *suffix, const char *funcname, const char *suffix,
const char *format, va_list ap) const char *format, va_list ap)

View File

@ -6,19 +6,16 @@
#ifndef TOR_LOG_TEST_HELPERS_H #ifndef TOR_LOG_TEST_HELPERS_H
#define TOR_LOG_TEST_HELPERS_H #define TOR_LOG_TEST_HELPERS_H
/** An element of mock_saved_logs(); records the log element that we
* received. */
typedef struct mock_saved_log_entry_t { typedef struct mock_saved_log_entry_t {
int severity; int severity;
const char *funcname; const char *funcname;
const char *suffix; const char *suffix;
const char *format; const char *format;
char *generated_msg; char *generated_msg;
struct mock_saved_log_entry_t *next;
} mock_saved_log_entry_t; } mock_saved_log_entry_t;
void mock_saving_logv(int severity, log_domain_mask_t domain,
const char *funcname, const char *suffix,
const char *format, va_list ap)
CHECK_PRINTF(5, 0);
void mock_clean_saved_logs(void); void mock_clean_saved_logs(void);
const smartlist_t *mock_saved_logs(void); const smartlist_t *mock_saved_logs(void);
int setup_capture_of_logs(int new_level); int setup_capture_of_logs(int new_level);