summaryrefslogtreecommitdiffstats
path: root/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestRules.py
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestRules.py')
-rw-r--r--testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestRules.py130
1 files changed, 130 insertions, 0 deletions
diff --git a/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestRules.py b/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestRules.py
new file mode 100644
index 000000000..f018b45dc
--- /dev/null
+++ b/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestRules.py
@@ -0,0 +1,130 @@
+import os
+import sys
+import lxml.etree
+import Bcfg2.Server.Plugin
+from mock import Mock, MagicMock, patch
+from Bcfg2.Server.Plugins.Rules 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 TestPrioDir
+
+
+class TestRules(TestPrioDir):
+ test_obj = Rules
+
+ def test_HandlesEntry(self):
+ r = self.get_obj()
+ r.Entries = dict(Path={"/etc/foo.conf": Mock(),
+ "/etc/bar.conf": Mock()})
+ r._matches = Mock()
+ metadata = Mock()
+
+ entry = lxml.etree.Element("Path", name="/etc/foo.conf")
+ self.assertEqual(r.HandlesEntry(entry, metadata),
+ r._matches.return_value)
+ r._matches.assert_called_with(entry, metadata,
+ r.Entries['Path'].keys())
+
+ r._matches.reset_mock()
+ entry = lxml.etree.Element("Path", name="/etc/baz.conf")
+ self.assertEqual(r.HandlesEntry(entry, metadata),
+ r._matches.return_value)
+ r._matches.assert_called_with(entry, metadata,
+ r.Entries['Path'].keys())
+
+ r._matches.reset_mock()
+ entry = lxml.etree.Element("Package", name="foo")
+ self.assertFalse(r.HandlesEntry(entry, metadata))
+
+ def test_BindEntry(self, method="BindEntry"):
+ r = self.get_obj()
+ r.get_attrs = Mock()
+ r.get_attrs.return_value = dict(overwrite="new", add="add",
+ text="text")
+ entry = lxml.etree.Element("Test", overwrite="old", keep="keep")
+ metadata = Mock()
+
+ getattr(r, method)(entry, metadata)
+ r.get_attrs.assert_called_with(entry, metadata)
+ self.assertItemsEqual(entry.attrib,
+ dict(overwrite="old", add="add", keep="keep",
+ text="text"))
+
+ def test_HandleEntry(self):
+ self.test_BindEntry(method="HandleEntry")
+
+ @patch("Bcfg2.Server.Plugin.PrioDir._matches")
+ def test__matches(self, mock_matches):
+ """ test _matches() behavior regardless of state of _regex_enabled """
+ r = self.get_obj()
+ metadata = Mock()
+
+ entry = lxml.etree.Element("Path", name="/etc/foo.conf")
+ rules = []
+ mock_matches.return_value = True
+ self.assertTrue(r._matches(entry, metadata, rules))
+ mock_matches.assert_called_with(r, entry, metadata, rules)
+
+ # test special Path cases -- adding and removing trailing slash
+ mock_matches.reset_mock()
+ mock_matches.return_value = False
+ rules = ["/etc/foo/", "/etc/bar"]
+ entry = lxml.etree.Element("Path", name="/etc/foo")
+ self.assertTrue(r._matches(entry, metadata, rules))
+ mock_matches.assert_called_with(r, entry, metadata, rules)
+
+ mock_matches.reset_mock()
+ entry = lxml.etree.Element("Path", name="/etc/bar/")
+ self.assertTrue(r._matches(entry, metadata, rules))
+ mock_matches.assert_called_with(r, entry, metadata, rules)
+
+ @patch("Bcfg2.Server.Plugin.PrioDir._matches")
+ def test__matches_regex_disabled(self, mock_matches):
+ """ test failure to match with regex disabled """
+ r = self.get_obj()
+ self.set_regex_enabled(r, False)
+ metadata = Mock()
+ mock_matches.return_value = False
+
+ entry = lxml.etree.Element("Path", name="/etc/foo.conf")
+ rules = []
+ self.assertFalse(r._matches(entry, metadata, rules))
+ mock_matches.assert_called_with(r, entry, metadata, rules)
+
+ @patch("Bcfg2.Server.Plugin.PrioDir._matches")
+ def test__matches_regex_enabled(self, mock_matches):
+ """ test match with regex enabled """
+ r = self.get_obj()
+ self.set_regex_enabled(r, True)
+ metadata = Mock()
+ mock_matches.return_value = False
+
+ entry = lxml.etree.Element("Path", name="/etc/foo.conf")
+ rules = ["/etc/.*\.conf", "/etc/bar"]
+ self.assertTrue(r._matches(entry, metadata, rules))
+ mock_matches.assert_called_with(r, entry, metadata, rules)
+ self.assertIn("/etc/.*\.conf", r._regex_cache.keys())
+
+ def set_regex_enabled(self, rules_obj, state):
+ """ set the state of regex_enabled for this implementation of
+ Rules """
+ if not isinstance(rules_obj.core.setup, MagicMock):
+ rules_obj.core.setup = MagicMock()
+ rules_obj.core.setup.cfp.getboolean.return_value = state
+
+ def test__regex_enabled(self):
+ r = self.get_obj()
+ r.core.setup = MagicMock()
+ self.assertEqual(r._regex_enabled,
+ r.core.setup.cfp.getboolean.return_value)
+ r.core.setup.cfp.getboolean.assert_called_with("rules", "regex",
+ default=False)