debian-forge/test/mod/test_loop.py
Christian Kellner 61d5f15420 loop: add autoclear propert to LoopInfo
Small convenience property to check if the autoclear flag is set
in the `lo_flags` member of the `LoopInfo`.
Also add a corresponding test for it.
2021-08-11 20:59:51 +02:00

77 lines
1.6 KiB
Python

#
# Test for the loop.py
#
import contextlib
import os
from tempfile import TemporaryDirectory
import pytest
from osbuild import loop
from ..test import TestBase
@pytest.fixture(name="tempdir")
def tempdir_fixture():
with TemporaryDirectory(prefix="loop-") as tmp:
yield tmp
@pytest.mark.skipif(not TestBase.can_bind_mount(), reason="root only")
def test_basic(tempdir):
path = os.path.join(tempdir, "test.img")
ctl = loop.LoopControl()
assert ctl
with pytest.raises(ValueError):
ctl.loop_for_fd(-1)
lo, f = None, None
try:
f = open(path, "wb+")
f.truncate(1024)
f.flush()
lo = ctl.loop_for_fd(f.fileno(), autoclear=True)
sb = os.fstat(f.fileno())
assert lo
assert lo.devname
info = lo.get_status()
assert info.lo_inode == sb.st_ino
assert info.lo_number == lo.minor
# check for autoclear flags setting and helpers
assert info.autoclear
lo.set_status(autoclear=False)
info = lo.get_status()
assert not info.autoclear
finally:
if lo:
with contextlib.suppress(OSError):
lo.clear_fd()
lo.close()
if f:
f.close()
ctl.close()
# closing must be a no-op on a closed LoopControl
ctl.close()
# check we raise exceptions on methods that require
# an open LoopControl
for fn in (ctl.add, ctl.remove, ctl.get_unbound):
with pytest.raises(RuntimeError):
fn()
with pytest.raises(RuntimeError):
ctl.loop_for_fd(0)