Blame tests/test_modules.py

Packit Service 21c75c
# Copyright (C) 2017 Red Hat, Inc.
Packit Service 21c75c
#
Packit Service 21c75c
# This copyrighted material is made available to anyone wishing to use,
Packit Service 21c75c
# modify, copy, or redistribute it subject to the terms and conditions of
Packit Service 21c75c
# the GNU General Public License v.2, or (at your option) any later version.
Packit Service 21c75c
# This program is distributed in the hope that it will be useful, but WITHOUT
Packit Service 21c75c
# ANY WARRANTY expressed or implied, including the implied warranties of
Packit Service 21c75c
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
Packit Service 21c75c
# Public License for more details.  You should have received a copy of the
Packit Service 21c75c
# GNU General Public License along with this program; if not, write to the
Packit Service 21c75c
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit Service 21c75c
# 02110-1301, USA.  Any Red Hat trademarks that are incorporated in the
Packit Service 21c75c
# source code or documentation are not subject to the GNU General Public
Packit Service 21c75c
# License and may only be used or replicated with the express permission of
Packit Service 21c75c
# Red Hat, Inc.
Packit Service 21c75c
#
Packit Service 21c75c
Packit Service 21c75c
from __future__ import absolute_import
Packit Service 21c75c
from __future__ import unicode_literals
Packit Service 21c75c
Packit Service 21c75c
import os
Packit Service 21c75c
import shutil
Packit Service 21c75c
import tempfile
Packit Service 21c75c
import unittest
Packit Service 21c75c
Packit Service 21c75c
import libdnf
Packit Service 21c75c
Packit Service 21c75c
import dnf.conf
Packit Service 21c75c
import dnf.base
Packit Service 21c75c
Packit Service 21c75c
TOP_DIR = os.path.abspath(os.path.dirname(__file__))
Packit Service 21c75c
REPOS_DIR = os.path.join(TOP_DIR, "modules/modules")
Packit Service 21c75c
Packit Service 21c75c
# with profile
Packit Service 21c75c
MODULE_NSVAP = "module-name:stream:1::x86_64/profile"
Packit Service 21c75c
MODULE_NSVP = "module-name:stream:1/profile"
Packit Service 21c75c
MODULE_NSAP = "module-name:stream::x86_64/profile"
Packit Service 21c75c
MODULE_NSP = "module-name:stream/profile"
Packit Service 21c75c
MODULE_NP = "module-name/profile"
Packit Service 21c75c
MODULE_NAP = "module-name::x86_64/profile"
Packit Service 21c75c
Packit Service 21c75c
# without profile
Packit Service 21c75c
MODULE_NSVA = "module-name:stream:1::x86_64"
Packit Service 21c75c
MODULE_NSV = "module-name:stream:1"
Packit Service 21c75c
MODULE_NSA = "module-name:stream::x86_64"
Packit Service 21c75c
MODULE_NS = "module-name:stream"
Packit Service 21c75c
MODULE_N = "module-name"
Packit Service 21c75c
MODULE_NA = "module-name::x86_64"
Packit Service 21c75c
Packit Service 21c75c
Packit Service 21c75c
class ModuleTest(unittest.TestCase):
Packit Service 21c75c
    def assertInstalls(self, nevras):
Packit Service 21c75c
        expected = sorted(set(nevras))
Packit Service 21c75c
        actual = sorted(set([str(i) for i in self.base._goal.list_installs()]))
Packit Service 21c75c
        self.assertEqual(expected, actual)
Packit Service 21c75c
Packit Service 21c75c
    def setUp(self):
Packit Service 21c75c
        self.tmpdir = tempfile.mkdtemp(prefix="dnf_test_")
Packit Service 21c75c
        self.conf = dnf.conf.MainConf()
Packit Service 21c75c
        self.conf.cachedir = os.path.join(self.tmpdir, "cache")
Packit Service 21c75c
        self.conf.installroot = os.path.join(TOP_DIR, "modules")
Packit Service 21c75c
        self.conf.persistdir = os.path.join(self.conf.installroot, self.conf.persistdir.lstrip("/"))
Packit Service 21c75c
        self.conf.substitutions["arch"] = "x86_64"
Packit Service 21c75c
        self.conf.substitutions["basearch"] = dnf.rpm.basearch(self.conf.substitutions["arch"])
Packit Service 21c75c
        self.conf.assumeyes = True
Packit Service 21c75c
        self.base = dnf.Base(conf=self.conf)
Packit Service 21c75c
        self.module_base = dnf.module.module_base.ModuleBase(self.base)
Packit Service 21c75c
Packit Service 21c75c
        self._add_module_repo("_all")
Packit Service 21c75c
        self.base.fill_sack(load_system_repo=False)
Packit Service 21c75c
Packit Service 21c75c
    def tearDown(self):
Packit Service 21c75c
        shutil.rmtree(self.tmpdir)
Packit Service 21c75c
Packit Service 21c75c
    def _add_module_repo(self, repo_id, modules=True):
Packit Service 21c75c
        url = "file://" + os.path.join(REPOS_DIR, repo_id, self.conf.substitutions["arch"])
Packit Service 21c75c
        repo = self.base.repos.add_new_repo(repo_id, self.base.conf, baseurl=[url], modules=modules)
Packit Service 21c75c
        return repo
Packit Service 21c75c
Packit Service 21c75c
    # dnf module enable
Packit Service 21c75c
Packit Service 21c75c
    def test_enable_name(self):
Packit Service 21c75c
        # use default stream
Packit Service 21c75c
        self.module_base.enable(["httpd"])
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getModuleState("httpd"),
Packit Service 21c75c
                         libdnf.module.ModulePackageContainer.ModuleState_ENABLED)
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getEnabledStream("httpd"), "2.4")
Packit Service 21c75c
Packit Service 21c75c
    def test_enable_name_stream(self):
Packit Service 21c75c
        self.module_base.enable(["httpd:2.4"])
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getModuleState("httpd"),
Packit Service 21c75c
                         libdnf.module.ModulePackageContainer.ModuleState_ENABLED)
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getEnabledStream("httpd"), "2.4")
Packit Service 21c75c
Packit Service 21c75c
        # also enable base-runtime; it's a dependency that's used in other tests
Packit Service 21c75c
        self.module_base.enable(["base-runtime:f26"])
Packit Service 21c75c
Packit Service 21c75c
    def test_enable_pkgspec(self):
Packit Service 21c75c
        self.module_base.enable(["httpd:2.4:1/foo"])
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getModuleState("httpd"),
Packit Service 21c75c
                         libdnf.module.ModulePackageContainer.ModuleState_ENABLED)
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getEnabledStream("httpd"), "2.4")
Packit Service 21c75c
Packit Service 21c75c
    def test_enable_invalid(self):
Packit Service 21c75c
        with self.assertRaises(dnf.exceptions.Error):
Packit Service 21c75c
            self.module_base.enable(["httpd:invalid"])
Packit Service 21c75c
Packit Service 21c75c
    def test_enable_different_stream(self):
Packit Service 21c75c
        self.module_base.enable(["httpd:2.4"])
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getModuleState("httpd"),
Packit Service 21c75c
                         libdnf.module.ModulePackageContainer.ModuleState_ENABLED)
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getEnabledStream("httpd"), "2.4")
Packit Service 21c75c
Packit Service 21c75c
        self.module_base.enable(["httpd:2.2"])
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getModuleState("httpd"),
Packit Service 21c75c
                         libdnf.module.ModulePackageContainer.ModuleState_ENABLED)
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getEnabledStream("httpd"), "2.2")
Packit Service 21c75c
Packit Service 21c75c
    def test_enable_different_stream_missing_profile(self):
Packit Service 21c75c
        pass
Packit Service 21c75c
Packit Service 21c75c
    # dnf module disable
Packit Service 21c75c
Packit Service 21c75c
    def test_disable_name(self):
Packit Service 21c75c
        self.module_base.enable(["httpd:2.4"])
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getModuleState("httpd"),
Packit Service 21c75c
                         libdnf.module.ModulePackageContainer.ModuleState_ENABLED)
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getEnabledStream("httpd"), "2.4")
Packit Service 21c75c
Packit Service 21c75c
        self.module_base.disable(["httpd"])
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getModuleState("httpd"),
Packit Service 21c75c
                         libdnf.module.ModulePackageContainer.ModuleState_DISABLED)
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getEnabledStream("httpd"), "")
Packit Service 21c75c
Packit Service 21c75c
    def test_disable_name_stream(self):
Packit Service 21c75c
        # It should disable whole module not only stream (strem = "")
Packit Service 21c75c
        self.module_base.enable(["httpd:2.4"])
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getModuleState("httpd"),
Packit Service 21c75c
                         libdnf.module.ModulePackageContainer.ModuleState_ENABLED)
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getEnabledStream("httpd"), "2.4")
Packit Service 21c75c
Packit Service 21c75c
        self.module_base.disable(["httpd:2.4"])
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getModuleState("httpd"),
Packit Service 21c75c
                         libdnf.module.ModulePackageContainer.ModuleState_DISABLED)
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getEnabledStream("httpd"), "")
Packit Service 21c75c
Packit Service 21c75c
    def test_disable_pkgspec(self):
Packit Service 21c75c
        # It should disable whole module not only profile (strem = "")
Packit Service 21c75c
        self.module_base.enable(["httpd:2.4"])
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getModuleState("httpd"),
Packit Service 21c75c
                         libdnf.module.ModulePackageContainer.ModuleState_ENABLED)
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getEnabledStream("httpd"), "2.4")
Packit Service 21c75c
Packit Service 21c75c
        self.module_base.disable(["httpd:2.4:1/foo"])
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getModuleState("httpd"),
Packit Service 21c75c
                         libdnf.module.ModulePackageContainer.ModuleState_DISABLED)
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getEnabledStream("httpd"), "")
Packit Service 21c75c
Packit Service 21c75c
    def test_disable_invalid(self):
Packit Service 21c75c
        self.module_base.enable(["httpd:2.4"])
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getModuleState("httpd"),
Packit Service 21c75c
                         libdnf.module.ModulePackageContainer.ModuleState_ENABLED)
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getEnabledStream("httpd"), "2.4")
Packit Service 21c75c
        with self.assertRaises(dnf.exceptions.Error):
Packit Service 21c75c
            self.module_base.disable(["httpd:invalid"])
Packit Service 21c75c
Packit Service 21c75c
    def test_info_name(self):
Packit Service 21c75c
        pass
Packit Service 21c75c
Packit Service 21c75c
    def test_info_name_stream(self):
Packit Service 21c75c
        pass
Packit Service 21c75c
Packit Service 21c75c
    def test_info_pkgspec(self):
Packit Service 21c75c
        pass
Packit Service 21c75c
Packit Service 21c75c
    # dnf module list
Packit Service 21c75c
Packit Service 21c75c
    def test_list_installed(self):
Packit Service 21c75c
        # install
Packit Service 21c75c
        self.module_base.install(["base-runtime"])
Packit Service 21c75c
Packit Service 21c75c
        # check module conf
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getModuleState("base-runtime"),
Packit Service 21c75c
                         libdnf.module.ModulePackageContainer.ModuleState_ENABLED)
Packit Service 21c75c
        self.assertEqual(self.base._moduleContainer.getEnabledStream("base-runtime"), "f26")
Packit Service 21c75c
        self.assertEqual(list(self.base._moduleContainer.getInstalledProfiles("base-runtime")),
Packit Service 21c75c
                         ["minimal"])
Packit Service 21c75c
Packit Service 21c75c
    # dnf module install / dnf install @
Packit Service 21c75c
Packit Service 21c75c
    def test_install_profile_latest(self):
Packit Service 21c75c
        self.test_enable_name_stream()
Packit Service 21c75c
        self.module_base.install(["httpd/default"])
Packit Service 21c75c
        self.base.resolve()
Packit Service 21c75c
        expected = [
Packit Service 21c75c
            "basesystem-11-3.noarch",
Packit Service 21c75c
            "filesystem-3.2-40.x86_64",
Packit Service 21c75c
            "glibc-2.25.90-2.x86_64",
Packit Service 21c75c
            "glibc-common-2.25.90-2.x86_64",
Packit Service 21c75c
            "httpd-2.4.25-8.x86_64",
Packit Service 21c75c
            "libnghttp2-1.21.1-1.x86_64",  # expected behaviour, non-modular rpm pulled in
Packit Service 21c75c
        ]
Packit Service 21c75c
        self.assertInstalls(expected)
Packit Service 21c75c
Packit Service 21c75c
    def test_install_profile(self):
Packit Service 21c75c
        self.test_enable_name_stream()
Packit Service 21c75c
        self.module_base.install(["httpd:2.4:1/default"])
Packit Service 21c75c
        self.base.resolve()
Packit Service 21c75c
        expected = [
Packit Service 21c75c
            "basesystem-11-3.noarch",
Packit Service 21c75c
            "filesystem-3.2-40.x86_64",
Packit Service 21c75c
            "glibc-2.25.90-2.x86_64",
Packit Service 21c75c
            "glibc-common-2.25.90-2.x86_64",
Packit Service 21c75c
            "httpd-2.4.25-7.x86_64",
Packit Service 21c75c
            "libnghttp2-1.21.1-1.x86_64",  # expected behaviour, non-modular rpm pulled in
Packit Service 21c75c
        ]
Packit Service 21c75c
        self.assertInstalls(expected)
Packit Service 21c75c
Packit Service 21c75c
    def test_install_two_profiles(self):
Packit Service 21c75c
        self.test_enable_name_stream()
Packit Service 21c75c
Packit Service 21c75c
        self.module_base.install(["httpd:2.4:1/default", "httpd:2.4:1/doc"])
Packit Service 21c75c
        self.base.resolve()
Packit Service 21c75c
        expected = [
Packit Service 21c75c
            "basesystem-11-3.noarch",
Packit Service 21c75c
            "filesystem-3.2-40.x86_64",
Packit Service 21c75c
            "glibc-2.25.90-2.x86_64",
Packit Service 21c75c
            "glibc-common-2.25.90-2.x86_64",
Packit Service 21c75c
            "httpd-2.4.25-7.x86_64",
Packit Service 21c75c
            "httpd-doc-2.4.25-7.x86_64",
Packit Service 21c75c
            "libnghttp2-1.21.1-1.x86_64",  # expected behaviour, non-modular rpm pulled in
Packit Service 21c75c
        ]
Packit Service 21c75c
        self.assertInstalls(expected)
Packit Service 21c75c
Packit Service 21c75c
    def test_install_two_profiles_different_versions(self):
Packit Service 21c75c
        self.test_enable_name_stream()
Packit Service 21c75c
        self.module_base.install(["httpd:2.4:2/default", "httpd:2.4:1/doc"])
Packit Service 21c75c
        self.base.resolve()
Packit Service 21c75c
        expected = [
Packit Service 21c75c
            "basesystem-11-3.noarch",
Packit Service 21c75c
            "filesystem-3.2-40.x86_64",
Packit Service 21c75c
            "glibc-2.25.90-2.x86_64",
Packit Service 21c75c
            "glibc-common-2.25.90-2.x86_64",
Packit Service 21c75c
            "httpd-2.4.25-8.x86_64",
Packit Service 21c75c
            "httpd-doc-2.4.25-8.x86_64",
Packit Service 21c75c
            "libnghttp2-1.21.1-1.x86_64",  # expected behaviour, non-modular rpm pulled in
Packit Service 21c75c
        ]
Packit Service 21c75c
        self.assertInstalls(expected)
Packit Service 21c75c
Packit Service 21c75c
    def test_install_profile_updated(self):
Packit Service 21c75c
        return
Packit Service 21c75c
        """
Packit Service 21c75c
        # install profile1 from an old module version
Packit Service 21c75c
        # then install profile2 from latest module version
Packit Service 21c75c
        # -> dnf forces upgrade profile1 to the latest module version
Packit Service 21c75c
        """
Packit Service 21c75c
Packit Service 21c75c
        self.test_install_profile()
Packit Service 21c75c
        self.module_base.install(["httpd:2.4:2/doc"])
Packit Service 21c75c
        self.base.resolve()
Packit Service 21c75c
        expected = [
Packit Service 21c75c
            "basesystem-11-3.noarch",
Packit Service 21c75c
            "filesystem-3.2-40.x86_64",
Packit Service 21c75c
            "glibc-2.25.90-2.x86_64",
Packit Service 21c75c
            "glibc-common-2.25.90-2.x86_64",
Packit Service 21c75c
            "httpd-2.4.25-8.x86_64",
Packit Service 21c75c
            "httpd-doc-2.4.25-8.x86_64",
Packit Service 21c75c
            "libnghttp2-1.21.1-1.x86_64",
Packit Service 21c75c
        ]
Packit Service 21c75c
        self.assertInstalls(expected)
Packit Service 21c75c
Packit Service 21c75c
    def test_install_deps_same_module_version(self):
Packit Service 21c75c
        pass
Packit Service 21c75c
Packit Service 21c75c
    def test_install_implicit_empty_default_profile(self):
Packit Service 21c75c
        # install module without a 'default' profile
Packit Service 21c75c
        # -> It should raise an error
Packit Service 21c75c
        self.assertRaises(dnf.exceptions.MarkingErrors, self.module_base.install, ["m4:1.4.18"])
Packit Service 21c75c
Packit Service 21c75c
    # dnf module upgrade / dnf upgrade @
Packit Service 21c75c
Packit Service 21c75c
    def test_upgrade(self):
Packit Service 21c75c
        pass
Packit Service 21c75c
Packit Service 21c75c
    def test_upgrade_lower_rpm_nevra(self):
Packit Service 21c75c
        pass
Packit Service 21c75c
Packit Service 21c75c
    def test_upgrade_lower_module_nsvap(self):
Packit Service 21c75c
        pass
Packit Service 21c75c
Packit Service 21c75c
    def test_upgrade_missing_profile(self):
Packit Service 21c75c
        pass
Packit Service 21c75c
Packit Service 21c75c
    # dnf module downgrade / dnf downgrade @
Packit Service 21c75c
Packit Service 21c75c
    def test_downgrade(self):
Packit Service 21c75c
        pass
Packit Service 21c75c
Packit Service 21c75c
    # dnf module remove / dnf remove @
Packit Service 21c75c
Packit Service 21c75c
    def test_remove(self):
Packit Service 21c75c
        pass
Packit Service 21c75c
Packit Service 21c75c
    def test_remove_shared_rpms(self):
Packit Service 21c75c
        # don't remove RPMs that are part of another installed module / module profile
Packit Service 21c75c
        # also don't remove RPMs that are required by user-installed RPMs
Packit Service 21c75c
        pass
Packit Service 21c75c
Packit Service 21c75c
    def test_remove_invalid(self):
Packit Service 21c75c
        pass
Packit Service 21c75c
Packit Service 21c75c
    def test_bare_rpms_filtering(self):
Packit Service 21c75c
        """
Packit Service 21c75c
        Test hybrid repos where RPMs of the same name (or Provides)
Packit Service 21c75c
        can be both modular and bare (non-modular).
Packit Service 21c75c
        """
Packit Service 21c75c
Packit Service 21c75c
        # no match with modular RPM $name -> keep
Packit Service 21c75c
        q = self.base.sack.query().filter(nevra="grub2-2.02-0.40.x86_64")
Packit Service 21c75c
        self.assertEqual(len(q), 1)
Packit Service 21c75c
Packit Service 21c75c
        # $name matches with modular RPM $name -> exclude
Packit Service 21c75c
        q = self.base.sack.query().filter(nevra="httpd-2.2.10-1.x86_64")
Packit Service 21c75c
        self.assertEqual(len(q), 0)
Packit Service 21c75c
Packit Service 21c75c
        # Provides: $name matches with modular RPM $name -> exclude
Packit Service 21c75c
        q = self.base.sack.query().filter(nevra="httpd-provides-name-3.0-1.x86_64")
Packit Service 21c75c
        self.assertEqual(len(q), 0)
Packit Service 21c75c
Packit Service 21c75c
        # Provides: $name = ... matches with modular RPM $name -> exclude
Packit Service 21c75c
        q = self.base.sack.query().filter(nevra="httpd-provides-name-version-release-3.0-1.x86_64")
Packit Service 21c75c
        self.assertEqual(len(q), 0)