[tor-commits] [stem/master] Integ tests for stem.version

atagar at torproject.org atagar at torproject.org
Tue Jan 3 00:30:44 UTC 2012


commit a08c09a21743225181569a9ba08b3b15a7c584e2
Author: Damian Johnson <atagar at torproject.org>
Date:   Mon Jan 2 16:27:48 2012 -0800

    Integ tests for stem.version
    
    I didn't have any integ tests for versions? Seriously? *sigh*
    
    Adding some basic verification tests that we can handle the version of our
    system and test instances. Earlier boerni was running into a bug where another
    integ tests inadvertantly failed due to an uncaught exception from
    get_system_tor_version(). It was inappropriate for that test to fail (it wasn't
    testing versions) but we should have some test for the function so this is it.
---
 run_tests.py                          |   31 ++++++++++-------
 test/integ/connection/protocolinfo.py |    1 +
 test/integ/version.py                 |   59 +++++++++++++++++++++++++++++++++
 3 files changed, 79 insertions(+), 12 deletions(-)

diff --git a/run_tests.py b/run_tests.py
index 9bd0735..280b05e 100755
--- a/run_tests.py
+++ b/run_tests.py
@@ -14,19 +14,20 @@ import StringIO
 
 import test.output
 import test.runner
-import test.unit.version
-import test.unit.socket.control_message
-import test.unit.socket.control_line
 import test.unit.connection.authentication
 import test.unit.connection.protocolinfo
+import test.unit.socket.control_line
+import test.unit.socket.control_message
 import test.unit.util.enum
 import test.unit.util.system
-import test.integ.socket.control_message
-import test.integ.util.conf
-import test.integ.util.system
+import test.unit.version
 import test.integ.connection.authentication
 import test.integ.connection.connect
 import test.integ.connection.protocolinfo
+import test.integ.socket.control_message
+import test.integ.util.conf
+import test.integ.util.system
+import test.integ.version
 
 import stem.util.enum
 import stem.util.log as log
@@ -36,23 +37,29 @@ OPT = "uic:t:l:h"
 OPT_EXPANDED = ["unit", "integ", "config=", "targets=", "log=", "help"]
 DIVIDER = "=" * 70
 
+# Tests are ordered by the dependencies so the lowest level tests come first.
+# This is because a problem in say, controller message parsing, will cause all
+# higher level tests to fail too. Hence we want the test that most narrowly
+# exhibits problems to come first.
+
 UNIT_TESTS = (
+  test.unit.util.enum.TestEnum,
+  test.unit.util.system.TestSystem,
+  test.unit.version.TestVersion,
   test.unit.socket.control_message.TestControlMessage,
   test.unit.socket.control_line.TestControlLine,
-  test.unit.version.TestVersion,
   test.unit.connection.authentication.TestAuthenticate,
   test.unit.connection.protocolinfo.TestProtocolInfoResponse,
-  test.unit.util.enum.TestEnum,
-  test.unit.util.system.TestSystem,
 )
 
 INTEG_TESTS = (
+  test.integ.util.conf.TestConf,
+  test.integ.util.system.TestSystem,
+  test.integ.version.TestVersion,
   test.integ.socket.control_message.TestControlMessage,
+  test.integ.connection.protocolinfo.TestProtocolInfo,
   test.integ.connection.authentication.TestAuthenticate,
   test.integ.connection.connect.TestConnect,
-  test.integ.connection.protocolinfo.TestProtocolInfo,
-  test.integ.util.conf.TestConf,
-  test.integ.util.system.TestSystem,
 )
 
 # Integration tests above the basic suite.
diff --git a/test/integ/connection/protocolinfo.py b/test/integ/connection/protocolinfo.py
index e37f63b..6f036c8 100644
--- a/test/integ/connection/protocolinfo.py
+++ b/test/integ/connection/protocolinfo.py
@@ -37,6 +37,7 @@ class TestProtocolInfo(unittest.TestCase):
     control_socket.send("PROTOCOLINFO 1")
     protocolinfo_response = control_socket.recv()
     stem.connection.ProtocolInfoResponse.convert(protocolinfo_response)
+    control_socket.close()
     
     # according to the control spec the following _could_ differ or be
     # undefined but if that actually happens then it's gonna make people sad
diff --git a/test/integ/version.py b/test/integ/version.py
new file mode 100644
index 0000000..9bd7ee7
--- /dev/null
+++ b/test/integ/version.py
@@ -0,0 +1,59 @@
+"""
+Integration tests for tor version parsing.
+"""
+
+import unittest
+
+import test.runner
+import stem.version
+
+class TestVersion(unittest.TestCase):
+  """
+  Tests that the stem.version functions can handle the tor instance we're
+  running with.
+  """
+  
+  def test_get_system_tor_version(self):
+    """
+    Basic verification checks for the get_system_tor_version() function.
+    """
+    
+    if not stem.util.system.is_available("tor"):
+      self.skipTest("(tor isn't in our path)")
+    
+    # Since tor is in our path we should expect to be able to get the version
+    # that way, though this might not belong to our test instance (if we're
+    # running against a specific tor binary).
+    
+    stem.version.get_system_tor_version()
+    
+    # try running against a command that exists, but isn't tor
+    self.assertRaises(IOError, stem.version.get_system_tor_version, "ls")
+    
+    # try running against a command that doesn't exist
+    self.assertRaises(IOError, stem.version.get_system_tor_version, "blarg")
+  
+  def test_getinfo_version_parsing(self):
+    """
+    Issues a 'GETINFO version' query to our test instance and makes sure that
+    we can parse it.
+    """
+    
+    runner = test.runner.get_runner()
+    connection_type = runner.get_connection_type()
+    
+    if connection_type == test.runner.TorConnection.NONE:
+      self.skipTest("(no connection)")
+    
+    control_socket = runner.get_tor_socket()
+    control_socket.send("GETINFO version")
+    version_response = control_socket.recv()
+    control_socket.close()
+    
+    # the getinfo response looks like...
+    # 250-version=0.2.1.30
+    # 250 OK
+    
+    tor_version = list(version_response)[0][8:]
+    stem.version.Version(tor_version)
+



More information about the tor-commits mailing list