commit 7d4efa2102727a1135bd19204e7d35f7b8900ec4 Author: Damian Johnson atagar@torproject.org Date: Mon Mar 4 00:10:07 2013 -0800
Tests for descriptor tutorial examples
Unit tests for our new 'mirror, mirror' tutorial examples, and writing our prior tests to conform with the way-less-sucky style that separates the mocking from the example. --- docs/tutorial/mirror_mirror_on_the_wall.rst | 4 +- test/unit/tutorial.py | 152 ++++++++++++++++++++------- 2 files changed, 117 insertions(+), 39 deletions(-)
diff --git a/docs/tutorial/mirror_mirror_on_the_wall.rst b/docs/tutorial/mirror_mirror_on_the_wall.rst index 3679ec1..617d898 100644 --- a/docs/tutorial/mirror_mirror_on_the_wall.rst +++ b/docs/tutorial/mirror_mirror_on_the_wall.rst @@ -87,7 +87,7 @@ through tor's control socket...
from stem.descriptor import parse_file
- for desc in parse_file("/home/atagar/.tor/cached-consensus"): + for desc in parse_file(open("/home/atagar/.tor/cached-consensus")): print "found relay %s (%s)" % (desc.nickname, desc.fingerprint)
.. _where-can-i-get-past-descriptors: @@ -128,7 +128,7 @@ this to work.
import sys
- from stem.contorl import Controller + from stem.control import Controller from stem.util import str_tools
# provides a mapping of observed bandwidth to the relay nicknames diff --git a/test/unit/tutorial.py b/test/unit/tutorial.py index 7d79eb2..0aec3a3 100644 --- a/test/unit/tutorial.py +++ b/test/unit/tutorial.py @@ -9,8 +9,16 @@ import sys import unittest
from stem.control import Controller +from stem.descriptor.reader import DescriptorReader +from stem.descriptor.server_descriptor import RelayDescriptor from test import mocking
+MIRROR_MIRROR_OUTPUT = """\ +1. speedyexit (102.13 KB/s) +2. speedyexit (102.13 KB/s) +3. speedyexit (102.13 KB/s) +""" +
class TestTutorial(unittest.TestCase): stdout, stdout_real = None, None @@ -53,53 +61,123 @@ class TestTutorial(unittest.TestCase): tutorial_example() self.assertEqual("My Tor relay has read 33406 bytes and written 29649.\n", self.stdout.getvalue())
- def test_mirror_mirror_on_the_wall(self): - from stem.descriptor.server_descriptor import RelayDescriptor - from stem.descriptor.reader import DescriptorReader - from stem.util import str_tools + def test_mirror_mirror_on_the_wall_1(self): + def tutorial_example(): + from stem.control import Controller
- exit_descriptor = mocking.get_relay_server_descriptor({ - 'router': 'speedyexit 149.255.97.109 9001 0 0' - }, content = True).replace('reject *:*', 'accept *:*') - exit_descriptor = mocking.sign_descriptor_content(exit_descriptor) - exit_descriptor = RelayDescriptor(exit_descriptor) + with Controller.from_port(control_port = 9051) as controller: + controller.authenticate()
- reader_wrapper = mocking.get_object(DescriptorReader, { - '__enter__': lambda x: x, - '__exit__': mocking.no_op(), - '__iter__': mocking.return_value(iter(( - exit_descriptor, - mocking.get_relay_server_descriptor(), # non-exit - exit_descriptor, - exit_descriptor, - ))) + for desc in controller.get_network_statuses(): + print "found relay %s (%s)" % (desc.nickname, desc.fingerprint) + + controller = mocking.get_object(Controller, { + 'authenticate': mocking.no_op(), + 'close': mocking.no_op(), + 'get_network_statuses': mocking.return_value( + [mocking.get_router_status_entry_v2()], + ), })
- # provides a mapping of observed bandwidth to the relay nicknames - def get_bw_to_relay(): - bw_to_relay = {} + mocking.mock( + Controller.from_port, mocking.return_value(controller), + target_module = Controller, + is_static = True, + ) + + tutorial_example() + self.assertEqual("found relay caerSidi (A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB)\n", self.stdout.getvalue()) + + def test_mirror_mirror_on_the_wall_2(self): + def tutorial_example(): + from stem.descriptor import parse_file + + for desc in parse_file(open("/home/atagar/.tor/cached-consensus")): + print "found relay %s (%s)" % (desc.nickname, desc.fingerprint) + + test_file = StringIO.StringIO(mocking.get_network_status_document_v3( + routers = [mocking.get_router_status_entry_v3()], + content = True, + )) + + mocking.support_with(test_file) + test_file.name = "/home/atagar/.tor/cached-consensus" + mocking.mock(open, mocking.return_value(test_file)) + + tutorial_example() + self.assertEqual("found relay caerSidi (A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB)\n", self.stdout.getvalue()) + + def test_mirror_mirror_on_the_wall_3(self): + def tutorial_example(): + from stem.descriptor.reader import DescriptorReader
- with reader_wrapper as reader: + with DescriptorReader(["/home/atagar/server-descriptors-2013-03.tar"]) as reader: for desc in reader: - if desc.exit_policy.is_exiting_allowed(): - bw_to_relay.setdefault(desc.observed_bandwidth, []).append(desc.nickname) + print "found relay %s (%s)" % (desc.nickname, desc.fingerprint)
- return bw_to_relay + mocking.mock( + DescriptorReader.__iter__, + mocking.return_value(iter([mocking.get_relay_server_descriptor()])), + target_module = DescriptorReader + ) + + tutorial_example() + self.assertEqual("found relay caerSidi (None)\n", self.stdout.getvalue()) + + def test_mirror_mirror_on_the_wall_4(self): + def tutorial_example(): + from stem.control import Controller + from stem.util import str_tools + + # provides a mapping of observed bandwidth to the relay nicknames + def get_bw_to_relay(): + bw_to_relay = {}
- # prints the top fifteen relays + with Controller.from_port(control_port = 9051) as controller: + controller.authenticate()
- bw_to_relay = get_bw_to_relay() - count = 1 + for desc in controller.get_server_descriptors(): + if desc.exit_policy.is_exiting_allowed(): + bw_to_relay.setdefault(desc.observed_bandwidth, []).append(desc.nickname) + + return bw_to_relay + + # prints the top fifteen relays + + bw_to_relay = get_bw_to_relay() + count = 1 + + for bw_value in sorted(bw_to_relay.keys(), reverse = True): + for nickname in bw_to_relay[bw_value]: + print "%i. %s (%s/s)" % (count, nickname, str_tools.get_size_label(bw_value, 2)) + count += 1 + + if count > 15: + return + + exit_descriptor = mocking.get_relay_server_descriptor({ + 'router': 'speedyexit 149.255.97.109 9001 0 0' + }, content = True).replace('reject *:*', 'accept *:*')
- for bw_value in sorted(bw_to_relay.keys(), reverse = True): - for nickname in bw_to_relay[bw_value]: - print "%i. %s (%s/s)" % (count, nickname, str_tools.get_size_label(bw_value, 2)) + exit_descriptor = mocking.sign_descriptor_content(exit_descriptor) + exit_descriptor = RelayDescriptor(exit_descriptor)
- count += 1 + controller = mocking.get_object(Controller, { + 'authenticate': mocking.no_op(), + 'close': mocking.no_op(), + 'get_server_descriptors': mocking.return_value([ + exit_descriptor, + mocking.get_relay_server_descriptor(), # non-exit + exit_descriptor, + exit_descriptor, + ]) + })
- if count > 15: - return + mocking.mock( + Controller.from_port, mocking.return_value(controller), + target_module = Controller, + is_static = True, + )
- expected_stdout = "".join(["%i. speedyexit (102.13 KB/s)\n" % i for i in xrange(1, 4)]) - self.assertEqual(expected_stdout, self.stdout.getvalue()) - self.assertEqual(4, count) + tutorial_example() + self.assertEqual(MIRROR_MIRROR_OUTPUT, self.stdout.getvalue())
tor-commits@lists.torproject.org