[tor-commits] [stem/master] First code review changes.

atagar at torproject.org atagar at torproject.org
Sun Jul 1 02:49:59 UTC 2012


commit 48fcbc69e4ed13a44ff160ba35997a46487f997f
Author: Megan <mchang01 at wesleyan.edu>
Date:   Tue Jun 26 17:05:35 2012 -0400

    First code review changes.
---
 test/unit/util/proc.py |   86 +++++++++++++++++++++++++----------------------
 1 files changed, 46 insertions(+), 40 deletions(-)

diff --git a/test/unit/util/proc.py b/test/unit/util/proc.py
index 2e3dd67..7ea119b 100644
--- a/test/unit/util/proc.py
+++ b/test/unit/util/proc.py
@@ -7,6 +7,7 @@ import time
 import unittest
 import operator
 import functools
+import itertools
 import cStringIO
 
 import test.mocking as mocking
@@ -24,25 +25,34 @@ class TargetError(Exception):
   def __str__(self):
     return repr(self.value)
 
-def mock_fn(exp_args, return_vals, target=None):
+def mock_fn(arguments_returns, target=None):
   """
   Provides a lambda function that may be used to mock another function.
   
-  :param list of tuples exp_args: expected input value(s) to be used for comparison
-  :param list return_vals: value(s) to be returned if expected input matches given input
+  :param dict args_rets: expected input value(s) as tuples are the key and return values are the values of the dictionary.
   :param function target: target function to be called if mocking doesn't cover this input
   
   :precondition: len(exp_args) = len(return_vals)
   
-                                                 return_vals[i]    a=exp_args[i]
-  :returns:  function _mocker such that: f(*a) = target(*a)        a != exp_args[i] and target != None
-                                                 raise TargetError a != exp_args[i] and target = None
+  :returns: function _mocker such that...
+  *return_vals[i]     a = exp_args[i]
+  *target(*a)         a != exp_args[i] and target != None
+  *raise TargetError  a != exp_args[i] and target = None
   """
   
-  def _mocked(tgt, exp_args, return_vals, *arg):
+  def _mocked(args_rets, tgt, *arg):
     try:
-      #
-      i = operator.indexOf(exp_args, arg)
+     # First check if given input matches one of the inputs to be mocked.
+     return args_rets[arg]
+    except KeyError:
+      if tgt:
+        return tgt(*arg)
+      else:
+        raise TargetError("A relevant function could not be applied")
+    '''
+    try:
+      # First check if given input matches one of the inputs to be mocked.
+      i = operator.indexOf(args_rets, arg)
     except ValueError:
       i = -1
     if i == -1:
@@ -52,17 +62,19 @@ def mock_fn(exp_args, return_vals, target=None):
         raise TargetError("A relevant function could not be applied")
     else:
       return return_vals[i]
-  
-  return functools.partial(_mocked, target, exp_args, return_vals)
+    '''
+  return functools.partial(_mocked, arguments_returns, target)
 
 def find_subsets(xs):
   """
   Used with the builtin zip function to create all possible combinations
-  of two lists. Called in test_get_stats().
+  of the elements of two lists.
+  
+  Called in test_get_stats().
   
   :param xs: list of tuples given by calling zip on two lists
   
-  :returns: a list of lists of tuples
+  :returns: a list of lists of tuples containing all possible combinations of arguments. Will be of the form [[(arg1, resp1),(arg2, resp2),...], [(arg1, resp1),(arg3, resp3),...],...]
   """
   
   #  Base case is the empty list.
@@ -88,8 +100,7 @@ class TestProc(unittest.TestCase):
     Tests the get_system_start_time function.
     """
     
-    mocking.mock(proc._get_line, mock_fn([("/proc/stat", "btime", 'system start time')],
-    ["btime 1001001"]))
+    mocking.mock(proc._get_line, mock_fn({('/proc/stat', 'btime', 'system start time'):'btime 1001001'}))
     
     # Single test as get_system_start_time takes no arguments
     self.assertEquals(1001001, proc.get_system_start_time())
@@ -99,8 +110,7 @@ class TestProc(unittest.TestCase):
     Tests the get_physical_memory function.
     """
     
-    mocking.mock(proc._get_line, mock_fn([("/proc/meminfo",
-    "MemTotal:", 'system physical memory')], ["MemTotal:       12345 kB"]))
+    mocking.mock(proc._get_line, mock_fn({('/proc/meminfo', 'MemTotal:', 'system physical memory'):'MemTotal:       12345 kB'}))
     
     self.assertEquals((12345*1024), proc.get_physical_memory())
     
@@ -109,8 +119,7 @@ class TestProc(unittest.TestCase):
     Tests the get_cwd function with a given pid.
     """
     
-    mocking.mock(os.readlink, mock_fn([('/proc/24019/cwd',)],
-                 ['/home/directory/TEST'], os.listdir), os)
+    mocking.mock(os.readlink, mock_fn({('/proc/24019/cwd',):'/home/directory/TEST'}, os.listdir), os)
     
     # Test edge case of pid = 0 and a standard pid.
     self.assertEquals('', proc.get_cwd(0))
@@ -127,8 +136,8 @@ class TestProc(unittest.TestCase):
     for pid in pid_list:
       pid_id, user_id = pid
       status_path = "/proc/%s/status" % pid_id
-      mocking.mock(proc._get_line, mock_fn([(status_path, "Uid:", "uid")],
-                   ["Uid: %s" % user_id]))
+      mocking.mock(proc._get_line, mock_fn({(status_path, 'Uid:', 'uid'):'Uid: %s' % user_id}))
+      
       self.assertEquals(user_id, proc.get_uid(pid_id))
       
   def test_get_memory_usage(self):
@@ -138,9 +147,7 @@ class TestProc(unittest.TestCase):
     This is the only function in proc.py that calls _get_lines explicitly.
     """
     
-    mocking.mock(proc._get_lines, mock_fn([("/proc/1111/status",
-    ("VmRSS:", "VmSize:"), 'memory usage')], [{"VmRSS:": "VmRSS: 100 kB",
-    "VmSize:":"VmSize: 1800 kB"}]))
+    mocking.mock(proc._get_lines, mock_fn({('/proc/1111/status', ('VmRSS:', 'VmSize:'), 'memory usage'):{'VmRSS:':'VmRSS: 100 kB', 'VmSize:':'VmSize: 1800 kB'}}))
     
     # Test edge case of pid = 0 and a standard pid
     self.assertEqual((0,0), proc.get_memory_usage(0))
@@ -165,8 +172,7 @@ class TestProc(unittest.TestCase):
     
     
     # Tests the case where no stat_types are specified.
-    mocking.mock(proc._get_line, mock_fn(
-      [(stat_path, str(24062), 'process ')], [stat]))
+    mocking.mock(proc._get_line, mock_fn({(stat_path, str(24062), 'process '):stat}))
     self.assertEquals((), proc.get_stats(24062))
     
     # Don't handle empty set of commands here. (just did above)
@@ -177,8 +183,8 @@ class TestProc(unittest.TestCase):
       # and (resp1,resp2,...).
       arg, response = zip(*sub)
       
-      mocking.mock(proc._get_line, mock_fn(
-          [(stat_path, str(24062), 'process %s' % ", ".join(arg))], [stat]))
+      mocking.mock(proc._get_line, mock_fn({(stat_path, str(24062), 'process %s' % ', '.join(arg)):stat}))
+      
       # Iterates through each combination of commands.
       self.assertEquals(response, proc.get_stats(24062, *arg))
       
@@ -197,9 +203,7 @@ class TestProc(unittest.TestCase):
           elif a == 'stime':
             response += ('0',)
       
-      mocking.mock(proc._get_line, mock_fn(
-        [('/proc/0/stat', str(0), 'process %s' % ", ".join(arg))], [stat]))
-      
+      mocking.mock(proc._get_line, mock_fn({('/proc/0/stat', str(0), 'process %s' % ', '.join(arg)):stat}))
       self.assertEquals(response, proc.get_stats(0, *arg))
   
   def test_get_connections(self):
@@ -209,23 +213,25 @@ class TestProc(unittest.TestCase):
     
     pid = 1111
     fd_list = ['1', '2', '3', '4']
-    fd_paths = []
+    '''
     for fd in fd_list:
       fd_paths.append(('/proc/%s/fd/%s' % (str(pid), fd),))
+    '''
     readlink_results = ['socket:[99999999]', 'socket:[IIIIIIII]', 'pipe:[30303]', 'pipe:[40404]']
+    input_vals = {}
+    for i in range(len(fd_list)):
+      input_vals[('/proc/%s/fd/%s' % (str(pid), fd_list[i]),)] = readlink_results[i]
     
     # Will be put in cStringIO wrappers and treated as files.
     tcp = '\n 0: 11111111:1111 22222222:2222 01 44444444:44444444 55:55555555 66666666 1111 8 99999999'
     udp = '\n A: BBBBBBBB:BBBB CCCCCCCC:CCCC DD EEEEEEEE:EEEEEEEE FF:FFFFFFFF GGGGGGGG 1111 H IIIIIIII'
     
-    file_list = [cStringIO.StringIO(tcp), cStringIO.StringIO(udp)]
-    contents_list = [tcp, udp]
-    
-    # Mock os.listdir, os.readlink, and open.
-    mocking.mock(os.listdir, mock_fn([('/proc/%s/fd' % str(pid),)], [fd_list], os.listdir), os)
-    mocking.mock(os.readlink, mock_fn(fd_paths, readlink_results, os.readlink), os)
+    file_vals = {('/proc/net/tcp',):cStringIO.StringIO(tcp), ('/proc/net/udp',):cStringIO.StringIO(udp)}
     
-    mocking.mock(open, mock_fn([('/proc/net/tcp',), ('/proc/net/udp',)], file_list, open))
+    # Mock os.listdir, os.readlink, and open with mock_fn.
+    mocking.mock(os.listdir, mock_fn({('/proc/%s/fd' % str(pid),):fd_list}, os.listdir), os)
+    mocking.mock(os.readlink, mock_fn(input_vals, os.readlink), os)
+    mocking.mock(open, mock_fn(file_vals, open))
     
     # Tests the edge case of pid = 0.
     self.assertEquals([], proc.get_connections(0))
@@ -240,5 +246,5 @@ class TestProc(unittest.TestCase):
       local_ip, local_port = proc._decode_proc_address_encoding(l_addr)
       foreign_ip, foreign_port = proc._decode_proc_address_encoding(f_addr)
       results.append((local_ip, local_port, foreign_ip, foreign_port))
-    
+      print "results: %s" % results
     self.assertEquals(results, proc.get_connections(1111))





More information about the tor-commits mailing list