kiwi-el8/test/unit/filesystem/base_test.py
Marcus Schäfer a0769c691c
Umount device before cloning
In case a clone should be created from a partition we need
to make sure to umount the device after sync and prior cloning.
Otherwise the clone operation is not safe because the rsynced
data might still be in memory and not synced out to the block
device.
2022-07-08 13:10:42 +02:00

140 lines
4.5 KiB
Python

import logging
from mock import patch
from pytest import (
raises, fixture
)
import mock
import kiwi.defaults as defaults
from kiwi.filesystem.base import FileSystemBase
from kiwi.exceptions import KiwiFileSystemSyncError
class TestFileSystemBase:
@fixture(autouse=True)
def inject_fixtures(self, caplog):
self._caplog = caplog
def setup(self):
provider = mock.Mock()
provider.get_device = mock.Mock(
return_value='/dev/loop0'
)
provider.get_byte_size = mock.Mock(
return_value=1073741824 # 1GB
)
custom_args = {
'fs_attributes': ['no-copy-on-write']
}
self.fsbase = FileSystemBase(provider, 'root_dir', custom_args)
def setup_method(self, cls):
self.setup()
def test_root_dir_does_not_exist(self):
fsbase = FileSystemBase(mock.Mock(), 'root_dir_not_existing')
with raises(KiwiFileSystemSyncError):
fsbase.sync_data()
def test_root_dir_not_defined(self):
fsbase = FileSystemBase(mock.Mock())
with raises(KiwiFileSystemSyncError):
fsbase.sync_data()
def test_create_on_device(self):
with raises(NotImplementedError):
self.fsbase.create_on_device('/dev/foo')
def test_create_on_file(self):
with raises(NotImplementedError):
self.fsbase.create_on_file('myimage')
def test_get_mountpoint(self):
assert self.fsbase.get_mountpoint() is None
@patch('kiwi.filesystem.base.MountManager')
@patch('kiwi.filesystem.base.DataSync')
@patch('kiwi.filesystem.base.Command.run')
@patch('os.path.exists')
def test_sync_data(
self, mock_exists, mock_Command_run, mock_sync, mock_mount
):
mock_exists.return_value = True
filesystem_mount = mock.Mock()
filesystem_mount.mountpoint = 'tmpdir'
mock_mount.return_value = filesystem_mount
data_sync = mock.Mock()
mock_sync.return_value = data_sync
self.fsbase.sync_data(['exclude_me'])
mock_sync.assert_called_once_with('root_dir', 'tmpdir')
data_sync.sync_data.assert_called_once_with(
exclude=['exclude_me'],
options=[
'--archive', '--hard-links', '--xattrs',
'--acls', '--one-file-system', '--inplace'
]
)
mock_mount.assert_called_once_with(
device='/dev/loop0'
)
mock_Command_run.assert_called_once_with(
['chattr', '+C', 'tmpdir']
)
filesystem_mount.mount.assert_called_once_with([])
assert self.fsbase.get_mountpoint() == 'tmpdir'
@patch('kiwi.filesystem.base.VeritySetup')
def test_create_verity_layer(self, mock_VeritySetup):
self.fsbase.create_verity_layer()
mock_VeritySetup.return_value.format.assert_called_once_with()
def test_create_verification_metadata(self):
veritysetup = mock.Mock()
self.fsbase.veritysetup = veritysetup
self.fsbase.create_verification_metadata('/some/device')
veritysetup.create_verity_verification_metadata.assert_called_once_with()
veritysetup.sign_verification_metadata.assert_called_once_with()
veritysetup.write_verification_metadata.assert_called_once_with(
'/some/device'
)
def test_umount(self):
mount = mock.Mock()
self.fsbase.filesystem_mount = mount
self.fsbase.umount()
mount.umount.assert_called_once_with()
def test_mount(self):
mount = mock.Mock()
self.fsbase.filesystem_mount = mount
self.fsbase.mount()
mount.mount.assert_called_once_with([])
def test_fs_size(self):
# size of 100k must be 100k (default unit)
assert self.fsbase._fs_size(100) == '100'
# size of 1073741824b (see test init) - 100k must be 1048476k
assert self.fsbase._fs_size(-100) == '1048476'
# size of 1073741824b (see test init) - 102400b must be 1073639424b
assert self.fsbase._fs_size(
-102400, unit=defaults.UNIT.byte
) == '1073639424'
# size of 1073741824b - 1024m must be zero
assert self.fsbase._fs_size(-1024, unit=defaults.UNIT.mb) == '0'
# size of 1073741824b - 1g must be zero
assert self.fsbase._fs_size(-1, unit=defaults.UNIT.gb) == '0'
def test_set_uuid(self):
with self._caplog.at_level(logging.WARNING):
self.fsbase.set_uuid()
def test_destructor_valid_mountpoint(self):
self.fsbase.filesystem_mount = mock.Mock()
self.fsbase.__del__()