r14661@catbus: nickm | 2007-08-18 15:38:08 -0400

Long overdue test.c refactoring: add --warn/--notice/--info/--debug command line options to set logging levels, and let the user specify which tests to run from the commmand line.


svn:r11167
This commit is contained in:
Nick Mathewson 2007-08-18 19:39:14 +00:00
parent 676d8622de
commit b45b91a358
2 changed files with 123 additions and 56 deletions

View File

@ -38,6 +38,12 @@ Changes in version 0.2.0.5-alpha - 2007-??-??
- Implement options to allow the controller to pick a new location for
the cookie authentication file, and to make it group-readable.
o Minor features (unit testing):
- Add command-line arguments to unit-test executable so that we can
invoke any chosen test from the command line rather than having to
run the whole test suite at once; and so that we can turn on logging
for the unit tests.
o Minor bugfixes (other):
- If we require CookieAuthentication but we fail to write the
cookie file, we would warn but not exit, and end up in a state

View File

@ -1079,7 +1079,7 @@ _test_eq_ip6(struct in6_addr *a, struct in6_addr *b, const char *e1,
STMT_END
static void
test_ip6_helpers(void)
test_util_ip6_helpers(void)
{
char buf[TOR_ADDR_BUF_LEN], bug[TOR_ADDR_BUF_LEN];
struct in6_addr a1, a2;
@ -1271,14 +1271,16 @@ test_ip6_helpers(void)
/* get interface addresses */
r = get_interface_address6(0, AF_INET, &t1);
i = get_interface_address6(0, AF_INET6, &t2);
#if 0
tor_inet_ntop(AF_INET, &t1.sa.sin_addr, buf, sizeof(buf));
printf("\nv4 address: %s (family=%i)", buf, IN_FAMILY(&t1));
tor_inet_ntop(AF_INET6, &t2.sa6.sin6_addr, buf, sizeof(buf));
printf("\nv6 address: %s (family=%i)", buf, IN_FAMILY(&t2));
#endif
}
static void
test_smartlist(void)
test_util_smartlist(void)
{
smartlist_t *sl;
char *cp;
@ -1545,7 +1547,7 @@ test_smartlist(void)
}
static void
test_bitarray(void)
test_util_bitarray(void)
{
bitarray_t *ba;
int i, j, ok=1;
@ -1629,7 +1631,7 @@ _thread_test_func(void* _s)
}
static void
test_threads(void)
test_util_threads(void)
{
char *s1, *s2;
int done = 0, timedout = 0;
@ -1694,7 +1696,7 @@ _compare_strings_for_pqueue(const void *s1, const void *s2)
}
static void
test_pqueue(void)
test_util_pqueue(void)
{
smartlist_t *sl;
int (*cmp)(const void *, const void*);
@ -1748,7 +1750,7 @@ test_pqueue(void)
}
static void
test_gzip(void)
test_util_gzip(void)
{
char *buf1, *buf2=NULL, *buf3=NULL, *cp1, *cp2;
const char *ccp2;
@ -1854,7 +1856,7 @@ test_gzip(void)
}
static void
test_strmap(void)
test_util_strmap(void)
{
strmap_t *map;
strmap_iter_t *iter;
@ -1933,7 +1935,7 @@ test_strmap(void)
}
static void
test_mmap(void)
test_util_mmap(void)
{
char *fname1 = tor_strdup(get_fname("mapped_1"));
char *fname2 = tor_strdup(get_fname("mapped_2"));
@ -1991,7 +1993,7 @@ test_mmap(void)
}
static void
test_control_formats(void)
test_util_control_formats(void)
{
char *out;
const char *inp =
@ -2391,7 +2393,7 @@ test_same_voter(networkstatus_voter_info_t *v1,
}
static void
test_dirvote_helpers(void)
test_util_dirvote_helpers(void)
{
smartlist_t *sl = smartlist_create();
int a=12,b=24,c=25,d=60,e=77;
@ -2443,8 +2445,6 @@ test_v3_networkstatus(void)
char *v1_text, *v2_text, *v3_text, *consensus_text, *cp;
smartlist_t *votes = smartlist_create();
add_stream_log(LOG_NOTICE, LOG_ERR, "", stdout);//XXXX020 remove me.
/* Parse certificates and keys. */
cert1 = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL);
test_assert(cert1);
@ -3066,7 +3066,7 @@ bench_aes(void)
}
static void
test_mempool(void)
test_util_mempool(void)
{
mp_pool_t *pool;
smartlist_t *allocated;
@ -3113,13 +3113,105 @@ test_mempool(void)
smartlist_free(allocated);
}
#define ENT(x) { #x, test_ ## x, 0, 0 }
#define SUBENT(x,y) { #x "/" #y, test_ ## x ## _ ## y, 1, 0 }
static struct {
const char *test_name;
void (*test_fn)(void);
int is_subent;
int selected;
} test_array[] = {
ENT(buffers),
ENT(crypto),
SUBENT(crypto, dh),
SUBENT(crypto, s2k),
ENT(util),
SUBENT(util, ip6_helpers),
SUBENT(util, gzip),
SUBENT(util, smartlist),
SUBENT(util, bitarray),
SUBENT(util, mempool),
SUBENT(util, strmap),
SUBENT(util, control_formats),
SUBENT(util, pqueue),
SUBENT(util, mmap),
SUBENT(util, threads),
SUBENT(util, dirvote_helpers),
ENT(onion_handshake),
ENT(dir_format),
ENT(v3_networkstatus),
ENT(policies),
ENT(rend_fns),
{ NULL, NULL, 0, 0 },
};
static void syntax(void) ATTR_NORETURN;
static void
syntax(void)
{
int i;
printf("Syntax:\n"
" test [-v|--verbose] [--warn|--notice|--info|--debug]\n"
" [testname...]\n"
"Recognized tests are:\n");
for (i = 0; test_array[i].test_name; ++i) {
printf(" %s\n", test_array[i].test_name);
}
exit(0);
}
int
main(int c, char**v)
{
or_options_t *options = options_new();
char *errmsg = NULL;
(void) c;
(void) v;
int i;
int verbose = 0, any_selected = 0;
int loglevel = LOG_ERR;
for (i = 1; i < c; ++i) {
if (!strcmp(v[i], "-v") || !strcmp(v[i], "--verbose"))
verbose++;
else if (!strcmp(v[i], "--warn"))
loglevel = LOG_WARN;
else if (!strcmp(v[i], "--notice"))
loglevel = LOG_NOTICE;
else if (!strcmp(v[i], "--info"))
loglevel = LOG_INFO;
else if (!strcmp(v[i], "--debug"))
loglevel = LOG_DEBUG;
else if (!strcmp(v[i], "--help") || !strcmp(v[i], "-h") || v[i][0] == '-')
syntax();
else {
int j, found=0;
for (j = 0; test_array[j].test_name; ++j) {
if (!strcmp(v[i], test_array[j].test_name) ||
(test_array[j].is_subent &&
!strcmpstart(test_array[j].test_name, v[i]) &&
test_array[j].test_name[strlen(v[i])] == '/') ||
(v[i][0] == '=' && !strcmp(v[i]+1, test_array[j].test_name))) {
test_array[j].selected = 1;
any_selected = 1;
found = 1;
}
}
if (!found) {
printf("Unknown test: %s\n", v[i]);
syntax();
}
}
}
if (!any_selected) {
for (i = 0; test_array[i].test_name; ++i) {
test_array[i].selected = 1;
}
}
add_stream_log(loglevel, LOG_ERR, "", stdout);
options->command = CMD_RUN_UNITTESTS;
rep_hist_init();
network_init();
@ -3143,47 +3235,16 @@ main(int c, char**v)
printf("Running Tor unit tests on %s\n", get_uname());
puts("========================== Buffers =========================");
test_buffers();
puts("\n========================== Crypto ==========================");
// add_stream_log(LOG_DEBUG, LOG_ERR, "<stdout>", stdout);
test_crypto();
test_crypto_dh();
test_crypto_s2k();
puts("\n========================= Util ============================"
"\n--IPv6");
test_ip6_helpers();
puts("\n--gzip");
test_gzip();
puts("\n--util");
test_util();
puts("\n--smartlist");
test_smartlist();
puts("\n--bitarray");
test_bitarray();
puts("\n--mempool");
test_mempool();
puts("\n--strmap");
test_strmap();
puts("\n--control formats");
test_control_formats();
puts("\n--pqueue");
test_pqueue();
puts("\n--mmap");
test_mmap();
puts("\n--threads");
test_threads();
puts("\n--dirvote-helpers");
test_dirvote_helpers();
puts("\n========================= Onion Skins =====================");
test_onion_handshake();
puts("\n========================= Directory Formats ===============");
test_dir_format();
test_v3_networkstatus();
puts("\n========================= Policies ===================");
test_policies();
puts("\n========================= Rendezvous functionality ========");
test_rend_fns();
for (i = 0; test_array[i].test_name; ++i) {
if (!test_array[i].selected)
continue;
if (!test_array[i].is_subent) {
printf("\n============================== %s\n",test_array[i].test_name);
} else if (test_array[i].is_subent && verbose) {
printf("\n%s", test_array[i].test_name);
}
test_array[i].test_fn();
}
puts("");
if (have_failed)