From f4d1509d39d5b67b7d83fec75ae016141034f3c0 Mon Sep 17 00:00:00 2001 From: Christopher Baines Date: Wed, 9 Apr 2014 21:51:46 +0100 Subject: More tests --- networks/hs-dual-intro-fail-3 | 36 +++++++++++++ networks/hs-start-3 | 35 ++++++++++++ networks/hs-stop-3 | 35 ++++++++++++ networks/hs-tripple-intro-fail-3 | 36 +++++++++++++ networks/hs_instance_start.py | 68 +++++++++++++++++++++++ networks/hs_instance_stop.py | 86 +++++++++++++++++++++++++++++ networks/hs_intro_fail.py | 113 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 409 insertions(+) create mode 100644 networks/hs-dual-intro-fail-3 create mode 100644 networks/hs-start-3 create mode 100644 networks/hs-stop-3 create mode 100644 networks/hs-tripple-intro-fail-3 create mode 100644 networks/hs_instance_start.py create mode 100644 networks/hs_instance_stop.py create mode 100644 networks/hs_intro_fail.py diff --git a/networks/hs-dual-intro-fail-3 b/networks/hs-dual-intro-fail-3 new file mode 100644 index 0000000..49a5537 --- /dev/null +++ b/networks/hs-dual-intro-fail-3 @@ -0,0 +1,36 @@ +from hs_intro_fail import * + +network = Network() + +hs_nodes, hs_servers = testing.create_hidden_service(3) + +network.add(hs_nodes); + +network.add(Node.create(3, { + "tag": "a", + "authority": 1, + "relay": 1, + "torrc": "authority.tmpl" +})) + +network.add(Node.create(12, { + "tag": "c", + "torrc": "client.tmpl" +})) + +network.add(Node.create(30, { + "tag": "r", + "relay": 1, + "torrc": "intro.tmpl" +})) + +def start(): + results = hs_fail_test(network, failures=2) + + for server in hs_servers: + server.stopListening() + + network.stop() + + return results + diff --git a/networks/hs-start-3 b/networks/hs-start-3 new file mode 100644 index 0000000..bc60e94 --- /dev/null +++ b/networks/hs-start-3 @@ -0,0 +1,35 @@ +from hs_instance_start import * + +network = Network() + +hs_nodes, hs_servers = testing.create_hidden_service(3) + +network.add(hs_nodes); + +network.add(Node.create(3, { + "tag": "a", + "authority": 1, + "relay": 1, + "torrc": "authority.tmpl" +})) + +network.add(Node.create(30, { + "tag": "c", + "torrc": "client.tmpl" +})) + +network.add(Node.create(10, { + "tag": "r", + "relay": 1, + "torrc": "intro.tmpl" +})) + +def start(): + results = hs_instance_start(network) + + for server in hs_servers: + server.stopListening() + + network.stop() + + return results diff --git a/networks/hs-stop-3 b/networks/hs-stop-3 new file mode 100644 index 0000000..9242f77 --- /dev/null +++ b/networks/hs-stop-3 @@ -0,0 +1,35 @@ +from hs_instance_stop import * + +network = Network() + +hs_nodes, hs_servers = testing.create_hidden_service(3) + +network.add(hs_nodes); + +network.add(Node.create(3, { + "tag": "a", + "authority": 1, + "relay": 1, + "torrc": "authority.tmpl" +})) + +network.add(Node.create(30, { + "tag": "c", + "torrc": "client.tmpl" +})) + +network.add(Node.create(10, { + "tag": "r", + "relay": 1, + "torrc": "intro.tmpl" +})) + +def start(): + results = hs_instance_stop(network) + + for server in hs_servers: + server.stopListening() + + network.stop() + + return results diff --git a/networks/hs-tripple-intro-fail-3 b/networks/hs-tripple-intro-fail-3 new file mode 100644 index 0000000..b301640 --- /dev/null +++ b/networks/hs-tripple-intro-fail-3 @@ -0,0 +1,36 @@ +from hs_intro_fail import * + +network = Network() + +hs_nodes, hs_servers = testing.create_hidden_service(3) + +network.add(hs_nodes); + +network.add(Node.create(3, { + "tag": "a", + "authority": 1, + "relay": 1, + "torrc": "authority.tmpl" +})) + +network.add(Node.create(12, { + "tag": "c", + "torrc": "client.tmpl" +})) + +network.add(Node.create(30, { + "tag": "r", + "relay": 1, + "torrc": "intro.tmpl" +})) + +def start(): + results = hs_fail_test(network, failures=3) + + for server in hs_servers: + server.stopListening() + + network.stop() + + return results + diff --git a/networks/hs_instance_start.py b/networks/hs_instance_start.py new file mode 100644 index 0000000..42a3dbc --- /dev/null +++ b/networks/hs_instance_start.py @@ -0,0 +1,68 @@ +from chutney.Testing import * +from chutney.TorNet import * + +from twisted.internet import reactor + +from stem.control import EventType + +def hs_instance_start(network): + hs_nodes = network.get("h") + clients = network.get("c") + + if len(clients) % len(hs_nodes) != 0: + logging.error("There must be a equal number of clients per hs_node") + return False + + clients_per_node = len(clients) / len(hs_nodes) + + if clients_per_node < 1: + logging.error("Not enough clients") + return False + + logging.info("Clients per node %d" % clients_per_node) + + # To ensure the .. + client_groups = zip(*(iter(clients),) * clients_per_node) + + initial_nodes = network.get("a") + network.get("r") + network.get("c") + + if not all([ n.getController().start() for n in initial_nodes ]): + return False + + nodes_by_fingerprint = get_node_fingerprints(network.get("a") + network.get("r")) + + logging.info("All initial nodes running") + + thread.start_new_thread(reactor.run, (), {"installSignalHandlers": 0}) + + logging.info("There are %d nodes to start" % len(hs_nodes)) + + for i, hs_node in enumerate(hs_nodes): + logging.info("Starting node %d" % i) + + if not hs_node.getController().start(): + return False # Stop on failure + + track_introduction_points(hs_node) + + node_published_descriptor = threading.Event() + + def hs_node_listener(logevent): + if "Successfully uploaded v2 rend descriptors" in logevent.message: + node_published_descriptor.set() + + hs_node.getStemController().add_event_listener(hs_node_listener, EventType.INFO) + + node_published_descriptor.wait() + + hs_node.getStemController().remove_event_listener(hs_node_listener) + + # Now begin testing + + for c_group in range(i + 1): + logging.info("Testing with the %d client group" % c_group) + connection_test(client_groups[c_group], i + 1) + + check_same_intro_points() + + reactor.stop() diff --git a/networks/hs_instance_stop.py b/networks/hs_instance_stop.py new file mode 100644 index 0000000..a8d7dd9 --- /dev/null +++ b/networks/hs_instance_stop.py @@ -0,0 +1,86 @@ +from chutney.Testing import * +from chutney.TorNet import * + +from twisted.internet import reactor + +from stem.control import EventType + +import time + +def hs_instance_stop(network): + hs_nodes = network.get("h") + clients = network.get("c") + + if len(clients) % len(hs_nodes) != 0: + logging.error("There must be a equal number of clients per hs_node") + return False + + clients_per_node = len(clients) / len(hs_nodes) + + if clients_per_node < 1: + logging.error("Not enough clients") + return False + + logging.info("Clients per node %d" % clients_per_node) + + # To ensure the .. + client_groups = zip(*(iter(clients),) * clients_per_node) + + initial_nodes = network.get("a") + network.get("r") + network.get("c") + + if not all([ n.getController().start() for n in initial_nodes ]): + return False + + nodes_by_fingerprint = get_node_fingerprints(network.get("a") + network.get("r")) + + logging.info("All initial nodes running") + + thread.start_new_thread(reactor.run, (), {"installSignalHandlers": 0}) + + logging.info("There are %d nodes to start" % len(hs_nodes)) + + for i, hs_node in enumerate(hs_nodes): + logging.info("Starting node %d" % i) + + if not hs_node.getController().start(): + logging.error("Error starting node %d" %i) + return False # Stop on failure + + track_introduction_points(hs_node) + + node_published_descriptor = threading.Event() + + def hs_node_listener(logevent): + if "Successfully uploaded v2 rend descriptors" in logevent.message: + node_published_descriptor.set() + + hs_node.getStemController().add_event_listener(hs_node_listener, EventType.INFO) + + node_published_descriptor.wait() + + hs_node.getStemController().remove_event_listener(hs_node_listener) + + # Now begin testing + + for c_group in range(i + 1): + logging.info("Testing with the %d client group" % c_group) + connection_test(client_groups[c_group], i + 1) + + check_same_intro_points() + + for i, hs_node in reversed(list(enumerate(hs_nodes))): + logging.info("Stopping node %d" % i) + + hs_node.getController().stop() + + time.sleep(1) + + # Now begin testing + + for c_group in range(len(hs_nodes)): + logging.info("Testing with the %d client group" % c_group) + connection_test(client_groups[c_group], i + 1) + + check_same_intro_points() + + reactor.stop() diff --git a/networks/hs_intro_fail.py b/networks/hs_intro_fail.py new file mode 100644 index 0000000..537e881 --- /dev/null +++ b/networks/hs_intro_fail.py @@ -0,0 +1,113 @@ +from chutney.Testing import * +from chutney.TorNet import * + +from twisted.internet import reactor + +from stem.control import EventType + +def hs_fail_test(network, failures=1): + hs_nodes = network.get("h") + + initial_nodes = network.get("a") + network.get("r") + network.get("c") + hs_nodes[:1] + + if not all([ n.getController().start() for n in initial_nodes ]): + return False + + logging.info("All initial nodes running") + + thread.start_new_thread(reactor.run, (), {"installSignalHandlers": 0}) + + nodes_by_fingerprint = get_node_fingerprints(network.get("a") + network.get("r")) + + track_introduction_points(hs_nodes[0]) + + node_0_published_descriptor = threading.Event() + + def hs_node_0_listener(logevent): + if "Successfully uploaded v2 rend descriptors" in logevent.message: + node_0_published_descriptor.set() + + + hs_nodes[0].getStemController().add_event_listener(hs_node_0_listener, EventType.INFO) + + node_0_published_descriptor.wait() + + hs_nodes[0].getStemController().remove_event_listener(hs_node_0_listener) + + # list to cope with scope problems + node_counter = [len(hs_nodes) - 1] + node_counter_lock = threading.RLock() + + nodes_published_descriptors = threading.Event() + + def hs_node_listener(logevent): + if "Successfully uploaded v2 rend descriptors" in logevent.message: + with node_counter_lock: + node_counter[0] -= 1 + + if node_counter[0] == 0: + nodes_published_descriptors.set() + + for node in hs_nodes[1:]: + node.getController().start() + track_introduction_points(node) + + node.getStemController().add_event_listener(hs_node_listener, EventType.INFO) + + nodes_published_descriptors.wait() + + for node in hs_nodes[1:]: + node.getStemController().remove_event_listener(hs_node_listener) + + # Now begin testing + + connection_test(network.get("c"), len(hs_nodes)) + + time.sleep(5) + + logging.info("About to stop %d introduction points" % failures) + + fingerprints = set() + + while len(fingerprints) != failures: + # Select a random node that is being used as an introduction point + nodenum = random.choice(node_intro_circuits.keys()) + fingerprint = random.choice(node_intro_circuits[nodenum].values()) + + fingerprints.add(fingerprint) + + for fingerprint in fingerprints: + node = nodes_by_fingerprint[fingerprint] + + logging.info("stopping " + node._env["nick"] + " (" + fingerprint + ")") + + node.getStemController().close() + node.getController().stop() + + logging.info("begining to watch for the establishment of new introduction points") + + changed = [False for n in hs_nodes] + + intro_points_before = [set(node_intro_circuits[n._env["nodenum"]].values()) for n in hs_nodes] + + time.sleep(60) + + intro_points_after = [set(node_intro_circuits[n._env["nodenum"]].values()) for n in hs_nodes] + + for i, node in enumerate(hs_nodes): + before = intro_points_before[i] + after = intro_points_after[i] + + if before != after: + changed[i] = True + + if all(changed): + logging.info("All changed") + else: + logging.info("All did not change") + + check_same_intro_points() + + connection_test(network.get("c"), len(hs_nodes)) + + reactor.stop() -- cgit v1.2.3