commit b2d487ae2249a307cd23255dbb1a22241eefd6ef Merge: 2d013bbe5 7e7a4874b Author: Nick Mathewson nickm@torproject.org Date: Tue Oct 22 09:39:06 2019 -0400
Merge branch 'ticket31705_v2' into ticket31705_v2_merged
Conflicts: src/feature/dirparse/authcert_parse.c src/feature/dirparse/ns_parse.c src/feature/hs/hs_service.c src/lib/conf/conftesting.h src/lib/log/log.h src/lib/thread/threads.h src/test/test_options.c
These conflicts were mostly related to autostyle improvements, with one or two due to doxygen fixes.
changes/ticket31705 | 9 +++++ scripts/coccinelle/apply.sh | 9 +++++ scripts/coccinelle/test-operator-cleanup | 13 +++++++ scripts/coccinelle/tor-coccinelle.h | 60 ++++++++++++++++++++++++++++++++ scripts/coccinelle/try_parse.sh | 29 +++++++++++++++ src/app/config/config.c | 10 ++++++ src/core/mainloop/mainloop.c | 9 ++++- src/core/mainloop/periodic.h | 2 ++ src/core/or/circuitpadding.c | 2 ++ src/core/or/or_periodic.c | 2 ++ src/feature/control/control_cmd.c | 2 ++ src/feature/control/control_events.c | 2 ++ src/feature/dirauth/dirauth_periodic.c | 2 ++ src/feature/dircommon/consdiff.c | 2 ++ src/feature/hs/hs_service.c | 2 ++ src/feature/relay/relay_periodic.c | 2 ++ src/lib/buf/buffers.c | 2 ++ src/lib/cc/ctassert.h | 2 +- src/lib/conf/confmacros.h | 2 ++ src/lib/conf/conftesting.h | 9 ++--- src/lib/container/namemap_st.h | 2 ++ src/lib/container/smartlist.h | 2 ++ src/lib/crypt_ops/crypto_openssl_mgt.c | 6 ++-- src/lib/dispatch/dispatch_naming.c | 2 ++ src/lib/evloop/timers.c | 4 ++- src/lib/intmath/weakrng.h | 3 ++ src/lib/log/log.c | 2 +- src/lib/log/log.h | 4 ++- src/lib/log/ratelim.h | 2 ++ src/lib/log/util_bug.h | 9 +++-- src/lib/malloc/map_anon.c | 4 +-- src/lib/net/address.c | 2 +- src/lib/string/parse_int.c | 5 ++- src/lib/thread/threads.h | 4 ++- src/lib/tls/tortls_openssl.c | 2 ++ src/lib/version/git_revision.c | 4 +++ src/lib/wallclock/timeval.h | 2 ++ src/test/hs_test_helpers.c | 28 +++++++-------- src/test/test.h | 6 ++++ src/test/test_addr.c | 6 ++++ src/test/test_config.c | 2 ++ src/test/test_confparse.c | 2 ++ src/test/test_connection.c | 2 ++ src/test/test_controller.c | 4 +++ src/test/test_crypto.c | 2 ++ src/test/test_crypto_slow.c | 2 ++ src/test/test_dir.c | 2 ++ src/test/test_entrynodes.c | 2 ++ src/test/test_link_handshake.c | 2 ++ src/test/test_options.c | 2 ++ src/test/test_router.c | 10 +++--- src/test/test_scheduler.c | 52 +++++++++++++-------------- src/test/test_util.c | 4 +++ 53 files changed, 296 insertions(+), 63 deletions(-)
diff --cc src/feature/hs/hs_service.c index 15db5dd1d,600d64cac..964bf68a1 --- a/src/feature/hs/hs_service.c +++ b/src/feature/hs/hs_service.c @@@ -67,7 -67,8 +67,8 @@@ #include <unistd.h> #endif
+ #ifndef COCCI -/* Helper macro. Iterate over every service in the global map. The var is the +/** Helper macro. Iterate over every service in the global map. The var is the * name of the service pointer. */ #define FOR_EACH_SERVICE_BEGIN(var) \ STMT_BEGIN \ diff --cc src/lib/log/util_bug.h index c3141754d,8c233da73..dcff5fd9c --- a/src/lib/log/util_bug.h +++ b/src/lib/log/util_bug.h @@@ -208,10 -211,10 +211,10 @@@ if (bool_result && !var) { \ var = 1; \ tor_bug_occurred_(SHORT_FILE__, __LINE__, __func__, \ - "!("#cond")", 1, NULL); \ + ("!("#cond")"), 1, NULL); \ } \ bool_result; } )) -#else /* !(defined(__GNUC__)) */ +#else /* !defined(__GNUC__) */ #define IF_BUG_ONCE__(cond,var) \ static int var = 0; \ if ((cond) ? \ diff --cc src/test/test_options.c index 82def205a,62d477a63..aeb5de210 --- a/src/test/test_options.c +++ b/src/test/test_options.c @@@ -3882,193 -4163,10 +3882,195 @@@ test_options_validate__accel(void *igno tor_free(msg); }
+static int mocked_granularity; + +static void +mock_set_log_time_granularity(int g) +{ + mocked_granularity = g; +} + +static void +test_options_init_logs_granularity(void *arg) +{ + options_test_data_t *tdata = get_options_test_data(""); + int rv; + (void) arg; + + MOCK(set_log_time_granularity, mock_set_log_time_granularity); + + /* Reasonable value. */ + tdata->opt->LogTimeGranularity = 100; + mocked_granularity = -1; + rv = options_init_logs(NULL, tdata->opt, 0); + tt_int_op(rv, OP_EQ, 0); + tt_int_op(mocked_granularity, OP_EQ, 100); + + /* Doesn't divide 1000. */ + tdata->opt->LogTimeGranularity = 249; + mocked_granularity = -1; + rv = options_init_logs(NULL, tdata->opt, 0); + tt_int_op(rv, OP_EQ, 0); + tt_int_op(mocked_granularity, OP_EQ, 250); + + /* Doesn't divide 1000. */ + tdata->opt->LogTimeGranularity = 3; + mocked_granularity = -1; + rv = options_init_logs(NULL, tdata->opt, 0); + tt_int_op(rv, OP_EQ, 0); + tt_int_op(mocked_granularity, OP_EQ, 4); + + /* Not a multiple of 1000. */ + tdata->opt->LogTimeGranularity = 1500; + mocked_granularity = -1; + rv = options_init_logs(NULL, tdata->opt, 0); + tt_int_op(rv, OP_EQ, 0); + tt_int_op(mocked_granularity, OP_EQ, 2000); + + /* Reasonable value. */ + tdata->opt->LogTimeGranularity = 3000; + mocked_granularity = -1; + rv = options_init_logs(NULL, tdata->opt, 0); + tt_int_op(rv, OP_EQ, 0); + tt_int_op(mocked_granularity, OP_EQ, 3000); + + /* Negative. (Shouldn't be allowed by rest of config parsing.) */ + tdata->opt->LogTimeGranularity = -1; + mocked_granularity = -1; + rv = options_init_logs(NULL, tdata->opt, 0); + tt_int_op(rv, OP_EQ, -1); + + /* Very big */ + tdata->opt->LogTimeGranularity = 3600 * 1000; + mocked_granularity = -1; + rv = options_init_logs(NULL, tdata->opt, 0); + tt_int_op(rv, OP_EQ, 0); + tt_int_op(mocked_granularity, OP_EQ, 3600 * 1000); + + done: + free_options_test_data(tdata); + UNMOCK(set_log_time_granularity); +} + +typedef struct { + char *name; + log_severity_list_t sev; + int fd; + bool stream; +} added_log_t; + +static smartlist_t *added_logs = NULL; + +static void +mock_add_stream_log_impl(const log_severity_list_t *sev, const char *name, + int fd) +{ + added_log_t *a = tor_malloc_zero(sizeof(added_log_t)); + a->name = tor_strdup(name); + memcpy(&a->sev, sev, sizeof(log_severity_list_t)); + a->fd = fd; + a->stream = true; + smartlist_add(added_logs, a); +} + +static int +mock_add_file_log(const log_severity_list_t *sev, const char *name, int fd) +{ + added_log_t *a = tor_malloc_zero(sizeof(added_log_t)); + a->name = tor_strdup(name); + memcpy(&a->sev, sev, sizeof(log_severity_list_t)); + a->fd = fd; + smartlist_add(added_logs, a); + return 0; +} + +static void +clear_added_logs(void) +{ + SMARTLIST_FOREACH(added_logs, added_log_t *, a, + { tor_free(a->name); tor_free(a); }); + smartlist_clear(added_logs); +} + +static void +test_options_init_logs_quiet(void *arg) +{ + (void)arg; + char *cfg = NULL; + options_test_data_t *tdata = get_options_test_data(""); + char *fn1 = tor_strdup(get_fname_rnd("log")); + const added_log_t *a; + int rv; + tdata->opt->RunAsDaemon = 0; + + added_logs = smartlist_new(); + MOCK(add_stream_log_impl, mock_add_stream_log_impl); + MOCK(add_file_log, mock_add_file_log); + + tt_ptr_op(tdata->opt->Logs, OP_EQ, NULL); + + /* First, try with no configured logs, and make sure that our configured + logs match the quiet level. */ + quiet_level = QUIET_SILENT; + rv = options_init_logs(NULL, tdata->opt, 0); + tt_int_op(rv, OP_EQ, 0); + tt_int_op(smartlist_len(added_logs), OP_EQ, 0); + + quiet_level = QUIET_HUSH; + rv = options_init_logs(NULL, tdata->opt, 0); + tt_int_op(rv, OP_EQ, 0); + tt_int_op(smartlist_len(added_logs), OP_EQ, 1); + a = smartlist_get(added_logs, 0); + tt_assert(a); + tt_assert(a->stream); + tt_int_op(a->fd, OP_EQ, fileno(stdout)); + tt_int_op(a->sev.masks[LOG_INFO-LOG_ERR], OP_EQ, 0); + tt_int_op(a->sev.masks[LOG_NOTICE-LOG_ERR], OP_EQ, 0); + tt_int_op(a->sev.masks[LOG_WARN-LOG_ERR], OP_EQ, LD_ALL_DOMAINS); + clear_added_logs(); + + quiet_level = QUIET_NONE; + rv = options_init_logs(NULL, tdata->opt, 0); + tt_int_op(rv, OP_EQ, 0); + tt_int_op(smartlist_len(added_logs), OP_EQ, 1); + a = smartlist_get(added_logs, 0); + tt_assert(a); + tt_assert(a->stream); + tt_int_op(a->fd, OP_EQ, fileno(stdout)); + tt_int_op(a->sev.masks[LOG_INFO-LOG_ERR], OP_EQ, 0); + tt_int_op(a->sev.masks[LOG_NOTICE-LOG_ERR], OP_EQ, LD_ALL_DOMAINS); + tt_int_op(a->sev.masks[LOG_WARN-LOG_ERR], OP_EQ, LD_ALL_DOMAINS); + clear_added_logs(); + + /* Make sure that adding a configured log makes the default logs go away. */ + tor_asprintf(&cfg, "Log info file %s\n", fn1); + free_options_test_data(tdata); + tdata = get_options_test_data(cfg); + rv = options_init_logs(NULL, tdata->opt, 0); + tt_int_op(rv, OP_EQ, 0); + tt_int_op(smartlist_len(added_logs), OP_EQ, 1); + a = smartlist_get(added_logs, 0); + tt_assert(a); + tt_assert(! a->stream); + tt_int_op(a->fd, OP_NE, fileno(stdout)); + tt_int_op(a->sev.masks[LOG_INFO-LOG_ERR], OP_EQ, LD_ALL_DOMAINS); + tt_int_op(a->sev.masks[LOG_NOTICE-LOG_ERR], OP_EQ, LD_ALL_DOMAINS); + tt_int_op(a->sev.masks[LOG_WARN-LOG_ERR], OP_EQ, LD_ALL_DOMAINS); + + done: + free_options_test_data(tdata); + tor_free(fn1); + tor_free(cfg); + clear_added_logs(); + smartlist_free(added_logs); + UNMOCK(add_stream_log_impl); + UNMOCK(add_file_log); +} + + #ifndef COCCI #define LOCAL_VALIDATE_TEST(name) \ { "validate__" #name, test_options_validate__ ## name, TT_FORK, NULL, NULL } + #endif
struct testcase_t options_tests[] = { { "validate", test_options_validate, TT_FORK, NULL, NULL },
tor-commits@lists.torproject.org