Passed
Pull Request — master (#40)
by Jan
26:45 queued 20:35
created

test_description()   A

Complexity

Conditions 1

Size

Total Lines 33
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 14
nop 2
dl 0
loc 33
ccs 5
cts 5
cp 1
crap 1
rs 9.7
c 0
b 0
f 0
1 1
import pytest
2
3 1
from oscap_report.scap_results_parser.data_structures.data_structures import (
4
    Report, Rule)
5 1
from oscap_report.scap_results_parser.scap_results_parser import \
6
    SCAPResultsParser
7
8 1
from ..constants import (PATH_TO_ARF, PATH_TO_ARF_WITH_MULTI_CHECK,
9
                         PATH_TO_ARF_WITHOUT_INFO,
10
                         PATH_TO_ARF_WITHOUT_SYSTEM_DATA,
11
                         PATH_TO_EMPTY_XML_FILE, PATH_TO_REMEDIATIONS_SCRIPTS,
12
                         PATH_TO_RULE_AND_CPE_CHECK_ARF,
13
                         PATH_TO_RULE_AND_CPE_CHECK_XCCDF,
14
                         PATH_TO_SIMPLE_RULE_FAIL_ARF,
15
                         PATH_TO_SIMPLE_RULE_FAIL_XCCDF,
16
                         PATH_TO_SIMPLE_RULE_PASS_ARF,
17
                         PATH_TO_SIMPLE_RULE_PASS_XCCDF, PATH_TO_XCCDF,
18
                         PATH_TO_XCCDF_WITH_MULTI_CHECK,
19
                         PATH_TO_XCCDF_WITHOUT_INFO,
20
                         PATH_TO_XCCDF_WITHOUT_SYSTEM_DATA)
21
22
23 1
def get_parser(file_path):
24 1
    xml_data = None
25 1
    with open(file_path, "r", encoding="utf-8") as xml_report:
26 1
        xml_data = xml_report.read().encode()
27 1
    return SCAPResultsParser(xml_data)
28
29
30 1
@pytest.mark.parametrize("file_path, result", [
31
    (PATH_TO_ARF, True),
32
    (PATH_TO_SIMPLE_RULE_PASS_ARF, True),
33
    (PATH_TO_SIMPLE_RULE_FAIL_ARF, True),
34
    (PATH_TO_RULE_AND_CPE_CHECK_ARF, True),
35
    (PATH_TO_ARF_WITHOUT_INFO, True),
36
    (PATH_TO_ARF_WITHOUT_SYSTEM_DATA, True),
37
    (PATH_TO_XCCDF, False),
38
    (PATH_TO_SIMPLE_RULE_PASS_XCCDF, False),
39
    (PATH_TO_SIMPLE_RULE_FAIL_XCCDF, False),
40
    (PATH_TO_RULE_AND_CPE_CHECK_XCCDF, False),
41
    (PATH_TO_XCCDF_WITHOUT_INFO, False),
42
    (PATH_TO_XCCDF_WITHOUT_SYSTEM_DATA, False),
43
    (PATH_TO_EMPTY_XML_FILE, False),
44
])
45 1
def test_validation(file_path, result):
46 1
    parser = get_parser(file_path)
47 1
    assert parser.validate(parser.arf_schemas_path) == result
48
49
50 1
@pytest.mark.parametrize("file_path, number_of_cpe_platforms", [
51
    (PATH_TO_ARF, 13),
52
    (PATH_TO_XCCDF, 13),
53
    (PATH_TO_SIMPLE_RULE_PASS_ARF, 0),
54
    (PATH_TO_SIMPLE_RULE_FAIL_ARF, 0),
55
    (PATH_TO_ARF_WITHOUT_INFO, 0),
56
    (PATH_TO_ARF_WITHOUT_SYSTEM_DATA, 0),
57
    (PATH_TO_RULE_AND_CPE_CHECK_ARF, 1),
58
    (PATH_TO_SIMPLE_RULE_PASS_XCCDF, 0),
59
    (PATH_TO_SIMPLE_RULE_FAIL_XCCDF, 0),
60
    (PATH_TO_XCCDF_WITHOUT_INFO, 0),
61
    (PATH_TO_XCCDF_WITHOUT_SYSTEM_DATA, 0),
62
    (PATH_TO_RULE_AND_CPE_CHECK_XCCDF, 1),
63
])
64 1
def test_get_profile_info(file_path, number_of_cpe_platforms):
65 1
    parser = get_parser(file_path)
66 1
    report = parser.get_profile_info()
67 1
    assert len(report.cpe_platforms) == number_of_cpe_platforms
68
69
70 1
@pytest.mark.parametrize("file_path, number_of_rules", [
71
    (PATH_TO_ARF, 714),
72
    (PATH_TO_XCCDF, 714),
73
    (PATH_TO_SIMPLE_RULE_PASS_ARF, 1),
74
    (PATH_TO_SIMPLE_RULE_FAIL_ARF, 1),
75
    (PATH_TO_ARF_WITHOUT_INFO, 1),
76
    (PATH_TO_ARF_WITHOUT_SYSTEM_DATA, 1),
77
    (PATH_TO_RULE_AND_CPE_CHECK_ARF, 3),
78
    (PATH_TO_SIMPLE_RULE_PASS_XCCDF, 1),
79
    (PATH_TO_SIMPLE_RULE_FAIL_XCCDF, 1),
80
    (PATH_TO_XCCDF_WITHOUT_INFO, 1),
81
    (PATH_TO_XCCDF_WITHOUT_SYSTEM_DATA, 1),
82
    (PATH_TO_RULE_AND_CPE_CHECK_XCCDF, 3),
83
])
84 1
def test_get_info_about_rules_in_profile(file_path, number_of_rules):
85 1
    parser = get_parser(file_path)
86 1
    parser.process_groups_or_rules()
87 1
    assert len(parser.rules.keys()) == number_of_rules
88 1
    for rule in parser.rules.values():
89 1
        assert isinstance(rule, Rule)
90
91
92 1
@pytest.mark.parametrize("file_path, contains_oval_tree", [
93
    (PATH_TO_ARF, True),
94
    (PATH_TO_XCCDF, False),
95
])
96 1
def test_parse_report(file_path, contains_oval_tree):
97 1
    parser = get_parser(file_path)
98 1
    report = parser.parse_report()
99 1
    assert isinstance(report, Report)
100 1
    assert report.profile_name is not None
101 1
    assert report.rules is not None
102 1
    rule_id = "xccdf_org.ssgproject.content_rule_accounts_passwords_pam_faillock_deny"
103 1
    assert isinstance(report.rules[rule_id], Rule)
104 1
    assert (report.rules[rule_id].oval_tree is not None) == contains_oval_tree
105
106
107 1
@pytest.mark.parametrize("file_path, contains_rules_some_multi_check_rule", [
108
    (PATH_TO_ARF, False),
109
    (PATH_TO_XCCDF, False),
110
    (PATH_TO_XCCDF_WITH_MULTI_CHECK, True),
111
    (PATH_TO_ARF_WITH_MULTI_CHECK, True),
112
])
113 1
def test_multi_check(file_path, contains_rules_some_multi_check_rule):
114 1
    parser = get_parser(file_path)
115 1
    parser.process_groups_or_rules()
116 1
    result = False
117 1
    for rule in parser.rules.values():
118 1
        if rule.multi_check:
119 1
            result = True
120 1
    assert result == contains_rules_some_multi_check_rule
121
122
123 1
@pytest.mark.parametrize("rule, result", [
124
    (
125
        "xccdf_org.ssgproject.content_rule_prefer_64bit_os",
126
        "Prefer installation of 64-bit operating systems when the CPU supports it."
127
    ),
128
    (
129
        "xccdf_org.ssgproject.content_rule_dconf_gnome_screensaver_lock_enabled",
130
        (
131
            "\nTo activate locking of the screensaver in the GNOME3 desktop"
132
            " when it is activated,\nadd or set <code>lock-enabled</code>"
133
            " to <code>true</code> in\n<code>/etc/dconf/db/local.d/00-security-settings</code>."
134
            " For example:\n<pre>[org/gnome/desktop/screensaver]\nlock-enabled=true\n</pre>\n"
135
            "Once the settings have been added, add a lock to\n"
136
            "<code>/etc/dconf/db/local.d/locks/00-security-settings-lock</code> "
137
            "to prevent user modification.\nFor example:\n"
138
            "<pre>/org/gnome/desktop/screensaver/lock-enabled</pre>\n"
139
            "After the settings have been set, run <code>dconf update</code>."
140
        )
141
    ),
142
    (
143
        "xccdf_org.ssgproject.content_rule_auditd_data_retention_action_mail_acct",
144
        (
145
            "The <code>auditd</code> service can be configured to send email to\n"
146
            "a designated account in certain situations. Add or correct the following line\n"
147
            "in <code>/etc/audit/auditd.conf</code> to ensure that administrators are notified\n"
148
            "via email for those situations:\n<pre>action_mail_acct = root</pre>"
149
        )
150
    )
151
])
152 1
def test_description(rule, result):
153 1
    parser = get_parser(PATH_TO_ARF)
154 1
    parser.process_groups_or_rules()
155 1
    assert parser.rules[rule].description == result
156
157
158 1
@pytest.mark.parametrize("rule, remediation_id, scripts", [
159
    (
160
        "xccdf_org.ssgproject.content_rule_prefer_64bit_os",
161
        None,
162
        {}
163
    ),
164
    (
165
        "xccdf_org.ssgproject.content_rule_dconf_gnome_screensaver_lock_enabled",
166
        "dconf_gnome_screensaver_lock_enabled",
167
        {
168
            "urn:xccdf:fix:script:ansible": "dconf_gnome_screensaver_lock_enabled_ansible.txt",
169
            "urn:xccdf:fix:script:sh": "dconf_gnome_screensaver_lock_enabled_sh.txt"
170
        }
171
    ),
172
    (
173
        "xccdf_org.ssgproject.content_rule_auditd_data_retention_action_mail_acct",
174
        "auditd_data_retention_action_mail_acct",
175
        {
176
            "urn:xccdf:fix:script:sh": "auditd_data_retention_action_mail_acct_sh.txt",
177
            "urn:xccdf:fix:script:ansible": "auditd_data_retention_action_mail_acct_ansible.txt"
178
        }
179
    )
180
])
181 1
def test_remediations(rule, remediation_id, scripts):
182 1
    parser = get_parser(PATH_TO_ARF)
183 1
    parser.process_groups_or_rules()
184 1
    for remediation in parser.rules[rule].remediations:
185 1
        assert remediation.remediation_id == remediation_id
186 1
        assert remediation.system in scripts
187 1
        path = PATH_TO_REMEDIATIONS_SCRIPTS / str(scripts[remediation.system])
188 1
        with open(path, "r", encoding="utf-8") as script:
189 1
            data = script.read()
190
            assert data == remediation.fix
191