Tor 0.4.9.0-alpha-dev
conftesting.h
Go to the documentation of this file.
1/* Copyright (c) 2001 Matej Pfajfar.
2 * Copyright (c) 2001-2004, Roger Dingledine.
3 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
4 * Copyright (c) 2007-2021, The Tor Project, Inc. */
5/* See LICENSE for licensing information */
6
7/**
8 * @file conftesting.h
9 * @brief Macro and type declarations for testing
10 **/
11
12#ifndef TOR_LIB_CONF_CONFTESTING_H
13#define TOR_LIB_CONF_CONFTESTING_H
14
15#include "lib/cc/torint.h"
16
17#ifndef COCCI
18#ifdef TOR_UNIT_TESTS
19#define USE_CONF_TESTING
20/**
21 * Union used when building in test mode typechecking the members of a type
22 * used with confmgt.c. See CONF_CHECK_VAR_TYPE for a description of how
23 * it is used. */
24typedef union {
25 char **STRING;
26 char **FILENAME;
27 int *POSINT; /* yes, this is really an int, and not an unsigned int. For
28 * historical reasons, many configuration values are restricted
29 * to the range [0,INT_MAX], and stored in signed ints.
30 */
31 uint64_t *UINT64;
32 int *INT;
33 int *INTERVAL;
34 int *MSEC_INTERVAL;
35 uint64_t *MEMUNIT;
36 double *DOUBLE;
37 int *BOOL;
38 int *AUTOBOOL;
39 time_t *ISOTIME;
40 struct smartlist_t **CSV;
41 int *CSV_INTERVAL;
42 struct config_line_t **LINELIST;
43 struct config_line_t **LINELIST_S;
44 struct config_line_t **LINELIST_V;
45 // XXXX this doesn't belong at this level of abstraction.
46 struct routerset_t **ROUTERSET;
47} confparse_dummy_values_t;
48
49/* Macros to define extra members inside config_var_t fields, and at the
50 * end of a list of them.
51 */
52/* This is a somewhat magic type-checking macro for users of confmgt.c.
53 * It initializes a union member "confparse_dummy_values_t.conftype" with
54 * the address of a static member "tp_dummy.member". This
55 * will give a compiler warning unless the member field is of the correct
56 * type.
57 *
58 * (This warning is mandatory, because a type mismatch here violates the type
59 * compatibility constraint for simple assignment, and requires a diagnostic,
60 * according to the C spec.)
61 *
62 * For example, suppose you say:
63 * "CONF_CHECK_VAR_TYPE(or_options_t, STRING, Address)".
64 * Then this macro will evaluate to:
65 * { .STRING = &or_options_t_dummy.Address }
66 * And since confparse_dummy_values_t.STRING has type "char **", that
67 * expression will create a warning unless or_options_t.Address also
68 * has type "char *".
69 */
70#define CONF_CHECK_VAR_TYPE(tp, conftype, member) \
71 { . conftype = &tp ## _dummy . member }
72#define CONF_TEST_MEMBERS(tp, conftype, member) \
73 , .var_ptr_dummy=CONF_CHECK_VAR_TYPE(tp, conftype, member)
74#define DUMMY_CONF_TEST_MEMBERS , .var_ptr_dummy={ .INT=NULL }
75#define DUMMY_TYPECHECK_INSTANCE(tp) \
76 static tp tp ## _dummy
77#endif /* defined(TOR_UNIT_TESTS) */
78#endif /* !defined(COCCI) */
79
80#ifndef USE_CONF_TESTING
81#define CONF_TEST_MEMBERS(tp, conftype, member)
82/* Repeatedly declarable incomplete struct to absorb redundant semicolons */
83#define DUMMY_TYPECHECK_INSTANCE(tp) \
84 struct tor_semicolon_eater
85#define DUMMY_CONF_TEST_MEMBERS
86
87#endif /* !defined(USE_CONF_TESTING) */
88
89#endif /* !defined(TOR_LIB_CONF_CONFTESTING_H) */
Integer definitions used throughout Tor.