kiwi-el8/test/unit/system/root_init_test.py
Marcus Schäfer 9d21a2c3b3
Set fixed permissions for image root directory
The new root directory (/) for an image build is created
by taking the current system umask into account. However,
if that umask setting is not appropriate for the needs
of the image root directory some hard to debug after
effects can appear on the later run of the image binary.
As such this commit changes the permissions for the root
directory explicitly to the expected value.
This Fixes #2920
2025-12-15 11:08:14 +01:00

126 lines
3.9 KiB
Python

import sys
from unittest.mock import (
patch, call, Mock
)
from pytest import raises
from ..test_helper import argv_kiwi_tests
from kiwi.system.root_init import RootInit
from kiwi.exceptions import (
KiwiRootDirExists,
KiwiRootInitCreationError
)
class TestRootInit:
@patch('os.path.exists')
def test_init_raises_error(self, mock_path):
mock_path.return_value = True
with raises(KiwiRootDirExists):
RootInit('root_dir')
@patch('os.path.exists')
@patch('os.makedirs')
@patch('os.chown')
@patch('os.symlink')
@patch('kiwi.system.root_init.DataSync')
@patch('kiwi.system.root_init.Temporary')
@patch('kiwi.system.root_init.Path.create')
def test_create_raises_error(
self, mock_Path_create, mock_Temporary, mock_data_sync,
mock_symlink, mock_chwon, mock_makedirs, mock_path
):
mock_path.return_value = False
mock_Temporary.return_value.new_dir.return_value.name = 'tmpdir'
mock_data_sync.side_effect = Exception
root = RootInit('root_dir')
with raises(KiwiRootInitCreationError):
root.create()
@patch('os.path.exists')
@patch('os.makedirs')
@patch('os.chown')
@patch('os.symlink')
@patch('os.makedev')
@patch('os.chmod')
@patch('kiwi.path.Path.create')
@patch('kiwi.system.root_init.copy')
@patch('kiwi.system.root_init.DataSync')
@patch('kiwi.system.root_init.Temporary')
@patch('kiwi.system.root_init.Path.create')
def test_create(
self, mock_Path_create, mock_Temporary, mock_data_sync,
mock_copy, mock_create, mock_chmod, mock_makedev,
mock_symlink, mock_chwon, mock_makedirs,
mock_path
):
data_sync = Mock()
mock_data_sync.return_value = data_sync
mock_makedev.return_value = 'makedev'
mock_path_return = [
True, True, True, True, False, False,
False, False, False, False, False
]
def path_exists(self):
return mock_path_return.pop()
mock_path.side_effect = path_exists
mock_path.return_value = False
mock_Temporary.return_value.new_dir.return_value.name = 'tmpdir'
root = RootInit('root_dir', True)
assert root.create() is None
assert mock_makedirs.call_args_list == [
call('tmpdir/var/cache/kiwi'),
call('tmpdir/dev/pts'),
call('tmpdir/proc'),
call('tmpdir/etc/sysconfig'),
call('tmpdir/run'),
call('tmpdir/sys'),
call('tmpdir/var')
]
assert mock_chwon.call_args_list == [
call('tmpdir/var/cache/kiwi', 0, 0),
call('tmpdir/dev/pts', 0, 0),
call('tmpdir/proc', 0, 0),
call('tmpdir/etc/sysconfig', 0, 0),
call('tmpdir/run', 0, 0),
call('tmpdir/sys', 0, 0),
call('tmpdir/var', 0, 0)
]
assert mock_symlink.call_args_list == [
call('/proc/self/fd', 'tmpdir/dev/fd'),
call('fd/2', 'tmpdir/dev/stderr'),
call('fd/0', 'tmpdir/dev/stdin'),
call('fd/1', 'tmpdir/dev/stdout')
]
mock_data_sync.assert_called_once_with(
'tmpdir/', 'root_dir'
)
data_sync.sync_data.assert_called_once_with(
options=['-a', '--ignore-existing']
)
mock_copy.assert_called_once_with(
'/.buildenv', 'root_dir'
)
mock_create.assert_called_once_with('root_dir')
mock_chmod.assert_called_once_with('root_dir', 0o755)
@patch('kiwi.path.Path.wipe')
@patch('os.path.exists')
def test_delete(self, mock_path, mock_wipe):
mock_path.return_value = False
root = RootInit('root_dir')
assert root.delete() is None
mock_wipe.assert_called_once_with('root_dir')
def teardown(self):
sys.argv = argv_kiwi_tests
def teardown_method(self, cls):
self.teardown()