aboutsummaryrefslogtreecommitdiff
path: root/src/test/test_confmgr.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2019-08-27 11:12:34 -0400
committerNick Mathewson <nickm@torproject.org>2019-08-28 09:42:17 -0400
commit8db3859cc6f394927ca66bfc19c1227408fb7874 (patch)
treea39fc0e05591f1eef6a02820f36365a378c02de6 /src/test/test_confmgr.c
parentd9fe9f5edef53c53e2e2337f8af0d88e42e47d4a (diff)
downloadtor-8db3859cc6f394927ca66bfc19c1227408fb7874.tar.gz
tor-8db3859cc6f394927ca66bfc19c1227408fb7874.zip
Simple tests for nested configuration formats
One test makes sure that the toplevel magic numbers are distinct. One test makes sure that we can parse a configuration object with two sub-objects.
Diffstat (limited to 'src/test/test_confmgr.c')
-rw-r--r--src/test/test_confmgr.c90
1 files changed, 88 insertions, 2 deletions
diff --git a/src/test/test_confmgr.c b/src/test/test_confmgr.c
index 9801108e97..547fd5f423 100644
--- a/src/test/test_confmgr.c
+++ b/src/test/test_confmgr.c
@@ -8,6 +8,7 @@
* formats and configuration objects.
*/
+#define CONFPARSE_PRIVATE
#include "orconfig.h"
#include "core/or/or.h"
@@ -128,12 +129,15 @@ static const config_format_t alpaca_fmt = {
.deprecations = alpaca_deprecations,
};
+#define LLAMA_IDX 0
+#define ALPACA_IDX 1
+
static config_mgr_t *
get_mgr(bool freeze)
{
config_mgr_t *mgr = config_mgr_new(&pasture_fmt);
- tt_int_op(0, OP_EQ, config_mgr_add_format(mgr, &llama_fmt));
- tt_int_op(1, OP_EQ, config_mgr_add_format(mgr, &alpaca_fmt));
+ tt_int_op(LLAMA_IDX, OP_EQ, config_mgr_add_format(mgr, &llama_fmt));
+ tt_int_op(ALPACA_IDX, OP_EQ, config_mgr_add_format(mgr, &alpaca_fmt));
if (freeze)
config_mgr_freeze(mgr);
return mgr;
@@ -173,10 +177,92 @@ test_confmgr_init(void *arg)
config_mgr_free(mgr);
}
+static void
+test_confmgr_magic(void *args)
+{
+ (void)args;
+ // Every time we build a manager, it is supposed to get a different magic
+ // number. Let's test that.
+ config_mgr_t *mgr1 = get_mgr(true);
+ config_mgr_t *mgr2 = get_mgr(true);
+ config_mgr_t *mgr3 = get_mgr(true);
+
+ pasture_cfg_t *p1 = NULL, *p2 = NULL, *p3 = NULL;
+
+ tt_assert(mgr1);
+ tt_assert(mgr2);
+ tt_assert(mgr3);
+
+ p1 = config_new(mgr1);
+ p2 = config_new(mgr2);
+ p3 = config_new(mgr3);
+
+ tt_assert(p1);
+ tt_assert(p2);
+ tt_assert(p3);
+
+ // By chance, two managers get the same magic with P=2^-32. Let's
+ // make sure that at least two of them are different, so that our
+ // odds of a false positive are 1/2^-64.
+ tt_assert((p1->magic != p2->magic) || (p2->magic != p3->magic));
+
+ done:
+ config_free(mgr1, p1);
+ config_free(mgr2, p2);
+ config_free(mgr3, p3);
+
+ config_mgr_free(mgr1);
+ config_mgr_free(mgr2);
+ config_mgr_free(mgr3);
+}
+
+static const char *simple_pasture =
+ "LLamaname hugo\n"
+ "Alpacaname daphne\n"
+ "gentillesse 42\n"
+ "address 123 Camelid ave\n";
+
+static void
+test_confmgr_parse(void *arg)
+{
+ (void)arg;
+ config_mgr_t *mgr = get_mgr(true);
+ pasture_cfg_t *p = config_new(mgr);
+ config_line_t *lines = NULL;
+ char *msg = NULL;
+
+ config_init(mgr, p); // set defaults.
+
+ int r = config_get_lines(simple_pasture, &lines, 0);
+ tt_int_op(r, OP_EQ, 0);
+ r = config_assign(mgr, p, lines, 0, &msg);
+ tt_int_op(r, OP_EQ, 0);
+
+ tt_int_op(p->opentopublic, OP_EQ, 1);
+ tt_str_op(p->address, OP_EQ, "123 Camelid ave");
+
+ // We are using this API directly; modules outside confparse will, in the
+ // future, not.
+ const alpaca_cfg_t *ac = config_mgr_get_obj(mgr, p, ALPACA_IDX);
+ const llama_cfg_t *lc = config_mgr_get_obj(mgr, p, LLAMA_IDX);
+ tt_str_op(lc->llamaname, OP_EQ, "hugo");
+ tt_str_op(ac->alpacaname, OP_EQ, "daphne");
+ tt_int_op(lc->cuteness, OP_EQ, 42);
+ tt_int_op(ac->fuzziness, OP_EQ, 50);
+
+ done:
+ config_free_lines(lines);
+ config_free(mgr, p);
+ config_mgr_free(mgr);
+ tor_free(msg);
+}
+
#define CONFMGR_TEST(name, flags) \
{ #name, test_confmgr_ ## name, flags, NULL, NULL }
struct testcase_t confmgr_tests[] = {
CONFMGR_TEST(init, 0),
+ CONFMGR_TEST(magic, 0),
+ CONFMGR_TEST(parse, 0),
END_OF_TESTCASES
};