|
@@ -4,6 +4,8 @@
|
|
/* See LICENSE for licensing information */
|
|
/* See LICENSE for licensing information */
|
|
|
|
|
|
#define CIRCUITBUILD_PRIVATE
|
|
#define CIRCUITBUILD_PRIVATE
|
|
|
|
+#define CIRCUITLIST_PRIVATE
|
|
|
|
+#define ENTRYNODES_PRIVATE
|
|
|
|
|
|
#include "core/or/or.h"
|
|
#include "core/or/or.h"
|
|
#include "test/test.h"
|
|
#include "test/test.h"
|
|
@@ -13,7 +15,11 @@
|
|
#include "core/or/circuitbuild.h"
|
|
#include "core/or/circuitbuild.h"
|
|
#include "core/or/circuitlist.h"
|
|
#include "core/or/circuitlist.h"
|
|
|
|
|
|
|
|
+#include "core/or/cpath_build_state_st.h"
|
|
#include "core/or/extend_info_st.h"
|
|
#include "core/or/extend_info_st.h"
|
|
|
|
+#include "core/or/origin_circuit_st.h"
|
|
|
|
+
|
|
|
|
+#include "feature/client/entrynodes.h"
|
|
|
|
|
|
/* Dummy nodes smartlist for testing */
|
|
/* Dummy nodes smartlist for testing */
|
|
static smartlist_t dummy_nodes;
|
|
static smartlist_t dummy_nodes;
|
|
@@ -126,10 +132,51 @@ test_new_route_len_unhandled_exit(void *arg)
|
|
UNMOCK(count_acceptable_nodes);
|
|
UNMOCK(count_acceptable_nodes);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void
|
|
|
|
+test_upgrade_from_guard_wait(void *arg)
|
|
|
|
+{
|
|
|
|
+ circuit_t *circ = NULL;
|
|
|
|
+ origin_circuit_t *orig_circ = NULL;
|
|
|
|
+ entry_guard_t *guard = NULL;
|
|
|
|
+ smartlist_t *list = NULL;
|
|
|
|
+
|
|
|
|
+ (void) arg;
|
|
|
|
+
|
|
|
|
+ circ = dummy_origin_circuit_new(0);
|
|
|
|
+ orig_circ = TO_ORIGIN_CIRCUIT(circ);
|
|
|
|
+ tt_assert(orig_circ);
|
|
|
|
+
|
|
|
|
+ orig_circ->build_state = tor_malloc_zero(sizeof(cpath_build_state_t));
|
|
|
|
+
|
|
|
|
+ circuit_set_state(circ, CIRCUIT_STATE_GUARD_WAIT);
|
|
|
|
+
|
|
|
|
+ /* Put it in guard wait state. */
|
|
|
|
+ guard = tor_malloc_zero(sizeof(*guard));
|
|
|
|
+ guard->in_selection = get_guard_selection_info();
|
|
|
|
+
|
|
|
|
+ orig_circ->guard_state =
|
|
|
|
+ circuit_guard_state_new(guard, GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD,
|
|
|
|
+ NULL);
|
|
|
|
+
|
|
|
|
+ /* Mark the circuit for close. */
|
|
|
|
+ circuit_mark_for_close(circ, END_CIRC_REASON_TORPROTOCOL);
|
|
|
|
+ tt_int_op(circ->marked_for_close, OP_NE, 0);
|
|
|
|
+
|
|
|
|
+ /* We shouldn't pick the mark for close circuit. */
|
|
|
|
+ list = circuit_find_circuits_to_upgrade_from_guard_wait();
|
|
|
|
+ tt_assert(!list);
|
|
|
|
+
|
|
|
|
+ done:
|
|
|
|
+ circuit_free(circ);
|
|
|
|
+ entry_guard_free_(guard);
|
|
|
|
+}
|
|
|
|
+
|
|
struct testcase_t circuitbuild_tests[] = {
|
|
struct testcase_t circuitbuild_tests[] = {
|
|
{ "noexit", test_new_route_len_noexit, 0, NULL, NULL },
|
|
{ "noexit", test_new_route_len_noexit, 0, NULL, NULL },
|
|
{ "safe_exit", test_new_route_len_safe_exit, 0, NULL, NULL },
|
|
{ "safe_exit", test_new_route_len_safe_exit, 0, NULL, NULL },
|
|
{ "unsafe_exit", test_new_route_len_unsafe_exit, 0, NULL, NULL },
|
|
{ "unsafe_exit", test_new_route_len_unsafe_exit, 0, NULL, NULL },
|
|
{ "unhandled_exit", test_new_route_len_unhandled_exit, 0, NULL, NULL },
|
|
{ "unhandled_exit", test_new_route_len_unhandled_exit, 0, NULL, NULL },
|
|
|
|
+ { "upgrade_from_guard_wait", test_upgrade_from_guard_wait, TT_FORK,
|
|
|
|
+ NULL, NULL },
|
|
END_OF_TESTCASES
|
|
END_OF_TESTCASES
|
|
};
|
|
};
|