commit 33eeb9bbcc4a877d02f227d9f9b76a4631f3053e Author: Damian Johnson atagar@torproject.org Date: Wed Jun 12 09:14:43 2013 -0700
Using mock for system unit tests
Pretty much a drop-in replacement for these. --- test/unit/util/system.py | 124 +++++++++++++++++++++++++++------------------- 1 file changed, 72 insertions(+), 52 deletions(-)
diff --git a/test/unit/util/system.py b/test/unit/util/system.py index a7b3d9b..628ab71 100644 --- a/test/unit/util/system.py +++ b/test/unit/util/system.py @@ -7,15 +7,12 @@ system running the tests.
import functools import ntpath -import os -import platform import posixpath import unittest
-import stem.util.proc +from mock import Mock, patch
from stem.util import system -from test import mocking
# Base responses for the get_pid_by_name tests. The 'success' and # 'multiple_results' entries are filled in by tests. @@ -109,15 +106,9 @@ def mock_call(base_cmd, responses):
class TestSystem(unittest.TestCase): - def setUp(self): - mocking.mock(stem.util.proc.is_available, mocking.return_false()) - mocking.mock(system.is_available, mocking.return_true()) - mocking.mock(system.call, mocking.return_none()) - - def tearDown(self): - mocking.revert_mocking() - - def test_is_running(self): + @patch('stem.util.system.call') + @patch('stem.util.system.is_available', Mock(return_value = True)) + def test_is_running(self, call_mock): """ Exercises multiple use cases for the is_running function. """ @@ -126,7 +117,7 @@ class TestSystem(unittest.TestCase): running_commands = [u"irssi", u"moc", u"tor", u"ps", u" firefox "]
for ps_cmd in (system.IS_RUNNING_PS_LINUX, system.IS_RUNNING_PS_BSD): - mocking.mock(system.call, mock_call(ps_cmd, running_commands)) + call_mock.side_effect = mock_call(ps_cmd, running_commands)
self.assertTrue(system.is_running("irssi")) self.assertTrue(system.is_running("moc")) @@ -136,11 +127,15 @@ class TestSystem(unittest.TestCase): self.assertEqual(False, system.is_running("something_else"))
# mock both calls failing - mocking.mock(system.call, mocking.return_none()) + + call_mock.return_value = None + call_mock.side_effect = None self.assertFalse(system.is_running("irssi")) self.assertEquals(None, system.is_running("irssi"))
- def test_get_pid_by_name_pgrep(self): + @patch('stem.util.system.call') + @patch('stem.util.system.is_available', Mock(return_value = True)) + def test_get_pid_by_name_pgrep(self, call_mock): """ Tests the get_pid_by_name function with pgrep responses. """ @@ -148,7 +143,7 @@ class TestSystem(unittest.TestCase): responses = dict(GET_PID_BY_NAME_BASE_RESULTS) responses["success"] = ["1111"] responses["multiple_results"] = ["123", "456", "789"] - mocking.mock(system.call, mock_call(system.GET_PID_BY_NAME_PGREP, responses)) + call_mock.side_effect = mock_call(system.GET_PID_BY_NAME_PGREP, responses)
for test_input in responses: expected_response = 1111 if test_input == "success" else None @@ -156,7 +151,9 @@ class TestSystem(unittest.TestCase):
self.assertEquals([123, 456, 789], system.get_pid_by_name("multiple_results", multiple = True))
- def test_get_pid_by_name_pidof(self): + @patch('stem.util.system.call') + @patch('stem.util.system.is_available', Mock(return_value = True)) + def test_get_pid_by_name_pidof(self, call_mock): """ Tests the get_pid_by_name function with pidof responses. """ @@ -164,7 +161,7 @@ class TestSystem(unittest.TestCase): responses = dict(GET_PID_BY_NAME_BASE_RESULTS) responses["success"] = ["1111"] responses["multiple_results"] = ["123 456 789"] - mocking.mock(system.call, mock_call(system.GET_PID_BY_NAME_PIDOF, responses)) + call_mock.side_effect = mock_call(system.GET_PID_BY_NAME_PIDOF, responses)
for test_input in responses: expected_response = 1111 if test_input == "success" else None @@ -172,16 +169,18 @@ class TestSystem(unittest.TestCase):
self.assertEquals([123, 456, 789], system.get_pid_by_name("multiple_results", multiple = True))
- def test_get_pid_by_name_ps_linux(self): + @patch('stem.util.system.call') + @patch('stem.util.system.is_bsd', Mock(return_value = False)) + @patch('stem.util.system.is_available', Mock(return_value = True)) + def test_get_pid_by_name_ps_linux(self, call_mock): """ Tests the get_pid_by_name function with the linux variant of ps. """
- mocking.mock(system.is_bsd, mocking.return_false()) responses = dict(GET_PID_BY_NAME_BASE_RESULTS) responses["success"] = ["PID", " 1111"] responses["multiple_results"] = ["PID", " 123", " 456", " 789"] - mocking.mock(system.call, mock_call(system.GET_PID_BY_NAME_PS_LINUX, responses)) + call_mock.side_effect = mock_call(system.GET_PID_BY_NAME_PS_LINUX, responses)
for test_input in responses: expected_response = 1111 if test_input == "success" else None @@ -189,22 +188,26 @@ class TestSystem(unittest.TestCase):
self.assertEquals([123, 456, 789], system.get_pid_by_name("multiple_results", multiple = True))
- def test_get_pid_by_name_ps_bsd(self): + @patch('stem.util.system.call') + @patch('stem.util.system.is_bsd', Mock(return_value = True)) + @patch('stem.util.system.is_available', Mock(return_value = True)) + def test_get_pid_by_name_ps_bsd(self, call_mock): """ Tests the get_pid_by_name function with the bsd variant of ps. """
- mocking.mock(system.is_bsd, mocking.return_true()) - mocking.mock(system.call, mock_call(system.GET_PID_BY_NAME_PS_BSD, GET_PID_BY_NAME_PS_BSD)) + call_mock.side_effect = mock_call(system.GET_PID_BY_NAME_PS_BSD, GET_PID_BY_NAME_PS_BSD) self.assertEquals(1, system.get_pid_by_name("launchd")) self.assertEquals(11, system.get_pid_by_name("DirectoryService")) self.assertEquals(None, system.get_pid_by_name("blarg"))
- mocking.mock(system.call, mock_call(system.GET_PID_BY_NAME_PS_BSD, GET_PID_BY_NAME_PS_BSD_MULTIPLE)) + call_mock.side_effect = mock_call(system.GET_PID_BY_NAME_PS_BSD, GET_PID_BY_NAME_PS_BSD_MULTIPLE)
self.assertEquals([1, 41], system.get_pid_by_name("launchd", multiple = True))
- def test_get_pid_by_name_lsof(self): + @patch('stem.util.system.call') + @patch('stem.util.system.is_available', Mock(return_value = True)) + def test_get_pid_by_name_lsof(self, call_mock): """ Tests the get_pid_by_name function with lsof responses. """ @@ -212,7 +215,7 @@ class TestSystem(unittest.TestCase): responses = dict(GET_PID_BY_NAME_BASE_RESULTS) responses["success"] = ["1111"] responses["multiple_results"] = ["123", "456", "789"] - mocking.mock(system.call, mock_call(system.GET_PID_BY_NAME_LSOF, responses)) + call_mock.side_effect = mock_call(system.GET_PID_BY_NAME_LSOF, responses)
for test_input in responses: expected_response = 1111 if test_input == "success" else None @@ -220,51 +223,63 @@ class TestSystem(unittest.TestCase):
self.assertEquals([123, 456, 789], system.get_pid_by_name("multiple_results", multiple = True))
- def test_get_pid_by_port_netstat(self): + @patch('stem.util.system.call') + @patch('stem.util.system.is_available', Mock(return_value = True)) + def test_get_pid_by_port_netstat(self, call_mock): """ Tests the get_pid_by_port function with a netstat response. """
- mocking.mock(system.call, mock_call(system.GET_PID_BY_PORT_NETSTAT, GET_PID_BY_PORT_NETSTAT_RESULTS)) + call_mock.side_effect = mock_call(system.GET_PID_BY_PORT_NETSTAT, GET_PID_BY_PORT_NETSTAT_RESULTS) self.assertEquals(1641, system.get_pid_by_port(9051)) self.assertEquals(1641, system.get_pid_by_port("9051")) self.assertEquals(None, system.get_pid_by_port(631)) self.assertEquals(None, system.get_pid_by_port(123))
- def test_get_pid_by_port_sockstat(self): + @patch('stem.util.system.call') + @patch('stem.util.system.is_available', Mock(return_value = True)) + def test_get_pid_by_port_sockstat(self, call_mock): """ Tests the get_pid_by_port function with a sockstat response. """
- mocking.mock(system.call, mock_call(system.GET_PID_BY_PORT_SOCKSTAT % 9051, GET_PID_BY_PORT_SOCKSTAT_RESULTS)) + call_mock.side_effect = mock_call(system.GET_PID_BY_PORT_SOCKSTAT % 9051, GET_PID_BY_PORT_SOCKSTAT_RESULTS) self.assertEquals(4397, system.get_pid_by_port(9051)) self.assertEquals(4397, system.get_pid_by_port("9051")) self.assertEquals(None, system.get_pid_by_port(123))
- def test_get_pid_by_port_lsof(self): + @patch('stem.util.system.call') + @patch('stem.util.system.is_available', Mock(return_value = True)) + def test_get_pid_by_port_lsof(self, call_mock): """ Tests the get_pid_by_port function with a lsof response. """
- mocking.mock(system.call, mock_call(system.GET_PID_BY_PORT_LSOF, GET_PID_BY_PORT_LSOF_RESULTS)) + call_mock.side_effect = mock_call(system.GET_PID_BY_PORT_LSOF, GET_PID_BY_PORT_LSOF_RESULTS) self.assertEquals(1745, system.get_pid_by_port(9051)) self.assertEquals(1745, system.get_pid_by_port("9051")) self.assertEquals(329, system.get_pid_by_port(80)) self.assertEquals(None, system.get_pid_by_port(123))
- def test_get_pid_by_open_file_lsof(self): + @patch('stem.util.system.call') + @patch('stem.util.system.is_available', Mock(return_value = True)) + def test_get_pid_by_open_file_lsof(self, call_mock): """ Tests the get_pid_by_open_file function with a lsof response. """
lsof_query = system.GET_PID_BY_FILE_LSOF % "/tmp/foo" - mocking.mock(system.call, mock_call(lsof_query, ["4762"])) + call_mock.side_effect = mock_call(lsof_query, ["4762"]) self.assertEquals(4762, system.get_pid_by_open_file("/tmp/foo"))
- mocking.mock(system.call, mocking.return_value([])) + call_mock.return_value = [] + call_mock.side_effect = None self.assertEquals(None, system.get_pid_by_open_file("/tmp/somewhere_else"))
- def test_get_cwd_pwdx(self): + @patch('stem.util.system.call') + @patch('stem.util.proc.is_available', Mock(return_value = False)) + @patch('stem.util.system.is_available', Mock(return_value = True)) + def test_get_cwd_pwdx(self, call_mock): """ Tests the get_cwd function with a pwdx response. """ @@ -276,13 +291,16 @@ class TestSystem(unittest.TestCase): "7878": None, }
- mocking.mock(system.call, mock_call(system.GET_CWD_PWDX, responses)) + call_mock.side_effect = mock_call(system.GET_CWD_PWDX, responses)
for test_input in responses: expected_response = "/home/atagar" if test_input == "3799" else None self.assertEquals(expected_response, system.get_cwd(test_input))
- def test_get_cwd_lsof(self): + @patch('stem.util.system.call') + @patch('stem.util.proc.is_available', Mock(return_value = False)) + @patch('stem.util.system.is_available', Mock(return_value = True)) + def test_get_cwd_lsof(self, call_mock): """ Tests the get_cwd function with a lsof response. """ @@ -293,13 +311,15 @@ class TestSystem(unittest.TestCase): "7878": [], }
- mocking.mock(system.call, mock_call(system.GET_CWD_LSOF, responses)) + call_mock.side_effect = mock_call(system.GET_CWD_LSOF, responses)
for test_input in responses: expected_response = "/Users/atagar/tor/src/or" if test_input == "75717" else None self.assertEquals(expected_response, system.get_cwd(test_input))
- def test_get_bsd_jail_id(self): + @patch('stem.util.system.call') + @patch('stem.util.system.is_available', Mock(return_value = True)) + def test_get_bsd_jail_id(self, call_mock): """ Tests the get_bsd_jail_id function. """ @@ -313,25 +333,29 @@ class TestSystem(unittest.TestCase): "6666": [] }
- mocking.mock(system.call, mock_call(system.GET_BSD_JAIL_ID_PS, responses)) + call_mock.side_effect = mock_call(system.GET_BSD_JAIL_ID_PS, responses)
for test_input in responses: expected_response = 1 if test_input == "1111" else 0 self.assertEquals(expected_response, system.get_bsd_jail_id(test_input))
- def test_get_bsd_jail_path(self): + @patch('stem.util.system.call') + @patch('stem.util.system.is_available', Mock(return_value = True)) + def test_get_bsd_jail_path(self, call_mock): """ Tests the get_bsd_jail_path function. """
# check when we don't have a jail
- mocking.mock(system.call, mocking.return_value([])) + call_mock.return_value = [] self.assertEquals(None, system.get_bsd_jail_path(1))
- mocking.mock(system.call, mock_call(system.GET_BSD_JAIL_PATH % '1', GET_BSD_JAIL_PATH_RESULTS)) + call_mock.side_effect = mock_call(system.GET_BSD_JAIL_PATH % '1', GET_BSD_JAIL_PATH_RESULTS) self.assertEquals("/usr/jails/tor-jail", system.get_bsd_jail_path(1))
+ @patch('platform.system', Mock(return_value = 'Linux')) + @patch('os.path.join', Mock(side_effect = posixpath.join)) def test_expand_path_unix(self): """ Tests the expand_path function. This does not exercise home directory @@ -339,9 +363,6 @@ class TestSystem(unittest.TestCase): tests). """
- mocking.mock(platform.system, mocking.return_value("Linux")) - mocking.mock(os.path.join, posixpath.join, os.path) - self.assertEquals("", system.expand_path("")) self.assertEquals("/tmp", system.expand_path("/tmp")) self.assertEquals("/tmp", system.expand_path("/tmp/")) @@ -350,6 +371,8 @@ class TestSystem(unittest.TestCase): self.assertEquals("/tmp/foo", system.expand_path("foo", "/tmp")) self.assertEquals("/tmp/foo", system.expand_path("./foo", "/tmp"))
+ @patch('platform.system', Mock(return_value = 'Windows')) + @patch('os.path.join', Mock(side_effect = ntpath.join)) def test_expand_path_windows(self): """ Tests the expand_path function on windows. This does not exercise @@ -357,9 +380,6 @@ class TestSystem(unittest.TestCase): (that's left to integ tests). """
- mocking.mock(platform.system, mocking.return_value("Windows")) - mocking.mock(os.path.join, ntpath.join, os.path) - self.assertEquals("", system.expand_path("")) self.assertEquals("C:\tmp", system.expand_path("C:\tmp")) self.assertEquals("C:\tmp", system.expand_path("C:\tmp\"))