Blame tests/kbd_test.py

Packit 2ba279
import unittest
Packit 2ba279
import os
Packit 2ba279
import re
Packit 2ba279
import time
Packit 2ba279
from contextlib import contextmanager
Packit 2ba279
from distutils.version import LooseVersion
Packit 2ba279
from distutils.spawn import find_executable
Packit 2ba279
from utils import create_sparse_tempfile, create_lio_device, delete_lio_device, wipe_all, fake_path, read_file, TestTags, tag_test
Packit 2ba279
from bytesize import bytesize
Packit 2ba279
import overrides_hack
Packit 2ba279
Packit 2ba279
from gi.repository import BlockDev, GLib
Packit 2ba279
Packit 2ba279
Packit 2ba279
def _can_load_zram():
Packit 2ba279
    """Test if we can load the zram module"""
Packit 2ba279
Packit 2ba279
    if os.system("lsmod|grep zram >/dev/null") != 0:
Packit 2ba279
        # not loaded
Packit 2ba279
        return True
Packit 2ba279
    elif os.system("rmmod zram") == 0:
Packit 2ba279
        # successfully unloaded
Packit 2ba279
        return True
Packit 2ba279
    else:
Packit 2ba279
        # loaded and failed to unload
Packit 2ba279
        return False
Packit 2ba279
Packit 2ba279
@contextmanager
Packit 2ba279
def _track_module_load(test_case, mod_name, loaded_attr):
Packit 2ba279
    setattr(test_case, loaded_attr, os.system("lsmod|grep %s > /dev/null" % mod_name) == 0)
Packit 2ba279
    try:
Packit 2ba279
        yield
Packit 2ba279
    finally:
Packit 2ba279
        setattr(test_case, loaded_attr, os.system("lsmod|grep %s > /dev/null" % mod_name) == 0)
Packit 2ba279
Packit 2ba279
def _wait_for_bcache_setup(bcache_dev):
Packit 2ba279
    i = 0
Packit 2ba279
    cache_dir = "/sys/block/%s/bcache/cache" % bcache_dev
Packit 2ba279
    while not os.access(cache_dir, os.R_OK):
Packit 2ba279
        time.sleep(1)
Packit 2ba279
        i += 1
Packit 2ba279
        if i >= 30:
Packit 2ba279
            print("WARNING: Giving up waiting for bcache setup!!!")
Packit 2ba279
            break
Packit 2ba279
Packit 2ba279
class KbdZRAMTestCase(unittest.TestCase):
Packit 2ba279
Packit 2ba279
    requested_plugins = BlockDev.plugin_specs_from_names(("kbd", "swap"))
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
    def setUp(self):
Packit 2ba279
        self.addCleanup(self._clean_up)
Packit 2ba279
        self._loaded_zram_module = False
Packit 2ba279
Packit 2ba279
    def _clean_up(self):
Packit 2ba279
        # make sure we unload the module if we loaded it
Packit 2ba279
        if self._loaded_zram_module:
Packit 2ba279
            os.system("rmmod zram")
Packit 2ba279
Packit 2ba279
class KbdZRAMDevicesTestCase(KbdZRAMTestCase):
Packit 2ba279
    @unittest.skipUnless(_can_load_zram(), "cannot load the 'zram' module")
Packit 2ba279
    @tag_test(TestTags.SLOW)
Packit 2ba279
    def test_create_destroy_devices(self):
Packit 2ba279
        # the easiest case
Packit 2ba279
        with _track_module_load(self, "zram", "_loaded_zram_module"):
Packit 2ba279
            self.assertTrue(BlockDev.kbd_zram_create_devices(2, [10 * 1024**2, 10 * 1024**2], [1, 2]))
Packit 2ba279
            time.sleep(1)
Packit 2ba279
            self.assertTrue(BlockDev.kbd_zram_destroy_devices())
Packit 2ba279
            time.sleep(1)
Packit 2ba279
Packit 2ba279
        # no nstreams specified
Packit 2ba279
        with _track_module_load(self, "zram", "_loaded_zram_module"):
Packit 2ba279
            self.assertTrue(BlockDev.kbd_zram_create_devices(2, [10 * 1024**2, 10 * 1024**2], None))
Packit 2ba279
            time.sleep(1)
Packit 2ba279
            self.assertTrue(BlockDev.kbd_zram_destroy_devices())
Packit 2ba279
            time.sleep(1)
Packit 2ba279
Packit 2ba279
        # with module pre-loaded, but unsed
Packit 2ba279
        self.assertEqual(os.system("modprobe zram num_devices=2"), 0)
Packit 2ba279
        time.sleep(1)
Packit 2ba279
        with _track_module_load(self, "zram", "_loaded_zram_module"):
Packit 2ba279
            self.assertTrue(BlockDev.kbd_zram_create_devices(2, [10 * 1024**2, 10 * 1024**2], [1, 1]))
Packit 2ba279
            time.sleep(1)
Packit 2ba279
            self.assertTrue(BlockDev.kbd_zram_destroy_devices())
Packit 2ba279
            time.sleep(1)
Packit 2ba279
Packit 2ba279
        # with module pre-loaded, and devices used (as active swaps)
Packit 2ba279
        self.assertEqual(os.system("modprobe zram num_devices=2"), 0)
Packit 2ba279
        self.assertEqual(os.system("echo 10M > /sys/class/block/zram0/disksize"), 0)
Packit 2ba279
        self.assertEqual(os.system("echo 10M > /sys/class/block/zram1/disksize"), 0)
Packit 2ba279
        time.sleep(1)
Packit 2ba279
        for zram_dev in ("/dev/zram0", "/dev/zram1"):
Packit 2ba279
            self.assertTrue(BlockDev.swap_mkswap(zram_dev, None))
Packit 2ba279
            self.assertTrue(BlockDev.swap_swapon(zram_dev, -1))
Packit 2ba279
        with _track_module_load(self, "zram", "_loaded_zram_module"):
Packit 2ba279
            with self.assertRaises(GLib.GError):
Packit 2ba279
                self.assertTrue(BlockDev.kbd_zram_create_devices(2, [10 * 1024**2, 10 * 1024**2], [1, 1]))
Packit 2ba279
            for zram_dev in ("/dev/zram0", "/dev/zram1"):
Packit 2ba279
                self.assertTrue(BlockDev.swap_swapoff(zram_dev))
Packit 2ba279
            self.assertEqual(os.system("rmmod zram"), 0)
Packit 2ba279
Packit 2ba279
            # should work just fine now
Packit 2ba279
            self.assertTrue(BlockDev.kbd_zram_create_devices(2, [10 * 1024**2, 10 * 1024**2], [1, 1]))
Packit 2ba279
            time.sleep(1)
Packit 2ba279
            self.assertTrue(BlockDev.kbd_zram_destroy_devices())
Packit 2ba279
            time.sleep(1)
Packit 2ba279
Packit 2ba279
    @unittest.skipUnless(_can_load_zram(), "cannot load the 'zram' module")
Packit 2ba279
    @tag_test(TestTags.SLOW)
Packit 2ba279
    def test_zram_add_remove_device(self):
Packit 2ba279
        """Verify that it is possible to add and remove a zram device"""
Packit 2ba279
Packit 2ba279
        # the easiest case
Packit 2ba279
        with _track_module_load(self, "zram", "_loaded_zram_module"):
Packit 2ba279
            succ, device = BlockDev.kbd_zram_add_device (10 * 1024**2, 4)
Packit 2ba279
            self.assertTrue(succ)
Packit 2ba279
            self.assertTrue(device.startswith("/dev/zram"))
Packit 2ba279
            time.sleep(5)
Packit 2ba279
            self.assertTrue(BlockDev.kbd_zram_remove_device(device))
Packit 2ba279
Packit 2ba279
        # no nstreams specified
Packit 2ba279
        with _track_module_load(self, "zram", "_loaded_zram_module"):
Packit 2ba279
            succ, device = BlockDev.kbd_zram_add_device (10 * 1024**2, 0)
Packit 2ba279
            self.assertTrue(succ)
Packit 2ba279
            self.assertTrue(device.startswith("/dev/zram"))
Packit 2ba279
            time.sleep(5)
Packit 2ba279
            self.assertTrue(BlockDev.kbd_zram_remove_device(device))
Packit 2ba279
Packit 2ba279
        # create two devices
Packit 2ba279
        with _track_module_load(self, "zram", "_loaded_zram_module"):
Packit 2ba279
            succ, device = BlockDev.kbd_zram_add_device (10 * 1024**2, 4)
Packit 2ba279
            self.assertTrue(succ)
Packit 2ba279
            self.assertTrue(device.startswith("/dev/zram"))
Packit 2ba279
Packit 2ba279
            succ, device2 = BlockDev.kbd_zram_add_device (10 * 1024**2, 4)
Packit 2ba279
            self.assertTrue(succ)
Packit 2ba279
            self.assertTrue(device2.startswith("/dev/zram"))
Packit 2ba279
Packit 2ba279
            time.sleep(5)
Packit 2ba279
            self.assertTrue(BlockDev.kbd_zram_remove_device(device))
Packit 2ba279
            self.assertTrue(BlockDev.kbd_zram_remove_device(device2))
Packit 2ba279
Packit 2ba279
        # mixture of multiple devices and a single device
Packit 2ba279
        with _track_module_load(self, "zram", "_loaded_zram_module"):
Packit 2ba279
            self.assertTrue(BlockDev.kbd_zram_create_devices(2, [10 * 1024**2, 10 * 1024**2], [1, 2]))
Packit 2ba279
            time.sleep(5)
Packit 2ba279
            succ, device = BlockDev.kbd_zram_add_device (10 * 1024**2, 4)
Packit 2ba279
            self.assertTrue(succ)
Packit 2ba279
            self.assertTrue(device.startswith("/dev/zram"))
Packit 2ba279
            time.sleep(5)
Packit 2ba279
            self.assertTrue(BlockDev.kbd_zram_destroy_devices())
Packit 2ba279
            time.sleep(5)
Packit 2ba279
Packit 2ba279
Packit 2ba279
class KbdZRAMStatsTestCase(KbdZRAMTestCase):
Packit 2ba279
    @unittest.skipUnless(_can_load_zram(), "cannot load the 'zram' module")
Packit 2ba279
    def test_zram_get_stats(self):
Packit 2ba279
        """Verify that it is possible to get stats for a zram device"""
Packit 2ba279
Packit 2ba279
        # location of some sysfs files we use is different since linux 4.11
Packit 2ba279
        kernel_version = os.uname()[2]
Packit 2ba279
        if LooseVersion(kernel_version) >= LooseVersion("4.11"):
Packit 2ba279
            self._zram_get_stats_new()
Packit 2ba279
        else:
Packit 2ba279
            self._zram_get_stats_old()
Packit 2ba279
Packit 2ba279
    def _zram_get_stats_new(self):
Packit 2ba279
        with _track_module_load(self, "zram", "_loaded_zram_module"):
Packit 2ba279
            self.assertTrue(BlockDev.kbd_zram_create_devices(1, [10 * 1024**2], [2]))
Packit 2ba279
            time.sleep(1)
Packit 2ba279
Packit 2ba279
        # XXX: this needs to get more complex/serious
Packit 2ba279
        stats = BlockDev.kbd_zram_get_stats("zram0")
Packit 2ba279
        self.assertTrue(stats)
Packit 2ba279
Packit 2ba279
        # /dev/zram0 should work too
Packit 2ba279
        stats = BlockDev.kbd_zram_get_stats("/dev/zram0")
Packit 2ba279
        self.assertTrue(stats)
Packit 2ba279
Packit 2ba279
        self.assertEqual(stats.disksize, 10 * 1024**2)
Packit 2ba279
        # XXX: 'max_comp_streams' is currently broken on rawhide
Packit 2ba279
        # https://bugzilla.redhat.com/show_bug.cgi?id=1352567
Packit 2ba279
        # self.assertEqual(stats.max_comp_streams, 2)
Packit 2ba279
        self.assertTrue(stats.comp_algorithm)
Packit 2ba279
Packit 2ba279
        # read 'num_reads' and 'num_writes' from '/sys/block/zram0/stat'
Packit 2ba279
        sys_stats = read_file("/sys/block/zram0/stat").strip().split()
Packit 2ba279
        self.assertGreaterEqual(len(sys_stats), 11)  # 15 stats since 4.19
Packit 2ba279
        num_reads = int(sys_stats[0])
Packit 2ba279
        num_writes = int(sys_stats[4])
Packit 2ba279
        self.assertEqual(stats.num_reads, num_reads)
Packit 2ba279
        self.assertEqual(stats.num_writes, num_writes)
Packit 2ba279
Packit 2ba279
        # read 'orig_data_size', 'compr_data_size', 'mem_used_total' and
Packit 2ba279
        # 'zero_pages' from '/sys/block/zram0/mm_stat'
Packit 2ba279
        sys_stats = read_file("/sys/block/zram0/mm_stat").strip().split()
Packit 2ba279
        self.assertGreaterEqual(len(sys_stats), 7)  # since 4.18 we have 8 stats
Packit 2ba279
        orig_data_size = int(sys_stats[0])
Packit 2ba279
        compr_data_size = int(sys_stats[1])
Packit 2ba279
        mem_used_total = int(sys_stats[2])
Packit 2ba279
        zero_pages = int(sys_stats[5])
Packit 2ba279
        self.assertEqual(stats.orig_data_size, orig_data_size)
Packit 2ba279
        self.assertEqual(stats.compr_data_size, compr_data_size)
Packit 2ba279
        self.assertEqual(stats.mem_used_total, mem_used_total)
Packit 2ba279
        self.assertEqual(stats.zero_pages, zero_pages)
Packit 2ba279
Packit 2ba279
        # read 'invalid_io' and 'num_writes' from '/sys/block/zram0/io_stat'
Packit 2ba279
        sys_stats = read_file("/sys/block/zram0/io_stat").strip().split()
Packit 2ba279
        self.assertEqual(len(sys_stats), 4)
Packit 2ba279
        invalid_io = int(sys_stats[2])
Packit 2ba279
        self.assertEqual(stats.invalid_io, invalid_io)
Packit 2ba279
Packit 2ba279
        with _track_module_load(self, "zram", "_loaded_zram_module"):
Packit 2ba279
            self.assertTrue(BlockDev.kbd_zram_destroy_devices())
Packit 2ba279
Packit 2ba279
    def _zram_get_stats_old(self):
Packit 2ba279
        with _track_module_load(self, "zram", "_loaded_zram_module"):
Packit 2ba279
            self.assertTrue(BlockDev.kbd_zram_create_devices(1, [10 * 1024**2], [2]))
Packit 2ba279
            time.sleep(1)
Packit 2ba279
Packit 2ba279
        stats = BlockDev.kbd_zram_get_stats("zram0")
Packit 2ba279
        self.assertTrue(stats)
Packit 2ba279
Packit 2ba279
        # /dev/zram0 should work too
Packit 2ba279
        stats = BlockDev.kbd_zram_get_stats("/dev/zram0")
Packit 2ba279
        self.assertTrue(stats)
Packit 2ba279
Packit 2ba279
        self.assertEqual(stats.disksize, 10 * 1024**2)
Packit 2ba279
        self.assertEqual(stats.max_comp_streams, 2)
Packit 2ba279
        self.assertTrue(stats.comp_algorithm)
Packit 2ba279
Packit 2ba279
        num_reads = int(read_file("/sys/block/zram0/num_reads").strip())
Packit 2ba279
        self.assertEqual(stats.num_reads, num_reads)
Packit 2ba279
        num_writes = int(read_file("/sys/block/zram0/num_writes").strip())
Packit 2ba279
        self.assertEqual(stats.num_writes, num_writes)
Packit 2ba279
Packit 2ba279
        orig_data_size = int(read_file("/sys/block/zram0/orig_data_size").strip())
Packit 2ba279
        self.assertEqual(stats.orig_data_size, orig_data_size)
Packit 2ba279
        compr_data_size = int(read_file("/sys/block/zram0/compr_data_size").strip())
Packit 2ba279
        self.assertEqual(stats.compr_data_size, compr_data_size)
Packit 2ba279
        mem_used_total = int(read_file("/sys/block/zram0/mem_used_total").strip())
Packit 2ba279
        self.assertEqual(stats.mem_used_total, mem_used_total)
Packit 2ba279
        zero_pages = int(read_file("/sys/block/zram0/zero_pages").strip())
Packit 2ba279
        self.assertEqual(stats.zero_pages, zero_pages)
Packit 2ba279
Packit 2ba279
        invalid_io = int(read_file("/sys/block/zram0/invalid_io").strip())
Packit 2ba279
        self.assertEqual(stats.invalid_io, invalid_io)
Packit 2ba279
Packit 2ba279
        with _track_module_load(self, "zram", "_loaded_zram_module"):
Packit 2ba279
            self.assertTrue(BlockDev.kbd_zram_destroy_devices())
Packit 2ba279
Packit 2ba279
class KbdBcacheNodevTestCase(unittest.TestCase):
Packit 2ba279
    # no setUp/tearDown methods needed
Packit 2ba279
    requested_plugins = BlockDev.plugin_specs_from_names(("kbd", "swap"))
Packit 2ba279
Packit 2ba279
    @classmethod
Packit 2ba279
    def setUpClass(cls):
Packit 2ba279
        if not find_executable("make-bcache"):
Packit 2ba279
            raise unittest.SkipTest("make-bcache executable not found in $PATH, skipping.")
Packit 2ba279
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
    @tag_test(TestTags.NOSTORAGE)
Packit 2ba279
    def test_bcache_mode_str_bijection(self):
Packit 2ba279
        """Verify that it's possible to transform between cache modes and their string representations"""
Packit 2ba279
Packit 2ba279
        mode_mapping = ((BlockDev.KBDBcacheMode.WRITETHROUGH, "writethrough"),
Packit 2ba279
                        (BlockDev.KBDBcacheMode.WRITEBACK, "writeback"),
Packit 2ba279
                        (BlockDev.KBDBcacheMode.WRITEAROUND, "writearound"),
Packit 2ba279
                        (BlockDev.KBDBcacheMode.NONE, "none"),
Packit 2ba279
                        (BlockDev.KBDBcacheMode.UNKNOWN, "unknown"),
Packit 2ba279
        )
Packit 2ba279
Packit 2ba279
        for (mode, mode_str) in mode_mapping:
Packit 2ba279
            self.assertEqual(mode, BlockDev.kbd_bcache_get_mode_from_str(mode_str))
Packit 2ba279
            self.assertEqual(mode_str, BlockDev.kbd_bcache_get_mode_str(mode))
Packit 2ba279
            self.assertEqual(mode_str, BlockDev.kbd_bcache_get_mode_str(BlockDev.kbd_bcache_get_mode_from_str(mode_str)))
Packit 2ba279
            self.assertEqual(mode, BlockDev.kbd_bcache_get_mode_from_str(BlockDev.kbd_bcache_get_mode_str(mode)))
Packit 2ba279
Packit 2ba279
class KbdBcacheTestCase(unittest.TestCase):
Packit 2ba279
    requested_plugins = BlockDev.plugin_specs_from_names(("kbd", "swap"))
Packit 2ba279
Packit 2ba279
    @classmethod
Packit 2ba279
    def setUpClass(cls):
Packit 2ba279
        if not find_executable("make-bcache"):
Packit 2ba279
            raise unittest.SkipTest("make-bcache executable not found in $PATH, skipping.")
Packit 2ba279
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
    def setUp(self):
Packit 2ba279
        self.addCleanup(self._clean_up)
Packit 2ba279
        self.dev_file = create_sparse_tempfile("lvm_test", 10 * 1024**3)
Packit 2ba279
        self.dev_file2 = create_sparse_tempfile("lvm_test", 10 * 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
        try:
Packit 2ba279
            self.loop_dev2 = create_lio_device(self.dev_file2)
Packit 2ba279
        except RuntimeError as e:
Packit 2ba279
            raise RuntimeError("Failed to setup loop device for testing: %s" % e)
Packit 2ba279
Packit 2ba279
        self.bcache_dev = None
Packit 2ba279
Packit 2ba279
    def _clean_up(self):
Packit 2ba279
        if self.bcache_dev:
Packit 2ba279
            try:
Packit 2ba279
                BlockDev.kbd_bcache_destroy(self.bcache_dev)
Packit 2ba279
            except:
Packit 2ba279
                pass
Packit 2ba279
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
        try:
Packit 2ba279
            delete_lio_device(self.loop_dev2)
Packit 2ba279
        except RuntimeError:
Packit 2ba279
            # just move on, we can do no better here
Packit 2ba279
            pass
Packit 2ba279
        os.unlink(self.dev_file2)
Packit 2ba279
Packit 2ba279
class KbdTestBcacheCreate(KbdBcacheTestCase):
Packit 2ba279
    @tag_test(TestTags.UNSTABLE)
Packit 2ba279
    def test_bcache_create_destroy(self):
Packit 2ba279
        """Verify that it's possible to create and destroy a bcache device"""
Packit 2ba279
Packit 2ba279
        succ, dev = BlockDev.kbd_bcache_create(self.loop_dev, self.loop_dev2, None)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.assertTrue(dev)
Packit 2ba279
        self.bcache_dev = dev
Packit 2ba279
Packit 2ba279
        _wait_for_bcache_setup(dev)
Packit 2ba279
Packit 2ba279
        succ = BlockDev.kbd_bcache_destroy(self.bcache_dev)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.bcache_dev = None
Packit 2ba279
        time.sleep(5)
Packit 2ba279
Packit 2ba279
        wipe_all(self.loop_dev, self.loop_dev2)
Packit 2ba279
Packit 2ba279
    @tag_test(TestTags.UNSTABLE)
Packit 2ba279
    def test_bcache_create_destroy_full_path(self):
Packit 2ba279
        """Verify that it's possible to create and destroy a bcache device with full device path"""
Packit 2ba279
Packit 2ba279
        succ, dev = BlockDev.kbd_bcache_create(self.loop_dev, self.loop_dev2, None)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.assertTrue(dev)
Packit 2ba279
        self.bcache_dev = dev
Packit 2ba279
Packit 2ba279
        _wait_for_bcache_setup(dev)
Packit 2ba279
Packit 2ba279
        succ = BlockDev.kbd_bcache_destroy("/dev/" + self.bcache_dev)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.bcache_dev = None
Packit 2ba279
        time.sleep(5)
Packit 2ba279
Packit 2ba279
        wipe_all(self.loop_dev, self.loop_dev2)
Packit 2ba279
Packit 2ba279
class KbdTestBcacheAttachDetach(KbdBcacheTestCase):
Packit 2ba279
    @tag_test(TestTags.UNSTABLE)
Packit 2ba279
    def test_bcache_attach_detach(self):
Packit 2ba279
        """Verify that it's possible to detach/attach a cache from/to a bcache device"""
Packit 2ba279
Packit 2ba279
        succ, dev = BlockDev.kbd_bcache_create(self.loop_dev, self.loop_dev2, None)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.assertTrue(dev)
Packit 2ba279
        self.bcache_dev = dev
Packit 2ba279
Packit 2ba279
        _wait_for_bcache_setup(dev)
Packit 2ba279
Packit 2ba279
        succ, c_set_uuid = BlockDev.kbd_bcache_detach(self.bcache_dev)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.assertTrue(c_set_uuid)
Packit 2ba279
Packit 2ba279
        succ = BlockDev.kbd_bcache_attach(c_set_uuid, self.bcache_dev)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
Packit 2ba279
        succ = BlockDev.kbd_bcache_destroy(self.bcache_dev)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.bcache_dev = None
Packit 2ba279
        time.sleep(1)
Packit 2ba279
Packit 2ba279
        wipe_all(self.loop_dev, self.loop_dev2)
Packit 2ba279
Packit 2ba279
    @tag_test(TestTags.UNSTABLE)
Packit 2ba279
    def test_bcache_attach_detach_full_path(self):
Packit 2ba279
        """Verify that it's possible to detach/attach a cache from/to a bcache device with full device path"""
Packit 2ba279
Packit 2ba279
        succ, dev = BlockDev.kbd_bcache_create(self.loop_dev, self.loop_dev2, None)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.assertTrue(dev)
Packit 2ba279
        self.bcache_dev = dev
Packit 2ba279
Packit 2ba279
        _wait_for_bcache_setup(dev)
Packit 2ba279
Packit 2ba279
        succ, c_set_uuid = BlockDev.kbd_bcache_detach("/dev/" + self.bcache_dev)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.assertTrue(c_set_uuid)
Packit 2ba279
Packit 2ba279
        succ = BlockDev.kbd_bcache_attach(c_set_uuid, "/dev/" + self.bcache_dev)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
Packit 2ba279
        succ = BlockDev.kbd_bcache_destroy(self.bcache_dev)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.bcache_dev = None
Packit 2ba279
        time.sleep(1)
Packit 2ba279
Packit 2ba279
        wipe_all(self.loop_dev, self.loop_dev2)
Packit 2ba279
Packit 2ba279
    @tag_test(TestTags.UNSTABLE)
Packit 2ba279
    def test_bcache_detach_destroy(self):
Packit 2ba279
        """Verify that it's possible to destroy a bcache device with no cache attached"""
Packit 2ba279
Packit 2ba279
        succ, dev = BlockDev.kbd_bcache_create(self.loop_dev, self.loop_dev2, None)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.assertTrue(dev)
Packit 2ba279
        self.bcache_dev = dev
Packit 2ba279
Packit 2ba279
        _wait_for_bcache_setup(dev)
Packit 2ba279
Packit 2ba279
        succ, c_set_uuid = BlockDev.kbd_bcache_detach(self.bcache_dev)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.assertTrue(c_set_uuid)
Packit 2ba279
Packit 2ba279
        succ = BlockDev.kbd_bcache_destroy(self.bcache_dev)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.bcache_dev = None
Packit 2ba279
        time.sleep(1)
Packit 2ba279
Packit 2ba279
        wipe_all(self.loop_dev, self.loop_dev2)
Packit 2ba279
Packit 2ba279
class KbdTestBcacheGetSetMode(KbdBcacheTestCase):
Packit 2ba279
    @tag_test(TestTags.UNSTABLE)
Packit 2ba279
    def test_bcache_get_set_mode(self):
Packit 2ba279
        """Verify that it is possible to get and set Bcache mode"""
Packit 2ba279
Packit 2ba279
        succ, dev = BlockDev.kbd_bcache_create(self.loop_dev, self.loop_dev2, None)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.assertTrue(dev)
Packit 2ba279
        self.bcache_dev = dev
Packit 2ba279
Packit 2ba279
        _wait_for_bcache_setup(dev)
Packit 2ba279
Packit 2ba279
        mode = BlockDev.kbd_bcache_get_mode(self.bcache_dev)
Packit 2ba279
        self.assertNotEqual(mode, BlockDev.KBDBcacheMode.UNKNOWN)
Packit 2ba279
Packit 2ba279
        for mode_str in ("writethrough", "writeback", "writearound", "none"):
Packit 2ba279
            mode = BlockDev.kbd_bcache_get_mode_from_str(mode_str)
Packit 2ba279
            succ = BlockDev.kbd_bcache_set_mode(self.bcache_dev, mode)
Packit 2ba279
            self.assertTrue(succ)
Packit 2ba279
            new_mode = BlockDev.kbd_bcache_get_mode(self.bcache_dev)
Packit 2ba279
            self.assertEqual(mode, new_mode)
Packit 2ba279
            self.assertEqual(mode_str, BlockDev.kbd_bcache_get_mode_str(new_mode))
Packit 2ba279
Packit 2ba279
        mode_str = "unknown"
Packit 2ba279
        mode = BlockDev.kbd_bcache_get_mode_from_str(mode_str)
Packit 2ba279
        with self.assertRaises(GLib.GError):
Packit 2ba279
            # cannot set mode to "uknown"
Packit 2ba279
            BlockDev.kbd_bcache_set_mode(self.bcache_dev, mode)
Packit 2ba279
Packit 2ba279
        mode_str = "bla"
Packit 2ba279
        with self.assertRaises(GLib.GError):
Packit 2ba279
            mode = BlockDev.kbd_bcache_get_mode_from_str(mode_str)
Packit 2ba279
Packit 2ba279
        # set back to some caching mode
Packit 2ba279
        mode_str = "writethrough"
Packit 2ba279
        mode = BlockDev.kbd_bcache_get_mode_from_str(mode_str)
Packit 2ba279
        succ = BlockDev.kbd_bcache_set_mode(self.bcache_dev, mode)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
Packit 2ba279
        _wait_for_bcache_setup(dev)
Packit 2ba279
Packit 2ba279
        succ = BlockDev.kbd_bcache_destroy(self.bcache_dev)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.bcache_dev = None
Packit 2ba279
        time.sleep(1)
Packit 2ba279
Packit 2ba279
        wipe_all(self.loop_dev, self.loop_dev2)
Packit 2ba279
Packit 2ba279
class KbdTestBcacheStatusTest(KbdBcacheTestCase):
Packit 2ba279
Packit 2ba279
    def _get_size(self, bcache_name):
Packit 2ba279
        cache_dir = '/sys/block/%s/bcache/cache' % bcache_name
Packit 2ba279
Packit 2ba279
        # sum sizes from all caches
Packit 2ba279
        caches = ['%s/%s' % (cache_dir, d) for d in os.listdir(cache_dir) if re.match('cache[0-9]*$', d)]
Packit 2ba279
        return sum(int(read_file(os.path.realpath(c) + '/../size')) for c in caches)
Packit 2ba279
Packit 2ba279
    @tag_test(TestTags.UNSTABLE)
Packit 2ba279
    def test_bcache_status(self):
Packit 2ba279
        succ, dev = BlockDev.kbd_bcache_create(self.loop_dev, self.loop_dev2, None)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.assertTrue(dev)
Packit 2ba279
        self.bcache_dev = dev
Packit 2ba279
Packit 2ba279
        _wait_for_bcache_setup(dev)
Packit 2ba279
Packit 2ba279
        # should work with both "bcacheX" and "/dev/bcacheX"
Packit 2ba279
        status = BlockDev.kbd_bcache_status(self.bcache_dev)
Packit 2ba279
        self.assertTrue(status)
Packit 2ba279
        status = BlockDev.kbd_bcache_status("/dev/" + self.bcache_dev)
Packit 2ba279
        self.assertTrue(status)
Packit 2ba279
Packit 2ba279
        # check some basic values
Packit 2ba279
        self.assertTrue(status.state)
Packit 2ba279
        sys_state = read_file("/sys/block/%s/bcache/state" % self.bcache_dev).strip()
Packit 2ba279
        self.assertEqual(status.state, sys_state)
Packit 2ba279
        sys_block = read_file("/sys/block/%s/bcache/cache/block_size" % self.bcache_dev).strip()
Packit 2ba279
        self.assertEqual(status.block_size, int(bytesize.Size(sys_block)))
Packit 2ba279
        sys_size = self._get_size(self.bcache_dev)
Packit 2ba279
        self.assertGreater(status.cache_size, sys_size)
Packit 2ba279
Packit 2ba279
        succ = BlockDev.kbd_bcache_destroy(self.bcache_dev)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.bcache_dev = None
Packit 2ba279
        time.sleep(1)
Packit 2ba279
Packit 2ba279
        wipe_all(self.loop_dev, self.loop_dev2)
Packit 2ba279
Packit 2ba279
class KbdTestBcacheBackingCacheDevTest(KbdBcacheTestCase):
Packit 2ba279
    @tag_test(TestTags.UNSTABLE)
Packit 2ba279
    def test_bcache_backing_cache_dev(self):
Packit 2ba279
        """Verify that is is possible to get the backing and cache devices for a Bcache"""
Packit 2ba279
Packit 2ba279
        succ, dev = BlockDev.kbd_bcache_create(self.loop_dev, self.loop_dev2, None)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.assertTrue(dev)
Packit 2ba279
        self.bcache_dev = dev
Packit 2ba279
Packit 2ba279
        _wait_for_bcache_setup(dev)
Packit 2ba279
Packit 2ba279
        self.assertEqual("/dev/" + BlockDev.kbd_bcache_get_backing_device(self.bcache_dev), self.loop_dev)
Packit 2ba279
        self.assertEqual("/dev/" + BlockDev.kbd_bcache_get_cache_device(self.bcache_dev), self.loop_dev2)
Packit 2ba279
Packit 2ba279
        succ = BlockDev.kbd_bcache_destroy(self.bcache_dev)
Packit 2ba279
        self.assertTrue(succ)
Packit 2ba279
        self.bcache_dev = None
Packit 2ba279
        time.sleep(1)
Packit 2ba279
Packit 2ba279
        wipe_all(self.loop_dev, self.loop_dev2)
Packit 2ba279
Packit 2ba279
class KbdUnloadTest(KbdBcacheTestCase):
Packit 2ba279
    def setUp(self):
Packit 2ba279
        # make sure the library is initialized with all plugins loaded for other
Packit 2ba279
        # tests
Packit 2ba279
        self.addCleanup(BlockDev.reinit, self.requested_plugins, True, None)
Packit 2ba279
Packit 2ba279
    @tag_test(TestTags.NOSTORAGE)
Packit 2ba279
    def test_check_no_bcache_progs(self):
Packit 2ba279
        """Verify that checking the availability of make-bcache works as expected"""
Packit 2ba279
Packit 2ba279
        # unload all plugins first
Packit 2ba279
        self.assertTrue(BlockDev.reinit([], True, None))
Packit 2ba279
Packit 2ba279
        with fake_path(all_but="make-bcache"):
Packit 2ba279
            with self.assertRaises(GLib.GError):
Packit 2ba279
                BlockDev.reinit(self.requested_plugins, True, None)
Packit 2ba279
Packit 2ba279
            self.assertNotIn("kbd", BlockDev.get_available_plugin_names())
Packit 2ba279
Packit 2ba279
        # load the plugins back
Packit 2ba279
        self.assertTrue(BlockDev.reinit(self.requested_plugins, True, None))
Packit 2ba279
        self.assertIn("kbd", BlockDev.get_available_plugin_names())