Blame tests/utils_test.py

Packit 2ba279
import unittest
Packit 2ba279
import re
Packit 2ba279
import os
Packit 2ba279
import overrides_hack
Packit Service 53eac1
from utils import fake_utils, create_sparse_tempfile, create_lio_device, delete_lio_device, run_command, TestTags, tag_test
Packit 2ba279
Packit 2ba279
from gi.repository import BlockDev, GLib
Packit 2ba279
Packit 2ba279
Packit 2ba279
class UtilsTestCase(unittest.TestCase):
Packit 2ba279
Packit 2ba279
    requested_plugins = []
Packit 2ba279
Packit 2ba279
    @classmethod
Packit 2ba279
    def setUpClass(cls):
Packit 2ba279
        if not BlockDev.is_initialized():
Packit 2ba279
            BlockDev.init(cls.requested_plugins, None)
Packit 2ba279
        else:
Packit 2ba279
            BlockDev.reinit(cls.requested_plugins, True, None)
Packit 2ba279
Packit 2ba279
class UtilsExecProgressTest(UtilsTestCase):
Packit 2ba279
    log = []
Packit 2ba279
Packit 2ba279
    def my_progress_func(self, task, status, completion, msg):
Packit 2ba279
        self.assertTrue(isinstance(completion, int))
Packit 2ba279
        self.log.append(completion)
Packit 2ba279
Packit 2ba279
    @tag_test(TestTags.NOSTORAGE, TestTags.CORE)
Packit 2ba279
    def test_initialization(self):
Packit 2ba279
        """ Verify that progress report can (de)initialized"""
Packit 2ba279
Packit 2ba279
        succ = BlockDev.utils_prog_reporting_initialized()
Packit 2ba279
        self.assertFalse(succ)
Packit 2ba279
Packit 2ba279
        succ = BlockDev.utils_init_prog_reporting(self.my_progress_func)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
Packit 2ba279
        succ = BlockDev.utils_prog_reporting_initialized()
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
Packit 2ba279
        succ = BlockDev.utils_init_prog_reporting(None)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
Packit 2ba279
        succ = BlockDev.utils_prog_reporting_initialized()
Packit 2ba279
        self.assertFalse(succ)
Packit 2ba279
Packit 2ba279
Packit 2ba279
class UtilsExecLoggingTest(UtilsTestCase):
Packit 2ba279
    log = ""
Packit 2ba279
Packit 2ba279
    def my_log_func(self, level, msg):
Packit 2ba279
        # not much to verify here
Packit 2ba279
        self.assertTrue(isinstance(level, int))
Packit 2ba279
        self.assertTrue(isinstance(msg, str))
Packit 2ba279
Packit 2ba279
        self.log += msg + "\n"
Packit 2ba279
Packit 2ba279
    @tag_test(TestTags.NOSTORAGE, TestTags.CORE)
Packit 2ba279
    def test_logging(self):
Packit 2ba279
        """Verify that setting up and using exec logging works as expected"""
Packit 2ba279
Packit 2ba279
        succ = BlockDev.utils_init_logging(self.my_log_func)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
Packit 2ba279
        succ = BlockDev.utils_exec_and_report_error(["true"])
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
Packit 2ba279
        succ, out = BlockDev.utils_exec_and_capture_output(["echo", "hi"])
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.assertEqual(out, "hi\n")
Packit 2ba279
Packit 2ba279
        match = re.search(r'Running \[(\d+)\] true', self.log)
Packit 2ba279
        self.assertIsNot(match, None)
Packit 2ba279
        task_id1 = match.group(1)
Packit 2ba279
        match = re.search(r'Running \[(\d+)\] echo hi', self.log)
Packit 2ba279
        self.assertIsNot(match, None)
Packit 2ba279
        task_id2 = match.group(1)
Packit 2ba279
Packit 2ba279
        self.assertIn("...done [%s] (exit code: 0)" % task_id1, self.log)
Packit 2ba279
        self.assertIn("stdout[%s]:" % task_id1, self.log)
Packit 2ba279
        self.assertIn("stderr[%s]:" % task_id1, self.log)
Packit 2ba279
Packit 2ba279
        self.assertIn("stdout[%s]: hi" % task_id2, self.log)
Packit 2ba279
        self.assertIn("stderr[%s]:" % task_id2, self.log)
Packit 2ba279
        self.assertIn("...done [%s] (exit code: 0)" % task_id2, self.log)
Packit 2ba279
Packit 2ba279
        # reset logging -> nothing more should appear in the log
Packit 2ba279
        succ = BlockDev.utils_init_logging(None)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
Packit 2ba279
        old_log = self.log
Packit 2ba279
        succ = BlockDev.utils_exec_and_report_error(["true"])
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.assertEqual(old_log, self.log)
Packit 2ba279
Packit 2ba279
    @tag_test(TestTags.NOSTORAGE, TestTags.CORE)
Packit 2ba279
    def test_version_cmp(self):
Packit 2ba279
        """Verify that version comparison works as expected"""
Packit 2ba279
Packit 2ba279
        with self.assertRaises(GLib.GError):
Packit 2ba279
            BlockDev.utils_version_cmp("malformed", "1.0")
Packit 2ba279
        with self.assertRaises(GLib.GError):
Packit 2ba279
            BlockDev.utils_version_cmp("1.0", "malformed")
Packit 2ba279
        with self.assertRaises(GLib.GError):
Packit 2ba279
            BlockDev.utils_version_cmp("1,0", "1.0")
Packit 2ba279
        with self.assertRaises(GLib.GError):
Packit 2ba279
            BlockDev.utils_version_cmp("1.0", "1,0")
Packit 2ba279
        with self.assertRaises(GLib.GError):
Packit 2ba279
            BlockDev.utils_version_cmp("1.x.0", "1.0")
Packit 2ba279
        with self.assertRaises(GLib.GError):
Packit 2ba279
            BlockDev.utils_version_cmp("1.0", "1.x.0")
Packit 2ba279
Packit 2ba279
        self.assertEqual(BlockDev.utils_version_cmp("1", "1"), 0)
Packit 2ba279
        self.assertEqual(BlockDev.utils_version_cmp("1.0", "1.0"), 0)
Packit 2ba279
        self.assertEqual(BlockDev.utils_version_cmp("1.0.1", "1.0.1"), 0)
Packit 2ba279
        self.assertEqual(BlockDev.utils_version_cmp("1.0.1-1", "1.0.1-1"), 0)
Packit 2ba279
Packit 2ba279
        self.assertEqual(BlockDev.utils_version_cmp("1.1", "1"), 1)
Packit 2ba279
        self.assertEqual(BlockDev.utils_version_cmp("1.1", "1.0"), 1)
Packit 2ba279
        self.assertEqual(BlockDev.utils_version_cmp("1.1.1", "1.1"), 1)
Packit 2ba279
        self.assertEqual(BlockDev.utils_version_cmp("1.1.1-1", "1.1.1"), 1)
Packit 2ba279
        self.assertEqual(BlockDev.utils_version_cmp("1.2", "1.1.2"), 1)
Packit 2ba279
Packit 2ba279
        self.assertEqual(BlockDev.utils_version_cmp("1", "1.1"), -1)
Packit 2ba279
        self.assertEqual(BlockDev.utils_version_cmp("1.0", "1.1"), -1)
Packit 2ba279
        self.assertEqual(BlockDev.utils_version_cmp("1.1", "1.1.1"), -1)
Packit 2ba279
        self.assertEqual(BlockDev.utils_version_cmp("1.1.1", "1.1.1-1"), -1)
Packit 2ba279
        self.assertEqual(BlockDev.utils_version_cmp("1.1.2", "1.2"), -1)
Packit 2ba279
Packit 2ba279
    @tag_test(TestTags.NOSTORAGE, TestTags.CORE)
Packit 2ba279
    def test_util_version(self):
Packit 2ba279
        """Verify that checking utility availability works as expected"""
Packit 2ba279
Packit 2ba279
        with self.assertRaises(GLib.GError):
Packit 2ba279
            BlockDev.utils_check_util_version("libblockdev-fake-util", None, None, None)
Packit 2ba279
Packit 2ba279
        with fake_utils("tests/utils_fake_util/"):
Packit 2ba279
            with self.assertRaises(GLib.GError):
Packit 2ba279
                # with no argument, the output is "Version: 1.2" which is not a
Packit 2ba279
                # valid version without regexp
Packit 2ba279
                BlockDev.utils_check_util_version("libblockdev-fake-util", "1.3", "", None)
Packit 2ba279
Packit 2ba279
            with self.assertRaises(GLib.GError):
Packit 2ba279
                # libblockdev-fake-util with no arguments reports 1.2 which is too low
Packit 2ba279
                BlockDev.utils_check_util_version("libblockdev-fake-util", "1.3", "", "Version:\\s(.*)")
Packit 2ba279
Packit 2ba279
            # just what we require
Packit 2ba279
            self.assertTrue(BlockDev.utils_check_util_version("libblockdev-fake-util", "1.2", "", "Version:\\s(.*)"))
Packit 2ba279
Packit 2ba279
            with self.assertRaises(GLib.GError):
Packit 2ba279
                # libblockdev-fake-util with "version" reports 1.1 which is too low
Packit 2ba279
                BlockDev.utils_check_util_version("libblockdev-fake-util", "1.2", "version", "Version:\\s(.*)")
Packit 2ba279
Packit 2ba279
            # just what we require
Packit 2ba279
            self.assertTrue(BlockDev.utils_check_util_version("libblockdev-fake-util", "1.1", "version", "Version:\\s(.*)"))
Packit 2ba279
Packit 2ba279
            with self.assertRaises(GLib.GError):
Packit 2ba279
                # libblockdev-fake-util with "--version" reports 1.0 which is too low
Packit 2ba279
                BlockDev.utils_check_util_version("libblockdev-fake-util", "1.1", "--version", None)
Packit 2ba279
Packit 2ba279
            # just what we require
Packit 2ba279
            self.assertTrue(BlockDev.utils_check_util_version("libblockdev-fake-util", "1.0", "--version", None))
Packit 2ba279
Packit 2ba279
            # lower required version
Packit 2ba279
            self.assertTrue(BlockDev.utils_check_util_version("libblockdev-fake-util", "0.9", "--version", None))
Packit 2ba279
Packit 2ba279
            # version on stderr
Packit 2ba279
            self.assertTrue(BlockDev.utils_check_util_version("libblockdev-fake-util-stderr", "1.1", "version", "Version:\\s(.*)"))
Packit 2ba279
Packit 2ba279
            # exit code != 0
Packit 2ba279
            self.assertTrue(BlockDev.utils_check_util_version("libblockdev-fake-util-fail", "1.1", "version", "Version:\\s(.*)"))
Packit 2ba279
Packit Service 924910
Packit 2ba279
class UtilsDevUtilsTestCase(UtilsTestCase):
Packit 2ba279
    @tag_test(TestTags.NOSTORAGE, TestTags.CORE)
Packit 2ba279
    def test_resolve_device(self):
Packit 2ba279
        """Verify that resolving device spec works as expected"""
Packit 2ba279
Packit 2ba279
        with self.assertRaises(GLib.GError):
Packit 2ba279
            BlockDev.utils_resolve_device("no_such_device")
Packit 2ba279
Packit 2ba279
        dev = "/dev/libblockdev-test-dev"
Packit 2ba279
        with open(dev, "w"):
Packit 2ba279
            pass
Packit 2ba279
        self.addCleanup(os.unlink, dev)
Packit 2ba279
Packit 2ba279
        # full path, no symlink, should just return the same
Packit 2ba279
        self.assertEqual(BlockDev.utils_resolve_device(dev), dev)
Packit 2ba279
Packit 2ba279
        # just the name of the device, should return the full path
Packit 2ba279
        self.assertEqual(BlockDev.utils_resolve_device(dev[5:]), dev)
Packit 2ba279
Packit 2ba279
        dev_dir = "/dev/libblockdev-test-dir"
Packit 2ba279
        os.mkdir(dev_dir)
Packit 2ba279
        self.addCleanup(os.rmdir, dev_dir)
Packit 2ba279
Packit 2ba279
        dev_link = dev_dir + "/test-dev-link"
Packit 2ba279
        os.symlink("../" + dev[5:], dev_link)
Packit 2ba279
        self.addCleanup(os.unlink, dev_link)
Packit 2ba279
Packit 2ba279
        # should resolve the symlink
Packit 2ba279
        self.assertEqual(BlockDev.utils_resolve_device(dev_link), dev)
Packit 2ba279
Packit 2ba279
        # should resolve the symlink even without the "/dev" prefix
Packit 2ba279
        self.assertEqual(BlockDev.utils_resolve_device(dev_link[5:]), dev)
Packit 2ba279
Packit 2ba279
Packit 2ba279
class UtilsDevUtilsSymlinksTestCase(UtilsTestCase):
Packit 2ba279
    def setUp(self):
Packit 2ba279
        self.addCleanup(self._clean_up)
Packit 2ba279
        self.dev_file = create_sparse_tempfile("lvm_test", 1024**3)
Packit 2ba279
        try:
Packit 2ba279
            self.loop_dev = create_lio_device(self.dev_file)
Packit 2ba279
        except RuntimeError as e:
Packit 2ba279
            raise RuntimeError("Failed to setup loop device for testing: %s" % e)
Packit 2ba279
Packit 2ba279
    def _clean_up(self):
Packit 2ba279
        try:
Packit 2ba279
            delete_lio_device(self.loop_dev)
Packit 2ba279
        except RuntimeError:
Packit 2ba279
            # just move on, we can do no better here
Packit 2ba279
            pass
Packit 2ba279
        os.unlink(self.dev_file)
Packit 2ba279
Packit 2ba279
    @tag_test(TestTags.CORE)
Packit 2ba279
    def test_get_device_symlinks(self):
Packit 2ba279
        """Verify that getting device symlinks works as expected"""
Packit 2ba279
Packit 2ba279
        with self.assertRaises(GLib.GError):
Packit 2ba279
            BlockDev.utils_get_device_symlinks("no_such_device")
Packit 2ba279
Packit 2ba279
        symlinks = BlockDev.utils_get_device_symlinks(self.loop_dev)
Packit 2ba279
        # there should be at least 2 symlinks for something like "/dev/sda" (in /dev/disk/by-id/)
Packit 2ba279
        self.assertGreaterEqual(len(symlinks), 2)
Packit 2ba279
Packit 2ba279
        symlinks = BlockDev.utils_get_device_symlinks(self.loop_dev[5:])
Packit 2ba279
        self.assertGreaterEqual(len(symlinks), 2)
Packit 2ba279
Packit 2ba279
        # create an LV to get a device with more symlinks
Packit 2ba279
        ret, _out, _err = run_command ("pvcreate %s" % self.loop_dev)
Packit 2ba279
        self.assertEqual(ret, 0)
Packit 2ba279
        self.addCleanup(run_command, "pvremove %s" % self.loop_dev)
Packit 2ba279
Packit 2ba279
        ret, _out, _err = run_command ("vgcreate utilsTestVG %s" % self.loop_dev)
Packit 2ba279
        self.assertEqual(ret, 0)
Packit 2ba279
        self.addCleanup(run_command, "vgremove -y utilsTestVG")
Packit 2ba279
Packit 2ba279
        ret, _out, _err = run_command ("lvcreate -n utilsTestLV -L 12M utilsTestVG")
Packit 2ba279
        self.assertEqual(ret, 0)
Packit 2ba279
        self.addCleanup(run_command, "lvremove -y utilsTestVG/utilsTestLV")
Packit 2ba279
Packit 2ba279
        symlinks = BlockDev.utils_get_device_symlinks("utilsTestVG/utilsTestLV")
Packit 2ba279
        # there should be at least 4 symlinks for an LV
Packit 2ba279
        self.assertGreaterEqual(len(symlinks), 4)
Packit 2ba279
Packit 2ba279
Packit 2ba279
class UtilsLinuxKernelVersionTest(UtilsTestCase):
Packit 2ba279
    @tag_test(TestTags.NOSTORAGE, TestTags.CORE)
Packit 2ba279
    def test_initialization(self):
Packit 2ba279
        """ Test Linux kernel version detection"""
Packit 2ba279
Packit 2ba279
        ver = BlockDev.utils_get_linux_version()
Packit 2ba279
        self.assertGreater(ver.major, 0)
Packit 2ba279
Packit 2ba279
        ret = BlockDev.utils_check_linux_version(ver.major, ver.minor, ver.micro)
Packit 2ba279
        self.assertEqual(ret, 0)
Packit 2ba279
Packit 2ba279
        ret = BlockDev.utils_check_linux_version(ver.major - 1, ver.minor, ver.micro)
Packit 2ba279
        self.assertGreater(ret, 0)
Packit 2ba279
Packit 2ba279
        ret = BlockDev.utils_check_linux_version(ver.major + 1, ver.minor, ver.micro)
Packit 2ba279
        self.assertLess(ret, 0)
Packit 2ba279
Packit 2ba279
        ver2 = BlockDev.utils_get_linux_version()
Packit 2ba279
        self.assertEqual(ver.major, ver2.major)
Packit 2ba279
        self.assertEqual(ver.minor, ver2.minor)
Packit 2ba279
        self.assertEqual(ver.micro, ver2.micro)