aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Baines <cb15g11@soton.ac.uk>2014-03-25 14:24:56 +0000
committerChristopher Baines <cb15g11@soton.ac.uk>2014-03-25 14:24:56 +0000
commit09ccece5303e1ed877bbb75105a8eb62cd721238 (patch)
treeb166daa7a84c447b165100912520539ca0da510a
parentc77297ef611096707f14cefb1f8dbe4cc96df446 (diff)
downloadchutney-09ccece5303e1ed877bbb75105a8eb62cd721238.tar
chutney-09ccece5303e1ed877bbb75105a8eb62cd721238.tar.gz
Better test structure
-rw-r--r--lib/chutney/Testing.py209
-rw-r--r--lib/chutney/TorNet.py1
-rw-r--r--networks/hs-intro-fail-3210
3 files changed, 214 insertions, 206 deletions
diff --git a/lib/chutney/Testing.py b/lib/chutney/Testing.py
new file mode 100644
index 0000000..ad69b52
--- /dev/null
+++ b/lib/chutney/Testing.py
@@ -0,0 +1,209 @@
+import Queue
+import stem.control
+import logging
+
+# Introduction Point Tracking
+
+node_intro_circuits = {}
+
+node_intro_events = {}
+
+# node_events
+
+introduction_point_circuits = {}
+
+nodes_by_fingerprint = {}
+
+#{ nodenum: { circuit: "fingerprint", circuit: "fingerprint" } }
+
+def get_node_fingerprints(nodes):
+
+ for n in nodes:
+ fingerprint = n.getStemController().get_info("fingerprint")
+ nodes_by_fingerprint[fingerprint] = n
+
+ return nodes_by_fingerprint
+
+def track_introduction_points(node):
+ nodenum = node._env["nodenum"]
+ nodenick = node._env["nick"]
+
+ node_intro_circuits[nodenum] = {}
+
+ node_intro_events[nodenum] = Queue.Queue()
+
+ def listener(logevent):
+ prefix = "rend_service_intro_has_opened(): Established circuit "
+ if logevent.message.startswith(prefix):
+ circuit = logevent.message[len(prefix):].split(" ")[0]
+ fingerprint = logevent.message[len(prefix):].split(" ")[1][1:]
+
+ node_intro_circuits[nodenum][circuit] = fingerprint
+
+ added_intro_node = nodes_by_fingerprint[fingerprint]
+
+ logging.info("%s: added %s (%s)" % (nodenick, added_intro_node._env["nick"], fingerprint))
+
+ node_intro_events[nodenum].put(("added", fingerprint))
+
+ prefix = "rend_services_introduce(): Giving up on "
+ if logevent.message.startswith(prefix) or "Giving up on" in logevent.message:
+ fingerprint = logevent.message[len(prefix):].split(" ")[0][1:41]
+
+ for_deletion = []
+
+ for circuit, fp in node_intro_circuits[nodenum].iteritems():
+ #log("circuit " + str(circuit) + " fp " + str(fp))
+ if fingerprint == fp:
+ for_deletion.append(circuit)
+
+ if len(for_deletion) == 0:
+ logging.info("got log message " + logevent.message + " but not deleting an introduction point")
+
+ for circuit in for_deletion:
+ fingerprint = node_intro_circuits[nodenum][circuit]
+
+ removed_intro_node = nodes_by_fingerprint[fingerprint]
+
+ logging.info("%s: removed %s (%s)" % (nodenick, removed_intro_node._env["nick"], fingerprint))
+
+ node_intro_events[nodenum].put(("removed", fingerprint))
+ del node_intro_circuits[nodenum][circuit]
+ logging.debug(nodenick + ": " + logevent.message)
+
+
+ node.getStemController().add_event_listener(listener, stem.control.EventType.INFO)
+ logging.info("Tracking introduction points for " + node._env["nick"])
+
+def track_introduction_point(node):
+ nodenum = node._env["nodenum"]
+ nodenick = node._env["nick"]
+
+ introduction_point_circuits[node] = {}
+
+ def listener(logevent):
+ prefix = " "
+ if logevent.message.startswith(prefix):
+ circuit = logevent.message[len(prefix):].split(" ")[0]
+ fingerprint = logevent.message[len(prefix):].split(" ")[1][1:]
+
+ node_intro_circuits[nodenum][circuit] = fingerprint
+
+ added_intro_node = nodes_by_fingerprint[fingerprint]
+
+ logging.info("%s: added %s (%s)" % (nodenick, added_intro_node._env["nick"], fingerprint))
+
+ node_intro_events[nodenum].put(("added", fingerprint))
+
+ prefix = "rend_services_introduce(): Giving up on "
+ if logevent.message.startswith(prefix) or "Giving up on" in logevent.message:
+ logging.info(logevent.message)
+ fingerprint = logevent.message[len(prefix):].split(" ")[0][1:41]
+
+ for_deletion = []
+
+ for circuit, fp in node_intro_circuits[nodenum].iteritems():
+ #log("circuit " + str(circuit) + " fp " + str(fp))
+ if fingerprint == fp:
+ for_deletion.append(circuit)
+
+ if len(for_deletion) == 0:
+ logging.info("got log message " + logevent.message + " but not deleting an introduction point")
+
+ for circuit in for_deletion:
+ fingerprint = node_intro_circuits[nodenum][circuit]
+
+ removed_intro_node = nodes_by_fingerprint[fingerprint]
+
+ logging.info("%s: removed %s (%s)" % (nodenick, removed_intro_node._env["nick"], fingerprint))
+
+ node_intro_events[nodenum].put(("removed", fingerprint))
+ del node_intro_circuits[nodenum][circuit]
+
+
+ node.getStemController().add_event_listener(listener, stem.control.EventType.INFO)
+ logging.info("Tracking introduction points for " + node._env["nick"])
+
+
+def determine_max_load(service_url, clients):
+ request_queue = Queue.Queue(1000)
+ singlelock = threading.Lock()
+
+ responses = []
+
+ running = True
+
+ class worker(threading.Thread):
+ def __init__ (self, client):
+ super(worker, self).__init__()
+ self.client = client
+
+ def run(self):
+ while running:
+ try:
+ request = request_queue.get(True, 1)
+
+ print("making request")
+ result = self.client.query("http://2oiifbe3wne4iaqb.onion/");
+
+ singlelock.acquire()
+ responses.append((result, time.time()))
+ print("result " + str(result))
+ singlelock.release()
+
+ # Let the queue know the job is finished.
+ request_queue.task_done()
+ except:
+ pass
+
+ # Create worker threads
+ for client in clients:
+ worker(client).start()
+
+ # Add elements to eueue at rate current_load
+ # Check size of queue, if above limit, return current_load
+
+ while True:
+ # Determine Average Load
+ time_barrier = time.time() - 10.0
+
+ last_responses = []
+
+ singlelock.acquire()
+ for response, response_time in reversed(responses):
+ if response_time < time_barrier:
+ break
+ last_responses.append(response)
+ singlelock.release()
+
+ current_average_load = len(last_responses) / 10.0
+ print("current average load %f" % current_average_load)
+
+ new_load = int(current_average_load) + 1
+
+ time_per_item = 1.0 / new_load
+
+ for i in range(new_load):
+ print("putting in item")
+ request_queue.put(1)
+ time.sleep(time_per_item)
+
+def check_same_intro_points():
+ intro_sets = []
+ for introduction_points in node_intro_circuits.values():
+ intro_sets.append(set(introduction_points.values()))
+
+ if intro_sets[0].issubset(intro_sets[1]) and intro_sets[1].issubset(intro_sets[0]):
+ logging.info("Same introduction points")
+ for fingerprint in node_intro_circuits.values()[0].values():
+ node = nodes_by_fingerprint[fingerprint]
+ logging.info(" - " + node._env["nick"] + "(" + fingerprint + ")")
+ return True
+ else:
+ logging.info("Not the same introduction points")
+ for num, circuits in node_intro_circuits.items():
+ logging.info("node %i" % num)
+ for fingerprint in sorted(circuits.values()):
+ node = nodes_by_fingerprint[fingerprint]
+ logging.info(" - " + node._env["nick"] + "(" + fingerprint + ")")
+ return False
diff --git a/lib/chutney/TorNet.py b/lib/chutney/TorNet.py
index 04af448..0fdeb04 100644
--- a/lib/chutney/TorNet.py
+++ b/lib/chutney/TorNet.py
@@ -677,7 +677,6 @@ class Network(object):
self.start()
def start(self):
- print "Starting network"
self._dfltEnv['start_time'] = time.time()
return self._start()
diff --git a/networks/hs-intro-fail-3 b/networks/hs-intro-fail-3
index c68071d..dac8e26 100644
--- a/networks/hs-intro-fail-3
+++ b/networks/hs-intro-fail-3
@@ -1,3 +1,5 @@
+from chutney.Testing import *
+
authority_nodes = Node.create(3, {
"tag": "a",
"authority": 1,
@@ -69,9 +71,7 @@ def start():
logging.info("All initial nodes running")
- for n in authority_nodes + relay_nodes:
- fingerprint = n.getStemController().get_info("fingerprint")
- nodes_by_fingerprint[fingerprint] = n
+ nodes_by_fingerprint = get_node_fingerprints(authority_nodes + relay_nodes)
track_introduction_points(hs_nodes[0])
@@ -114,9 +114,9 @@ def start():
node.getStemController().remove_event_listener(hs_node_listener)
#thread.start_new_thread(test_intro_failure, ())
- test_intro_failure()
+ test_intro_failure(nodes_by_fingerprint)
-def test_intro_failure():
+def test_intro_failure(nodes_by_fingerprint):
connection_test()
time.sleep(5)
@@ -178,203 +178,3 @@ def connection_test():
logging.info("Unknown response: " + str(result))
logging.info(str(responses))
-
-## Utility Code
-
-# Introduction Point Tracking
-
-node_intro_circuits = {}
-
-node_intro_events = {}
-
-# node_events
-
-introduction_point_circuits = {}
-
-nodes_by_fingerprint = {}
-
-#{ nodenum: { circuit: "fingerprint", circuit: "fingerprint" } }
-
-def track_introduction_points(node):
- nodenum = node._env["nodenum"]
- nodenick = node._env["nick"]
-
- node_intro_circuits[nodenum] = {}
-
- node_intro_events[nodenum] = Queue.Queue()
-
- def listener(logevent):
- prefix = "rend_service_intro_has_opened(): Established circuit "
- if logevent.message.startswith(prefix):
- circuit = logevent.message[len(prefix):].split(" ")[0]
- fingerprint = logevent.message[len(prefix):].split(" ")[1][1:]
-
- node_intro_circuits[nodenum][circuit] = fingerprint
-
- added_intro_node = nodes_by_fingerprint[fingerprint]
-
- logging.info("%s: added %s (%s)" % (nodenick, added_intro_node._env["nick"], fingerprint))
-
- node_intro_events[nodenum].put(("added", fingerprint))
-
- prefix = "rend_services_introduce(): Giving up on "
- if logevent.message.startswith(prefix) or "Giving up on" in logevent.message:
- fingerprint = logevent.message[len(prefix):].split(" ")[0][1:41]
-
- for_deletion = []
-
- for circuit, fp in node_intro_circuits[nodenum].iteritems():
- #log("circuit " + str(circuit) + " fp " + str(fp))
- if fingerprint == fp:
- for_deletion.append(circuit)
-
- if len(for_deletion) == 0:
- logging.info("got log message " + logevent.message + " but not deleting an introduction point")
-
- for circuit in for_deletion:
- fingerprint = node_intro_circuits[nodenum][circuit]
-
- removed_intro_node = nodes_by_fingerprint[fingerprint]
-
- logging.info("%s: removed %s (%s)" % (nodenick, removed_intro_node._env["nick"], fingerprint))
-
- node_intro_events[nodenum].put(("removed", fingerprint))
- del node_intro_circuits[nodenum][circuit]
- logging.debug(nodenick + ": " + logevent.message)
-
-
- node.getStemController().add_event_listener(listener, EventType.INFO)
- logging.info("Tracking introduction points for " + node._env["nick"])
-
-def track_introduction_point(node):
- nodenum = node._env["nodenum"]
- nodenick = node._env["nick"]
-
- introduction_point_circuits[node] = {}
-
- def listener(logevent):
- prefix = " "
- if logevent.message.startswith(prefix):
- circuit = logevent.message[len(prefix):].split(" ")[0]
- fingerprint = logevent.message[len(prefix):].split(" ")[1][1:]
-
- node_intro_circuits[nodenum][circuit] = fingerprint
-
- added_intro_node = nodes_by_fingerprint[fingerprint]
-
- logging.info("%s: added %s (%s)" % (nodenick, added_intro_node._env["nick"], fingerprint))
-
- node_intro_events[nodenum].put(("added", fingerprint))
-
- prefix = "rend_services_introduce(): Giving up on "
- if logevent.message.startswith(prefix) or "Giving up on" in logevent.message:
- logging.info(logevent.message)
- fingerprint = logevent.message[len(prefix):].split(" ")[0][1:41]
-
- for_deletion = []
-
- for circuit, fp in node_intro_circuits[nodenum].iteritems():
- #log("circuit " + str(circuit) + " fp " + str(fp))
- if fingerprint == fp:
- for_deletion.append(circuit)
-
- if len(for_deletion) == 0:
- logging.info("got log message " + logevent.message + " but not deleting an introduction point")
-
- for circuit in for_deletion:
- fingerprint = node_intro_circuits[nodenum][circuit]
-
- removed_intro_node = nodes_by_fingerprint[fingerprint]
-
- logging.info("%s: removed %s (%s)" % (nodenick, removed_intro_node._env["nick"], fingerprint))
-
- node_intro_events[nodenum].put(("removed", fingerprint))
- del node_intro_circuits[nodenum][circuit]
-
-
- node.getStemController().add_event_listener(listener, EventType.INFO)
- logging.info("Tracking introduction points for " + node._env["nick"])
-
-
-def determine_max_load(service_url, clients):
- request_queue = Queue.Queue(1000)
- singlelock = threading.Lock()
-
- responses = []
-
- running = True
-
- class worker(threading.Thread):
- def __init__ (self, client):
- super(worker, self).__init__()
- self.client = client
-
- def run(self):
- while running:
- try:
- request = request_queue.get(True, 1)
-
- print("making request")
- result = self.client.query("http://2oiifbe3wne4iaqb.onion/");
-
- singlelock.acquire()
- responses.append((result, time.time()))
- print("result " + str(result))
- singlelock.release()
-
- # Let the queue know the job is finished.
- request_queue.task_done()
- except:
- pass
-
- # Create worker threads
- for client in clients:
- worker(client).start()
-
- # Add elements to eueue at rate current_load
- # Check size of queue, if above limit, return current_load
-
- while True:
- # Determine Average Load
- time_barrier = time.time() - 10.0
-
- last_responses = []
-
- singlelock.acquire()
- for response, response_time in reversed(responses):
- if response_time < time_barrier:
- break
- last_responses.append(response)
- singlelock.release()
-
- current_average_load = len(last_responses) / 10.0
- print("current average load %f" % current_average_load)
-
- new_load = int(current_average_load) + 1
-
- time_per_item = 1.0 / new_load
-
- for i in range(new_load):
- print("putting in item")
- request_queue.put(1)
- time.sleep(time_per_item)
-
-def check_same_intro_points():
- intro_sets = []
- for introduction_points in node_intro_circuits.values():
- intro_sets.append(set(introduction_points.values()))
-
- if intro_sets[0].issubset(intro_sets[1]) and intro_sets[1].issubset(intro_sets[0]):
- logging.info("Same introduction points")
- for fingerprint in node_intro_circuits.values()[0].values():
- node = nodes_by_fingerprint[fingerprint]
- logging.info(" - " + node._env["nick"] + "(" + fingerprint + ")")
- return True
- else:
- logging.info("Not the same introduction points")
- for num, circuits in node_intro_circuits.items():
- logging.info("node %i" % num)
- for fingerprint in sorted(circuits.values()):
- node = nodes_by_fingerprint[fingerprint]
- logging.info(" - " + node._env["nick"] + "(" + fingerprint + ")")
- return False