aboutsummaryrefslogtreecommitdiff
path: root/networks/hs_intro_fail.py
diff options
context:
space:
mode:
Diffstat (limited to 'networks/hs_intro_fail.py')
-rw-r--r--networks/hs_intro_fail.py113
1 files changed, 113 insertions, 0 deletions
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()