Commit 0f83fcc5 authored by Nick Mathewson's avatar Nick Mathewson 🤹
Browse files

Add a quick-and-dirty-test for generate_v2_networkstatus.

It sure is a good thing we can run each test in its own process, or
else the amount of setup I needed to do to make this thing work
would have broken all the other tests.

Test mocking would have made this easier to write too.
parent 6706a05b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2904,7 +2904,7 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key,
/** For v2 authoritative directories only: Replace the contents of
 * <b>the_v2_networkstatus</b> with a newly generated network status
 * object.  */
static cached_dir_t *
cached_dir_t *
generate_v2_networkstatus_opinion(void)
{
  cached_dir_t *r = NULL;
+1 −0
Original line number Diff line number Diff line
@@ -120,6 +120,7 @@ int measured_bw_line_parse(measured_bw_line_t *out, const char *line);

int measured_bw_line_apply(measured_bw_line_t *parsed_line,
                           smartlist_t *routerstatuses);
cached_dir_t *generate_v2_networkstatus_opinion(void);
#endif

int dirserv_read_measured_bandwidths(const char *from_file,
+84 −5
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@
#define ROUTERLIST_PRIVATE
#define HIBERNATE_PRIVATE
#include "or.h"
#include "config.h"
#include "directory.h"
#include "dirserv.h"
#include "dirvote.h"
@@ -2140,25 +2141,103 @@ test_dir_clip_unmeasured_bw_alt(void)
                       test_routerstatus_for_umbw);
}

extern time_t time_of_process_start; /* from main.c */

static void
test_dir_v2_dir(void *arg)
{
  /* Runs in a forked process: acts like a v2 directory just enough to make and
   * sign a v2 networkstatus opinion */

  cached_dir_t *v2 = NULL;
  or_options_t *options = get_options_mutable();
  crypto_pk_t *id_key = pk_generate(4);
  (void) arg;

  options->ORPort_set = 1; /* So we believe we're a server. */
  options->DirPort_set = 1;
  options->Address = tor_strdup("99.99.99.99");
  options->Nickname = tor_strdup("TestV2Auth");
  options->ContactInfo = tor_strdup("TestV2Auth <testv2auth@example.com>");
  {
    /* Give it a DirPort */
    smartlist_t *ports = (smartlist_t *)get_configured_ports();
    port_cfg_t *port = tor_malloc_zero(sizeof(port_cfg_t));
    port->type = CONN_TYPE_DIR_LISTENER;
    port->port = 9999;
    smartlist_add(ports, port);
  }
  set_server_identity_key(id_key);
  set_client_identity_key(id_key);

  /* Add a router. */
  {
    was_router_added_t wra;
    const char *msg = NULL;
    routerinfo_t *r1 = tor_malloc_zero(sizeof(routerinfo_t));
    r1->address = tor_strdup("18.244.0.1");
    r1->addr = 0xc0a80001u; /* 192.168.0.1 */
    r1->cache_info.published_on = time(NULL)-60;
    r1->or_port = 9000;
    r1->dir_port = 9003;
    tor_addr_parse(&r1->ipv6_addr, "1:2:3:4::");
    r1->ipv6_orport = 9999;
    r1->onion_pkey = pk_generate(1);
    r1->identity_pkey = pk_generate(2);
    r1->bandwidthrate = 1000;
    r1->bandwidthburst = 5000;
    r1->bandwidthcapacity = 10000;
    r1->exit_policy = NULL;
    r1->nickname = tor_strdup("Magri");
    r1->platform = tor_strdup("Tor 0.2.7.7-gamma");
    r1->cache_info.routerlist_index = -1;
    r1->cache_info.signed_descriptor_body =
      router_dump_router_to_string(r1, r1->identity_pkey);
    r1->cache_info.signed_descriptor_len =
      strlen(r1->cache_info.signed_descriptor_body);
    wra = router_add_to_routerlist(r1, &msg, 0, 0);
    tt_int_op(wra, ==, ROUTER_ADDED_SUCCESSFULLY);
  }

  /* Prevent call of rep_hist_note_router_unreachable(). */
  time_of_process_start = time(NULL);

  /* Make a directory so there's somewhere to store the thing */
#ifdef _WIN32
  mkdir(get_fname("cached-status"));
#else
  mkdir(get_fname("cached-status"), 0700);
#endif

  v2 = generate_v2_networkstatus_opinion();
  tt_assert(v2);

 done:
  crypto_pk_free(id_key);
  cached_dir_decref(v2);
}


#define DIR_LEGACY(name)                                                   \
  { #name, legacy_test_helper, TT_FORK, &legacy_setup, test_dir_ ## name }

#define DIR(name)                               \
  { #name, test_dir_##name, 0, NULL, NULL }
#define DIR(name,flags)                              \
  { #name, test_dir_##name, (flags), NULL, NULL }

struct testcase_t dir_tests[] = {
  DIR_LEGACY(nicknames),
  DIR_LEGACY(formats),
  DIR_LEGACY(versions),
  DIR_LEGACY(fp_pairs),
  DIR(split_fps),
  DIR(split_fps, 0),
  DIR_LEGACY(measured_bw),
  DIR_LEGACY(param_voting),
  DIR_LEGACY(v3_networkstatus),
  DIR(random_weighted),
  DIR(scale_bw),
  DIR(random_weighted, 0),
  DIR(scale_bw, 0),
  DIR_LEGACY(clip_unmeasured_bw),
  DIR_LEGACY(clip_unmeasured_bw_alt),
  DIR(v2_dir, TT_FORK),
  END_OF_TESTCASES
};