test.c
上传用户:awang829
上传日期:2019-07-14
资源大小:2356k
文件大小:163k
源码类别:

网络

开发平台:

Unix_Linux

  1.  done:
  2.   smartlist_free(sl);
  3. }
  4. /** Run unit tests for compression functions */
  5. static void
  6. test_util_gzip(void)
  7. {
  8.   char *buf1=NULL, *buf2=NULL, *buf3=NULL, *cp1, *cp2;
  9.   const char *ccp2;
  10.   size_t len1, len2;
  11.   tor_zlib_state_t *state = NULL;
  12.   buf1 = tor_strdup("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ");
  13.   test_assert(detect_compression_method(buf1, strlen(buf1)) == UNKNOWN_METHOD);
  14.   if (is_gzip_supported()) {
  15.     test_assert(!tor_gzip_compress(&buf2, &len1, buf1, strlen(buf1)+1,
  16.                                    GZIP_METHOD));
  17.     test_assert(buf2);
  18.     test_assert(!memcmp(buf2, "37213", 2)); /* Gzip magic. */
  19.     test_assert(detect_compression_method(buf2, len1) == GZIP_METHOD);
  20.     test_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1,
  21.                                      GZIP_METHOD, 1, LOG_INFO));
  22.     test_assert(buf3);
  23.     test_streq(buf1,buf3);
  24.     tor_free(buf2);
  25.     tor_free(buf3);
  26.   }
  27.   test_assert(!tor_gzip_compress(&buf2, &len1, buf1, strlen(buf1)+1,
  28.                                  ZLIB_METHOD));
  29.   test_assert(buf2);
  30.   test_assert(!memcmp(buf2, "x78xDA", 2)); /* deflate magic. */
  31.   test_assert(detect_compression_method(buf2, len1) == ZLIB_METHOD);
  32.   test_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1,
  33.                                    ZLIB_METHOD, 1, LOG_INFO));
  34.   test_assert(buf3);
  35.   test_streq(buf1,buf3);
  36.   /* Check whether we can uncompress concatenated, compressed strings. */
  37.   tor_free(buf3);
  38.   buf2 = tor_realloc(buf2, len1*2);
  39.   memcpy(buf2+len1, buf2, len1);
  40.   test_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1*2,
  41.                                    ZLIB_METHOD, 1, LOG_INFO));
  42.   test_eq(len2, (strlen(buf1)+1)*2);
  43.   test_memeq(buf3,
  44.              "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ"
  45.              "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ",
  46.              (strlen(buf1)+1)*2);
  47.   tor_free(buf1);
  48.   tor_free(buf2);
  49.   tor_free(buf3);
  50.   /* Check whether we can uncompress partial strings. */
  51.   buf1 =
  52.     tor_strdup("String with low redundancy that won't be compressed much.");
  53.   test_assert(!tor_gzip_compress(&buf2, &len1, buf1, strlen(buf1)+1,
  54.                                  ZLIB_METHOD));
  55.   tor_assert(len1>16);
  56.   /* when we allow an incomplete string, we should succeed.*/
  57.   tor_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1-16,
  58.                                   ZLIB_METHOD, 0, LOG_INFO));
  59.   buf3[len2]='';
  60.   tor_assert(len2 > 5);
  61.   tor_assert(!strcmpstart(buf1, buf3));
  62.   /* when we demand a complete string, this must fail. */
  63.   tor_free(buf3);
  64.   tor_assert(tor_gzip_uncompress(&buf3, &len2, buf2, len1-16,
  65.                                  ZLIB_METHOD, 1, LOG_INFO));
  66.   tor_assert(!buf3);
  67.   /* Now, try streaming compression. */
  68.   tor_free(buf1);
  69.   tor_free(buf2);
  70.   tor_free(buf3);
  71.   state = tor_zlib_new(1, ZLIB_METHOD);
  72.   tor_assert(state);
  73.   cp1 = buf1 = tor_malloc(1024);
  74.   len1 = 1024;
  75.   ccp2 = "ABCDEFGHIJABCDEFGHIJ";
  76.   len2 = 21;
  77.   test_assert(tor_zlib_process(state, &cp1, &len1, &ccp2, &len2, 0)
  78.               == TOR_ZLIB_OK);
  79.   test_eq(len2, 0); /* Make sure we compressed it all. */
  80.   test_assert(cp1 > buf1);
  81.   len2 = 0;
  82.   cp2 = cp1;
  83.   test_assert(tor_zlib_process(state, &cp1, &len1, &ccp2, &len2, 1)
  84.               == TOR_ZLIB_DONE);
  85.   test_eq(len2, 0);
  86.   test_assert(cp1 > cp2); /* Make sure we really added something. */
  87.   tor_assert(!tor_gzip_uncompress(&buf3, &len2, buf1, 1024-len1,
  88.                                   ZLIB_METHOD, 1, LOG_WARN));
  89.   test_streq(buf3, "ABCDEFGHIJABCDEFGHIJ"); /*Make sure it compressed right.*/
  90.  done:
  91.   if (state)
  92.     tor_zlib_free(state);
  93.   tor_free(buf2);
  94.   tor_free(buf3);
  95.   tor_free(buf1);
  96. }
  97. /** Run unit tests for string-to-void* map functions */
  98. static void
  99. test_util_strmap(void)
  100. {
  101.   strmap_t *map;
  102.   strmap_iter_t *iter;
  103.   const char *k;
  104.   void *v;
  105.   char *visited = NULL;
  106.   smartlist_t *found_keys = NULL;
  107.   map = strmap_new();
  108.   test_assert(map);
  109.   test_eq(strmap_size(map), 0);
  110.   test_assert(strmap_isempty(map));
  111.   v = strmap_set(map, "K1", (void*)99);
  112.   test_eq(v, NULL);
  113.   test_assert(!strmap_isempty(map));
  114.   v = strmap_set(map, "K2", (void*)101);
  115.   test_eq(v, NULL);
  116.   v = strmap_set(map, "K1", (void*)100);
  117.   test_eq(v, (void*)99);
  118.   test_eq_ptr(strmap_get(map,"K1"), (void*)100);
  119.   test_eq_ptr(strmap_get(map,"K2"), (void*)101);
  120.   test_eq_ptr(strmap_get(map,"K-not-there"), NULL);
  121.   strmap_assert_ok(map);
  122.   v = strmap_remove(map,"K2");
  123.   strmap_assert_ok(map);
  124.   test_eq_ptr(v, (void*)101);
  125.   test_eq_ptr(strmap_get(map,"K2"), NULL);
  126.   test_eq_ptr(strmap_remove(map,"K2"), NULL);
  127.   strmap_set(map, "K2", (void*)101);
  128.   strmap_set(map, "K3", (void*)102);
  129.   strmap_set(map, "K4", (void*)103);
  130.   test_eq(strmap_size(map), 4);
  131.   strmap_assert_ok(map);
  132.   strmap_set(map, "K5", (void*)104);
  133.   strmap_set(map, "K6", (void*)105);
  134.   strmap_assert_ok(map);
  135.   /* Test iterator. */
  136.   iter = strmap_iter_init(map);
  137.   found_keys = smartlist_create();
  138.   while (!strmap_iter_done(iter)) {
  139.     strmap_iter_get(iter,&k,&v);
  140.     smartlist_add(found_keys, tor_strdup(k));
  141.     test_eq_ptr(v, strmap_get(map, k));
  142.     if (!strcmp(k, "K2")) {
  143.       iter = strmap_iter_next_rmv(map,iter);
  144.     } else {
  145.       iter = strmap_iter_next(map,iter);
  146.     }
  147.   }
  148.   /* Make sure we removed K2, but not the others. */
  149.   test_eq_ptr(strmap_get(map, "K2"), NULL);
  150.   test_eq_ptr(strmap_get(map, "K5"), (void*)104);
  151.   /* Make sure we visited everyone once */
  152.   smartlist_sort_strings(found_keys);
  153.   visited = smartlist_join_strings(found_keys, ":", 0, NULL);
  154.   test_streq(visited, "K1:K2:K3:K4:K5:K6");
  155.   strmap_assert_ok(map);
  156.   /* Clean up after ourselves. */
  157.   strmap_free(map, NULL);
  158.   map = NULL;
  159.   /* Now try some lc functions. */
  160.   map = strmap_new();
  161.   strmap_set_lc(map,"Ab.C", (void*)1);
  162.   test_eq_ptr(strmap_get(map,"ab.c"), (void*)1);
  163.   strmap_assert_ok(map);
  164.   test_eq_ptr(strmap_get_lc(map,"AB.C"), (void*)1);
  165.   test_eq_ptr(strmap_get(map,"AB.C"), NULL);
  166.   test_eq_ptr(strmap_remove_lc(map,"aB.C"), (void*)1);
  167.   strmap_assert_ok(map);
  168.   test_eq_ptr(strmap_get_lc(map,"AB.C"), NULL);
  169.  done:
  170.   if (map)
  171.     strmap_free(map,NULL);
  172.   if (found_keys) {
  173.     SMARTLIST_FOREACH(found_keys, char *, cp, tor_free(cp));
  174.     smartlist_free(found_keys);
  175.   }
  176.   tor_free(visited);
  177. }
  178. /** Run unit tests for mmap() wrapper functionality. */
  179. static void
  180. test_util_mmap(void)
  181. {
  182.   char *fname1 = tor_strdup(get_fname("mapped_1"));
  183.   char *fname2 = tor_strdup(get_fname("mapped_2"));
  184.   char *fname3 = tor_strdup(get_fname("mapped_3"));
  185.   const size_t buflen = 17000;
  186.   char *buf = tor_malloc(17000);
  187.   tor_mmap_t *mapping = NULL;
  188.   crypto_rand(buf, buflen);
  189.   mapping = tor_mmap_file(fname1);
  190.   test_assert(! mapping);
  191.   write_str_to_file(fname1, "Short file.", 1);
  192.   write_bytes_to_file(fname2, buf, buflen, 1);
  193.   write_bytes_to_file(fname3, buf, 16384, 1);
  194.   mapping = tor_mmap_file(fname1);
  195.   test_assert(mapping);
  196.   test_eq(mapping->size, strlen("Short file."));
  197.   test_streq(mapping->data, "Short file.");
  198. #ifdef MS_WINDOWS
  199.   tor_munmap_file(mapping);
  200.   mapping = NULL;
  201.   test_assert(unlink(fname1) == 0);
  202. #else
  203.   /* make sure we can unlink. */
  204.   test_assert(unlink(fname1) == 0);
  205.   test_streq(mapping->data, "Short file.");
  206.   tor_munmap_file(mapping);
  207.   mapping = NULL;
  208. #endif
  209.   /* Now a zero-length file. */
  210.   write_str_to_file(fname1, "", 1);
  211.   mapping = tor_mmap_file(fname1);
  212.   test_eq(mapping, NULL);
  213.   test_eq(ERANGE, errno);
  214.   unlink(fname1);
  215.   /* Make sure that we fail to map a no-longer-existent file. */
  216.   mapping = tor_mmap_file(fname1);
  217.   test_assert(mapping == NULL);
  218.   /* Now try a big file that stretches across a few pages and isn't aligned */
  219.   mapping = tor_mmap_file(fname2);
  220.   test_assert(mapping);
  221.   test_eq(mapping->size, buflen);
  222.   test_memeq(mapping->data, buf, buflen);
  223.   tor_munmap_file(mapping);
  224.   mapping = NULL;
  225.   /* Now try a big aligned file. */
  226.   mapping = tor_mmap_file(fname3);
  227.   test_assert(mapping);
  228.   test_eq(mapping->size, 16384);
  229.   test_memeq(mapping->data, buf, 16384);
  230.   tor_munmap_file(mapping);
  231.   mapping = NULL;
  232.  done:
  233.   unlink(fname1);
  234.   unlink(fname2);
  235.   unlink(fname3);
  236.   tor_free(fname1);
  237.   tor_free(fname2);
  238.   tor_free(fname3);
  239.   tor_free(buf);
  240.   if (mapping)
  241.     tor_munmap_file(mapping);
  242. }
  243. /** Run unit tests for escaping/unescaping data for use by controllers. */
  244. static void
  245. test_util_control_formats(void)
  246. {
  247.   char *out = NULL;
  248.   const char *inp =
  249.     "..This is a testrnof the emergency nbroadcastrn..system.rnZ.rn";
  250.   size_t sz;
  251.   sz = read_escaped_data(inp, strlen(inp), &out);
  252.   test_streq(out,
  253.              ".This is a testnof the emergency nbroadcastn.system.nZ.n");
  254.   test_eq(sz, strlen(out));
  255.  done:
  256.   tor_free(out);
  257. }
  258. static void
  259. test_util_sscanf(void)
  260. {
  261.   unsigned u1, u2, u3;
  262.   char s1[10], s2[10], s3[10], ch;
  263.   int r;
  264.   r = tor_sscanf("hello world", "hello world"); /* String match: success */
  265.   test_eq(r, 0);
  266.   r = tor_sscanf("hello world 3", "hello worlb %u", &u1); /* String fail */
  267.   test_eq(r, 0);
  268.   r = tor_sscanf("12345", "%u", &u1); /* Simple number */
  269.   test_eq(r, 1);
  270.   test_eq(u1, 12345u);
  271.   r = tor_sscanf("", "%u", &u1); /* absent number */
  272.   test_eq(r, 0);
  273.   r = tor_sscanf("A", "%u", &u1); /* bogus number */
  274.   test_eq(r, 0);
  275.   r = tor_sscanf("4294967295", "%u", &u1); /* UINT32_MAX should work. */
  276.   test_eq(r, 1);
  277.   test_eq(u1, 4294967295u);
  278.   r = tor_sscanf("4294967296", "%u", &u1); /* Always say -1 at 32 bits. */
  279.   test_eq(r, 0);
  280.   r = tor_sscanf("123456", "%2u%u", &u1, &u2); /* Width */
  281.   test_eq(r, 2);
  282.   test_eq(u1, 12u);
  283.   test_eq(u2, 3456u);
  284.   r = tor_sscanf("!12:3:456", "!%2u:%2u:%3u", &u1, &u2, &u3); /* separators */
  285.   test_eq(r, 3);
  286.   test_eq(u1, 12u);
  287.   test_eq(u2, 3u);
  288.   test_eq(u3, 456u);
  289.   r = tor_sscanf("12:3:045", "%2u:%2u:%3u", &u1, &u2, &u3); /* 0s */
  290.   test_eq(r, 3);
  291.   test_eq(u1, 12u);
  292.   test_eq(u2, 3u);
  293.   test_eq(u3, 45u);
  294.   /* %u does not match space.*/
  295.   r = tor_sscanf("12:3: 45", "%2u:%2u:%3u", &u1, &u2, &u3);
  296.   test_eq(r, 2);
  297.   /* %u does not match negative numbers. */
  298.   r = tor_sscanf("12:3:-4", "%2u:%2u:%3u", &u1, &u2, &u3);
  299.   test_eq(r, 2);
  300.   /* Arbitrary amounts of 0-padding are okay */
  301.   r = tor_sscanf("12:03:000000000000000099", "%2u:%2u:%u", &u1, &u2, &u3);
  302.   test_eq(r, 3);
  303.   test_eq(u1, 12u);
  304.   test_eq(u2, 3u);
  305.   test_eq(u3, 99u);
  306.   r = tor_sscanf("99% fresh", "%3u%% fresh", &u1); /* percents are scannable.*/
  307.   test_eq(r, 1);
  308.   test_eq(u1, 99);
  309.   r = tor_sscanf("hello", "%s", s1); /* %s needs a number. */
  310.   test_eq(r, -1);
  311.   r = tor_sscanf("hello", "%3s%7s", s1, s2); /* %s matches characters. */
  312.   test_eq(r, 2);
  313.   test_streq(s1, "hel");
  314.   test_streq(s2, "lo");
  315.   r = tor_sscanf("WD40", "%2s%u", s3, &u1); /* %s%u */
  316.   test_eq(r, 2);
  317.   test_streq(s3, "WD");
  318.   test_eq(u1, 40);
  319.   r = tor_sscanf("76trombones", "%6u%9s", &u1, s1); /* %u%s */
  320.   test_eq(r, 2);
  321.   test_eq(u1, 76);
  322.   test_streq(s1, "trombones");
  323.   r = tor_sscanf("hello world", "%9s %9s", s1, s2); /* %s doesn't eat space. */
  324.   test_eq(r, 2);
  325.   test_streq(s1, "hello");
  326.   test_streq(s2, "world");
  327.   r = tor_sscanf("hi", "%9s%9s%3s", s1, s2, s3); /* %s can be empty. */
  328.   test_eq(r, 3);
  329.   test_streq(s1, "hi");
  330.   test_streq(s2, "");
  331.   test_streq(s3, "");
  332.   r = tor_sscanf("1.2.3", "%u.%u.%u%c", &u1, &u2, &u3, &ch);
  333.   test_eq(r, 3);
  334.   r = tor_sscanf("1.2.3 foobar", "%u.%u.%u%c", &u1, &u2, &u3, &ch);
  335.   test_eq(r, 4);
  336.  done:
  337.   ;
  338. }
  339. /** Run unit tests for the onion handshake code. */
  340. static void
  341. test_onion_handshake(void)
  342. {
  343.   /* client-side */
  344.   crypto_dh_env_t *c_dh = NULL;
  345.   char c_buf[ONIONSKIN_CHALLENGE_LEN];
  346.   char c_keys[40];
  347.   /* server-side */
  348.   char s_buf[ONIONSKIN_REPLY_LEN];
  349.   char s_keys[40];
  350.   /* shared */
  351.   crypto_pk_env_t *pk = NULL;
  352.   pk = pk_generate(0);
  353.   /* client handshake 1. */
  354.   memset(c_buf, 0, ONIONSKIN_CHALLENGE_LEN);
  355.   test_assert(! onion_skin_create(pk, &c_dh, c_buf));
  356.   /* server handshake */
  357.   memset(s_buf, 0, ONIONSKIN_REPLY_LEN);
  358.   memset(s_keys, 0, 40);
  359.   test_assert(! onion_skin_server_handshake(c_buf, pk, NULL,
  360.                                             s_buf, s_keys, 40));
  361.   /* client handshake 2 */
  362.   memset(c_keys, 0, 40);
  363.   test_assert(! onion_skin_client_handshake(c_dh, s_buf, c_keys, 40));
  364.   if (memcmp(c_keys, s_keys, 40)) {
  365.     puts("Aiiiie");
  366.     exit(1);
  367.   }
  368.   test_memeq(c_keys, s_keys, 40);
  369.   memset(s_buf, 0, 40);
  370.   test_memneq(c_keys, s_buf, 40);
  371.  done:
  372.   if (c_dh)
  373.     crypto_dh_free(c_dh);
  374.   if (pk)
  375.     crypto_free_pk_env(pk);
  376. }
  377. /** Run unit tests for router descriptor generation logic. */
  378. static void
  379. test_dir_format(void)
  380. {
  381.   char buf[8192], buf2[8192];
  382.   char platform[256];
  383.   char fingerprint[FINGERPRINT_LEN+1];
  384.   char *pk1_str = NULL, *pk2_str = NULL, *pk3_str = NULL, *cp;
  385.   size_t pk1_str_len, pk2_str_len, pk3_str_len;
  386.   routerinfo_t *r1=NULL, *r2=NULL;
  387.   crypto_pk_env_t *pk1 = NULL, *pk2 = NULL, *pk3 = NULL;
  388.   routerinfo_t *rp1 = NULL;
  389.   addr_policy_t *ex1, *ex2;
  390.   routerlist_t *dir1 = NULL, *dir2 = NULL;
  391.   tor_version_t ver1;
  392.   pk1 = pk_generate(0);
  393.   pk2 = pk_generate(1);
  394.   pk3 = pk_generate(2);
  395.   test_assert( is_legal_nickname("a"));
  396.   test_assert(!is_legal_nickname(""));
  397.   test_assert(!is_legal_nickname("abcdefghijklmnopqrst")); /* 20 chars */
  398.   test_assert(!is_legal_nickname("hyphen-")); /* bad char */
  399.   test_assert( is_legal_nickname("abcdefghijklmnopqrs")); /* 19 chars */
  400.   test_assert(!is_legal_nickname("$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA"));
  401.   /* valid */
  402.   test_assert( is_legal_nickname_or_hexdigest(
  403.                                  "$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA"));
  404.   test_assert( is_legal_nickname_or_hexdigest(
  405.                          "$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA=fred"));
  406.   test_assert( is_legal_nickname_or_hexdigest(
  407.                          "$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA~fred"));
  408.   /* too short */
  409.   test_assert(!is_legal_nickname_or_hexdigest(
  410.                                  "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"));
  411.   /* illegal char */
  412.   test_assert(!is_legal_nickname_or_hexdigest(
  413.                                  "$AAAAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"));
  414.   /* hex part too long */
  415.   test_assert(!is_legal_nickname_or_hexdigest(
  416.                          "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"));
  417.   test_assert(!is_legal_nickname_or_hexdigest(
  418.                          "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=fred"));
  419.   /* Bad nickname */
  420.   test_assert(!is_legal_nickname_or_hexdigest(
  421.                          "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="));
  422.   test_assert(!is_legal_nickname_or_hexdigest(
  423.                          "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~"));
  424.   test_assert(!is_legal_nickname_or_hexdigest(
  425.                        "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~hyphen-"));
  426.   test_assert(!is_legal_nickname_or_hexdigest(
  427.                        "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~"
  428.                        "abcdefghijklmnoppqrst"));
  429.   /* Bad extra char. */
  430.   test_assert(!is_legal_nickname_or_hexdigest(
  431.                          "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA!"));
  432.   test_assert(is_legal_nickname_or_hexdigest("xyzzy"));
  433.   test_assert(is_legal_nickname_or_hexdigest("abcdefghijklmnopqrs"));
  434.   test_assert(!is_legal_nickname_or_hexdigest("abcdefghijklmnopqrst"));
  435.   get_platform_str(platform, sizeof(platform));
  436.   r1 = tor_malloc_zero(sizeof(routerinfo_t));
  437.   r1->address = tor_strdup("18.244.0.1");
  438.   r1->addr = 0xc0a80001u; /* 192.168.0.1 */
  439.   r1->cache_info.published_on = 0;
  440.   r1->or_port = 9000;
  441.   r1->dir_port = 9003;
  442.   r1->onion_pkey = crypto_pk_dup_key(pk1);
  443.   r1->identity_pkey = crypto_pk_dup_key(pk2);
  444.   r1->bandwidthrate = 1000;
  445.   r1->bandwidthburst = 5000;
  446.   r1->bandwidthcapacity = 10000;
  447.   r1->exit_policy = NULL;
  448.   r1->nickname = tor_strdup("Magri");
  449.   r1->platform = tor_strdup(platform);
  450.   ex1 = tor_malloc_zero(sizeof(addr_policy_t));
  451.   ex2 = tor_malloc_zero(sizeof(addr_policy_t));
  452.   ex1->policy_type = ADDR_POLICY_ACCEPT;
  453.   tor_addr_from_ipv4h(&ex1->addr, 0);
  454.   ex1->maskbits = 0;
  455.   ex1->prt_min = ex1->prt_max = 80;
  456.   ex2->policy_type = ADDR_POLICY_REJECT;
  457.   tor_addr_from_ipv4h(&ex2->addr, 18<<24);
  458.   ex2->maskbits = 8;
  459.   ex2->prt_min = ex2->prt_max = 24;
  460.   r2 = tor_malloc_zero(sizeof(routerinfo_t));
  461.   r2->address = tor_strdup("1.1.1.1");
  462.   r2->addr = 0x0a030201u; /* 10.3.2.1 */
  463.   r2->platform = tor_strdup(platform);
  464.   r2->cache_info.published_on = 5;
  465.   r2->or_port = 9005;
  466.   r2->dir_port = 0;
  467.   r2->onion_pkey = crypto_pk_dup_key(pk2);
  468.   r2->identity_pkey = crypto_pk_dup_key(pk1);
  469.   r2->bandwidthrate = r2->bandwidthburst = r2->bandwidthcapacity = 3000;
  470.   r2->exit_policy = smartlist_create();
  471.   smartlist_add(r2->exit_policy, ex2);
  472.   smartlist_add(r2->exit_policy, ex1);
  473.   r2->nickname = tor_strdup("Fred");
  474.   test_assert(!crypto_pk_write_public_key_to_string(pk1, &pk1_str,
  475.                                                     &pk1_str_len));
  476.   test_assert(!crypto_pk_write_public_key_to_string(pk2 , &pk2_str,
  477.                                                     &pk2_str_len));
  478.   test_assert(!crypto_pk_write_public_key_to_string(pk3 , &pk3_str,
  479.                                                     &pk3_str_len));
  480.   memset(buf, 0, 2048);
  481.   test_assert(router_dump_router_to_string(buf, 2048, r1, pk2)>0);
  482.   strlcpy(buf2, "router Magri 18.244.0.1 9000 0 9003n"
  483.           "platform Tor "VERSION" on ", sizeof(buf2));
  484.   strlcat(buf2, get_uname(), sizeof(buf2));
  485.   strlcat(buf2, "n"
  486.           "opt protocols Link 1 2 Circuit 1n"
  487.           "published 1970-01-01 00:00:00n"
  488.           "opt fingerprint ", sizeof(buf2));
  489.   test_assert(!crypto_pk_get_fingerprint(pk2, fingerprint, 1));
  490.   strlcat(buf2, fingerprint, sizeof(buf2));
  491.   strlcat(buf2, "nuptime 0n"
  492.   /* XXX the "0" above is hard-coded, but even if we made it reflect
  493.    * uptime, that still wouldn't make it right, because the two
  494.    * descriptors might be made on different seconds... hm. */
  495.          "bandwidth 1000 5000 10000n"
  496.           "opt extra-info-digest 0000000000000000000000000000000000000000n"
  497.           "onion-keyn", sizeof(buf2));
  498.   strlcat(buf2, pk1_str, sizeof(buf2));
  499.   strlcat(buf2, "signing-keyn", sizeof(buf2));
  500.   strlcat(buf2, pk2_str, sizeof(buf2));
  501.   strlcat(buf2, "opt hidden-service-dirn", sizeof(buf2));
  502.   strlcat(buf2, "reject *:*nrouter-signaturen", sizeof(buf2));
  503.   buf[strlen(buf2)] = ''; /* Don't compare the sig; it's never the same
  504.                              * twice */
  505.   test_streq(buf, buf2);
  506.   test_assert(router_dump_router_to_string(buf, 2048, r1, pk2)>0);
  507.   cp = buf;
  508.   rp1 = router_parse_entry_from_string((const char*)cp,NULL,1,0,NULL);
  509.   test_assert(rp1);
  510.   test_streq(rp1->address, r1->address);
  511.   test_eq(rp1->or_port, r1->or_port);
  512.   //test_eq(rp1->dir_port, r1->dir_port);
  513.   test_eq(rp1->bandwidthrate, r1->bandwidthrate);
  514.   test_eq(rp1->bandwidthburst, r1->bandwidthburst);
  515.   test_eq(rp1->bandwidthcapacity, r1->bandwidthcapacity);
  516.   test_assert(crypto_pk_cmp_keys(rp1->onion_pkey, pk1) == 0);
  517.   test_assert(crypto_pk_cmp_keys(rp1->identity_pkey, pk2) == 0);
  518.   //test_assert(rp1->exit_policy == NULL);
  519. #if 0
  520.   /* XXX Once we have exit policies, test this again. XXX */
  521.   strlcpy(buf2, "router tor.tor.tor 9005 0 0 3000n", sizeof(buf2));
  522.   strlcat(buf2, pk2_str, sizeof(buf2));
  523.   strlcat(buf2, "signing-keyn", sizeof(buf2));
  524.   strlcat(buf2, pk1_str, sizeof(buf2));
  525.   strlcat(buf2, "accept *:80nreject 18.*:24nn", sizeof(buf2));
  526.   test_assert(router_dump_router_to_string(buf, 2048, &r2, pk2)>0);
  527.   test_streq(buf, buf2);
  528.   cp = buf;
  529.   rp2 = router_parse_entry_from_string(&cp,1);
  530.   test_assert(rp2);
  531.   test_streq(rp2->address, r2.address);
  532.   test_eq(rp2->or_port, r2.or_port);
  533.   test_eq(rp2->dir_port, r2.dir_port);
  534.   test_eq(rp2->bandwidth, r2.bandwidth);
  535.   test_assert(crypto_pk_cmp_keys(rp2->onion_pkey, pk2) == 0);
  536.   test_assert(crypto_pk_cmp_keys(rp2->identity_pkey, pk1) == 0);
  537.   test_eq(rp2->exit_policy->policy_type, EXIT_POLICY_ACCEPT);
  538.   test_streq(rp2->exit_policy->string, "accept *:80");
  539.   test_streq(rp2->exit_policy->address, "*");
  540.   test_streq(rp2->exit_policy->port, "80");
  541.   test_eq(rp2->exit_policy->next->policy_type, EXIT_POLICY_REJECT);
  542.   test_streq(rp2->exit_policy->next->string, "reject 18.*:24");
  543.   test_streq(rp2->exit_policy->next->address, "18.*");
  544.   test_streq(rp2->exit_policy->next->port, "24");
  545.   test_assert(rp2->exit_policy->next->next == NULL);
  546.   /* Okay, now for the directories. */
  547.   {
  548.     fingerprint_list = smartlist_create();
  549.     crypto_pk_get_fingerprint(pk2, buf, 1);
  550.     add_fingerprint_to_dir("Magri", buf, fingerprint_list);
  551.     crypto_pk_get_fingerprint(pk1, buf, 1);
  552.     add_fingerprint_to_dir("Fred", buf, fingerprint_list);
  553.   }
  554.   {
  555.   char d[DIGEST_LEN];
  556.   const char *m;
  557.   /* XXXX NM re-enable. */
  558.   /* Make sure routers aren't too far in the past any more. */
  559.   r1->cache_info.published_on = time(NULL);
  560.   r2->cache_info.published_on = time(NULL)-3*60*60;
  561.   test_assert(router_dump_router_to_string(buf, 2048, r1, pk2)>0);
  562.   test_eq(dirserv_add_descriptor(buf,&m,""), ROUTER_ADDED_NOTIFY_GENERATOR);
  563.   test_assert(router_dump_router_to_string(buf, 2048, r2, pk1)>0);
  564.   test_eq(dirserv_add_descriptor(buf,&m,""), ROUTER_ADDED_NOTIFY_GENERATOR);
  565.   get_options()->Nickname = tor_strdup("DirServer");
  566.   test_assert(!dirserv_dump_directory_to_string(&cp,pk3, 0));
  567.   crypto_pk_get_digest(pk3, d);
  568.   test_assert(!router_parse_directory(cp));
  569.   test_eq(2, smartlist_len(dir1->routers));
  570.   tor_free(cp);
  571.   }
  572. #endif
  573.   dirserv_free_fingerprint_list();
  574.   /* Try out version parsing functionality */
  575.   test_eq(0, tor_version_parse("0.3.4pre2-cvs", &ver1));
  576.   test_eq(0, ver1.major);
  577.   test_eq(3, ver1.minor);
  578.   test_eq(4, ver1.micro);
  579.   test_eq(VER_PRE, ver1.status);
  580.   test_eq(2, ver1.patchlevel);
  581.   test_eq(0, tor_version_parse("0.3.4rc1", &ver1));
  582.   test_eq(0, ver1.major);
  583.   test_eq(3, ver1.minor);
  584.   test_eq(4, ver1.micro);
  585.   test_eq(VER_RC, ver1.status);
  586.   test_eq(1, ver1.patchlevel);
  587.   test_eq(0, tor_version_parse("1.3.4", &ver1));
  588.   test_eq(1, ver1.major);
  589.   test_eq(3, ver1.minor);
  590.   test_eq(4, ver1.micro);
  591.   test_eq(VER_RELEASE, ver1.status);
  592.   test_eq(0, ver1.patchlevel);
  593.   test_eq(0, tor_version_parse("1.3.4.999", &ver1));
  594.   test_eq(1, ver1.major);
  595.   test_eq(3, ver1.minor);
  596.   test_eq(4, ver1.micro);
  597.   test_eq(VER_RELEASE, ver1.status);
  598.   test_eq(999, ver1.patchlevel);
  599.   test_eq(0, tor_version_parse("0.1.2.4-alpha", &ver1));
  600.   test_eq(0, ver1.major);
  601.   test_eq(1, ver1.minor);
  602.   test_eq(2, ver1.micro);
  603.   test_eq(4, ver1.patchlevel);
  604.   test_eq(VER_RELEASE, ver1.status);
  605.   test_streq("alpha", ver1.status_tag);
  606.   test_eq(0, tor_version_parse("0.1.2.4", &ver1));
  607.   test_eq(0, ver1.major);
  608.   test_eq(1, ver1.minor);
  609.   test_eq(2, ver1.micro);
  610.   test_eq(4, ver1.patchlevel);
  611.   test_eq(VER_RELEASE, ver1.status);
  612.   test_streq("", ver1.status_tag);
  613. #define test_eq_vs(vs1, vs2) test_eq_type(version_status_t, "%d", (vs1), (vs2))
  614. #define test_v_i_o(val, ver, lst) 
  615.   test_eq_vs(val, tor_version_is_obsolete(ver, lst))
  616.   /* make sure tor_version_is_obsolete() works */
  617.   test_v_i_o(VS_OLD, "0.0.1", "Tor 0.0.2");
  618.   test_v_i_o(VS_OLD, "0.0.1", "0.0.2, Tor 0.0.3");
  619.   test_v_i_o(VS_OLD, "0.0.1", "0.0.2,Tor 0.0.3");
  620.   test_v_i_o(VS_OLD, "0.0.1","0.0.3,BetterTor 0.0.1");
  621.   test_v_i_o(VS_RECOMMENDED, "0.0.2", "Tor 0.0.2,Tor 0.0.3");
  622.   test_v_i_o(VS_NEW_IN_SERIES, "0.0.2", "Tor 0.0.2pre1,Tor 0.0.3");
  623.   test_v_i_o(VS_OLD, "0.0.2", "Tor 0.0.2.1,Tor 0.0.3");
  624.   test_v_i_o(VS_NEW, "0.1.0", "Tor 0.0.2,Tor 0.0.3");
  625.   test_v_i_o(VS_RECOMMENDED, "0.0.7rc2", "0.0.7,Tor 0.0.7rc2,Tor 0.0.8");
  626.   test_v_i_o(VS_OLD, "0.0.5.0", "0.0.5.1-cvs");
  627.   test_v_i_o(VS_NEW_IN_SERIES, "0.0.5.1-cvs", "0.0.5, 0.0.6");
  628.   /* Not on list, but newer than any in same series. */
  629.   test_v_i_o(VS_NEW_IN_SERIES, "0.1.0.3",
  630.              "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0");
  631.   /* Series newer than any on list. */
  632.   test_v_i_o(VS_NEW, "0.1.2.3", "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0");
  633.   /* Series older than any on list. */
  634.   test_v_i_o(VS_OLD, "0.0.1.3", "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0");
  635.   /* Not on list, not newer than any on same series. */
  636.   test_v_i_o(VS_UNRECOMMENDED, "0.1.0.1",
  637.              "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0");
  638.   /* On list, not newer than any on same series. */
  639.   test_v_i_o(VS_UNRECOMMENDED,
  640.              "0.1.0.1", "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0");
  641.   test_eq(0, tor_version_as_new_as("Tor 0.0.5", "0.0.9pre1-cvs"));
  642.   test_eq(1, tor_version_as_new_as(
  643.           "Tor 0.0.8 on Darwin 64-121-192-100.c3-0."
  644.           "sfpo-ubr1.sfrn-sfpo.ca.cable.rcn.com Power Macintosh",
  645.           "0.0.8rc2"));
  646.   test_eq(0, tor_version_as_new_as(
  647.           "Tor 0.0.8 on Darwin 64-121-192-100.c3-0."
  648.           "sfpo-ubr1.sfrn-sfpo.ca.cable.rcn.com Power Macintosh", "0.0.8.2"));
  649.   /* Now try svn revisions. */
  650.   test_eq(1, tor_version_as_new_as("Tor 0.2.1.0-dev (r100)",
  651.                                    "Tor 0.2.1.0-dev (r99)"));
  652.   test_eq(1, tor_version_as_new_as("Tor 0.2.1.0-dev (r100) on Banana Jr",
  653.                                    "Tor 0.2.1.0-dev (r99) on Hal 9000"));
  654.   test_eq(1, tor_version_as_new_as("Tor 0.2.1.0-dev (r100)",
  655.                                    "Tor 0.2.1.0-dev on Colossus"));
  656.   test_eq(0, tor_version_as_new_as("Tor 0.2.1.0-dev (r99)",
  657.                                    "Tor 0.2.1.0-dev (r100)"));
  658.   test_eq(0, tor_version_as_new_as("Tor 0.2.1.0-dev (r99) on MCP",
  659.                                    "Tor 0.2.1.0-dev (r100) on AM"));
  660.   test_eq(0, tor_version_as_new_as("Tor 0.2.1.0-dev",
  661.                                    "Tor 0.2.1.0-dev (r99)"));
  662.   test_eq(1, tor_version_as_new_as("Tor 0.2.1.1",
  663.                                    "Tor 0.2.1.0-dev (r99)"));
  664.  done:
  665.   if (r1)
  666.     routerinfo_free(r1);
  667.   if (r2)
  668.     routerinfo_free(r2);
  669.   tor_free(pk1_str);
  670.   tor_free(pk2_str);
  671.   tor_free(pk3_str);
  672.   if (pk1) crypto_free_pk_env(pk1);
  673.   if (pk2) crypto_free_pk_env(pk2);
  674.   if (pk3) crypto_free_pk_env(pk3);
  675.   if (rp1) routerinfo_free(rp1);
  676.   tor_free(dir1); /* XXXX And more !*/
  677.   tor_free(dir2); /* And more !*/
  678. }
  679. /** Run unit tests for misc directory functions. */
  680. static void
  681. test_dirutil(void)
  682. {
  683.   smartlist_t *sl = smartlist_create();
  684.   fp_pair_t *pair;
  685.   dir_split_resource_into_fingerprint_pairs(
  686.        /* Two pairs, out of order, with one duplicate. */
  687.        "73656372657420646174612E0000000000FFFFFF-"
  688.        "557365204145532d32353620696e73746561642e+"
  689.        "73656372657420646174612E0000000000FFFFFF-"
  690.        "557365204145532d32353620696e73746561642e+"
  691.        "48657861646563696d616c2069736e277420736f-"
  692.        "676f6f6420666f7220686964696e6720796f7572.z", sl);
  693.   test_eq(smartlist_len(sl), 2);
  694.   pair = smartlist_get(sl, 0);
  695.   test_memeq(pair->first,  "Hexadecimal isn't so", DIGEST_LEN);
  696.   test_memeq(pair->second, "good for hiding your", DIGEST_LEN);
  697.   pair = smartlist_get(sl, 1);
  698.   test_memeq(pair->first,  "secret data.xffxffxff", DIGEST_LEN);
  699.   test_memeq(pair->second, "Use AES-256 instead.", DIGEST_LEN);
  700.  done:
  701.   SMARTLIST_FOREACH(sl, fp_pair_t *, pair, tor_free(pair));
  702.   smartlist_free(sl);
  703. }
  704. extern const char AUTHORITY_CERT_1[];
  705. extern const char AUTHORITY_SIGNKEY_1[];
  706. extern const char AUTHORITY_CERT_2[];
  707. extern const char AUTHORITY_SIGNKEY_2[];
  708. extern const char AUTHORITY_CERT_3[];
  709. extern const char AUTHORITY_SIGNKEY_3[];
  710. /** Helper: Test that two networkstatus_voter_info_t do in fact represent the
  711.  * same voting authority, and that they do in fact have all the same
  712.  * information. */
  713. static void
  714. test_same_voter(networkstatus_voter_info_t *v1,
  715.                 networkstatus_voter_info_t *v2)
  716. {
  717.   test_streq(v1->nickname, v2->nickname);
  718.   test_memeq(v1->identity_digest, v2->identity_digest, DIGEST_LEN);
  719.   test_streq(v1->address, v2->address);
  720.   test_eq(v1->addr, v2->addr);
  721.   test_eq(v1->dir_port, v2->dir_port);
  722.   test_eq(v1->or_port, v2->or_port);
  723.   test_streq(v1->contact, v2->contact);
  724.   test_memeq(v1->vote_digest, v2->vote_digest, DIGEST_LEN);
  725.  done:
  726.   ;
  727. }
  728. /** Run unit tests for getting the median of a list. */
  729. static void
  730. test_util_order_functions(void)
  731. {
  732.   int lst[25], n = 0;
  733.   //  int a=12,b=24,c=25,d=60,e=77;
  734. #define median() median_int(lst, n)
  735.   lst[n++] = 12;
  736.   test_eq(12, median()); /* 12 */
  737.   lst[n++] = 77;
  738.   //smartlist_shuffle(sl);
  739.   test_eq(12, median()); /* 12, 77 */
  740.   lst[n++] = 77;
  741.   //smartlist_shuffle(sl);
  742.   test_eq(77, median()); /* 12, 77, 77 */
  743.   lst[n++] = 24;
  744.   test_eq(24, median()); /* 12,24,77,77 */
  745.   lst[n++] = 60;
  746.   lst[n++] = 12;
  747.   lst[n++] = 25;
  748.   //smartlist_shuffle(sl);
  749.   test_eq(25, median()); /* 12,12,24,25,60,77,77 */
  750. #undef median
  751.  done:
  752.   ;
  753. }
  754. /** Helper: Make a new routerinfo containing the right information for a
  755.  * given vote_routerstatus_t. */
  756. static routerinfo_t *
  757. generate_ri_from_rs(const vote_routerstatus_t *vrs)
  758. {
  759.   routerinfo_t *r;
  760.   const routerstatus_t *rs = &vrs->status;
  761.   static time_t published = 0;
  762.   r = tor_malloc_zero(sizeof(routerinfo_t));
  763.   memcpy(r->cache_info.identity_digest, rs->identity_digest, DIGEST_LEN);
  764.   memcpy(r->cache_info.signed_descriptor_digest, rs->descriptor_digest,
  765.          DIGEST_LEN);
  766.   r->cache_info.do_not_cache = 1;
  767.   r->cache_info.routerlist_index = -1;
  768.   r->cache_info.signed_descriptor_body =
  769.     tor_strdup("123456789012345678901234567890123");
  770.   r->cache_info.signed_descriptor_len =
  771.     strlen(r->cache_info.signed_descriptor_body);
  772.   r->exit_policy = smartlist_create();
  773.   r->cache_info.published_on = ++published + time(NULL);
  774.   return r;
  775. }
  776. /** Run unit tests for generating and parsing V3 consensus networkstatus
  777.  * documents. */
  778. static void
  779. test_v3_networkstatus(void)
  780. {
  781.   authority_cert_t *cert1=NULL, *cert2=NULL, *cert3=NULL;
  782.   crypto_pk_env_t *sign_skey_1=NULL, *sign_skey_2=NULL, *sign_skey_3=NULL;
  783.   crypto_pk_env_t *sign_skey_leg1=NULL;
  784.   const char *msg=NULL;
  785.   time_t now = time(NULL);
  786.   networkstatus_voter_info_t *voter;
  787.   networkstatus_t *vote=NULL, *v1=NULL, *v2=NULL, *v3=NULL, *con=NULL;
  788.   vote_routerstatus_t *vrs;
  789.   routerstatus_t *rs;
  790.   char *v1_text=NULL, *v2_text=NULL, *v3_text=NULL, *consensus_text=NULL, *cp;
  791.   smartlist_t *votes = smartlist_create();
  792.   /* For generating the two other consensuses. */
  793.   char *detached_text1=NULL, *detached_text2=NULL;
  794.   char *consensus_text2=NULL, *consensus_text3=NULL;
  795.   networkstatus_t *con2=NULL, *con3=NULL;
  796.   ns_detached_signatures_t *dsig1=NULL, *dsig2=NULL;
  797.   /* Parse certificates and keys. */
  798.   cert1 = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL);
  799.   test_assert(cert1);
  800.   test_assert(cert1->is_cross_certified);
  801.   cert2 = authority_cert_parse_from_string(AUTHORITY_CERT_2, NULL);
  802.   test_assert(cert2);
  803.   cert3 = authority_cert_parse_from_string(AUTHORITY_CERT_3, NULL);
  804.   test_assert(cert3);
  805.   sign_skey_1 = crypto_new_pk_env();
  806.   sign_skey_2 = crypto_new_pk_env();
  807.   sign_skey_3 = crypto_new_pk_env();
  808.   sign_skey_leg1 = pk_generate(4);
  809.   test_assert(!crypto_pk_read_private_key_from_string(sign_skey_1,
  810.                                                       AUTHORITY_SIGNKEY_1));
  811.   test_assert(!crypto_pk_read_private_key_from_string(sign_skey_2,
  812.                                                       AUTHORITY_SIGNKEY_2));
  813.   test_assert(!crypto_pk_read_private_key_from_string(sign_skey_3,
  814.                                                       AUTHORITY_SIGNKEY_3));
  815.   test_assert(!crypto_pk_cmp_keys(sign_skey_1, cert1->signing_key));
  816.   test_assert(!crypto_pk_cmp_keys(sign_skey_2, cert2->signing_key));
  817.   /*
  818.    * Set up a vote; generate it; try to parse it.
  819.    */
  820.   vote = tor_malloc_zero(sizeof(networkstatus_t));
  821.   vote->type = NS_TYPE_VOTE;
  822.   vote->published = now;
  823.   vote->valid_after = now+1000;
  824.   vote->fresh_until = now+2000;
  825.   vote->valid_until = now+3000;
  826.   vote->vote_seconds = 100;
  827.   vote->dist_seconds = 200;
  828.   vote->supported_methods = smartlist_create();
  829.   smartlist_split_string(vote->supported_methods, "1 2 3", NULL, 0, -1);
  830.   vote->client_versions = tor_strdup("0.1.2.14,0.1.2.15");
  831.   vote->server_versions = tor_strdup("0.1.2.14,0.1.2.15,0.1.2.16");
  832.   vote->known_flags = smartlist_create();
  833.   smartlist_split_string(vote->known_flags,
  834.                      "Authority Exit Fast Guard Running Stable V2Dir Valid",
  835.                      0, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
  836.   vote->voters = smartlist_create();
  837.   voter = tor_malloc_zero(sizeof(networkstatus_voter_info_t));
  838.   voter->nickname = tor_strdup("Voter1");
  839.   voter->address = tor_strdup("1.2.3.4");
  840.   voter->addr = 0x01020304;
  841.   voter->dir_port = 80;
  842.   voter->or_port = 9000;
  843.   voter->contact = tor_strdup("voter@example.com");
  844.   crypto_pk_get_digest(cert1->identity_key, voter->identity_digest);
  845.   smartlist_add(vote->voters, voter);
  846.   vote->cert = authority_cert_dup(cert1);
  847.   vote->routerstatus_list = smartlist_create();
  848.   /* add the first routerstatus. */
  849.   vrs = tor_malloc_zero(sizeof(vote_routerstatus_t));
  850.   rs = &vrs->status;
  851.   vrs->version = tor_strdup("0.1.2.14");
  852.   rs->published_on = now-1500;
  853.   strlcpy(rs->nickname, "router2", sizeof(rs->nickname));
  854.   memset(rs->identity_digest, 3, DIGEST_LEN);
  855.   memset(rs->descriptor_digest, 78, DIGEST_LEN);
  856.   rs->addr = 0x99008801;
  857.   rs->or_port = 443;
  858.   rs->dir_port = 8000;
  859.   /* all flags but running cleared */
  860.   rs->is_running = 1;
  861.   smartlist_add(vote->routerstatus_list, vrs);
  862.   test_assert(router_add_to_routerlist(generate_ri_from_rs(vrs), &msg,0,0)>=0);
  863.   /* add the second routerstatus. */
  864.   vrs = tor_malloc_zero(sizeof(vote_routerstatus_t));
  865.   rs = &vrs->status;
  866.   vrs->version = tor_strdup("0.2.0.5");
  867.   rs->published_on = now-1000;
  868.   strlcpy(rs->nickname, "router1", sizeof(rs->nickname));
  869.   memset(rs->identity_digest, 5, DIGEST_LEN);
  870.   memset(rs->descriptor_digest, 77, DIGEST_LEN);
  871.   rs->addr = 0x99009901;
  872.   rs->or_port = 443;
  873.   rs->dir_port = 0;
  874.   rs->is_exit = rs->is_stable = rs->is_fast = rs->is_running =
  875.     rs->is_valid = rs->is_v2_dir = rs->is_possible_guard = 1;
  876.   smartlist_add(vote->routerstatus_list, vrs);
  877.   test_assert(router_add_to_routerlist(generate_ri_from_rs(vrs), &msg,0,0)>=0);
  878.   /* add the third routerstatus. */
  879.   vrs = tor_malloc_zero(sizeof(vote_routerstatus_t));
  880.   rs = &vrs->status;
  881.   vrs->version = tor_strdup("0.1.0.3");
  882.   rs->published_on = now-1000;
  883.   strlcpy(rs->nickname, "router3", sizeof(rs->nickname));
  884.   memset(rs->identity_digest, 33, DIGEST_LEN);
  885.   memset(rs->descriptor_digest, 79, DIGEST_LEN);
  886.   rs->addr = 0xAA009901;
  887.   rs->or_port = 400;
  888.   rs->dir_port = 9999;
  889.   rs->is_authority = rs->is_exit = rs->is_stable = rs->is_fast =
  890.     rs->is_running = rs->is_valid = rs->is_v2_dir = rs->is_possible_guard = 1;
  891.   smartlist_add(vote->routerstatus_list, vrs);
  892.   test_assert(router_add_to_routerlist(generate_ri_from_rs(vrs), &msg,0,0)>=0);
  893.   /* add a fourth routerstatus that is not running. */
  894.   vrs = tor_malloc_zero(sizeof(vote_routerstatus_t));
  895.   rs = &vrs->status;
  896.   vrs->version = tor_strdup("0.1.6.3");
  897.   rs->published_on = now-1000;
  898.   strlcpy(rs->nickname, "router4", sizeof(rs->nickname));
  899.   memset(rs->identity_digest, 34, DIGEST_LEN);
  900.   memset(rs->descriptor_digest, 48, DIGEST_LEN);
  901.   rs->addr = 0xC0000203;
  902.   rs->or_port = 500;
  903.   rs->dir_port = 1999;
  904.   /* Running flag (and others) cleared */
  905.   smartlist_add(vote->routerstatus_list, vrs);
  906.   test_assert(router_add_to_routerlist(generate_ri_from_rs(vrs), &msg,0,0)>=0);
  907.   /* dump the vote and try to parse it. */
  908.   v1_text = format_networkstatus_vote(sign_skey_1, vote);
  909.   test_assert(v1_text);
  910.   v1 = networkstatus_parse_vote_from_string(v1_text, NULL, NS_TYPE_VOTE);
  911.   test_assert(v1);
  912.   /* Make sure the parsed thing was right. */
  913.   test_eq(v1->type, NS_TYPE_VOTE);
  914.   test_eq(v1->published, vote->published);
  915.   test_eq(v1->valid_after, vote->valid_after);
  916.   test_eq(v1->fresh_until, vote->fresh_until);
  917.   test_eq(v1->valid_until, vote->valid_until);
  918.   test_eq(v1->vote_seconds, vote->vote_seconds);
  919.   test_eq(v1->dist_seconds, vote->dist_seconds);
  920.   test_streq(v1->client_versions, vote->client_versions);
  921.   test_streq(v1->server_versions, vote->server_versions);
  922.   test_assert(v1->voters && smartlist_len(v1->voters));
  923.   voter = smartlist_get(v1->voters, 0);
  924.   test_streq(voter->nickname, "Voter1");
  925.   test_streq(voter->address, "1.2.3.4");
  926.   test_eq(voter->addr, 0x01020304);
  927.   test_eq(voter->dir_port, 80);
  928.   test_eq(voter->or_port, 9000);
  929.   test_streq(voter->contact, "voter@example.com");
  930.   test_assert(v1->cert);
  931.   test_assert(!crypto_pk_cmp_keys(sign_skey_1, v1->cert->signing_key));
  932.   cp = smartlist_join_strings(v1->known_flags, ":", 0, NULL);
  933.   test_streq(cp, "Authority:Exit:Fast:Guard:Running:Stable:V2Dir:Valid");
  934.   tor_free(cp);
  935.   test_eq(smartlist_len(v1->routerstatus_list), 4);
  936.   /* Check the first routerstatus. */
  937.   vrs = smartlist_get(v1->routerstatus_list, 0);
  938.   rs = &vrs->status;
  939.   test_streq(vrs->version, "0.1.2.14");
  940.   test_eq(rs->published_on, now-1500);
  941.   test_streq(rs->nickname, "router2");
  942.   test_memeq(rs->identity_digest,
  943.              "x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3",
  944.              DIGEST_LEN);
  945.   test_memeq(rs->descriptor_digest, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN);
  946.   test_eq(rs->addr, 0x99008801);
  947.   test_eq(rs->or_port, 443);
  948.   test_eq(rs->dir_port, 8000);
  949.   test_eq(vrs->flags, U64_LITERAL(16)); // no flags except "running"
  950.   /* Check the second routerstatus. */
  951.   vrs = smartlist_get(v1->routerstatus_list, 1);
  952.   rs = &vrs->status;
  953.   test_streq(vrs->version, "0.2.0.5");
  954.   test_eq(rs->published_on, now-1000);
  955.   test_streq(rs->nickname, "router1");
  956.   test_memeq(rs->identity_digest,
  957.              "x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5",
  958.              DIGEST_LEN);
  959.   test_memeq(rs->descriptor_digest, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN);
  960.   test_eq(rs->addr, 0x99009901);
  961.   test_eq(rs->or_port, 443);
  962.   test_eq(rs->dir_port, 0);
  963.   test_eq(vrs->flags, U64_LITERAL(254)); // all flags except "authority."
  964.   /* Generate second vote. It disagrees on some of the times,
  965.    * and doesn't list versions, and knows some crazy flags */
  966.   vote->published = now+1;
  967.   vote->fresh_until = now+3005;
  968.   vote->dist_seconds = 300;
  969.   authority_cert_free(vote->cert);
  970.   vote->cert = authority_cert_dup(cert2);
  971.   tor_free(vote->client_versions);
  972.   tor_free(vote->server_versions);
  973.   voter = smartlist_get(vote->voters, 0);
  974.   tor_free(voter->nickname);
  975.   tor_free(voter->address);
  976.   voter->nickname = tor_strdup("Voter2");
  977.   voter->address = tor_strdup("2.3.4.5");
  978.   voter->addr = 0x02030405;
  979.   crypto_pk_get_digest(cert2->identity_key, voter->identity_digest);
  980.   smartlist_add(vote->known_flags, tor_strdup("MadeOfCheese"));
  981.   smartlist_add(vote->known_flags, tor_strdup("MadeOfTin"));
  982.   smartlist_sort_strings(vote->known_flags);
  983.   vrs = smartlist_get(vote->routerstatus_list, 2);
  984.   smartlist_del_keeporder(vote->routerstatus_list, 2);
  985.   tor_free(vrs->version);
  986.   tor_free(vrs);
  987.   vrs = smartlist_get(vote->routerstatus_list, 0);
  988.   vrs->status.is_fast = 1;
  989.   /* generate and parse. */
  990.   v2_text = format_networkstatus_vote(sign_skey_2, vote);
  991.   test_assert(v2_text);
  992.   v2 = networkstatus_parse_vote_from_string(v2_text, NULL, NS_TYPE_VOTE);
  993.   test_assert(v2);
  994.   /* Check that flags come out right.*/
  995.   cp = smartlist_join_strings(v2->known_flags, ":", 0, NULL);
  996.   test_streq(cp, "Authority:Exit:Fast:Guard:MadeOfCheese:MadeOfTin:"
  997.              "Running:Stable:V2Dir:Valid");
  998.   tor_free(cp);
  999.   vrs = smartlist_get(v2->routerstatus_list, 1);
  1000.   /* 1023 - authority(1) - madeofcheese(16) - madeoftin(32) */
  1001.   test_eq(vrs->flags, U64_LITERAL(974));
  1002.   /* Generate the third vote. */
  1003.   vote->published = now;
  1004.   vote->fresh_until = now+2003;
  1005.   vote->dist_seconds = 250;
  1006.   authority_cert_free(vote->cert);
  1007.   vote->cert = authority_cert_dup(cert3);
  1008.   smartlist_add(vote->supported_methods, tor_strdup("4"));
  1009.   vote->client_versions = tor_strdup("0.1.2.14,0.1.2.17");
  1010.   vote->server_versions = tor_strdup("0.1.2.10,0.1.2.15,0.1.2.16");
  1011.   voter = smartlist_get(vote->voters, 0);
  1012.   tor_free(voter->nickname);
  1013.   tor_free(voter->address);
  1014.   voter->nickname = tor_strdup("Voter3");
  1015.   voter->address = tor_strdup("3.4.5.6");
  1016.   voter->addr = 0x03040506;
  1017.   crypto_pk_get_digest(cert3->identity_key, voter->identity_digest);
  1018.   /* This one has a legacy id. */
  1019.   memset(voter->legacy_id_digest, (int)'A', DIGEST_LEN);
  1020.   vrs = smartlist_get(vote->routerstatus_list, 0);
  1021.   smartlist_del_keeporder(vote->routerstatus_list, 0);
  1022.   tor_free(vrs->version);
  1023.   tor_free(vrs);
  1024.   vrs = smartlist_get(vote->routerstatus_list, 0);
  1025.   memset(vrs->status.descriptor_digest, (int)'Z', DIGEST_LEN);
  1026.   test_assert(router_add_to_routerlist(generate_ri_from_rs(vrs), &msg,0,0)>=0);
  1027.   v3_text = format_networkstatus_vote(sign_skey_3, vote);
  1028.   test_assert(v3_text);
  1029.   v3 = networkstatus_parse_vote_from_string(v3_text, NULL, NS_TYPE_VOTE);
  1030.   test_assert(v3);
  1031.   /* Compute a consensus as voter 3. */
  1032.   smartlist_add(votes, v3);
  1033.   smartlist_add(votes, v1);
  1034.   smartlist_add(votes, v2);
  1035.   consensus_text = networkstatus_compute_consensus(votes, 3,
  1036.                                                    cert3->identity_key,
  1037.                                                    sign_skey_3,
  1038.                                                    "AAAAAAAAAAAAAAAAAAAA",
  1039.                                                    sign_skey_leg1);
  1040.   test_assert(consensus_text);
  1041.   con = networkstatus_parse_vote_from_string(consensus_text, NULL,
  1042.                                              NS_TYPE_CONSENSUS);
  1043.   test_assert(con);
  1044.   //log_notice(LD_GENERAL, "<<%s>>n<<%s>>n<<%s>>n",
  1045.   //           v1_text, v2_text, v3_text);
  1046.   /* Check consensus contents. */
  1047.   test_assert(con->type == NS_TYPE_CONSENSUS);
  1048.   test_eq(con->published, 0); /* this field only appears in votes. */
  1049.   test_eq(con->valid_after, now+1000);
  1050.   test_eq(con->fresh_until, now+2003); /* median */
  1051.   test_eq(con->valid_until, now+3000);
  1052.   test_eq(con->vote_seconds, 100);
  1053.   test_eq(con->dist_seconds, 250); /* median */
  1054.   test_streq(con->client_versions, "0.1.2.14");
  1055.   test_streq(con->server_versions, "0.1.2.15,0.1.2.16");
  1056.   cp = smartlist_join_strings(v2->known_flags, ":", 0, NULL);
  1057.   test_streq(cp, "Authority:Exit:Fast:Guard:MadeOfCheese:MadeOfTin:"
  1058.              "Running:Stable:V2Dir:Valid");
  1059.   tor_free(cp);
  1060.   test_eq(4, smartlist_len(con->voters)); /*3 voters, 1 legacy key.*/
  1061.   /* The voter id digests should be in this order. */
  1062.   test_assert(memcmp(cert2->cache_info.identity_digest,
  1063.                      cert1->cache_info.identity_digest,DIGEST_LEN)<0);
  1064.   test_assert(memcmp(cert1->cache_info.identity_digest,
  1065.                      cert3->cache_info.identity_digest,DIGEST_LEN)<0);
  1066.   test_same_voter(smartlist_get(con->voters, 1),
  1067.                   smartlist_get(v2->voters, 0));
  1068.   test_same_voter(smartlist_get(con->voters, 2),
  1069.                   smartlist_get(v1->voters, 0));
  1070.   test_same_voter(smartlist_get(con->voters, 3),
  1071.                   smartlist_get(v3->voters, 0));
  1072.   test_assert(!con->cert);
  1073.   test_eq(2, smartlist_len(con->routerstatus_list));
  1074.   /* There should be two listed routers: one with identity 3, one with
  1075.    * identity 5. */
  1076.   /* This one showed up in 2 digests. */
  1077.   rs = smartlist_get(con->routerstatus_list, 0);
  1078.   test_memeq(rs->identity_digest,
  1079.              "x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3",
  1080.              DIGEST_LEN);
  1081.   test_memeq(rs->descriptor_digest, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN);
  1082.   test_assert(!rs->is_authority);
  1083.   test_assert(!rs->is_exit);
  1084.   test_assert(!rs->is_fast);
  1085.   test_assert(!rs->is_possible_guard);
  1086.   test_assert(!rs->is_stable);
  1087.   test_assert(rs->is_running); /* If it wasn't running it wouldn't be here */
  1088.   test_assert(!rs->is_v2_dir);
  1089.   test_assert(!rs->is_valid);
  1090.   test_assert(!rs->is_named);
  1091.   /* XXXX check version */
  1092.   rs = smartlist_get(con->routerstatus_list, 1);
  1093.   /* This one showed up in 3 digests. Twice with ID 'M', once with 'Z'.  */
  1094.   test_memeq(rs->identity_digest,
  1095.              "x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5x5",
  1096.              DIGEST_LEN);
  1097.   test_streq(rs->nickname, "router1");
  1098.   test_memeq(rs->descriptor_digest, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN);
  1099.   test_eq(rs->published_on, now-1000);
  1100.   test_eq(rs->addr, 0x99009901);
  1101.   test_eq(rs->or_port, 443);
  1102.   test_eq(rs->dir_port, 0);
  1103.   test_assert(!rs->is_authority);
  1104.   test_assert(rs->is_exit);
  1105.   test_assert(rs->is_fast);
  1106.   test_assert(rs->is_possible_guard);
  1107.   test_assert(rs->is_stable);
  1108.   test_assert(rs->is_running);
  1109.   test_assert(rs->is_v2_dir);
  1110.   test_assert(rs->is_valid);
  1111.   test_assert(!rs->is_named);
  1112.   /* XXXX check version */
  1113.   // x231
  1114.   // x213
  1115.   /* Check signatures.  the first voter is a pseudo-entry with a legacy key.
  1116.    * The second one hasn't signed.  The fourth one has signed: validate it. */
  1117.   voter = smartlist_get(con->voters, 1);
  1118.   test_assert(!voter->signature);
  1119.   test_assert(!voter->good_signature);
  1120.   test_assert(!voter->bad_signature);
  1121.   voter = smartlist_get(con->voters, 3);
  1122.   test_assert(voter->signature);
  1123.   test_assert(!voter->good_signature);
  1124.   test_assert(!voter->bad_signature);
  1125.   test_assert(!networkstatus_check_voter_signature(con,
  1126.                                                smartlist_get(con->voters, 3),
  1127.                                                cert3));
  1128.   test_assert(voter->signature);
  1129.   test_assert(voter->good_signature);
  1130.   test_assert(!voter->bad_signature);
  1131.   {
  1132.     const char *msg=NULL;
  1133.     /* Compute the other two signed consensuses. */
  1134.     smartlist_shuffle(votes);
  1135.     consensus_text2 = networkstatus_compute_consensus(votes, 3,
  1136.                                                       cert2->identity_key,
  1137.                                                       sign_skey_2, NULL,NULL);
  1138.     smartlist_shuffle(votes);
  1139.     consensus_text3 = networkstatus_compute_consensus(votes, 3,
  1140.                                                       cert1->identity_key,
  1141.                                                       sign_skey_1, NULL,NULL);
  1142.     test_assert(consensus_text2);
  1143.     test_assert(consensus_text3);
  1144.     con2 = networkstatus_parse_vote_from_string(consensus_text2, NULL,
  1145.                                                 NS_TYPE_CONSENSUS);
  1146.     con3 = networkstatus_parse_vote_from_string(consensus_text3, NULL,
  1147.                                                 NS_TYPE_CONSENSUS);
  1148.     test_assert(con2);
  1149.     test_assert(con3);
  1150.     /* All three should have the same digest. */
  1151.     test_memeq(con->networkstatus_digest, con2->networkstatus_digest,
  1152.                DIGEST_LEN);
  1153.     test_memeq(con->networkstatus_digest, con3->networkstatus_digest,
  1154.                DIGEST_LEN);
  1155.     /* Extract a detached signature from con3. */
  1156.     detached_text1 = networkstatus_get_detached_signatures(con3);
  1157.     tor_assert(detached_text1);
  1158.     /* Try to parse it. */
  1159.     dsig1 = networkstatus_parse_detached_signatures(detached_text1, NULL);
  1160.     tor_assert(dsig1);
  1161.     /* Are parsed values as expected? */
  1162.     test_eq(dsig1->valid_after, con3->valid_after);
  1163.     test_eq(dsig1->fresh_until, con3->fresh_until);
  1164.     test_eq(dsig1->valid_until, con3->valid_until);
  1165.     test_memeq(dsig1->networkstatus_digest, con3->networkstatus_digest,
  1166.                DIGEST_LEN);
  1167.     test_eq(1, smartlist_len(dsig1->signatures));
  1168.     voter = smartlist_get(dsig1->signatures, 0);
  1169.     test_memeq(voter->identity_digest, cert1->cache_info.identity_digest,
  1170.                DIGEST_LEN);
  1171.     /* Try adding it to con2. */
  1172.     detached_text2 = networkstatus_get_detached_signatures(con2);
  1173.     test_eq(1, networkstatus_add_detached_signatures(con2, dsig1, &msg));
  1174.     tor_free(detached_text2);
  1175.     detached_text2 = networkstatus_get_detached_signatures(con2);
  1176.     //printf("n<%s>n", detached_text2);
  1177.     dsig2 = networkstatus_parse_detached_signatures(detached_text2, NULL);
  1178.     test_assert(dsig2);
  1179.     /*
  1180.     printf("n");
  1181.     SMARTLIST_FOREACH(dsig2->signatures, networkstatus_voter_info_t *, vi, {
  1182.         char hd[64];
  1183.         base16_encode(hd, sizeof(hd), vi->identity_digest, DIGEST_LEN);
  1184.         printf("%sn", hd);
  1185.       });
  1186.     */
  1187.     test_eq(2, smartlist_len(dsig2->signatures));
  1188.     /* Try adding to con2 twice; verify that nothing changes. */
  1189.     test_eq(0, networkstatus_add_detached_signatures(con2, dsig1, &msg));
  1190.     /* Add to con. */
  1191.     test_eq(2, networkstatus_add_detached_signatures(con, dsig2, &msg));
  1192.     /* Check signatures */
  1193.     test_assert(!networkstatus_check_voter_signature(con,
  1194.                                                smartlist_get(con->voters, 1),
  1195.                                                cert2));
  1196.     test_assert(!networkstatus_check_voter_signature(con,
  1197.                                                smartlist_get(con->voters, 2),
  1198.                                                cert1));
  1199.   }
  1200.  done:
  1201.   smartlist_free(votes);
  1202.   tor_free(v1_text);
  1203.   tor_free(v2_text);
  1204.   tor_free(v3_text);
  1205.   tor_free(consensus_text);
  1206.   if (vote)
  1207.     networkstatus_vote_free(vote);
  1208.   if (v1)
  1209.     networkstatus_vote_free(v1);
  1210.   if (v2)
  1211.     networkstatus_vote_free(v2);
  1212.   if (v3)
  1213.     networkstatus_vote_free(v3);
  1214.   if (con)
  1215.     networkstatus_vote_free(con);
  1216.   if (sign_skey_1)
  1217.     crypto_free_pk_env(sign_skey_1);
  1218.   if (sign_skey_2)
  1219.     crypto_free_pk_env(sign_skey_2);
  1220.   if (sign_skey_3)
  1221.     crypto_free_pk_env(sign_skey_3);
  1222.   if (sign_skey_leg1)
  1223.     crypto_free_pk_env(sign_skey_leg1);
  1224.   if (cert1)
  1225.     authority_cert_free(cert1);
  1226.   if (cert2)
  1227.     authority_cert_free(cert2);
  1228.   if (cert3)
  1229.     authority_cert_free(cert3);
  1230.   tor_free(consensus_text2);
  1231.   tor_free(consensus_text3);
  1232.   tor_free(detached_text1);
  1233.   tor_free(detached_text2);
  1234.   if (con2)
  1235.     networkstatus_vote_free(con2);
  1236.   if (con3)
  1237.     networkstatus_vote_free(con3);
  1238.   if (dsig1)
  1239.     ns_detached_signatures_free(dsig1);
  1240.   if (dsig2)
  1241.     ns_detached_signatures_free(dsig2);
  1242. }
  1243. /** Helper: Parse the exit policy string in <b>policy_str</b>, and make sure
  1244.  * that policies_summarize() produces the string <b>expected_summary</b> from
  1245.  * it. */
  1246. static void
  1247. test_policy_summary_helper(const char *policy_str,
  1248.                            const char *expected_summary)
  1249. {
  1250.   config_line_t line;
  1251.   smartlist_t *policy = smartlist_create();
  1252.   char *summary = NULL;
  1253.   int r;
  1254.   line.key = (char*)"foo";
  1255.   line.value = (char *)policy_str;
  1256.   line.next = NULL;
  1257.   r = policies_parse_exit_policy(&line, &policy, 0, NULL);
  1258.   test_eq(r, 0);
  1259.   summary = policy_summarize(policy);
  1260.   test_assert(summary != NULL);
  1261.   test_streq(summary, expected_summary);
  1262.  done:
  1263.   tor_free(summary);
  1264.   if (policy)
  1265.     addr_policy_list_free(policy);
  1266. }
  1267. /** Run unit tests for generating summary lines of exit policies */
  1268. static void
  1269. test_policies(void)
  1270. {
  1271.   int i;
  1272.   smartlist_t *policy = NULL, *policy2 = NULL;
  1273.   addr_policy_t *p;
  1274.   tor_addr_t tar;
  1275.   config_line_t line;
  1276.   smartlist_t *sm = NULL;
  1277.   char *policy_str = NULL;
  1278.   policy = smartlist_create();
  1279.   p = router_parse_addr_policy_item_from_string("reject 192.168.0.0/16:*",-1);
  1280.   test_assert(p != NULL);
  1281.   test_eq(ADDR_POLICY_REJECT, p->policy_type);
  1282.   tor_addr_from_ipv4h(&tar, 0xc0a80000u);
  1283.   test_eq(0, tor_addr_compare(&p->addr, &tar, CMP_EXACT));
  1284.   test_eq(16, p->maskbits);
  1285.   test_eq(1, p->prt_min);
  1286.   test_eq(65535, p->prt_max);
  1287.   smartlist_add(policy, p);
  1288.   test_assert(ADDR_POLICY_ACCEPTED ==
  1289.           compare_addr_to_addr_policy(0x01020304u, 2, policy));
  1290.   test_assert(ADDR_POLICY_PROBABLY_ACCEPTED ==
  1291.           compare_addr_to_addr_policy(0, 2, policy));
  1292.   test_assert(ADDR_POLICY_REJECTED ==
  1293.           compare_addr_to_addr_policy(0xc0a80102, 2, policy));
  1294.   policy2 = NULL;
  1295.   test_assert(0 == policies_parse_exit_policy(NULL, &policy2, 1, NULL));
  1296.   test_assert(policy2);
  1297.   test_assert(!exit_policy_is_general_exit(policy));
  1298.   test_assert(exit_policy_is_general_exit(policy2));
  1299.   test_assert(!exit_policy_is_general_exit(NULL));
  1300.   test_assert(cmp_addr_policies(policy, policy2));
  1301.   test_assert(cmp_addr_policies(policy, NULL));
  1302.   test_assert(!cmp_addr_policies(policy2, policy2));
  1303.   test_assert(!cmp_addr_policies(NULL, NULL));
  1304.   test_assert(!policy_is_reject_star(policy2));
  1305.   test_assert(policy_is_reject_star(policy));
  1306.   test_assert(policy_is_reject_star(NULL));
  1307.   addr_policy_list_free(policy);
  1308.   policy = NULL;
  1309.   /* make sure compacting logic works. */
  1310.   policy = NULL;
  1311.   line.key = (char*)"foo";
  1312.   line.value = (char*)"accept *:80,reject private:*,reject *:*";
  1313.   line.next = NULL;
  1314.   test_assert(0 == policies_parse_exit_policy(&line, &policy, 0, NULL));
  1315.   test_assert(policy);
  1316.   //test_streq(policy->string, "accept *:80");
  1317.   //test_streq(policy->next->string, "reject *:*");
  1318.   test_eq(smartlist_len(policy), 2);
  1319.   /* test policy summaries */
  1320.   /* check if we properly ignore private IP addresses */
  1321.   test_policy_summary_helper("reject 192.168.0.0/16:*,"
  1322.                              "reject 0.0.0.0/8:*,"
  1323.                              "reject 10.0.0.0/8:*,"
  1324.                              "accept *:10-30,"
  1325.                              "accept *:90,"
  1326.                              "reject *:*",
  1327.                              "accept 10-30,90");
  1328.   /* check all accept policies, and proper counting of rejects */
  1329.   test_policy_summary_helper("reject 11.0.0.0/9:80,"
  1330.                              "reject 12.0.0.0/9:80,"
  1331.                              "reject 13.0.0.0/9:80,"
  1332.                              "reject 14.0.0.0/9:80,"
  1333.                              "accept *:*", "accept 1-65535");
  1334.   test_policy_summary_helper("reject 11.0.0.0/9:80,"
  1335.                              "reject 12.0.0.0/9:80,"
  1336.                              "reject 13.0.0.0/9:80,"
  1337.                              "reject 14.0.0.0/9:80,"
  1338.                              "reject 15.0.0.0:81,"
  1339.                              "accept *:*", "accept 1-65535");
  1340.   test_policy_summary_helper("reject 11.0.0.0/9:80,"
  1341.                              "reject 12.0.0.0/9:80,"
  1342.                              "reject 13.0.0.0/9:80,"
  1343.                              "reject 14.0.0.0/9:80,"
  1344.                              "reject 15.0.0.0:80,"
  1345.                              "accept *:*",
  1346.                              "reject 80");
  1347.   /* no exits */
  1348.   test_policy_summary_helper("accept 11.0.0.0/9:80,"
  1349.                              "reject *:*",
  1350.                              "reject 1-65535");
  1351.   /* port merging */
  1352.   test_policy_summary_helper("accept *:80,"
  1353.                              "accept *:81,"
  1354.                              "accept *:100-110,"
  1355.                              "accept *:111,"
  1356.                              "reject *:*",
  1357.                              "accept 80-81,100-111");
  1358.   /* border ports */
  1359.   test_policy_summary_helper("accept *:1,"
  1360.                              "accept *:3,"
  1361.                              "accept *:65535,"
  1362.                              "reject *:*",
  1363.                              "accept 1,3,65535");
  1364.   /* holes */
  1365.   test_policy_summary_helper("accept *:1,"
  1366.                              "accept *:3,"
  1367.                              "accept *:5,"
  1368.                              "accept *:7,"
  1369.                              "reject *:*",
  1370.                              "accept 1,3,5,7");
  1371.   test_policy_summary_helper("reject *:1,"
  1372.                              "reject *:3,"
  1373.                              "reject *:5,"
  1374.                              "reject *:7,"
  1375.                              "accept *:*",
  1376.                              "reject 1,3,5,7");
  1377.   /* truncation ports */
  1378.   sm = smartlist_create();
  1379.   for (i=1; i<2000; i+=2) {
  1380.     char buf[POLICY_BUF_LEN];
  1381.     tor_snprintf(buf, sizeof(buf), "reject *:%d", i);
  1382.     smartlist_add(sm, tor_strdup(buf));
  1383.   }
  1384.   smartlist_add(sm, tor_strdup("accept *:*"));
  1385.   policy_str = smartlist_join_strings(sm, ",", 0, NULL);
  1386.   test_policy_summary_helper( policy_str,
  1387.     "accept 2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,"
  1388.     "46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,"
  1389.     "92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,"
  1390.     "130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,"
  1391.     "166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,"
  1392.     "202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,"
  1393.     "238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,"
  1394.     "274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,"
  1395.     "310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344,"
  1396.     "346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,378,380,"
  1397.     "382,384,386,388,390,392,394,396,398,400,402,404,406,408,410,412,414,416,"
  1398.     "418,420,422,424,426,428,430,432,434,436,438,440,442,444,446,448,450,452,"
  1399.     "454,456,458,460,462,464,466,468,470,472,474,476,478,480,482,484,486,488,"
  1400.     "490,492,494,496,498,500,502,504,506,508,510,512,514,516,518,520,522");
  1401.  done:
  1402.   if (policy)
  1403.     addr_policy_list_free(policy);
  1404.   if (policy2)
  1405.     addr_policy_list_free(policy2);
  1406.   tor_free(policy_str);
  1407.   if (sm) {
  1408.     SMARTLIST_FOREACH(sm, char *, s, tor_free(s));
  1409.     smartlist_free(sm);
  1410.   }
  1411. }
  1412. /** Run unit tests for basic rendezvous functions. */
  1413. static void
  1414. test_rend_fns(void)
  1415. {
  1416.   char address1[] = "fooaddress.onion";
  1417.   char address2[] = "aaaaaaaaaaaaaaaa.onion";
  1418.   char address3[] = "fooaddress.exit";
  1419.   char address4[] = "www.torproject.org";
  1420.   rend_service_descriptor_t *d1 =
  1421.     tor_malloc_zero(sizeof(rend_service_descriptor_t));
  1422.   rend_service_descriptor_t *d2 = NULL;
  1423.   char *encoded = NULL;
  1424.   size_t len;
  1425.   time_t now;
  1426.   int i;
  1427.   crypto_pk_env_t *pk1 = pk_generate(0), *pk2 = pk_generate(1);
  1428.   /* Test unversioned (v0) descriptor */
  1429.   d1->pk = crypto_pk_dup_key(pk1);
  1430.   now = time(NULL);
  1431.   d1->timestamp = now;
  1432.   d1->version = 0;
  1433.   d1->intro_nodes = smartlist_create();
  1434.   for (i = 0; i < 3; i++) {
  1435.     rend_intro_point_t *intro = tor_malloc_zero(sizeof(rend_intro_point_t));
  1436.     intro->extend_info = tor_malloc_zero(sizeof(extend_info_t));
  1437.     crypto_rand(intro->extend_info->identity_digest, DIGEST_LEN);
  1438.     intro->extend_info->nickname[0] = '$';
  1439.     base16_encode(intro->extend_info->nickname+1, HEX_DIGEST_LEN+1,
  1440.                   intro->extend_info->identity_digest, DIGEST_LEN);
  1441.     smartlist_add(d1->intro_nodes, intro);
  1442.   }
  1443.   test_assert(! rend_encode_service_descriptor(d1, pk1, &encoded, &len));
  1444.   d2 = rend_parse_service_descriptor(encoded, len);
  1445.   test_assert(d2);
  1446.   test_assert(!crypto_pk_cmp_keys(d1->pk, d2->pk));
  1447.   test_eq(d2->timestamp, now);
  1448.   test_eq(d2->version, 0);
  1449.   test_eq(d2->protocols, 1<<2);
  1450.   test_eq(smartlist_len(d2->intro_nodes), 3);
  1451.   for (i = 0; i < 3; i++) {
  1452.     rend_intro_point_t *intro1 = smartlist_get(d1->intro_nodes, i);
  1453.     rend_intro_point_t *intro2 = smartlist_get(d2->intro_nodes, i);
  1454.     test_streq(intro1->extend_info->nickname,
  1455.                intro2->extend_info->nickname);
  1456.   }
  1457.   test_assert(BAD_HOSTNAME == parse_extended_hostname(address1));
  1458.   test_assert(ONION_HOSTNAME == parse_extended_hostname(address2));
  1459.   test_assert(EXIT_HOSTNAME == parse_extended_hostname(address3));
  1460.   test_assert(NORMAL_HOSTNAME == parse_extended_hostname(address4));
  1461.   crypto_free_pk_env(pk1);
  1462.   crypto_free_pk_env(pk2);
  1463.   pk1 = pk2 = NULL;
  1464.   rend_service_descriptor_free(d1);
  1465.   rend_service_descriptor_free(d2);
  1466.   d1 = d2 = NULL;
  1467.  done:
  1468.   if (pk1)
  1469.     crypto_free_pk_env(pk1);
  1470.   if (pk2)
  1471.     crypto_free_pk_env(pk2);
  1472.   if (d1)
  1473.     rend_service_descriptor_free(d1);
  1474.   if (d2)
  1475.     rend_service_descriptor_free(d2);
  1476.   tor_free(encoded);
  1477. }
  1478. /** Run AES performance benchmarks. */
  1479. static void
  1480. bench_aes(void)
  1481. {
  1482.   int len, i;
  1483.   char *b1, *b2;
  1484.   crypto_cipher_env_t *c;
  1485.   struct timeval start, end;
  1486.   const int iters = 100000;
  1487.   uint64_t nsec;
  1488.   c = crypto_new_cipher_env();
  1489.   crypto_cipher_generate_key(c);
  1490.   crypto_cipher_encrypt_init_cipher(c);
  1491.   for (len = 1; len <= 8192; len *= 2) {
  1492.     b1 = tor_malloc_zero(len);
  1493.     b2 = tor_malloc_zero(len);
  1494.     tor_gettimeofday(&start);
  1495.     for (i = 0; i < iters; ++i) {
  1496.       crypto_cipher_encrypt(c, b1, b2, len);
  1497.     }
  1498.     tor_gettimeofday(&end);
  1499.     tor_free(b1);
  1500.     tor_free(b2);
  1501.     nsec = (uint64_t) tv_udiff(&start,&end);
  1502.     nsec *= 1000;
  1503.     nsec /= (iters*len);
  1504.     printf("%d bytes: "U64_FORMAT" nsec per byten", len,
  1505.            U64_PRINTF_ARG(nsec));
  1506.   }
  1507.   crypto_free_cipher_env(c);
  1508. }
  1509. /** Run digestmap_t performance benchmarks. */
  1510. static void
  1511. bench_dmap(void)
  1512. {
  1513.   smartlist_t *sl = smartlist_create();
  1514.   smartlist_t *sl2 = smartlist_create();
  1515.   struct timeval start, end, pt2, pt3, pt4;
  1516.   const int iters = 10000;
  1517.   const int elts = 4000;
  1518.   const int fpostests = 1000000;
  1519.   char d[20];
  1520.   int i,n=0, fp = 0;
  1521.   digestmap_t *dm = digestmap_new();
  1522.   digestset_t *ds = digestset_new(elts);
  1523.   for (i = 0; i < elts; ++i) {
  1524.     crypto_rand(d, 20);
  1525.     smartlist_add(sl, tor_memdup(d, 20));
  1526.   }
  1527.   for (i = 0; i < elts; ++i) {
  1528.     crypto_rand(d, 20);
  1529.     smartlist_add(sl2, tor_memdup(d, 20));
  1530.   }
  1531.   printf("nbits=%dn", ds->mask+1);
  1532.   tor_gettimeofday(&start);
  1533.   for (i = 0; i < iters; ++i) {
  1534.     SMARTLIST_FOREACH(sl, const char *, cp, digestmap_set(dm, cp, (void*)1));
  1535.   }
  1536.   tor_gettimeofday(&pt2);
  1537.   for (i = 0; i < iters; ++i) {
  1538.     SMARTLIST_FOREACH(sl, const char *, cp, digestmap_get(dm, cp));
  1539.     SMARTLIST_FOREACH(sl2, const char *, cp, digestmap_get(dm, cp));
  1540.   }
  1541.   tor_gettimeofday(&pt3);
  1542.   for (i = 0; i < iters; ++i) {
  1543.     SMARTLIST_FOREACH(sl, const char *, cp, digestset_add(ds, cp));
  1544.   }
  1545.   tor_gettimeofday(&pt4);
  1546.   for (i = 0; i < iters; ++i) {
  1547.     SMARTLIST_FOREACH(sl, const char *, cp, n += digestset_isin(ds, cp));
  1548.     SMARTLIST_FOREACH(sl2, const char *, cp, n += digestset_isin(ds, cp));
  1549.   }
  1550.   tor_gettimeofday(&end);
  1551.   for (i = 0; i < fpostests; ++i) {
  1552.     crypto_rand(d, 20);
  1553.     if (digestset_isin(ds, d)) ++fp;
  1554.   }
  1555.   printf("%ldn",(unsigned long)tv_udiff(&start, &pt2));
  1556.   printf("%ldn",(unsigned long)tv_udiff(&pt2, &pt3));
  1557.   printf("%ldn",(unsigned long)tv_udiff(&pt3, &pt4));
  1558.   printf("%ldn",(unsigned long)tv_udiff(&pt4, &end));
  1559.   printf("-- %dn", n);
  1560.   printf("++ %fn", fp/(double)fpostests);
  1561.   digestmap_free(dm, NULL);
  1562.   digestset_free(ds);
  1563.   SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
  1564.   SMARTLIST_FOREACH(sl2, char *, cp, tor_free(cp));
  1565.   smartlist_free(sl);
  1566.   smartlist_free(sl2);
  1567. }
  1568. /** Run unittests for memory pool allocator */
  1569. static void
  1570. test_util_mempool(void)
  1571. {
  1572.   mp_pool_t *pool = NULL;
  1573.   smartlist_t *allocated = NULL;
  1574.   int i;
  1575.   pool = mp_pool_new(1, 100);
  1576.   test_assert(pool);
  1577.   test_assert(pool->new_chunk_capacity >= 100);
  1578.   test_assert(pool->item_alloc_size >= sizeof(void*)+1);
  1579.   mp_pool_destroy(pool);
  1580.   pool = NULL;
  1581.   pool = mp_pool_new(241, 2500);
  1582.   test_assert(pool);
  1583.   test_assert(pool->new_chunk_capacity >= 10);
  1584.   test_assert(pool->item_alloc_size >= sizeof(void*)+241);
  1585.   test_eq(pool->item_alloc_size & 0x03, 0);
  1586.   test_assert(pool->new_chunk_capacity < 60);
  1587.   allocated = smartlist_create();
  1588.   for (i = 0; i < 20000; ++i) {
  1589.     if (smartlist_len(allocated) < 20 || crypto_rand_int(2)) {
  1590.       void *m = mp_pool_get(pool);
  1591.       memset(m, 0x09, 241);
  1592.       smartlist_add(allocated, m);
  1593.       //printf("%d: %pn", i, m);
  1594.       //mp_pool_assert_ok(pool);
  1595.     } else {
  1596.       int idx = crypto_rand_int(smartlist_len(allocated));
  1597.       void *m = smartlist_get(allocated, idx);
  1598.       //printf("%d: free %pn", i, m);
  1599.       smartlist_del(allocated, idx);
  1600.       mp_pool_release(m);
  1601.       //mp_pool_assert_ok(pool);
  1602.     }
  1603.     if (crypto_rand_int(777)==0)
  1604.       mp_pool_clean(pool, 1, 1);
  1605.     if (i % 777)
  1606.       mp_pool_assert_ok(pool);
  1607.   }
  1608.  done:
  1609.   if (allocated) {
  1610.     SMARTLIST_FOREACH(allocated, void *, m, mp_pool_release(m));
  1611.     mp_pool_assert_ok(pool);
  1612.     mp_pool_clean(pool, 0, 0);
  1613.     mp_pool_assert_ok(pool);
  1614.     smartlist_free(allocated);
  1615.   }
  1616.   if (pool)
  1617.     mp_pool_destroy(pool);
  1618. }
  1619. /** Run unittests for memory area allocator */
  1620. static void
  1621. test_util_memarea(void)
  1622. {
  1623.   memarea_t *area = memarea_new();
  1624.   char *p1, *p2, *p3, *p1_orig;
  1625.   void *malloced_ptr = NULL;
  1626.   int i;
  1627.   test_assert(area);
  1628.   p1_orig = p1 = memarea_alloc(area,64);
  1629.   p2 = memarea_alloc_zero(area,52);
  1630.   p3 = memarea_alloc(area,11);
  1631.   test_assert(memarea_owns_ptr(area, p1));
  1632.   test_assert(memarea_owns_ptr(area, p2));
  1633.   test_assert(memarea_owns_ptr(area, p3));
  1634.   /* Make sure we left enough space. */
  1635.   test_assert(p1+64 <= p2);
  1636.   test_assert(p2+52 <= p3);
  1637.   /* Make sure we aligned. */
  1638.   test_eq(((uintptr_t)p1) % sizeof(void*), 0);
  1639.   test_eq(((uintptr_t)p2) % sizeof(void*), 0);
  1640.   test_eq(((uintptr_t)p3) % sizeof(void*), 0);
  1641.   test_assert(!memarea_owns_ptr(area, p3+8192));
  1642.   test_assert(!memarea_owns_ptr(area, p3+30));
  1643.   test_assert(tor_mem_is_zero(p2, 52));
  1644.   /* Make sure we don't overalign. */
  1645.   p1 = memarea_alloc(area, 1);
  1646.   p2 = memarea_alloc(area, 1);
  1647.   test_eq(p1+sizeof(void*), p2);
  1648.   {
  1649.     malloced_ptr = tor_malloc(64);
  1650.     test_assert(!memarea_owns_ptr(area, malloced_ptr));
  1651.     tor_free(malloced_ptr);
  1652.   }
  1653.   /* memarea_memdup */
  1654.   {
  1655.     malloced_ptr = tor_malloc(64);
  1656.     crypto_rand((char*)malloced_ptr, 64);
  1657.     p1 = memarea_memdup(area, malloced_ptr, 64);
  1658.     test_assert(p1 != malloced_ptr);
  1659.     test_memeq(p1, malloced_ptr, 64);
  1660.     tor_free(malloced_ptr);
  1661.   }
  1662.   /* memarea_strdup. */
  1663.   p1 = memarea_strdup(area,"");
  1664.   p2 = memarea_strdup(area, "abcd");
  1665.   test_assert(p1);
  1666.   test_assert(p2);
  1667.   test_streq(p1, "");
  1668.   test_streq(p2, "abcd");
  1669.   /* memarea_strndup. */
  1670.   {
  1671.     const char *s = "Ad ogni porta batte la morte e grida: il nome!";
  1672.     /* (From Turandot, act 3.) */
  1673.     size_t len = strlen(s);
  1674.     p1 = memarea_strndup(area, s, 1000);
  1675.     p2 = memarea_strndup(area, s, 10);
  1676.     test_streq(p1, s);
  1677.     test_assert(p2 >= p1 + len + 1);
  1678.     test_memeq(s, p2, 10);
  1679.     test_eq(p2[10], '');
  1680.     p3 = memarea_strndup(area, s, len);
  1681.     test_streq(p3, s);
  1682.     p3 = memarea_strndup(area, s, len-1);
  1683.     test_memeq(s, p3, len-1);
  1684.     test_eq(p3[len-1], '');
  1685.   }
  1686.   memarea_clear(area);
  1687.   p1 = memarea_alloc(area, 1);
  1688.   test_eq(p1, p1_orig);
  1689.   memarea_clear(area);
  1690.   /* Check for running over an area's size. */
  1691.   for (i = 0; i < 512; ++i) {
  1692.     p1 = memarea_alloc(area, crypto_rand_int(5)+1);
  1693.     test_assert(memarea_owns_ptr(area, p1));
  1694.   }
  1695.   memarea_assert_ok(area);
  1696.   /* Make sure we can allocate a too-big object. */
  1697.   p1 = memarea_alloc_zero(area, 9000);
  1698.   p2 = memarea_alloc_zero(area, 16);
  1699.   test_assert(memarea_owns_ptr(area, p1));
  1700.   test_assert(memarea_owns_ptr(area, p2));
  1701.  done:
  1702.   memarea_drop_all(area);
  1703.   tor_free(malloced_ptr);
  1704. }
  1705. /** Run unit tests for utility functions to get file names relative to
  1706.  * the data directory. */
  1707. static void
  1708. test_util_datadir(void)
  1709. {
  1710.   char buf[1024];
  1711.   char *f = NULL;
  1712.   f = get_datadir_fname(NULL);
  1713.   test_streq(f, temp_dir);
  1714.   tor_free(f);
  1715.   f = get_datadir_fname("state");
  1716.   tor_snprintf(buf, sizeof(buf), "%s"PATH_SEPARATOR"state", temp_dir);
  1717.   test_streq(f, buf);
  1718.   tor_free(f);
  1719.   f = get_datadir_fname2("cache", "thingy");
  1720.   tor_snprintf(buf, sizeof(buf),
  1721.                "%s"PATH_SEPARATOR"cache"PATH_SEPARATOR"thingy", temp_dir);
  1722.   test_streq(f, buf);
  1723.   tor_free(f);
  1724.   f = get_datadir_fname2_suffix("cache", "thingy", ".foo");
  1725.   tor_snprintf(buf, sizeof(buf),
  1726.                "%s"PATH_SEPARATOR"cache"PATH_SEPARATOR"thingy.foo", temp_dir);
  1727.   test_streq(f, buf);
  1728.   tor_free(f);
  1729.   f = get_datadir_fname_suffix("cache", ".foo");
  1730.   tor_snprintf(buf, sizeof(buf), "%s"PATH_SEPARATOR"cache.foo",
  1731.                temp_dir);
  1732.   test_streq(f, buf);
  1733.  done:
  1734.   tor_free(f);
  1735. }
  1736. /** Test AES-CTR encryption and decryption with IV. */
  1737. static void
  1738. test_crypto_aes_iv(void)
  1739. {
  1740.   crypto_cipher_env_t *cipher;
  1741.   char *plain, *encrypted1, *encrypted2, *decrypted1, *decrypted2;
  1742.   char plain_1[1], plain_15[15], plain_16[16], plain_17[17];
  1743.   char key1[16], key2[16];
  1744.   ssize_t encrypted_size, decrypted_size;
  1745.   plain = tor_malloc(4095);
  1746.   encrypted1 = tor_malloc(4095 + 1 + 16);
  1747.   encrypted2 = tor_malloc(4095 + 1 + 16);
  1748.   decrypted1 = tor_malloc(4095 + 1);
  1749.   decrypted2 = tor_malloc(4095 + 1);
  1750.   crypto_rand(plain, 4095);
  1751.   crypto_rand(key1, 16);
  1752.   crypto_rand(key2, 16);
  1753.   crypto_rand(plain_1, 1);
  1754.   crypto_rand(plain_15, 15);
  1755.   crypto_rand(plain_16, 16);
  1756.   crypto_rand(plain_17, 17);
  1757.   key1[0] = key2[0] + 128; /* Make sure that contents are different. */
  1758.   /* Encrypt and decrypt with the same key. */
  1759.   cipher = crypto_create_init_cipher(key1, 1);
  1760.   encrypted_size = crypto_cipher_encrypt_with_iv(cipher, encrypted1, 16 + 4095,
  1761.                                                  plain, 4095);
  1762.   crypto_free_cipher_env(cipher);
  1763.   cipher = NULL;
  1764.   test_eq(encrypted_size, 16 + 4095);
  1765.   tor_assert(encrypted_size > 0); /* This is obviously true, since 4111 is
  1766.                                    * greater than 0, but its truth is not
  1767.                                    * obvious to all analysis tools. */
  1768.   cipher = crypto_create_init_cipher(key1, 0);
  1769.   decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted1, 4095,
  1770.                                              encrypted1, encrypted_size);
  1771.   crypto_free_cipher_env(cipher);
  1772.   cipher = NULL;
  1773.   test_eq(decrypted_size, 4095);
  1774.   tor_assert(decrypted_size > 0);
  1775.   test_memeq(plain, decrypted1, 4095);
  1776.   /* Encrypt a second time (with a new random initialization vector). */
  1777.   cipher = crypto_create_init_cipher(key1, 1);
  1778.   encrypted_size = crypto_cipher_encrypt_with_iv(cipher, encrypted2, 16 + 4095,
  1779.                                              plain, 4095);
  1780.   crypto_free_cipher_env(cipher);
  1781.   cipher = NULL;
  1782.   test_eq(encrypted_size, 16 + 4095);
  1783.   tor_assert(encrypted_size > 0);
  1784.   cipher = crypto_create_init_cipher(key1, 0);
  1785.   decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted2, 4095,
  1786.                                              encrypted2, encrypted_size);
  1787.   crypto_free_cipher_env(cipher);
  1788.   cipher = NULL;
  1789.   test_eq(decrypted_size, 4095);
  1790.   tor_assert(decrypted_size > 0);
  1791.   test_memeq(plain, decrypted2, 4095);
  1792.   test_memneq(encrypted1, encrypted2, encrypted_size);
  1793.   /* Decrypt with the wrong key. */
  1794.   cipher = crypto_create_init_cipher(key2, 0);
  1795.   decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted2, 4095,
  1796.                                              encrypted1, encrypted_size);
  1797.   crypto_free_cipher_env(cipher);
  1798.   cipher = NULL;
  1799.   test_memneq(plain, decrypted2, encrypted_size);
  1800.   /* Alter the initialization vector. */
  1801.   encrypted1[0] += 42;
  1802.   cipher = crypto_create_init_cipher(key1, 0);
  1803.   decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted1, 4095,
  1804.                                              encrypted1, encrypted_size);
  1805.   crypto_free_cipher_env(cipher);
  1806.   cipher = NULL;
  1807.   test_memneq(plain, decrypted2, 4095);
  1808.   /* Special length case: 1. */
  1809.   cipher = crypto_create_init_cipher(key1, 1);
  1810.   encrypted_size = crypto_cipher_encrypt_with_iv(cipher, encrypted1, 16 + 1,
  1811.                                              plain_1, 1);
  1812.   crypto_free_cipher_env(cipher);
  1813.   cipher = NULL;
  1814.   test_eq(encrypted_size, 16 + 1);
  1815.   tor_assert(encrypted_size > 0);
  1816.   cipher = crypto_create_init_cipher(key1, 0);
  1817.   decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted1, 1,
  1818.                                              encrypted1, encrypted_size);
  1819.   crypto_free_cipher_env(cipher);
  1820.   cipher = NULL;
  1821.   test_eq(decrypted_size, 1);
  1822.   tor_assert(decrypted_size > 0);
  1823.   test_memeq(plain_1, decrypted1, 1);
  1824.   /* Special length case: 15. */
  1825.   cipher = crypto_create_init_cipher(key1, 1);
  1826.   encrypted_size = crypto_cipher_encrypt_with_iv(cipher, encrypted1, 16 + 15,
  1827.                                              plain_15, 15);
  1828.   crypto_free_cipher_env(cipher);
  1829.   cipher = NULL;
  1830.   test_eq(encrypted_size, 16 + 15);
  1831.   tor_assert(encrypted_size > 0);
  1832.   cipher = crypto_create_init_cipher(key1, 0);
  1833.   decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted1, 15,
  1834.                                              encrypted1, encrypted_size);
  1835.   crypto_free_cipher_env(cipher);
  1836.   cipher = NULL;
  1837.   test_eq(decrypted_size, 15);
  1838.   tor_assert(decrypted_size > 0);
  1839.   test_memeq(plain_15, decrypted1, 15);
  1840.   /* Special length case: 16. */
  1841.   cipher = crypto_create_init_cipher(key1, 1);
  1842.   encrypted_size = crypto_cipher_encrypt_with_iv(cipher, encrypted1, 16 + 16,
  1843.                                              plain_16, 16);
  1844.   crypto_free_cipher_env(cipher);
  1845.   cipher = NULL;
  1846.   test_eq(encrypted_size, 16 + 16);
  1847.   tor_assert(encrypted_size > 0);
  1848.   cipher = crypto_create_init_cipher(key1, 0);
  1849.   decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted1, 16,
  1850.                                              encrypted1, encrypted_size);
  1851.   crypto_free_cipher_env(cipher);
  1852.   cipher = NULL;
  1853.   test_eq(decrypted_size, 16);
  1854.   tor_assert(decrypted_size > 0);
  1855.   test_memeq(plain_16, decrypted1, 16);
  1856.   /* Special length case: 17. */
  1857.   cipher = crypto_create_init_cipher(key1, 1);
  1858.   encrypted_size = crypto_cipher_encrypt_with_iv(cipher, encrypted1, 16 + 17,
  1859.                                              plain_17, 17);
  1860.   crypto_free_cipher_env(cipher);
  1861.   cipher = NULL;
  1862.   test_eq(encrypted_size, 16 + 17);
  1863.   tor_assert(encrypted_size > 0);
  1864.   cipher = crypto_create_init_cipher(key1, 0);
  1865.   decrypted_size = crypto_cipher_decrypt_with_iv(cipher, decrypted1, 17,
  1866.                                              encrypted1, encrypted_size);
  1867.   test_eq(decrypted_size, 17);
  1868.   tor_assert(decrypted_size > 0);
  1869.   test_memeq(plain_17, decrypted1, 17);
  1870.  done:
  1871.   /* Free memory. */
  1872.   tor_free(plain);
  1873.   tor_free(encrypted1);
  1874.   tor_free(encrypted2);
  1875.   tor_free(decrypted1);
  1876.   tor_free(decrypted2);
  1877.   if (cipher)
  1878.     crypto_free_cipher_env(cipher);
  1879. }
  1880. /** Test base32 decoding. */
  1881. static void
  1882. test_crypto_base32_decode(void)
  1883. {
  1884.   char plain[60], encoded[96 + 1], decoded[60];
  1885.   int res;
  1886.   crypto_rand(plain, 60);
  1887.   /* Encode and decode a random string. */
  1888.   base32_encode(encoded, 96 + 1, plain, 60);
  1889.   res = base32_decode(decoded, 60, encoded, 96);
  1890.   test_eq(res, 0);
  1891.   test_memeq(plain, decoded, 60);
  1892.   /* Encode, uppercase, and decode a random string. */
  1893.   base32_encode(encoded, 96 + 1, plain, 60);
  1894.   tor_strupper(encoded);
  1895.   res = base32_decode(decoded, 60, encoded, 96);
  1896.   test_eq(res, 0);
  1897.   test_memeq(plain, decoded, 60);
  1898.   /* Change encoded string and decode. */
  1899.   if (encoded[0] == 'A' || encoded[0] == 'a')
  1900.     encoded[0] = 'B';
  1901.   else
  1902.     encoded[0] = 'A';
  1903.   res = base32_decode(decoded, 60, encoded, 96);
  1904.   test_eq(res, 0);
  1905.   test_memneq(plain, decoded, 60);
  1906.   /* Bad encodings. */
  1907.   encoded[0] = '!';
  1908.   res = base32_decode(decoded, 60, encoded, 96);
  1909.   test_assert(res < 0);
  1910.  done:
  1911.   ;
  1912. }
  1913. /** Test encoding and parsing of v2 rendezvous service descriptors. */
  1914. static void
  1915. test_rend_fns_v2(void)
  1916. {
  1917.   rend_service_descriptor_t *generated = NULL, *parsed = NULL;
  1918.   char service_id[DIGEST_LEN];
  1919.   char service_id_base32[REND_SERVICE_ID_LEN_BASE32+1];
  1920.   const char *next_desc;
  1921.   smartlist_t *descs = smartlist_create();
  1922.   char computed_desc_id[DIGEST_LEN];
  1923.   char parsed_desc_id[DIGEST_LEN];
  1924.   crypto_pk_env_t *pk1 = NULL, *pk2 = NULL;
  1925.   time_t now;
  1926.   char *intro_points_encrypted = NULL;
  1927.   size_t intro_points_size;
  1928.   size_t encoded_size;
  1929.   int i;
  1930.   pk1 = pk_generate(0);
  1931.   pk2 = pk_generate(1);
  1932.   generated = tor_malloc_zero(sizeof(rend_service_descriptor_t));
  1933.   generated->pk = crypto_pk_dup_key(pk1);
  1934.   crypto_pk_get_digest(generated->pk, service_id);
  1935.   base32_encode(service_id_base32, REND_SERVICE_ID_LEN_BASE32+1,
  1936.                 service_id, REND_SERVICE_ID_LEN);
  1937.   now = time(NULL);
  1938.   generated->timestamp = now;
  1939.   generated->version = 2;
  1940.   generated->protocols = 42;
  1941.   generated->intro_nodes = smartlist_create();
  1942.   for (i = 0; i < 3; i++) {
  1943.     rend_intro_point_t *intro = tor_malloc_zero(sizeof(rend_intro_point_t));
  1944.     crypto_pk_env_t *okey = pk_generate(2 + i);
  1945.     intro->extend_info = tor_malloc_zero(sizeof(extend_info_t));
  1946.     intro->extend_info->onion_key = okey;
  1947.     crypto_pk_get_digest(intro->extend_info->onion_key,
  1948.                          intro->extend_info->identity_digest);
  1949.     //crypto_rand(info->identity_digest, DIGEST_LEN); /* Would this work? */
  1950.     intro->extend_info->nickname[0] = '$';
  1951.     base16_encode(intro->extend_info->nickname + 1,
  1952.                   sizeof(intro->extend_info->nickname) - 1,
  1953.                   intro->extend_info->identity_digest, DIGEST_LEN);
  1954.     /* Does not cover all IP addresses. */
  1955.     tor_addr_from_ipv4h(&intro->extend_info->addr, crypto_rand_int(65536));
  1956.     intro->extend_info->port = crypto_rand_int(65536);
  1957.     intro->intro_key = crypto_pk_dup_key(pk2);
  1958.     smartlist_add(generated->intro_nodes, intro);
  1959.   }
  1960.   test_assert(rend_encode_v2_descriptors(descs, generated, now, 0,
  1961.                                          REND_NO_AUTH, NULL, NULL) > 0);
  1962.   test_assert(rend_compute_v2_desc_id(computed_desc_id, service_id_base32,
  1963.                                       NULL, now, 0) == 0);
  1964.   test_memeq(((rend_encoded_v2_service_descriptor_t *)
  1965.              smartlist_get(descs, 0))->desc_id, computed_desc_id, DIGEST_LEN);
  1966.   test_assert(rend_parse_v2_service_descriptor(&parsed, parsed_desc_id,
  1967.                                                &intro_points_encrypted,
  1968.                                                &intro_points_size,
  1969.                                                &encoded_size,
  1970.                                                &next_desc,
  1971.                                      ((rend_encoded_v2_service_descriptor_t *)
  1972.                                      smartlist_get(descs, 0))->desc_str) == 0);
  1973.   test_assert(parsed);
  1974.   test_memeq(((rend_encoded_v2_service_descriptor_t *)
  1975.              smartlist_get(descs, 0))->desc_id, parsed_desc_id, DIGEST_LEN);
  1976.   test_eq(rend_parse_introduction_points(parsed, intro_points_encrypted,
  1977.                                          intro_points_size), 3);
  1978.   test_assert(!crypto_pk_cmp_keys(generated->pk, parsed->pk));
  1979.   test_eq(parsed->timestamp, now);
  1980.   test_eq(parsed->version, 2);
  1981.   test_eq(parsed->protocols, 42);
  1982.   test_eq(smartlist_len(parsed->intro_nodes), 3);
  1983.   for (i = 0; i < smartlist_len(parsed->intro_nodes); i++) {
  1984.     rend_intro_point_t *par_intro = smartlist_get(parsed->intro_nodes, i),
  1985.       *gen_intro = smartlist_get(generated->intro_nodes, i);
  1986.     extend_info_t *par_info = par_intro->extend_info;
  1987.     extend_info_t *gen_info = gen_intro->extend_info;
  1988.     test_assert(!crypto_pk_cmp_keys(gen_info->onion_key, par_info->onion_key));
  1989.     test_memeq(gen_info->identity_digest, par_info->identity_digest,
  1990.                DIGEST_LEN);
  1991.     test_streq(gen_info->nickname, par_info->nickname);
  1992.     test_assert(tor_addr_eq(&gen_info->addr, &par_info->addr));
  1993.     test_eq(gen_info->port, par_info->port);
  1994.   }
  1995.   rend_service_descriptor_free(parsed);
  1996.   rend_service_descriptor_free(generated);
  1997.   parsed = generated = NULL;
  1998.  done:
  1999.   if (descs) {
  2000.     for (i = 0; i < smartlist_len(descs); i++)
  2001.       rend_encoded_v2_service_descriptor_free(smartlist_get(descs, i));
  2002.     smartlist_free(descs);
  2003.   }
  2004.   if (parsed)
  2005.     rend_service_descriptor_free(parsed);
  2006.   if (generated)
  2007.     rend_service_descriptor_free(generated);
  2008.   if (pk1)
  2009.     crypto_free_pk_env(pk1);
  2010.   if (pk2)
  2011.     crypto_free_pk_env(pk2);
  2012.   tor_free(intro_points_encrypted);
  2013. }
  2014. /** Run unit tests for GeoIP code. */
  2015. static void
  2016. test_geoip(void)
  2017. {
  2018.   int i, j;
  2019.   time_t now = time(NULL);
  2020.   char *s = NULL;
  2021.   /* Populate the DB a bit.  Add these in order, since we can't do the final
  2022.    * 'sort' step.  These aren't very good IP addresses, but they're perfectly
  2023.    * fine uint32_t values. */
  2024.   test_eq(0, geoip_parse_entry("10,50,AB"));
  2025.   test_eq(0, geoip_parse_entry("52,90,XY"));
  2026.   test_eq(0, geoip_parse_entry("95,100,AB"));
  2027.   test_eq(0, geoip_parse_entry(""105","140","ZZ""));
  2028.   test_eq(0, geoip_parse_entry(""150","190","XY""));
  2029.   test_eq(0, geoip_parse_entry(""200","250","AB""));
  2030.   /* We should have 3 countries: ab, xy, zz. */
  2031.   test_eq(3, geoip_get_n_countries());
  2032.   /* Make sure that country ID actually works. */
  2033. #define NAMEFOR(x) geoip_get_country_name(geoip_get_country_by_ip(x))
  2034.   test_streq("ab", NAMEFOR(32));
  2035.   test_streq("??", NAMEFOR(5));
  2036.   test_streq("??", NAMEFOR(51));
  2037.   test_streq("xy", NAMEFOR(150));
  2038.   test_streq("xy", NAMEFOR(190));
  2039.   test_streq("??", NAMEFOR(2000));
  2040. #undef NAMEFOR
  2041.   get_options()->BridgeRelay = 1;
  2042.   get_options()->BridgeRecordUsageByCountry = 1;
  2043.   /* Put 9 observations in AB... */
  2044.   for (i=32; i < 40; ++i)
  2045.     geoip_note_client_seen(GEOIP_CLIENT_CONNECT, i, now-7200);
  2046.   geoip_note_client_seen(GEOIP_CLIENT_CONNECT, 225, now-7200);
  2047.   /* and 3 observations in XY, several times. */
  2048.   for (j=0; j < 10; ++j)
  2049.     for (i=52; i < 55; ++i)
  2050.       geoip_note_client_seen(GEOIP_CLIENT_CONNECT, i, now-3600);
  2051.   /* and 17 observations in ZZ... */
  2052.   for (i=110; i < 127; ++i)
  2053.     geoip_note_client_seen(GEOIP_CLIENT_CONNECT, i, now);
  2054.   s = geoip_get_client_history(now+5*24*60*60, GEOIP_CLIENT_CONNECT);
  2055.   test_assert(s);
  2056.   test_streq("zz=24,ab=16,xy=8", s);
  2057.   tor_free(s);
  2058.   /* Now clear out all the AB observations. */
  2059.   geoip_remove_old_clients(now-6000);
  2060.   s = geoip_get_client_history(now+5*24*60*60, GEOIP_CLIENT_CONNECT);
  2061.   test_assert(s);
  2062.   test_streq("zz=24,xy=8", s);
  2063.  done:
  2064.   tor_free(s);
  2065. }
  2066. /** For test_array. Declare an CLI-invocable off-by-default function in the
  2067.  * unit tests, with function name and user-visible name <b>x</b>*/
  2068. #define DISABLED(x) { #x, x, 0, 0, 0 }
  2069. /** For test_array. Declare an CLI-invocable unit test function, with function
  2070.  * name test_<b>x</b>(), and user-visible name <b>x</b> */
  2071. #define ENT(x) { #x, test_ ## x, 0, 0, 1 }
  2072. /** For test_array. Declare an CLI-invocable unit test function, with function
  2073.  * name test_<b>x</b>_<b>y</b>(), and user-visible name
  2074.  * <b>x</b>/<b>y</b>. This function will be treated as a subentry of <b>x</b>,
  2075.  * so that invoking <b>x</b> from the CLI invokes this test too. */
  2076. #define SUBENT(x,y) { #x "/" #y, test_ ## x ## _ ## y, 1, 0, 1 }
  2077. /** An array of functions and information for all the unit tests we can run. */
  2078. static struct {
  2079.   const char *test_name; /**< How does the user refer to this test from the
  2080.                           * command line? */
  2081.   void (*test_fn)(void); /**< What function is called to run this test? */
  2082.   int is_subent; /**< Is this a subentry of a bigger set of related tests? */
  2083.   int selected; /**< Are we planning to run this one? */
  2084.   int is_default; /**< If the user doesn't say what tests they want, do they
  2085.                    * get this function by default? */
  2086. } test_array[] = {
  2087.   ENT(buffers),
  2088.   ENT(crypto),
  2089.   SUBENT(crypto, rng),
  2090.   SUBENT(crypto, aes),
  2091.   SUBENT(crypto, sha),
  2092.   SUBENT(crypto, pk),
  2093.   SUBENT(crypto, dh),
  2094.   SUBENT(crypto, s2k),
  2095.   SUBENT(crypto, aes_iv),
  2096.   SUBENT(crypto, base32_decode),
  2097.   ENT(util),
  2098.   SUBENT(util, ip6_helpers),
  2099.   SUBENT(util, gzip),
  2100.   SUBENT(util, datadir),
  2101.   SUBENT(util, smartlist_basic),
  2102.   SUBENT(util, smartlist_strings),
  2103.   SUBENT(util, smartlist_overlap),
  2104.   SUBENT(util, smartlist_digests),
  2105.   SUBENT(util, smartlist_join),
  2106.   SUBENT(util, bitarray),
  2107.   SUBENT(util, digestset),
  2108.   SUBENT(util, mempool),
  2109.   SUBENT(util, memarea),
  2110.   SUBENT(util, strmap),
  2111.   SUBENT(util, control_formats),
  2112.   SUBENT(util, pqueue),
  2113.   SUBENT(util, mmap),
  2114.   SUBENT(util, threads),
  2115.   SUBENT(util, order_functions),
  2116.   SUBENT(util, sscanf),
  2117.   ENT(onion_handshake),
  2118.   ENT(dir_format),
  2119.   ENT(dirutil),
  2120.   ENT(v3_networkstatus),
  2121.   ENT(policies),
  2122.   ENT(rend_fns),
  2123.   SUBENT(rend_fns, v2),
  2124.   ENT(geoip),
  2125.   DISABLED(bench_aes),
  2126.   DISABLED(bench_dmap),
  2127.   { NULL, NULL, 0, 0, 0 },
  2128. };
  2129. static void syntax(void) ATTR_NORETURN;
  2130. /** Print a syntax usage message, and exit.*/
  2131. static void
  2132. syntax(void)
  2133. {
  2134.   int i;
  2135.   printf("Syntax:n"
  2136.          "  test [-v|--verbose] [--warn|--notice|--info|--debug]n"
  2137.          "       [testname...]n"
  2138.          "Recognized tests are:n");
  2139.   for (i = 0; test_array[i].test_name; ++i) {
  2140.     printf("   %sn", test_array[i].test_name);
  2141.   }
  2142.   exit(0);
  2143. }
  2144. /** Main entry point for unit test code: parse the command line, and run
  2145.  * some unit tests. */
  2146. int
  2147. main(int c, char**v)
  2148. {
  2149.   or_options_t *options;
  2150.   char *errmsg = NULL;
  2151.   int i;
  2152.   int verbose = 0, any_selected = 0;
  2153.   int loglevel = LOG_ERR;
  2154. #ifdef USE_DMALLOC
  2155.   {
  2156.     int r = CRYPTO_set_mem_ex_functions(_tor_malloc, _tor_realloc, _tor_free);
  2157.     tor_assert(r);
  2158.   }
  2159. #endif
  2160.   update_approx_time(time(NULL));
  2161.   options = options_new();
  2162.   tor_threads_init();
  2163.   init_logging();
  2164.   for (i = 1; i < c; ++i) {
  2165.     if (!strcmp(v[i], "-v") || !strcmp(v[i], "--verbose"))
  2166.       verbose++;
  2167.     else if (!strcmp(v[i], "--warn"))
  2168.       loglevel = LOG_WARN;
  2169.     else if (!strcmp(v[i], "--notice"))
  2170.       loglevel = LOG_NOTICE;
  2171.     else if (!strcmp(v[i], "--info"))
  2172.       loglevel = LOG_INFO;
  2173.     else if (!strcmp(v[i], "--debug"))
  2174.       loglevel = LOG_DEBUG;
  2175.     else if (!strcmp(v[i], "--help") || !strcmp(v[i], "-h") || v[i][0] == '-')
  2176.       syntax();
  2177.     else {
  2178.       int j, found=0;
  2179.       for (j = 0; test_array[j].test_name; ++j) {
  2180.         if (!strcmp(v[i], test_array[j].test_name) ||
  2181.             (test_array[j].is_subent &&
  2182.              !strcmpstart(test_array[j].test_name, v[i]) &&
  2183.              test_array[j].test_name[strlen(v[i])] == '/') ||
  2184.             (v[i][0] == '=' && !strcmp(v[i]+1, test_array[j].test_name))) {
  2185.           test_array[j].selected = 1;
  2186.           any_selected = 1;
  2187.           found = 1;
  2188.         }
  2189.       }
  2190.       if (!found) {
  2191.         printf("Unknown test: %sn", v[i]);
  2192.         syntax();
  2193.       }
  2194.     }
  2195.   }
  2196.   if (!any_selected) {
  2197.     for (i = 0; test_array[i].test_name; ++i) {
  2198.       test_array[i].selected = test_array[i].is_default;
  2199.     }
  2200.   }
  2201.   {
  2202.     log_severity_list_t s;
  2203.     memset(&s, 0, sizeof(s));
  2204.     set_log_severity_config(loglevel, LOG_ERR, &s);
  2205.     add_stream_log(&s, "", fileno(stdout));
  2206.   }
  2207.   options->command = CMD_RUN_UNITTESTS;
  2208.   crypto_global_init(0);
  2209.   rep_hist_init();
  2210.   network_init();
  2211.   setup_directory();
  2212.   options_init(options);
  2213.   options->DataDirectory = tor_strdup(temp_dir);
  2214.   if (set_options(options, &errmsg) < 0) {
  2215.     printf("Failed to set initial options: %sn", errmsg);
  2216.     tor_free(errmsg);
  2217.     return 1;
  2218.   }
  2219.   crypto_seed_rng(1);
  2220.   atexit(remove_directory);
  2221.   printf("Running Tor unit tests on %sn", get_uname());
  2222.   for (i = 0; test_array[i].test_name; ++i) {
  2223.     if (!test_array[i].selected)
  2224.       continue;
  2225.     if (!test_array[i].is_subent) {
  2226.       printf("n============================== %sn",test_array[i].test_name);
  2227.     } else if (test_array[i].is_subent && verbose) {
  2228.       printf("n%s", test_array[i].test_name);
  2229.     }
  2230.     test_array[i].test_fn();
  2231.   }
  2232.   puts("");
  2233.   free_pregenerated_keys();
  2234. #ifdef USE_DMALLOC
  2235.   tor_free_all(0);
  2236.   dmalloc_log_unfreed();
  2237. #endif
  2238.   if (have_failed)
  2239.     return 1;
  2240.   else
  2241.     return 0;
  2242. }