[tor-commits] [stem/master] Add SETCONF integration tests, SingleLineResponse unit tests and the bugfixes that come with them

atagar at torproject.org atagar at torproject.org
Sun Jul 8 20:14:44 UTC 2012


commit 85c923bfc784aaf8080e08053ef6b577e8c23944
Author: Ravi Chandra Padmala <neenaoffline at gmail.com>
Date:   Thu Jun 21 22:08:30 2012 +0530

    Add SETCONF integration tests, SingleLineResponse unit tests and the bugfixes that come with them
---
 stem/control.py                  |   21 +++++++++++----
 test/integ/control/controller.py |   49 ++++++++++++++++++++++++++++++++++++++
 test/unit/response/singleline.py |   33 +++++++++++++++++++++++++
 3 files changed, 97 insertions(+), 6 deletions(-)

diff --git a/stem/control.py b/stem/control.py
index 290f178..0e0d611 100644
--- a/stem/control.py
+++ b/stem/control.py
@@ -685,21 +685,30 @@ class Controller(BaseController):
     """
     
     if len(args) == 2:
-      options = {args[0]: args[1]}
+      args = {args[0]: args[1]}
     elif len(args) == 1:
-      options = args[0]
+      args = args[0]
     else:
       raise TypeError("set_conf expected 1 or 2 arguments, got %d", len(args))
     
-    response = self.msg("SETCONF %s" % " ".join(["=".join(opts) for opts in args.items()]))
+    options = []
+    for key, value in args.iteritems():
+      options.append(key + "=\"" + value + "\"")
+      
+    response = self.msg("SETCONF %s" % " ".join(options))
     stem.response.convert("SINGLELINE", response)
     
     if response.is_ok():
       return True
-    elif response.code in ("513", "552", "553"):
-      raise InvalidRequest(response.code, response.message)
+    elif response.code == "552":
+      if response.message.startswith("Unrecognized option: Unknown option '"):
+        key = response.message[37:response.message.find("\'", 37)]
+        raise stem.socket.InvalidArguments(response.code, response.message, [key])
+      raise stem.socket.InvalidRequest(response.code, response.message)
+    elif response.code in ("513", "553"):
+      raise stem.socket.InvalidRequest(response.code, response.message)
     else:
-      raise ProtocolError("SETCONF returned unexpected status code")
+      raise stem.socket.ProtocolError("SETCONF returned unexpected status code")
 
 def _case_insensitive_lookup(entries, key):
   """
diff --git a/test/integ/control/controller.py b/test/integ/control/controller.py
index 55f7210..4a517dd 100644
--- a/test/integ/control/controller.py
+++ b/test/integ/control/controller.py
@@ -191,4 +191,53 @@ class TestController(unittest.TestCase):
       self.assertEqual("la-di-dah", controller.get_conf("", "la-di-dah"))
       self.assertEqual({}, controller.get_conf_map("", "la-di-dah"))
       self.assertEqual({}, controller.get_conf_map([], "la-di-dah"))
+      
+      # context-sensitive keys
+      
+      keys = {
+          "HiddenServiceDir": "/tmp/stemtestdir",
+          "HiddenServicePort": "17234 127.0.0.1:17235"
+          }
+      controller.set_conf(keys)
+      self.assertEqual("/tmp/stemtestdir", controller.get_conf("HiddenServiceDir"))
+      self.assertEqual("17234 127.0.0.1:17235", controller.get_conf("HiddenServiceDir"))
+  
+  def test_setconf(self):
+    """
+    Exercises SETCONF with valid and invalid requests.
+    """
+    
+    runner = test.runner.get_runner()
+    
+    with runner.get_tor_controller() as controller:
+      # Single key, valid and invalid
+      connlimit = int(controller.get_conf("ConnLimit"))
+      controller.set_conf("connlimit", str(connlimit - 1))
+      self.assertEqual(connlimit - 1, int(controller.get_conf("ConnLimit")))
+      try:
+        controller.set_conf("invalidkeyboo", "abcde")
+      except stem.socket.InvalidArguments, exc:
+        self.assertEqual(["invalidkeyboo"], exc.arguments)
+      
+      settings = {
+          "connlimit": str(connlimit - 2),
+          "contactinfo": "stem at testing"
+          }
+      controller.set_conf(settings)
+      self.assertEqual(connlimit - 2, int(controller.get_conf("ConnLimit")))
+      self.assertEqual("stem at testing", controller.get_conf("contactinfo"))
+      
+      settings["bombay"] = "vadapav"
+      try:
+        controller.set_conf(settings)
+      except stem.socket.InvalidArguments, exc:
+        self.assertEqual(["bombay"], exc.arguments)
+      
+      settings = {
+          "HiddenServiceDir": "/tmp/stemtestdir",
+          "HiddenServicePort": "17234 127.0.0.1:17235"
+          }
+      controller.set_conf(settings)
+      self.assertEqual("17234 127.0.0.1:17235", controller.get_conf("hiddenserviceport"))
+      self.assertEqual("/tmp/stemtestdir", controller.get_conf("hiddenservicedir"))
 
diff --git a/test/unit/response/singleline.py b/test/unit/response/singleline.py
new file mode 100644
index 0000000..8781bf9
--- /dev/null
+++ b/test/unit/response/singleline.py
@@ -0,0 +1,33 @@
+"""
+Unit tests for the stem.response.getconf.GetConfResponse class.
+"""
+
+import unittest
+
+import stem.socket
+import stem.response
+import test.mocking as mocking
+
+MULTILINE_RESPONSE = """250-MULTI
+250 LINE"""
+
+class TestSingleLineResponse(unittest.TestCase):
+  def test_single_line_response(self):
+    message = mocking.get_message("552 NOTOK")
+    stem.response.convert("SINGLELINE", message)
+    self.assertEqual(False, message.is_ok())
+    message = mocking.get_message("250 KK")
+    stem.response.convert("SINGLELINE", message)
+    self.assertEqual(True, message.is_ok())
+    
+    message = mocking.get_message("250 OK")
+    stem.response.convert("SINGLELINE", message)
+    self.assertEqual(True, message.is_ok(True))
+    message = mocking.get_message("250 HMM")
+    stem.response.convert("SINGLELINE", message)
+    self.assertEqual(False, message.is_ok(True))
+  
+  def test_multi_line_response(self):
+    message = mocking.get_message(MULTILINE_RESPONSE)
+    self.assertRaises(stem.socket.ProtocolError, stem.response.convert, "SINGLELINE", message)
+





More information about the tor-commits mailing list