tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

test_circuituse.c (7679B)


      1 /* Copyright (c) 2001-2004, Roger Dingledine.
      2 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
      3 * Copyright (c) 2007-2021, The Tor Project, Inc. */
      4 /* See LICENSE for licensing information */
      5 
      6 #define CIRCUITLIST_PRIVATE
      7 
      8 #include "core/or/or.h"
      9 #include "test/test.h"
     10 #include "test/test_helpers.h"
     11 #include "app/config/config.h"
     12 #include "core/or/circuitlist.h"
     13 #include "core/or/circuituse.h"
     14 #include "core/or/circuitbuild.h"
     15 #include "feature/nodelist/nodelist.h"
     16 
     17 #include "core/or/cpath_build_state_st.h"
     18 #include "core/or/origin_circuit_st.h"
     19 
     20 static void
     21 test_circuit_is_available_for_use_ret_false_when_marked_for_close(void *arg)
     22 {
     23  (void)arg;
     24 
     25  circuit_t *circ = tor_malloc(sizeof(circuit_t));
     26  circ->marked_for_close = 1;
     27 
     28  tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ));
     29 
     30  done:
     31    tor_free(circ);
     32 }
     33 
     34 static void
     35 test_circuit_is_available_for_use_ret_false_when_timestamp_dirty(void *arg)
     36 {
     37  (void)arg;
     38 
     39  circuit_t *circ = tor_malloc(sizeof(circuit_t));
     40  circ->timestamp_dirty = 1;
     41 
     42  tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ));
     43 
     44  done:
     45    tor_free(circ);
     46 }
     47 
     48 static void
     49 test_circuit_is_available_for_use_ret_false_for_non_general_purpose(void *arg)
     50 {
     51  (void)arg;
     52 
     53  circuit_t *circ = tor_malloc(sizeof(circuit_t));
     54  circ->purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING;
     55 
     56  tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ));
     57 
     58  done:
     59    tor_free(circ);
     60 }
     61 
     62 static void
     63 test_circuit_is_available_for_use_ret_false_for_non_general_origin(void *arg)
     64 {
     65  (void)arg;
     66 
     67  circuit_t *circ = tor_malloc(sizeof(circuit_t));
     68  circ->purpose = CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT;
     69 
     70  tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ));
     71 
     72  done:
     73    tor_free(circ);
     74 }
     75 
     76 static void
     77 test_circuit_is_available_for_use_ret_false_for_non_origin_purpose(void *arg)
     78 {
     79  (void)arg;
     80 
     81  circuit_t *circ = tor_malloc(sizeof(circuit_t));
     82  circ->purpose = CIRCUIT_PURPOSE_OR;
     83 
     84  tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ));
     85 
     86  done:
     87    tor_free(circ);
     88 }
     89 
     90 static void
     91 test_circuit_is_available_for_use_ret_false_unusable_for_new_conns(void *arg)
     92 {
     93  (void)arg;
     94 
     95  circuit_t *circ = dummy_origin_circuit_new(30);
     96  mark_circuit_unusable_for_new_conns(TO_ORIGIN_CIRCUIT(circ));
     97 
     98  tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ));
     99 
    100  done:
    101    circuit_free(circ);
    102 }
    103 
    104 static void
    105 test_circuit_is_available_for_use_returns_false_for_onehop_tunnel(void *arg)
    106 {
    107  (void)arg;
    108 
    109  circuit_t *circ = dummy_origin_circuit_new(30);
    110  origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(circ);
    111  oc->build_state = tor_malloc_zero(sizeof(cpath_build_state_t));
    112  oc->build_state->onehop_tunnel = 1;
    113 
    114  tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ));
    115 
    116  done:
    117    circuit_free(circ);
    118 }
    119 
    120 static void
    121 test_circuit_is_available_for_use_returns_true_for_clean_circuit(void *arg)
    122 {
    123  (void)arg;
    124 
    125  circuit_t *circ = dummy_origin_circuit_new(30);
    126  origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(circ);
    127  oc->build_state = tor_malloc_zero(sizeof(cpath_build_state_t));
    128  oc->build_state->onehop_tunnel = 0;
    129 
    130  tt_int_op(1, OP_EQ, circuit_is_available_for_use(circ));
    131 
    132  done:
    133    circuit_free(circ);
    134 }
    135 
    136 static int
    137 mock_circuit_all_predicted_ports_handled(time_t now,
    138                                         int *need_uptime,
    139                                         int *need_capacity)
    140 {
    141  (void)now;
    142 
    143  if (need_uptime && need_capacity)
    144    return 0;
    145  return 1;
    146 }
    147 
    148 static consensus_path_type_t
    149 mock_router_have_unknown_consensus_path(void)
    150 {
    151  return CONSENSUS_PATH_UNKNOWN;
    152 }
    153 
    154 static consensus_path_type_t
    155 mock_router_have_exit_consensus_path(void)
    156 {
    157  return CONSENSUS_PATH_EXIT;
    158 }
    159 
    160 static void
    161 test_needs_exit_circuits_ret_false_for_predicted_ports_and_path(void *arg)
    162 {
    163  (void)arg;
    164 
    165  MOCK(circuit_all_predicted_ports_handled,
    166       mock_circuit_all_predicted_ports_handled);
    167  int needs_uptime = 1;
    168  int needs_capacity = 0;
    169 
    170  time_t now = time(NULL);
    171  tt_int_op(0, OP_EQ,
    172            needs_exit_circuits(now, &needs_uptime, &needs_capacity));
    173 
    174  done:
    175    UNMOCK(circuit_all_predicted_ports_handled);
    176 }
    177 
    178 static void
    179 test_needs_exit_circuits_ret_false_for_non_exit_consensus_path(void *arg)
    180 {
    181  (void)arg;
    182 
    183  MOCK(circuit_all_predicted_ports_handled,
    184       mock_circuit_all_predicted_ports_handled);
    185  int needs_uptime = 1;
    186  int needs_capacity = 1;
    187  MOCK(router_have_consensus_path, mock_router_have_unknown_consensus_path);
    188 
    189  time_t now = time(NULL);
    190  tt_int_op(0, OP_EQ,
    191            needs_exit_circuits(now, &needs_uptime, &needs_capacity));
    192 
    193  done:
    194    UNMOCK(circuit_all_predicted_ports_handled);
    195    UNMOCK(router_have_consensus_path);
    196 }
    197 
    198 static void
    199 test_needs_exit_circuits_ret_true_for_predicted_ports_and_path(void *arg)
    200 {
    201  (void)arg;
    202 
    203  MOCK(circuit_all_predicted_ports_handled,
    204       mock_circuit_all_predicted_ports_handled);
    205  int needs_uptime = 1;
    206  int needs_capacity = 1;
    207  MOCK(router_have_consensus_path, mock_router_have_exit_consensus_path);
    208 
    209  time_t now = time(NULL);
    210  tt_int_op(1, OP_EQ,
    211            needs_exit_circuits(now, &needs_uptime, &needs_capacity));
    212 
    213  done:
    214    UNMOCK(circuit_all_predicted_ports_handled);
    215    UNMOCK(router_have_consensus_path);
    216 }
    217 
    218 static void
    219 test_needs_circuits_for_build_ret_false_consensus_path_unknown(void *arg)
    220 {
    221  (void)arg;
    222  MOCK(router_have_consensus_path, mock_router_have_unknown_consensus_path);
    223  tt_int_op(0, OP_EQ, needs_circuits_for_build(0));
    224  done: ;
    225 }
    226 
    227 static void
    228 test_needs_circuits_for_build_ret_false_if_num_less_than_max(void *arg)
    229 {
    230  (void)arg;
    231  MOCK(router_have_consensus_path, mock_router_have_exit_consensus_path);
    232  tt_int_op(0, OP_EQ, needs_circuits_for_build(13));
    233  done:
    234    UNMOCK(router_have_consensus_path);
    235 }
    236 
    237 static void
    238 test_needs_circuits_for_build_returns_true_when_more_are_needed(void *arg)
    239 {
    240  (void)arg;
    241  MOCK(router_have_consensus_path, mock_router_have_exit_consensus_path);
    242  tt_int_op(1, OP_EQ, needs_circuits_for_build(0));
    243  done:
    244    UNMOCK(router_have_consensus_path);
    245 }
    246 
    247 struct testcase_t circuituse_tests[] = {
    248 { "marked",
    249   test_circuit_is_available_for_use_ret_false_when_marked_for_close,
    250   TT_FORK, NULL, NULL
    251 },
    252 { "timestamp",
    253   test_circuit_is_available_for_use_ret_false_when_timestamp_dirty,
    254   TT_FORK, NULL, NULL
    255 },
    256 { "non_general",
    257   test_circuit_is_available_for_use_ret_false_for_non_general_purpose,
    258   TT_FORK, NULL, NULL
    259 },
    260 { "non_general",
    261  test_circuit_is_available_for_use_ret_false_for_non_general_origin,
    262   TT_FORK, NULL, NULL
    263 },
    264 { "origin",
    265   test_circuit_is_available_for_use_ret_false_for_non_origin_purpose,
    266   TT_FORK, NULL, NULL
    267 },
    268 { "clean",
    269   test_circuit_is_available_for_use_ret_false_unusable_for_new_conns,
    270   TT_FORK, NULL, NULL
    271 },
    272 { "onehop",
    273   test_circuit_is_available_for_use_returns_false_for_onehop_tunnel,
    274   TT_FORK, NULL, NULL
    275 },
    276 { "clean_circ",
    277   test_circuit_is_available_for_use_returns_true_for_clean_circuit,
    278   TT_FORK, NULL, NULL
    279 },
    280 { "exit_f",
    281   test_needs_exit_circuits_ret_false_for_predicted_ports_and_path,
    282   TT_FORK, NULL, NULL
    283 },
    284 { "exit_t",
    285   test_needs_exit_circuits_ret_true_for_predicted_ports_and_path,
    286   TT_FORK, NULL, NULL
    287 },
    288 { "non_exit",
    289   test_needs_exit_circuits_ret_false_for_non_exit_consensus_path,
    290   TT_FORK, NULL, NULL
    291 },
    292 { "true",
    293   test_needs_exit_circuits_ret_true_for_predicted_ports_and_path,
    294   TT_FORK, NULL, NULL
    295 },
    296 { "consensus_path_unknown",
    297   test_needs_circuits_for_build_ret_false_consensus_path_unknown,
    298   TT_FORK, NULL, NULL
    299 },
    300 { "less_than_max",
    301   test_needs_circuits_for_build_ret_false_if_num_less_than_max,
    302   TT_FORK, NULL, NULL
    303 },
    304 { "more_needed",
    305   test_needs_circuits_for_build_returns_true_when_more_are_needed,
    306   TT_FORK, NULL, NULL
    307 },
    308  END_OF_TESTCASES
    309 };