From 10326a34dd813b88c6c8816115e91977a93a1f10 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Thu, 20 Dec 2012 10:02:41 -0600 Subject: Cfg: added creator handler to perform one-time creation of static data --- .../TestServer/TestPlugins/TestCfg/Test_init.py | 100 ++++++++++++++++++++- 1 file changed, 99 insertions(+), 1 deletion(-) (limited to 'testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestCfg/Test_init.py') diff --git a/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestCfg/Test_init.py b/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestCfg/Test_init.py index d6313b073..6412480f0 100644 --- a/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestCfg/Test_init.py +++ b/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestCfg/Test_init.py @@ -1,5 +1,6 @@ import os import sys +import errno import lxml.etree import Bcfg2.Options from Bcfg2.Compat import walk_packages @@ -181,6 +182,64 @@ class TestCfgVerifier(TestCfgBaseFileMatcher): cf.verify_entry, Mock(), Mock(), Mock()) +class TestCfgCreator(TestCfgBaseFileMatcher): + test_obj = CfgCreator + path = "/foo/bar/test.txt" + + def test_create_data(self): + cc = self.get_obj() + self.assertRaises(NotImplementedError, + cc.create_data, Mock(), Mock()) + + @patch("os.makedirs") + @patch("%s.open" % builtins) + def test_write_data(self, mock_open, mock_makedirs): + cc = self.get_obj() + data = "test\ntest" + + def reset(): + mock_open.reset_mock() + mock_makedirs.reset_mock() + + # test writing non-specific file + cc.write_data(data) + mock_makedirs.assert_called_with("/foo/bar") + mock_open.assert_called_with("/foo/bar/bar", "wb") + mock_open.return_value.write.assert_called_with(data) + + # test writing group-specific file + reset() + cc.write_data(data, group="foogroup", prio=9) + mock_makedirs.assert_called_with("/foo/bar") + mock_open.assert_called_with("/foo/bar/bar.G09_foogroup", "wb") + mock_open.return_value.write.assert_called_with(data) + + # test writing host-specific file + reset() + cc.write_data(data, host="foo.example.com") + mock_makedirs.assert_called_with("/foo/bar") + mock_open.assert_called_with("/foo/bar/bar.H_foo.example.com", "wb") + mock_open.return_value.write.assert_called_with(data) + + # test already-exists error from makedirs + reset() + mock_makedirs.side_effect = OSError(errno.EEXIST, self.path) + cc.write_data(data) + mock_makedirs.assert_called_with("/foo/bar") + mock_open.assert_called_with("/foo/bar/bar", "wb") + mock_open.return_value.write.assert_called_with(data) + + # test error from open + reset() + mock_open.side_effect = IOError + self.assertRaises(CfgCreationError, cc.write_data, data) + + # test real error from makedirs + reset() + mock_makedirs.side_effect = OSError + self.assertRaises(CfgCreationError, cc.write_data, data) + + class TestCfgDefaultInfo(TestCfgInfo): test_obj = CfgDefaultInfo @@ -570,9 +629,36 @@ class TestCfgEntrySet(TestEntrySet): Bcfg2.Server.Plugins.Cfg.DEFAULT_INFO = default_info + def test_create_data(self): + eset = self.get_obj() + eset.best_matching = Mock() + creator = Mock() + creator.create_data.return_value = "data" + eset.best_matching.return_value = creator + eset.get_handlers = Mock() + entry = lxml.etree.Element("Path", name="/test.txt", mode="0640") + metadata = Mock() + + def reset(): + eset.best_matching.reset_mock() + eset.get_handlers.reset_mock() + + # test success + self.assertEqual(eset._create_data(entry, metadata), "data") + eset.get_handlers.assert_called_with(metadata, CfgCreator) + eset.best_matching.assert_called_with(metadata, + eset.get_handlers.return_value) + + # test failure to create data + reset() + creator.create_data.side_effect = OSError + self.assertRaises(PluginExecutionError, + eset._create_data, entry, metadata) + def test_generate_data(self): eset = self.get_obj() eset.best_matching = Mock() + eset._create_data = Mock() generator = Mock() generator.get_data.return_value = "data" eset.best_matching.return_value = generator @@ -583,7 +669,7 @@ class TestCfgEntrySet(TestEntrySet): def reset(): eset.best_matching.reset_mock() eset.get_handlers.reset_mock() - + eset._create_data.reset_mock() # test success self.assertEqual(eset._generate_data(entry, metadata), @@ -591,6 +677,7 @@ class TestCfgEntrySet(TestEntrySet): eset.get_handlers.assert_called_with(metadata, CfgGenerator) eset.best_matching.assert_called_with(metadata, eset.get_handlers.return_value) + self.assertFalse(eset._create_data.called) # test failure to generate data reset() @@ -598,6 +685,17 @@ class TestCfgEntrySet(TestEntrySet): self.assertRaises(PluginExecutionError, eset._generate_data, entry, metadata) + # test no generator found + reset() + eset.best_matching.side_effect = PluginExecutionError + self.assertEqual(eset._generate_data(entry, metadata), + eset._create_data.return_value) + eset.get_handlers.assert_called_with(metadata, CfgGenerator) + eset.best_matching.assert_called_with(metadata, + eset.get_handlers.return_value) + eset._create_data.assert_called_with(entry, metadata) + + def test_validate_data(self): class MockChild1(Mock): pass -- cgit v1.2.3-1-g7c22