Blame tests/test_modules.py

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