summaryrefslogtreecommitdiffstats
path: root/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestSEModules.py
blob: c319ed663b05013c5ac4c41dc337eb1384347d35 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import os
import sys
import lxml.etree
import Bcfg2.Server.Plugin
from Bcfg2.Compat import b64encode
from mock import Mock, MagicMock, patch
from Bcfg2.Server.Plugins.SEModules 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 XI_NAMESPACE, XI, inPy3k, call, builtins, u, can_skip, \
    skip, skipIf, skipUnless, Bcfg2TestCase, DBModelTestCase, syncdb, \
    patchIf, datastore
from TestPlugin import TestSpecificData, TestGroupSpool

class TestSEModuleData(TestSpecificData):
    test_obj = SEModuleData
    path = os.path.join(datastore, "SEModules", "test.pp", "test.pp")

    def test_bind_entry(self):
        data = self.get_obj()
        data.data = "test"
        entry = lxml.etree.Element("test", name=self.path)
        data.bind_entry(entry, Mock())
        self.assertEqual(entry.get("name"), self.path)
        self.assertEqual(entry.get("encoding"), "base64")
        self.assertEqual(entry.text, b64encode(data.data))


class TestSEModules(TestGroupSpool):
    test_obj = SEModules

    def test__get_module_name(self):
        modules = self.get_obj()
        for mname in ["foo", "foo.pp"]:
            entry = lxml.etree.Element("SELinux", type="module", name=mname)
            self.assertEqual(modules._get_module_name(entry), "/foo.pp")

    @patch("Bcfg2.Server.Plugins.SEModules.SEModules._get_module_name")
    def test_HandlesEntry(self, mock_get_name):
        modules = self.get_obj()
        modules.Entries['SELinux']['/foo.pp'] = Mock()
        modules.Entries['SELinux']['/bar.pp'] = Mock()
        for el in [lxml.etree.Element("Path", name="/foo.pp"),
                   lxml.etree.Element("SELinux", type="fcontext",
                                      name="/foo.pp"),
                   lxml.etree.Element("SELinux", type="module",
                                      name="/baz.pp")]:
            mock_get_name.return_value = el.get("name")
            self.assertFalse(modules.HandlesEntry(el, Mock()))
            mock_get_name.assert_called_with(el)

        for el in [lxml.etree.Element("SELinux", type="module",
                                      name="/foo.pp"),
                   lxml.etree.Element("SELinux", type="module",
                                      name="/bar.pp")]:
            mock_get_name.return_value = el.get("name")
            self.assertTrue(modules.HandlesEntry(el, Mock()),
                            msg="SEModules fails to handle %s" % el.get("name"))
            mock_get_name.assert_called_with(el)

        TestGroupSpool.test_HandlesEntry(self)

    @patch("Bcfg2.Server.Plugins.SEModules.SEModules._get_module_name")
    def test_HandlesEntry(self, mock_get_name):
        modules = self.get_obj()
        handler = Mock()
        modules.Entries['SELinux']['/foo.pp'] = handler
        mock_get_name.return_value = "/foo.pp"
        
        entry = lxml.etree.Element("SELinux", type="module", name="foo")
        metadata = Mock()
        self.assertEqual(modules.HandleEntry(entry, metadata),
                         handler.return_value)
        mock_get_name.assert_called_with(entry)
        self.assertEqual(entry.get("name"), mock_get_name.return_value)
        handler.assert_called_with(entry, metadata)

        TestGroupSpool.test_HandlesEntry(self)

    def test_add_entry(self):
        @patch("%s.%s.event_path" %
               (self.test_obj.__module__, self.test_obj.__name__))
        @patch("%s.%s.add_entry" % (self.test_obj.__base__.__module__,
                                    self.test_obj.__base__.__name__))
        def inner(mock_add_entry, mock_event_path):
            modules = self.get_obj()

            evt = Mock()
            evt.filename = "test.pp.G10_foo"

            mock_event_path.return_value = os.path.join(datastore,
                                                        self.test_obj.__name__,
                                                        "test.pp",
                                                        "test.pp.G10_foo")
            modules.add_entry(evt)
            self.assertEqual(modules.filename_pattern, "test.pp")
            mock_add_entry.assert_called_with(modules, evt)
            mock_event_path.assert_called_with(evt)

        inner()
        TestGroupSpool.test_add_entry(self)