[tor-commits] [stem/master] Minor revisions for USEFEATURE

atagar at torproject.org atagar at torproject.org
Sun Aug 26 20:36:53 UTC 2012


commit 6d1f3625710eb382a810907a49b481ca14762783
Author: Damian Johnson <atagar at torproject.org>
Date:   Thu Aug 23 21:32:36 2012 -0700

    Minor revisions for USEFEATURE
    
    Few very minor tweaks...
    
    * 'GETINFO orconn-status' provides empty results when we don't have a
      connection, causing the test to fail.
    
    * Making is_feature_enabled() case insensitive.
    
    * Short circuiting is_feature_enabled() checks if it's in enabled_features.
    
    * The enabled_features attribute is simply used for an existance check, so we
      don't need to be too careful about deduplicaion. That said, we *do* need to
      be careful about the case of its entries.
    
    * Renamed the version constants since I'm trying to list their category at the
      start, to make a sort of namespace.
---
 stem/control.py                  |   29 ++++++++++++++++++-----------
 stem/version.py                  |    4 ++--
 test/integ/control/controller.py |   11 ++++++++++-
 3 files changed, 30 insertions(+), 14 deletions(-)

diff --git a/stem/control.py b/stem/control.py
index 84a9df1..7edd7bf 100644
--- a/stem/control.py
+++ b/stem/control.py
@@ -24,8 +24,8 @@ interacting at a higher level.
     |- set_options - sets or resets the values of multiple configuration options
     |- load_conf - loads configuration information as if it was in the torrc
     |- save_conf - saves configuration information to the torrc
-    |- is_feature_enabled - returns true if a given control connection feature is enabled
-    |- enable_feature - enables control protocol features that have been disabled by default
+    |- is_feature_enabled - checks if a given controller feature is enabled
+    |- enable_feature - enables a controller feature that has been disabled by default
     |- get_version - convenience method to get tor version
     |- authenticate - convenience method to authenticate the controller
     +- protocolinfo - convenience method to get the protocol info
@@ -976,16 +976,22 @@ class Controller(BaseController):
     :returns: True if feature is enabled, False otherwise
     """
     
-    defaulted_version = None
+    feature = feature.upper()
     
-    if feature == "EXTENDED_EVENTS":
-      defaulted_version = stem.version.Requirement.EXTENDED_EVENTS_DEFAULTED
-    elif feature == "VERBOSE_NAMES":
-      defaulted_version = stem.version.Requirement.VERBOSE_NAMES_DEFAULTED
-    
-    if defaulted_version and self.get_version().meets_requirements(defaulted_version):
+    if feature in self.enabled_features:
       return True
     else:
+      # check if this feature is on by default
+      defaulted_version = None
+      
+      if feature == "EXTENDED_EVENTS":
+        defaulted_version = stem.version.Requirement.FEATURE_EXTENDED_EVENTS
+      elif feature == "VERBOSE_NAMES":
+        defaulted_version = stem.version.Requirement.FEATURE_VERBOSE_NAMES
+      
+      if defaulted_version and self.get_version().meets_requirements(defaulted_version):
+        self.enabled_features.append(feature)
+      
       return feature in self.enabled_features
   
   def enable_feature(self, features):
@@ -1016,9 +1022,10 @@ class Controller(BaseController):
         if response.message.startswith("Unrecognized feature \""):
           invalid_feature = [response.message[22:response.message.find("\"", 22)]]
         raise stem.socket.InvalidArguments(response.code, response.message, invalid_feature)
-      raise stem.socket.ProtocolError("USEFEATURE returned invalid response code")
+      
+      raise stem.socket.ProtocolError("USEFEATURE provided an invalid response code: %s" % response.code)
     
-    self.enabled_features = list(set(self.enabled_features).union(features))
+    self.enabled_features += [entry.upper() for entry in features]
 
 def _case_insensitive_lookup(entries, key, default = UNDEFINED):
   """
diff --git a/stem/version.py b/stem/version.py
index 90cc997..342c400 100644
--- a/stem/version.py
+++ b/stem/version.py
@@ -249,7 +249,7 @@ Requirement = stem.util.enum.Enum(
   ("LOADCONF", Version("0.2.1.1")),
   ("TORRC_CONTROL_SOCKET", Version("0.2.0.30")),
   ("TORRC_DISABLE_DEBUGGER_ATTACHMENT", Version("0.2.3.9")),
-  ("VERBOSE_NAMES_DEFAULTED", Version("0.2.2.1-alpha")),
-  ("EXTENDED_EVENTS_DEFAULTED", Version("0.2.2.1-alpha")),
+  ("FEATURE_VERBOSE_NAMES", Version("0.2.2.1-alpha")),
+  ("FEATURE_EXTENDED_EVENTS", Version("0.2.2.1-alpha")),
 )
 
diff --git a/test/integ/control/controller.py b/test/integ/control/controller.py
index ea91c8c..2723e27 100644
--- a/test/integ/control/controller.py
+++ b/test/integ/control/controller.py
@@ -330,8 +330,17 @@ class TestController(unittest.TestCase):
     with runner.get_tor_controller() as controller:
       if not test.runner.require_version(self, stem.version.Version("0.1.2.2-alpha")):
         controller.enable_feature("VERBOSE_NAMES")
-      self.assertTrue(re.match("\$[0-9a-fA-F]{40}[~=].*", controller.get_info('orconn-status').split()[0]))
+      
       self.assertTrue(controller.is_feature_enabled("VERBOSE_NAMES"))
+      
+      orconn_output = controller.get_info('orconn-status')
+      
+      # the orconn-status results will be empty if we don't have a connection
+      if orconn_output == '':
+        test.runner.skip(self, "(no tor connections)")
+        return
+      
+      self.assertTrue(re.match("\$[0-9a-fA-F]{40}[~=].*", controller.get_info('orconn-status').split()[0]))
       self.assertTrue("VERBOSE_NAMES" in controller.enabled_features)
       self.assertRaises(stem.socket.InvalidArguments, controller.enable_feature, ["NOT", "A", "FEATURE"])
       try:





More information about the tor-commits mailing list