[tor-commits] [stem/master] Cleaning up 'The Little Engine that Could' tutorial test

atagar at torproject.org atagar at torproject.org
Mon Mar 4 08:17:57 UTC 2013


commit 478ba3a44f3291367eeaea9ba9ce0f4cab24f517
Author: Damian Johnson <atagar at torproject.org>
Date:   Sat Feb 23 11:49:02 2013 -0800

    Cleaning up 'The Little Engine that Could' tutorial test
    
    Of all our tests the tutorial example tests stick out as being... just
    aweful. They work I guess but their mix of heavy mocking and the example being
    tested is both damn confusing and unmaintainable.
    
    Breaking it up so the mocking is entirely separate from the tutorial code.
---
 docs/tutorial/the_little_relay_that_could.rst |    2 +-
 test/mocking.py                               |   12 ++++++---
 test/unit/tutorial.py                         |   32 +++++++++++++++---------
 3 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/docs/tutorial/the_little_relay_that_could.rst b/docs/tutorial/the_little_relay_that_could.rst
index 5f85f6e..e3f42d0 100644
--- a/docs/tutorial/the_little_relay_that_could.rst
+++ b/docs/tutorial/the_little_relay_that_could.rst
@@ -49,7 +49,7 @@ many bytes Tor has sent and received...
   from stem.control import Controller
   
   with Controller.from_port(control_port = 9051) as controller:
-    controller.authenticate() # provide the password here if you set one
+    controller.authenticate()  # provide the password here if you set one
 
     bytes_read = controller.get_info("traffic/read")
     bytes_written = controller.get_info("traffic/written")
diff --git a/test/mocking.py b/test/mocking.py
index 3ee8f08..9ed3fbb 100644
--- a/test/mocking.py
+++ b/test/mocking.py
@@ -204,14 +204,14 @@ NETWORK_STATUS_DOCUMENT_FOOTER = (
 
 
 def no_op():
-  def _no_op(*args):
+  def _no_op(*args, **kwargs):
     pass
 
   return _no_op
 
 
 def return_value(value):
-  def _return_value(*args):
+  def _return_value(*args, **kwargs):
     return value
 
   return _return_value
@@ -318,7 +318,7 @@ def support_with(obj):
   return obj
 
 
-def mock(target, mock_call, target_module=None):
+def mock(target, mock_call, target_module = None, is_static = False):
   """
   Mocks the given function, saving the initial implementation so it can be
   reverted later.
@@ -331,6 +331,7 @@ def mock(target, mock_call, target_module=None):
   :param function target: function to be mocked
   :param functor mock_call: mocking to replace the function with
   :param module target_module: module that this is mocking, this defaults to the inspected value
+  :param bool is_static: handles this like a static method of the target_module if True
   """
 
   if hasattr(target, "mock_id"):
@@ -349,7 +350,10 @@ def mock(target, mock_call, target_module=None):
 
   # mocks the function with this wrapper
 
-  setattr(target_module, target_function, mock_wrapper)
+  if is_static:
+    setattr(target_module, target_function, staticmethod(mock_wrapper))
+  else:
+    setattr(target_module, target_function, mock_wrapper)
 
 
 def mock_method(target_class, method_name, mock_call):
diff --git a/test/unit/tutorial.py b/test/unit/tutorial.py
index 21db41b..7d79eb2 100644
--- a/test/unit/tutorial.py
+++ b/test/unit/tutorial.py
@@ -8,6 +8,7 @@ import StringIO
 import sys
 import unittest
 
+from stem.control import Controller
 from test import mocking
 
 
@@ -23,27 +24,34 @@ class TestTutorial(unittest.TestCase):
     sys.stdout = self.stdout_real
 
   def test_the_little_relay_that_could(self):
-    from stem.control import Controller
+    def tutorial_example():
+      from stem.control import Controller
+
+      with Controller.from_port(control_port = 9051) as controller:
+        controller.authenticate()  # provide the password here if you set one
+
+        bytes_read = controller.get_info("traffic/read")
+        bytes_written = controller.get_info("traffic/written")
+
+        print "My Tor relay has read %s bytes and written %s." % (bytes_read, bytes_written)
 
     controller = mocking.get_object(Controller, {
       'authenticate': mocking.no_op(),
       'close': mocking.no_op(),
       'get_info': mocking.return_for_args({
-        ('traffic/read',): '1234',
-        ('traffic/written',): '5678',
+        ('traffic/read',): '33406',
+        ('traffic/written',): '29649',
       }, is_method = True),
     })
 
-    controller.authenticate()
-
-    bytes_read = controller.get_info("traffic/read")
-    bytes_written = controller.get_info("traffic/written")
-
-    print "My Tor relay has read %s bytes and written %s." % (bytes_read, bytes_written)
-
-    controller.close()
+    mocking.mock(
+      Controller.from_port, mocking.return_value(controller),
+      target_module = Controller,
+      is_static = True,
+    )
 
-    self.assertEqual("My Tor relay has read 1234 bytes and written 5678.\n", self.stdout.getvalue())
+    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





More information about the tor-commits mailing list