[tor-commits] [arm/master] Testing the ConnectionTracker class

atagar at torproject.org atagar at torproject.org
Mon Jan 6 01:54:14 UTC 2014


commit 6f2ce6c6d1004fd69d8ba1038f08c1376cdf2625
Author: Damian Johnson <atagar at torproject.org>
Date:   Sun Jan 5 17:55:17 2014 -0800

    Testing the ConnectionTracker class
    
    Unit tests for our connection resolver daemon. There's a lot more tests we
    could add for the tracker module, but this gets us pretty good coverage for
    now.
---
 arm/util/tracker.py                     |    2 +-
 test/util/tracker/connection_tracker.py |   76 +++++++++++++++++++++++++++++++
 test/util/tracker/resource_tracker.py   |    5 +-
 3 files changed, 80 insertions(+), 3 deletions(-)

diff --git a/arm/util/tracker.py b/arm/util/tracker.py
index b0f99b2..6c5b1f4 100644
--- a/arm/util/tracker.py
+++ b/arm/util/tracker.py
@@ -384,7 +384,7 @@ class ConnectionTracker(Daemon):
         self._failure_count += 1
 
         if self._failure_count >= 3:
-          self._resolvers.pop()
+          self._resolvers.pop(0)
           self._failure_count = 0
 
           if self._resolvers:
diff --git a/test/util/tracker/connection_tracker.py b/test/util/tracker/connection_tracker.py
new file mode 100644
index 0000000..bdb1d69
--- /dev/null
+++ b/test/util/tracker/connection_tracker.py
@@ -0,0 +1,76 @@
+import time
+import unittest
+
+from arm.util.tracker import ConnectionTracker
+
+from stem.util import connection
+
+from mock import Mock, patch
+
+CONNECTION_1 = connection.Connection('127.0.0.1', 3531, '75.119.206.243', 22, 'tcp')
+CONNECTION_2 = connection.Connection('127.0.0.1', 1766, '86.59.30.40', 443, 'tcp')
+CONNECTION_3 = connection.Connection('127.0.0.1', 1059, '74.125.28.106', 80, 'tcp')
+
+
+class TestConnectionTracker(unittest.TestCase):
+  @patch('arm.util.tracker.tor_controller')
+  @patch('arm.util.tracker.connection.get_connections')
+  @patch('arm.util.tracker.system', Mock(return_value = Mock()))
+  @patch('arm.util.tracker.connection.get_system_resolvers', Mock(return_value = [connection.Resolver.NETSTAT]))
+  def test_fetching_connections(self, get_connections_mock, tor_controller_mock):
+    tor_controller_mock().get_pid.return_value = 12345
+    get_connections_mock.return_value = [CONNECTION_1, CONNECTION_2, CONNECTION_3]
+
+    with ConnectionTracker(0.04) as daemon:
+      time.sleep(0.01)
+
+      connections = daemon.get_connections()
+
+      self.assertEqual(1, daemon.run_counter())
+      self.assertEqual([CONNECTION_1, CONNECTION_2, CONNECTION_3], connections)
+
+      get_connections_mock.return_value = []  # no connection results
+      time.sleep(0.05)
+      connections = daemon.get_connections()
+
+      self.assertEqual(2, daemon.run_counter())
+      self.assertEqual([], connections)
+
+  @patch('arm.util.tracker.tor_controller')
+  @patch('arm.util.tracker.connection.get_connections')
+  @patch('arm.util.tracker.system', Mock(return_value = Mock()))
+  @patch('arm.util.tracker.connection.get_system_resolvers', Mock(return_value = [connection.Resolver.NETSTAT, connection.Resolver.LSOF]))
+  def test_resolver_failover(self, get_connections_mock, tor_controller_mock):
+    tor_controller_mock().get_pid.return_value = 12345
+    get_connections_mock.side_effect = IOError()
+
+    with ConnectionTracker(0.01) as daemon:
+      time.sleep(0.03)
+
+      self.assertEqual([connection.Resolver.NETSTAT, connection.Resolver.LSOF], daemon._resolvers)
+      self.assertEqual([], daemon.get_connections())
+
+      time.sleep(0.05)
+
+      self.assertEqual([connection.Resolver.LSOF], daemon._resolvers)
+      self.assertEqual([], daemon.get_connections())
+
+      time.sleep(0.05)
+
+      self.assertEqual([], daemon._resolvers)
+      self.assertEqual([], daemon.get_connections())
+
+      # Now make connection resolution work. We still shouldn't provide any
+      # results since we stopped looking.
+
+      get_connections_mock.return_value = [CONNECTION_1, CONNECTION_2]
+      get_connections_mock.side_effect = None
+      time.sleep(0.05)
+      self.assertEqual([], daemon.get_connections())
+
+      # Finally, select a custom resolver. This should cause us to query again
+      # reguardless of our prior failures.
+
+      daemon.set_custom_resolver(connection.Resolver.NETSTAT)
+      time.sleep(0.05)
+      self.assertEqual([CONNECTION_1, CONNECTION_2], daemon.get_connections())
diff --git a/test/util/tracker/resource_tracker.py b/test/util/tracker/resource_tracker.py
index 70cdf27..41ef80e 100644
--- a/test/util/tracker/resource_tracker.py
+++ b/test/util/tracker/resource_tracker.py
@@ -107,12 +107,13 @@ class TestResourceTracker(unittest.TestCase):
       self.assertEqual(0.0, resources.memory_percent)
       self.assertEqual(0.0, resources.timestamp)
 
-      time.sleep(0.05)
+      while daemon.run_counter() < 1:
+        time.sleep(0.01)
+
       self.assertEqual(False, daemon._use_proc)
 
       resources = daemon.get_resource_usage()
 
-      self.assertEqual(1, daemon.run_counter())
       self.assertEqual(0.0, resources.cpu_sample)
       self.assertEqual(43.875, resources.cpu_average)
       self.assertEqual(105.3, resources.cpu_total)



More information about the tor-commits mailing list