conftesting.h (3092B)
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. */ 24 typedef 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) */