diff options
author | Christopher Baines <cb15g11@soton.ac.uk> | 2014-04-04 16:23:22 +0100 |
---|---|---|
committer | Christopher Baines <cb15g11@soton.ac.uk> | 2014-04-04 16:23:22 +0100 |
commit | f8203cfd8560478d13cf5ca8883faafd626ca998 (patch) | |
tree | e79cb1177295b05b6d87867628860bd681f873ea /networks/hs-intro-fail-2 | |
parent | dbd356492f854c530660ea817fc2bde82191671a (diff) | |
download | chutney-f8203cfd8560478d13cf5ca8883faafd626ca998.tar chutney-f8203cfd8560478d13cf5ca8883faafd626ca998.tar.gz |
Better tests
Diffstat (limited to 'networks/hs-intro-fail-2')
-rw-r--r-- | networks/hs-intro-fail-2 | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/networks/hs-intro-fail-2 b/networks/hs-intro-fail-2 new file mode 100644 index 0000000..23d4c6e --- /dev/null +++ b/networks/hs-intro-fail-2 @@ -0,0 +1,189 @@ +from chutney.Testing import * + +authority_nodes = Node.create(3, { + "tag": "a", + "authority": 1, + "relay": 1, + "torrc": "authority.tmpl" +}) + +# hidden service (hs) nodes +hs_nodes = [] + +hs_servers = [] + +from twisted.web import server, resource +from twisted.internet import reactor + +# Use twisted to create web servers in this script +class Site(resource.Resource): + isLeaf = True + numberRequests = 0 + + def __init__(self, siteNum): + self.siteNum = siteNum + + def render_GET(self, request): + self.numberRequests += 1 + request.setHeader("content-type", "text/plain") + return str(self.siteNum) + +base_port = 10080 +for i in range(2): + + port = base_port + i + + node = Node( + tag="h", + hiddenservice=1, + torrc="hidden-service.tmpl", + hiddenservicetarget="127.0.0.1:%i" % port + ) + hs_nodes.append(node) + + site = server.Site(Site(i)) + + s = reactor.listenTCP(port, site) + hs_servers.append(s) + + port += 1 + +client_nodes = Node.create(12, { + "tag": "c", + "torrc": "client.tmpl" +}) + +relay_nodes = Node.create(10, { + "tag": "r", + "relay": 1, + "torrc": "intro.tmpl" +}) + +thread.start_new_thread(reactor.run, (), {"installSignalHandlers": 0}) + +initial_nodes = authority_nodes + relay_nodes + client_nodes + hs_nodes[:1] + +def start(): + if not all([ n.getController().start() for n in initial_nodes ]): + return False + + logging.info("All initial nodes running") + + nodes_by_fingerprint = get_node_fingerprints(authority_nodes + relay_nodes) + + 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) + + test_intro_failure(nodes_by_fingerprint) + +def test_intro_failure(nodes_by_fingerprint): + connection_test() + + time.sleep(5) + + # 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()) + + 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(20) + + 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() + + for server in hs_servers: + server.stopListening() + + reactor.stop() + + stop() + +def connection_test(): + logging.info("Connecting to clients") + + responses = {str(i): 0 for i in range(len(hs_servers))} + + for c in client_nodes: + result = c.query("http://2oiifbe3wne4iaqb.onion/"); + + if result in responses: + responses[result] += 1 + else: + logging.info("Unknown response: " + str(result)) + + test_pass = True + + for node, responses in sorted(responses.items()): + logging.info(node + ": " + str(responses)) + + if responses == 0: + test_pass = False + + if test_pass: + logging.info("Test PASS") + else: + logging.info("Test FAIL") |