|
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)
|