aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Baines <cb15g11@soton.ac.uk>2014-04-09 21:51:46 +0100
committerChristopher Baines <cb15g11@soton.ac.uk>2014-04-09 21:51:46 +0100
commitf4d1509d39d5b67b7d83fec75ae016141034f3c0 (patch)
treed5c3223716516feec434767071f388a74732060a
parentd753b9994986c4a19d60bfe6c49609eb13d7ca7c (diff)
downloadchutney-f4d1509d39d5b67b7d83fec75ae016141034f3c0.tar
chutney-f4d1509d39d5b67b7d83fec75ae016141034f3c0.tar.gz
More tests
-rw-r--r--networks/hs-dual-intro-fail-336
-rw-r--r--networks/hs-start-335
-rw-r--r--networks/hs-stop-335
-rw-r--r--networks/hs-tripple-intro-fail-336
-rw-r--r--networks/hs_instance_start.py68
-rw-r--r--networks/hs_instance_stop.py86
-rw-r--r--networks/hs_intro_fail.py113
7 files changed, 409 insertions, 0 deletions
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()