From 09ccece5303e1ed877bbb75105a8eb62cd721238 Mon Sep 17 00:00:00 2001 From: Christopher Baines Date: Tue, 25 Mar 2014 14:24:56 +0000 Subject: Better test structure --- lib/chutney/Testing.py | 209 ++++++++++++++++++++++++++++++++++++++++++++++ lib/chutney/TorNet.py | 1 - networks/hs-intro-fail-3 | 210 ++--------------------------------------------- 3 files changed, 214 insertions(+), 206 deletions(-) create mode 100644 lib/chutney/Testing.py 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 -- cgit v1.2.3