Blame tests/test_ks_oscap.py

Packit Service 39273c
"""Module with tests for the ks/oscap.py module."""
Packit Service 39273c
Packit Service 39273c
import os
Packit Service 39273c
Packit Service 39273c
from pykickstart.errors import KickstartValueError
Packit Service 39273c
import pytest
Packit Service 39273c
Packit Service 39273c
try:
Packit Service 39273c
    from org_fedora_oscap.ks.oscap import OSCAPdata
Packit Service 39273c
    from org_fedora_oscap import common
Packit Service 39273c
except ImportError as exc:
Packit Service 39273c
    pytestmark = pytest.mark.skip(
Packit Service 39273c
        "Unable to import modules, possibly due to bad version of Anaconda: {error}"
Packit Service 39273c
        .format(error=str(exc)))
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
@pytest.fixture()
Packit Service 39273c
def blank_oscap_data():
Packit Service 39273c
    return OSCAPdata("org_fedora_oscap")
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
@pytest.fixture()
Packit Service 39273c
def filled_oscap_data(blank_oscap_data):
Packit Service 39273c
    oscap_data = blank_oscap_data
Packit Service 39273c
    for line in [
Packit Service 39273c
            "content-type = datastream\n",
Packit Service 39273c
            "content-url = \"https://example.com/hardening.xml\"\n",
Packit Service 39273c
            "datastream-id = id_datastream_1\n",
Packit Service 39273c
            "xccdf-id = id_xccdf_new\n",
Packit Service 39273c
            "content-path = /usr/share/oscap/testing_ds.xml",
Packit Service 39273c
            "cpe-path = /usr/share/oscap/cpe.xml",
Packit Service 39273c
            "tailoring-path = /usr/share/oscap/tailoring.xml",
Packit Service 39273c
            "profile = \"Web Server\"\n",
Packit Service 39273c
            ]:
Packit Service 39273c
        oscap_data.handle_line(line)
Packit Service 39273c
    return oscap_data
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_parsing(filled_oscap_data):
Packit Service 39273c
    data = filled_oscap_data
Packit Service 39273c
    assert data.content_type == "datastream"
Packit Service 39273c
    assert data.content_url == "https://example.com/hardening.xml"
Packit Service 39273c
    assert data.datastream_id == "id_datastream_1"
Packit Service 39273c
    assert data.xccdf_id == "id_xccdf_new"
Packit Service 39273c
    assert data.content_path == "/usr/share/oscap/testing_ds.xml"
Packit Service 39273c
    assert data.cpe_path == "/usr/share/oscap/cpe.xml"
Packit Service 39273c
    assert data.profile_id == "Web Server"
Packit Service 39273c
    assert data.content_name == "hardening.xml"
Packit Service 39273c
    assert data.tailoring_path == "/usr/share/oscap/tailoring.xml"
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_properties(filled_oscap_data):
Packit Service 39273c
    data = filled_oscap_data
Packit Service 39273c
    assert (data.preinst_content_path
Packit Service 39273c
            == common.INSTALLATION_CONTENT_DIR + data.content_name)
Packit Service 39273c
    assert (data.postinst_content_path
Packit Service 39273c
            == common.TARGET_CONTENT_DIR + data.content_name)
Packit Service 39273c
    assert (data.raw_preinst_content_path
Packit Service 39273c
            == common.INSTALLATION_CONTENT_DIR + data.content_name)
Packit Service 39273c
    assert (data.preinst_tailoring_path
Packit Service 39273c
            == os.path.normpath(common.INSTALLATION_CONTENT_DIR + data.tailoring_path))
Packit Service 39273c
    assert (data.postinst_tailoring_path
Packit Service 39273c
            == os.path.normpath(common.TARGET_CONTENT_DIR + data.tailoring_path))
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_str(filled_oscap_data):
Packit Service 39273c
    str_ret = str(filled_oscap_data)
Packit Service 39273c
    assert (str_ret ==
Packit Service 39273c
            "%addon org_fedora_oscap\n"
Packit Service 39273c
            "    content-type = datastream\n"
Packit Service 39273c
            "    content-url = https://example.com/hardening.xml\n"
Packit Service 39273c
            "    datastream-id = id_datastream_1\n"
Packit Service 39273c
            "    xccdf-id = id_xccdf_new\n"
Packit Service 39273c
            "    content-path = /usr/share/oscap/testing_ds.xml\n"
Packit Service 39273c
            "    cpe-path = /usr/share/oscap/cpe.xml\n"
Packit Service 39273c
            "    tailoring-path = /usr/share/oscap/tailoring.xml\n"
Packit Service 39273c
            "    profile = Web Server\n"
Packit Service 39273c
            "%end\n\n"
Packit Service 39273c
            )
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_str_parse(filled_oscap_data):
Packit Service 39273c
    our_oscap_data = OSCAPdata("org_fedora_oscap")
Packit Service 39273c
Packit Service 39273c
    str_ret = str(filled_oscap_data)
Packit Service 39273c
    for line in str_ret.splitlines()[1:-1]:
Packit Service 39273c
        if "%end" not in line:
Packit Service 39273c
            our_oscap_data.handle_line(line)
Packit Service 39273c
Packit Service 39273c
    our_str_ret = str(our_oscap_data)
Packit Service 39273c
    assert str_ret == our_str_ret
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_nothing_given(blank_oscap_data):
Packit Service 39273c
    with pytest.raises(KickstartValueError):
Packit Service 39273c
        blank_oscap_data.finalize()
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_no_content_type(blank_oscap_data):
Packit Service 39273c
    for line in ["content-url = http://example.com/test_ds.xml",
Packit Service 39273c
                 "profile = Web Server",
Packit Service 39273c
                 ]:
Packit Service 39273c
        blank_oscap_data.handle_line(line)
Packit Service 39273c
Packit Service 39273c
    with pytest.raises(KickstartValueError):
Packit Service 39273c
        blank_oscap_data.finalize()
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_no_content_url(blank_oscap_data):
Packit Service 39273c
    for line in ["content-type = datastream",
Packit Service 39273c
                 "profile = Web Server",
Packit Service 39273c
                 ]:
Packit Service 39273c
        blank_oscap_data.handle_line(line)
Packit Service 39273c
Packit Service 39273c
    with pytest.raises(KickstartValueError):
Packit Service 39273c
        blank_oscap_data.finalize()
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_no_profile(blank_oscap_data):
Packit Service 39273c
    for line in ["content-url = http://example.com/test_ds.xml",
Packit Service 39273c
                 "content-type = datastream",
Packit Service 39273c
                 ]:
Packit Service 39273c
        blank_oscap_data.handle_line(line)
Packit Service 39273c
Packit Service 39273c
    blank_oscap_data.finalize()
Packit Service 39273c
    assert blank_oscap_data.profile_id == "default"
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_rpm_without_path(blank_oscap_data):
Packit Service 39273c
    for line in ["content-url = http://example.com/oscap_content.rpm",
Packit Service 39273c
                 "content-type = RPM",
Packit Service 39273c
                 "profile = Web Server",
Packit Service 39273c
                 ]:
Packit Service 39273c
        blank_oscap_data.handle_line(line)
Packit Service 39273c
Packit Service 39273c
    with pytest.raises(KickstartValueError):
Packit Service 39273c
        blank_oscap_data.finalize()
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_rpm_with_wrong_suffix(blank_oscap_data):
Packit Service 39273c
    for line in ["content-url = http://example.com/oscap_content.xml",
Packit Service 39273c
                 "content-type = RPM",
Packit Service 39273c
                 "profile = Web Server",
Packit Service 39273c
                 ]:
Packit Service 39273c
        blank_oscap_data.handle_line(line)
Packit Service 39273c
Packit Service 39273c
    with pytest.raises(KickstartValueError):
Packit Service 39273c
        blank_oscap_data.finalize()
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_archive_without_path(blank_oscap_data):
Packit Service 39273c
    for line in ["content-url = http://example.com/oscap_content.tar",
Packit Service 39273c
                 "content-type = archive",
Packit Service 39273c
                 "profile = Web Server",
Packit Service 39273c
                 ]:
Packit Service 39273c
        blank_oscap_data.handle_line(line)
Packit Service 39273c
Packit Service 39273c
    with pytest.raises(KickstartValueError):
Packit Service 39273c
        blank_oscap_data.finalize()
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_unsupported_archive_type(blank_oscap_data):
Packit Service 39273c
    for line in ["content-url = http://example.com/oscap_content.tbz",
Packit Service 39273c
                 "content-type = archive",
Packit Service 39273c
                 "profile = Web Server",
Packit Service 39273c
                 "xccdf-path = xccdf.xml"
Packit Service 39273c
                 ]:
Packit Service 39273c
        blank_oscap_data.handle_line(line)
Packit Service 39273c
Packit Service 39273c
    with pytest.raises(KickstartValueError):
Packit Service 39273c
        blank_oscap_data.finalize()
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_enough_for_ds(blank_oscap_data):
Packit Service 39273c
    for line in ["content-url = http://example.com/test_ds.xml",
Packit Service 39273c
                 "content-type = datastream",
Packit Service 39273c
                 "profile = Web Server",
Packit Service 39273c
                 ]:
Packit Service 39273c
        blank_oscap_data.handle_line(line)
Packit Service 39273c
Packit Service 39273c
    blank_oscap_data.finalize()
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_enough_for_rpm(blank_oscap_data):
Packit Service 39273c
    for line in ["content-url = http://example.com/oscap_content.rpm",
Packit Service 39273c
                 "content-type = RPM",
Packit Service 39273c
                 "profile = Web Server",
Packit Service 39273c
                 "xccdf-path = /usr/share/oscap/xccdf.xml"
Packit Service 39273c
                 ]:
Packit Service 39273c
        blank_oscap_data.handle_line(line)
Packit Service 39273c
Packit Service 39273c
    blank_oscap_data.finalize()
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_enough_for_archive(blank_oscap_data):
Packit Service 39273c
    for line in ["content-url = http://example.com/oscap_content.tar",
Packit Service 39273c
                 "content-type = archive",
Packit Service 39273c
                 "profile = Web Server",
Packit Service 39273c
                 "xccdf-path = /usr/share/oscap/xccdf.xml"
Packit Service 39273c
                 ]:
Packit Service 39273c
        blank_oscap_data.handle_line(line)
Packit Service 39273c
Packit Service 39273c
    blank_oscap_data.finalize()
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_archive_preinst_content_path(blank_oscap_data):
Packit Service 39273c
    for line in ["content-url = http://example.com/oscap_content.tar",
Packit Service 39273c
                 "content-type = archive",
Packit Service 39273c
                 "profile = Web Server",
Packit Service 39273c
                 "xccdf-path = oscap/xccdf.xml"
Packit Service 39273c
                 ]:
Packit Service 39273c
        blank_oscap_data.handle_line(line)
Packit Service 39273c
Packit Service 39273c
    blank_oscap_data.finalize()
Packit Service 39273c
Packit Service 39273c
    # content_name should be the archive's name
Packit Service 39273c
    assert blank_oscap_data.content_name == "oscap_content.tar"
Packit Service 39273c
Packit Service 39273c
    # content path should end with the xccdf path
Packit Service 39273c
    assert blank_oscap_data.preinst_content_path.endswith("oscap/xccdf.xml")
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_ds_preinst_content_path(blank_oscap_data):
Packit Service 39273c
    for line in ["content-url = http://example.com/scap_content.xml",
Packit Service 39273c
                 "content-type = datastream",
Packit Service 39273c
                 "profile = Web Server",
Packit Service 39273c
                 ]:
Packit Service 39273c
        blank_oscap_data.handle_line(line)
Packit Service 39273c
Packit Service 39273c
    blank_oscap_data.finalize()
Packit Service 39273c
Packit Service 39273c
    # both content_name and content path should point to the data stream
Packit Service 39273c
    # XML
Packit Service 39273c
    assert blank_oscap_data.content_name == "scap_content.xml"
Packit Service 39273c
    assert blank_oscap_data.preinst_content_path.endswith("scap_content.xml")
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_archive_raw_content_paths(blank_oscap_data):
Packit Service 39273c
    for line in ["content-url = http://example.com/oscap_content.tar",
Packit Service 39273c
                 "content-type = archive",
Packit Service 39273c
                 "profile = Web Server",
Packit Service 39273c
                 "xccdf-path = oscap/xccdf.xml",
Packit Service 39273c
                 "tailoring-path = oscap/tailoring.xml",
Packit Service 39273c
                 ]:
Packit Service 39273c
        blank_oscap_data.handle_line(line)
Packit Service 39273c
Packit Service 39273c
    blank_oscap_data.finalize()
Packit Service 39273c
Packit Service 39273c
    # content_name should be the archive's name
Packit Service 39273c
    assert blank_oscap_data.content_name == "oscap_content.tar"
Packit Service 39273c
Packit Service 39273c
    # content path should end with the archive's name
Packit Service 39273c
    assert blank_oscap_data.raw_preinst_content_path.endswith("oscap_content.tar")
Packit Service 39273c
    assert blank_oscap_data.raw_postinst_content_path.endswith("oscap_content.tar")
Packit Service 39273c
Packit Service 39273c
    # tailoring paths should be returned properly
Packit Service 39273c
    assert (blank_oscap_data.preinst_tailoring_path
Packit Service 39273c
            == common.INSTALLATION_CONTENT_DIR + blank_oscap_data.tailoring_path)
Packit Service 39273c
Packit Service 39273c
    assert (blank_oscap_data.postinst_tailoring_path
Packit Service 39273c
            == common.TARGET_CONTENT_DIR + blank_oscap_data.tailoring_path)
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_rpm_raw_content_paths(blank_oscap_data):
Packit Service 39273c
    for line in ["content-url = http://example.com/oscap_content.rpm",
Packit Service 39273c
                 "content-type = rpm",
Packit Service 39273c
                 "profile = Web Server",
Packit Service 39273c
                 "xccdf-path = /usr/share/oscap/xccdf.xml",
Packit Service 39273c
                 "tailoring-path = /usr/share/oscap/tailoring.xml",
Packit Service 39273c
                 ]:
Packit Service 39273c
        blank_oscap_data.handle_line(line)
Packit Service 39273c
Packit Service 39273c
    blank_oscap_data.finalize()
Packit Service 39273c
Packit Service 39273c
    # content_name should be the rpm's name
Packit Service 39273c
    assert blank_oscap_data.content_name == "oscap_content.rpm"
Packit Service 39273c
Packit Service 39273c
    # content path should end with the rpm's name
Packit Service 39273c
    assert blank_oscap_data.raw_preinst_content_path.endswith("oscap_content.rpm")
Packit Service 39273c
    assert blank_oscap_data.raw_postinst_content_path.endswith("oscap_content.rpm")
Packit Service 39273c
Packit Service 39273c
    # content paths should be returned as expected
Packit Service 39273c
    assert (blank_oscap_data.preinst_content_path
Packit Service 39273c
            == os.path.normpath(common.INSTALLATION_CONTENT_DIR + blank_oscap_data.content_path))
Packit Service 39273c
Packit Service 39273c
    # when using rpm, content_path doesn't change for the post-installation
Packit Service 39273c
    # phase
Packit Service 39273c
    assert blank_oscap_data.postinst_content_path == blank_oscap_data.content_path
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_ds_raw_content_paths(blank_oscap_data):
Packit Service 39273c
    for line in ["content-url = http://example.com/scap_content.xml",
Packit Service 39273c
                 "content-type = datastream",
Packit Service 39273c
                 "profile = Web Server",
Packit Service 39273c
                 ]:
Packit Service 39273c
        blank_oscap_data.handle_line(line)
Packit Service 39273c
Packit Service 39273c
    blank_oscap_data.finalize()
Packit Service 39273c
Packit Service 39273c
    # content_name and content paths should all point to the data stream
Packit Service 39273c
    # XML
Packit Service 39273c
    assert blank_oscap_data.content_name == "scap_content.xml"
Packit Service 39273c
    assert blank_oscap_data.raw_preinst_content_path.endswith("scap_content.xml")
Packit Service 39273c
    assert blank_oscap_data.raw_postinst_content_path.endswith("scap_content.xml")
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_valid_fingerprints(blank_oscap_data):
Packit Service 39273c
    for repetitions in (32, 40, 56, 64, 96, 128):
Packit Service 39273c
        blank_oscap_data.handle_line("fingerprint = %s" % ("a" * repetitions))
Packit Service 39273c
Packit Service 39273c
Packit Service 39273c
def test_invalid_fingerprints(blank_oscap_data):
Packit Service 39273c
    # invalid character
Packit Service 39273c
    with pytest.raises(
Packit Service 39273c
            KickstartValueError, message="Unsupported or invalid fingerprint"):
Packit Service 39273c
        blank_oscap_data.handle_line("fingerprint = %s?" % ("a" * 31))
Packit Service 39273c
Packit Service 39273c
    # invalid lengths (odd and even)
Packit Service 39273c
    for repetitions in (31, 41, 54, 66, 98, 124):
Packit Service 39273c
        with pytest.raises(
Packit Service 39273c
                KickstartValueError, message="Unsupported fingerprint"):
Packit Service 39273c
            blank_oscap_data.handle_line("fingerprint = %s" % ("a" * repetitions))