From a4bc6ed01acf5da44a77191a203f0e56e580d124 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Tue, 11 Dec 2012 01:17:46 -0600 Subject: testsuite: added unit tests for Trigger --- .../Testlib/TestServer/TestPlugins/TestTrigger.py | 89 ++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestTrigger.py (limited to 'testsuite') diff --git a/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestTrigger.py b/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestTrigger.py new file mode 100644 index 000000000..c35405b80 --- /dev/null +++ b/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestTrigger.py @@ -0,0 +1,89 @@ +import os +import sys +from mock import Mock, patch +from subprocess import PIPE +from Bcfg2.Server.Plugins.Trigger import * + +# add all parent testsuite directories to sys.path to allow (most) +# relative imports in python 2.4 +path = os.path.dirname(__file__) +while path != "/": + if os.path.basename(path).lower().startswith("test"): + sys.path.append(path) + if os.path.basename(path) == "testsuite": + break + path = os.path.dirname(path) +from common import * +from TestPlugin import TestDirectoryBacked, TestClientRunHooks, TestPlugin, \ + TestFileBacked + + +class TestTriggerFile(TestFileBacked): + test_obj = TriggerFile + + def test_HandleEvent(self): + pass + + +class TestTrigger(TestPlugin, TestClientRunHooks, TestDirectoryBacked): + test_obj = Trigger + + def get_obj(self, core=None, fam=None): + if core is None: + core = Mock() + if fam is not None: + core.fam = fam + + @patch("%s.%s.add_directory_monitor" % (self.test_obj.__module__, + self.test_obj.__name__), + Mock()) + def inner(): + return TestPlugin.get_obj(self, core=core) + return inner() + + @patch("os.fork") + @patch("os._exit") + @patch("os.waitpid") + @patch("subprocess.Popen") + @skip("Tests that call os.fork are broken, even when os.fork is mocked") + def test_async_run(self, mock_Popen, mock_waitpid, mock_exit, mock_fork): + trigger = self.get_obj() + + def reset(): + mock_Popen.reset_mock() + mock_waitpid.reset_mock() + mock_exit.reset_mock() + mock_fork.reset_mock() + + mock_fork.return_value = 0 + trigger.async_run(["foo", "bar"]) + self.assertItemsEqual(mock_fork.call_args_list, + [call(), call()]) + mock_Popen.assert_called_with(["foo", "bar"], stdin=PIPE, stdout=PIPE, + stderr=PIPE) + mock_Popen.return_value.wait.assert_called_with() + mock_exit.assert_called_with(0) + + reset() + mock_fork.return_value = 123 + trigger.async_run(["foo", "bar"]) + mock_fork.assert_called_with() + mock_waitpid.assert_called_with(123, 0) + self.assertFalse(mock_Popen.called) + + def test_end_client_run(self): + trigger = self.get_obj() + trigger.async_run = Mock() + trigger.entries = {'foo.sh': Mock(), 'bar': Mock()} + + metadata = Mock() + metadata.hostname = "host" + metadata.profile = "profile" + metadata.groups = ['a', 'b', 'c'] + args = ['host', '-p', 'profile', '-g', 'a:b:c'] + + trigger.end_client_run(metadata) + self.assertItemsEqual([[os.path.join(trigger.data, 'foo.sh')] + args, + [os.path.join(trigger.data, 'bar')] + args], + [c[0][0] + for c in trigger.async_run.call_args_list]) -- cgit v1.2.3-1-g7c22