|
@@ -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)
|