mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 13:13:44 +01:00
Add unit tests for connection_describe().
This commit is contained in:
parent
9b5567df4e
commit
10d8555e7d
@ -10,6 +10,7 @@
|
|||||||
#include "core/or/or.h"
|
#include "core/or/or.h"
|
||||||
#include "test/test.h"
|
#include "test/test.h"
|
||||||
|
|
||||||
|
#include "app/config/config.h"
|
||||||
#include "app/config/or_options_st.h"
|
#include "app/config/or_options_st.h"
|
||||||
#include "core/mainloop/connection.h"
|
#include "core/mainloop/connection.h"
|
||||||
#include "core/or/connection_edge.h"
|
#include "core/or/connection_edge.h"
|
||||||
@ -961,6 +962,111 @@ test_failed_orconn_tracker(void *arg)
|
|||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_conn_describe(void *arg)
|
||||||
|
{
|
||||||
|
(void)arg;
|
||||||
|
or_options_t *options = get_options_mutable();
|
||||||
|
options->SafeLogging_ = SAFELOG_SCRUB_ALL;
|
||||||
|
|
||||||
|
// Let's start with a listener connection since they're simple.
|
||||||
|
connection_t *conn = connection_new(CONN_TYPE_OR_LISTENER, AF_INET);
|
||||||
|
tor_addr_parse(&conn->addr, "44.22.11.11");
|
||||||
|
conn->port = 80;
|
||||||
|
tt_str_op(connection_describe(conn), OP_EQ,
|
||||||
|
"OR listener connection (ready) on 44.22.11.11:80");
|
||||||
|
// If the address is unspec, we should still work.
|
||||||
|
tor_addr_make_unspec(&conn->addr);
|
||||||
|
tt_str_op(connection_describe(conn), OP_EQ,
|
||||||
|
"OR listener connection (ready) on <unset>:80");
|
||||||
|
// Try making the address null.
|
||||||
|
tor_addr_make_null(&conn->addr, AF_INET);
|
||||||
|
tt_str_op(connection_describe(conn), OP_EQ,
|
||||||
|
"OR listener connection (ready) on 0.0.0.0:80");
|
||||||
|
// What if the address is uninitialized? (This can happen if we log about the
|
||||||
|
// connection before we set the address.)
|
||||||
|
memset(&conn->addr, 0, sizeof(conn->addr));
|
||||||
|
tt_str_op(connection_describe(conn), OP_EQ,
|
||||||
|
"OR listener connection (ready) on <unset>:80");
|
||||||
|
connection_free_minimal(conn);
|
||||||
|
|
||||||
|
// Try a unix socket.
|
||||||
|
conn = connection_new(CONN_TYPE_CONTROL_LISTENER, AF_UNIX);
|
||||||
|
conn->address = tor_strdup("/a/path/that/could/exist");
|
||||||
|
tt_str_op(connection_describe(conn), OP_EQ,
|
||||||
|
"Control listener connection (ready) on /a/path/that/could/exist");
|
||||||
|
connection_free_minimal(conn);
|
||||||
|
|
||||||
|
// Try an IPv6 address.
|
||||||
|
conn = connection_new(CONN_TYPE_AP_LISTENER, AF_INET6);
|
||||||
|
tor_addr_parse(&conn->addr, "ff00::3");
|
||||||
|
conn->port = 9050;
|
||||||
|
tt_str_op(connection_describe(conn), OP_EQ,
|
||||||
|
"Socks listener connection (ready) on [ff00::3]:9050");
|
||||||
|
connection_free_minimal(conn);
|
||||||
|
|
||||||
|
// Now let's mess with exit connections. They have some special issues.
|
||||||
|
options->SafeLogging_ = SAFELOG_SCRUB_NONE;
|
||||||
|
conn = connection_new(CONN_TYPE_EXIT, AF_INET);
|
||||||
|
// If address and state are unset, we should say SOMETHING.
|
||||||
|
tt_str_op(connection_describe(conn), OP_EQ,
|
||||||
|
"Exit connection (uninitialized) to <unset> (DNS lookup pending)");
|
||||||
|
// Now suppose that the address is set but we haven't resolved the hostname.
|
||||||
|
conn->port = 443;
|
||||||
|
conn->address = tor_strdup("www.torproject.org");
|
||||||
|
conn->state = EXIT_CONN_STATE_RESOLVING;
|
||||||
|
tt_str_op(connection_describe(conn), OP_EQ,
|
||||||
|
"Exit connection (waiting for dest info) to "
|
||||||
|
"www.torproject.org:443 (DNS lookup pending)");
|
||||||
|
// Now give it a hostname!
|
||||||
|
tor_addr_parse(&conn->addr, "192.168.8.8");
|
||||||
|
conn->state = EXIT_CONN_STATE_OPEN;
|
||||||
|
tt_str_op(connection_describe(conn), OP_EQ,
|
||||||
|
"Exit connection (open) to 192.168.8.8:443");
|
||||||
|
// But what if safelogging is on?
|
||||||
|
options->SafeLogging_ = SAFELOG_SCRUB_RELAY;
|
||||||
|
tt_str_op(connection_describe(conn), OP_EQ,
|
||||||
|
"Exit connection (open) to [scrubbed]");
|
||||||
|
connection_free_minimal(conn);
|
||||||
|
|
||||||
|
// Now at last we look at OR addresses, which are complicated.
|
||||||
|
conn = connection_new(CONN_TYPE_OR, AF_INET6);
|
||||||
|
conn->state = OR_CONN_STATE_OPEN;
|
||||||
|
conn->port = 8080;
|
||||||
|
tor_addr_parse(&conn->addr, "[ffff:3333:1111::2]");
|
||||||
|
// This should get scrubbed, since the lack of a set ID means we might be
|
||||||
|
// talking to a client.
|
||||||
|
tt_str_op(connection_describe(conn), OP_EQ,
|
||||||
|
"OR connection (open) with [scrubbed]");
|
||||||
|
// But now suppose we aren't safelogging? We'll get the address then.
|
||||||
|
options->SafeLogging_ = SAFELOG_SCRUB_NONE;
|
||||||
|
tt_str_op(connection_describe(conn), OP_EQ,
|
||||||
|
"OR connection (open) with [ffff:3333:1111::2]:8080");
|
||||||
|
// Suppose we have an ID, so we know it isn't a client.
|
||||||
|
TO_OR_CONN(conn)->identity_digest[3] = 7;
|
||||||
|
options->SafeLogging_ = SAFELOG_SCRUB_RELAY; // back to safelogging.
|
||||||
|
tt_str_op(connection_describe(conn), OP_EQ,
|
||||||
|
"OR connection (open) with [ffff:3333:1111::2]:8080 "
|
||||||
|
"ID=0000000700000000000000000000000000000000");
|
||||||
|
// Add a 'real address' that is the same as the one we have.
|
||||||
|
tor_addr_parse(&TO_OR_CONN(conn)->real_addr, "[ffff:3333:1111::2]");
|
||||||
|
tt_str_op(connection_describe(conn), OP_EQ,
|
||||||
|
"OR connection (open) with [ffff:3333:1111::2]:8080 "
|
||||||
|
"ID=0000000700000000000000000000000000000000");
|
||||||
|
// Add a different 'real address'
|
||||||
|
tor_addr_parse(&TO_OR_CONN(conn)->real_addr, "[ffff:3333:1111::8]");
|
||||||
|
tt_str_op(connection_describe(conn), OP_EQ,
|
||||||
|
"OR connection (open) with [ffff:3333:1111::8]:8080 "
|
||||||
|
"ID=0000000700000000000000000000000000000000 "
|
||||||
|
"canonical_addr=[ffff:3333:1111::2]");
|
||||||
|
|
||||||
|
// Clear identity_digest so that free_minimal won't complain.
|
||||||
|
memset(TO_OR_CONN(conn)->identity_digest, 0, DIGEST_LEN);
|
||||||
|
|
||||||
|
done:
|
||||||
|
connection_free_minimal(conn);
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef COCCI
|
#ifndef COCCI
|
||||||
#define CONNECTION_TESTCASE(name, fork, setup) \
|
#define CONNECTION_TESTCASE(name, fork, setup) \
|
||||||
{ #name, test_conn_##name, fork, &setup, NULL }
|
{ #name, test_conn_##name, fork, &setup, NULL }
|
||||||
@ -995,5 +1101,6 @@ struct testcase_t connection_tests[] = {
|
|||||||
|
|
||||||
//CONNECTION_TESTCASE(func_suffix, TT_FORK, setup_func_pair),
|
//CONNECTION_TESTCASE(func_suffix, TT_FORK, setup_func_pair),
|
||||||
{ "failed_orconn_tracker", test_failed_orconn_tracker, TT_FORK, NULL, NULL },
|
{ "failed_orconn_tracker", test_failed_orconn_tracker, TT_FORK, NULL, NULL },
|
||||||
|
{ "describe", test_conn_describe, TT_FORK, NULL, NULL },
|
||||||
END_OF_TESTCASES
|
END_OF_TESTCASES
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user