kiwi-el8/test/unit/system_root_init_test.py
David Cassany 3355f93aad Fix existing root check, fixes #349
This commit fixes the validation of an existing root directory
for the command 'system build'. System build used to create the root
directory before performing the root existance check, thus the
check was always failing in any case. The root directory is created
inside the RootInit class within the 'create' method.

Fixes #349
2017-05-26 14:48:05 +02:00

149 lines
4.9 KiB
Python

from mock import patch
from mock import call
import mock
from .test_helper import raises
from kiwi.exceptions import (
KiwiRootDirExists,
KiwiRootInitCreationError
)
from kiwi.system.root_init import RootInit
class TestRootInit(object):
@raises(KiwiRootDirExists)
@patch('os.path.exists')
def test_init_raises_error(self, mock_path):
mock_path.return_value = True
RootInit('root_dir')
@raises(KiwiRootInitCreationError)
@patch('os.path.exists')
@patch('os.makedirs')
@patch('os.chown')
@patch('os.mknod')
@patch('os.symlink')
@patch('shutil.rmtree')
@patch('kiwi.system.root_init.DataSync')
@patch('kiwi.system.root_init.mkdtemp')
@patch('kiwi.system.root_init.Command.run')
def test_create_raises_error(
self, mock_command, mock_temp, mock_data_sync, mock_rmtree,
mock_symlink, mock_mknod, mock_chwon, mock_makedirs, mock_path
):
mock_path.return_value = False
mock_temp.return_value = 'tmpdir'
mock_data_sync.side_effect = Exception
root = RootInit('root_dir')
root.create()
@patch('os.path.exists')
@patch('os.makedirs')
@patch('os.chown')
@patch('os.mknod')
@patch('os.symlink')
@patch('os.makedev')
@patch('kiwi.system.root_init.rmtree')
@patch('kiwi.system.root_init.DataSync')
@patch('kiwi.system.root_init.mkdtemp')
@patch('kiwi.system.root_init.Command.run')
def test_create(
self, mock_command, mock_temp, mock_data_sync, mock_rmtree,
mock_makedev, mock_symlink, mock_mknod, mock_chwon, mock_makedirs,
mock_path
):
data_sync = mock.Mock()
mock_data_sync.return_value = data_sync
mock_makedev.return_value = 'makedev'
mock_path_return = [
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_temp.return_value = 'tmpdir'
root = RootInit('root_dir', True)
root.create()
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_mknod.call_args_list == [
call('tmpdir/dev/null', 8630, 'makedev'),
call('tmpdir/dev/zero', 8630, 'makedev'),
call('tmpdir/dev/full', 8594, 'makedev'),
call('tmpdir/dev/random', 8630, 'makedev'),
call('tmpdir/dev/urandom', 8612, 'makedev'),
call('tmpdir/dev/tty', 8630, 'makedev'),
call('tmpdir/dev/ptmx', 8630, 'makedev'),
call('tmpdir/dev/loop0', 24992, 'makedev'),
call('tmpdir/dev/loop1', 24992, 'makedev'),
call('tmpdir/dev/loop2', 24992, 'makedev'),
call('tmpdir/dev/loop3', 25014, 'makedev'),
call('tmpdir/dev/loop4', 25014, 'makedev')
]
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'),
call('/run', 'tmpdir/var/run')
]
assert mock_command.call_args_list == [
call(['mkdir', '-p', 'root_dir']),
call([
'cp',
'/var/adm/fillup-templates/group.aaa_base',
'tmpdir/etc/group'
]),
call([
'cp',
'/var/adm/fillup-templates/passwd.aaa_base',
'tmpdir/etc/passwd'
]),
call([
'cp',
'/var/adm/fillup-templates/sysconfig.proxy',
'tmpdir/etc/sysconfig/proxy'
])
]
mock_data_sync.assert_called_once_with(
'tmpdir/', 'root_dir'
)
data_sync.sync_data.assert_called_once_with(
options=['-a', '--ignore-existing']
)
mock_rmtree.assert_called_once_with(
'tmpdir', ignore_errors=True
)
@patch('kiwi.command.Command.run')
@patch('os.path.exists')
def test_delete(self, mock_path, mock_command):
mock_path.return_value = False
root = RootInit('root_dir')
root.delete()
mock_command.assert_called_once_with(
['rm', '-r', '-f', 'root_dir']
)