1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
from unittest.mock import (
patch, call, Mock
)
from pytest import raises
from kiwi.chroot_manager import (
ChrootManager, ChrootMount
)
from kiwi.exceptions import (
KiwiCommandError,
KiwiUmountBusyError
)
class TestChrootManager:
@patch('kiwi.chroot_manager.MountManager')
@patch('kiwi.chroot_manager.Command.run')
def test_run_in_chroot_context(self, mock_run, mock_mount):
mock_mntMngr = Mock()
mock_mount.return_value = mock_mntMngr
with ChrootManager(
'/some/root', binds=[
ChrootMount('/dev'), ChrootMount('/proc'), ChrootMount('/sys')
]
) as chroot:
chroot.run(['cmd', 'arg1', 'arg2'])
assert mock_mount.call_args_list == [
call(device='/dev', mountpoint='/some/root/dev'),
call(device='/proc', mountpoint='/some/root/proc'),
call(device='/sys', mountpoint='/some/root/sys')
]
mock_run.assert_called_once_with(
['chroot', '/some/root', 'cmd', 'arg1', 'arg2'],
None, True, False, True
)
mock_mntMngr.bind_mount.assert_called()
mock_mntMngr.umount.assert_called()
@patch('kiwi.chroot_manager.MountManager')
@patch('kiwi.chroot_manager.Command.run')
def test_run_fails_in_chroot_context(self, mock_run, mock_mount):
mock_mntMngr = Mock()
mock_mount.return_value = mock_mntMngr
mock_run.side_effect = Exception
with ChrootManager(
'/some/root', binds=[
ChrootMount('/dev'), ChrootMount('/proc'), ChrootMount('/sys')
]
) as chroot:
with raises(Exception):
chroot.run(['cmd', 'arg1', 'arg2'])
assert mock_mount.call_args_list == [
call(device='/dev', mountpoint='/some/root/dev'),
call(device='/proc', mountpoint='/some/root/proc'),
call(device='/sys', mountpoint='/some/root/sys')
]
mock_run.assert_called_once_with(
['chroot', '/some/root', 'cmd', 'arg1', 'arg2'],
None, True, False, True
)
mock_mntMngr.bind_mount.assert_called()
mock_mntMngr.umount.assert_called()
@patch('kiwi.chroot_manager.MountManager')
@patch('kiwi.chroot_manager.Command.run')
def test_run_fails_to_enter_chroot_context(self, mock_run, mock_mount):
mock_mntMngr = Mock()
mock_mount.return_value = mock_mntMngr
mock_mntMngr.bind_mount.side_effect = KiwiCommandError('mount error')
with raises(KiwiCommandError):
with ChrootManager(
'/some/root', binds=[
ChrootMount('/dev'), ChrootMount('/proc'),
ChrootMount('/sys')
]
) as chroot:
chroot.run(['cmd', 'arg1', 'arg2'])
assert mock_mount.call_args_list == [
call(device='/dev', mountpoint='/some/root/dev'),
call(device='/proc', mountpoint='/some/root/proc'),
call(device='/sys', mountpoint='/some/root/sys')
]
mock_run.assert_not_called()
mock_mntMngr.bind_mount.assert_called_once()
mock_mntMngr.umount.assert_called()
@patch('kiwi.chroot_manager.MountManager')
@patch('kiwi.chroot_manager.Command.run')
def test_run_fails_to_enter_and_clean_chroot_context(
self, mock_run, mock_mount
):
mock_mntMngr = Mock()
mock_mount.return_value = mock_mntMngr
mock_mntMngr.bind_mount.side_effect = KiwiCommandError('mount error')
mock_mntMngr.umount.side_effect = KiwiUmountBusyError('umount error')
with raises(KiwiCommandError):
with ChrootManager(
'/some/root', binds=[
ChrootMount('/dev'), ChrootMount('/proc'),
ChrootMount('/sys')
]
) as chroot:
chroot.run(['cmd', 'arg1', 'arg2'])
assert mock_mount.call_args_list == [
call(device='/dev', mountpoint='/some/root/dev'),
call(device='/proc', mountpoint='/some/root/proc'),
call(device='/sys', mountpoint='/some/root/sys')
]
mock_run.assert_not_called()
mock_mntMngr.bind_mount.assert_called_once()
mock_mntMngr.umount.assert_called()
@patch('kiwi.chroot_manager.MountManager')
@patch('kiwi.chroot_manager.Command.run')
def test_run_fails_to_clean_chroot_context(
self, mock_run, mock_mount
):
mock_mntMngr = Mock()
mock_mount.return_value = mock_mntMngr
mock_mntMngr.umount.side_effect = KiwiUmountBusyError('umount error')
with raises(KiwiUmountBusyError):
with ChrootManager(
'/some/root', binds=[
ChrootMount('/dev'), ChrootMount('/proc'),
ChrootMount('/sys')
]
) as chroot:
chroot.run(['cmd', 'arg1', 'arg2'])
assert mock_mount.call_args_list == [
call(device='/dev', mountpoint='/some/root/dev'),
call(device='/proc', mountpoint='/some/root/proc'),
call(device='/sys', mountpoint='/some/root/sys')
]
mock_run.assert_called_once_with(
['chroot', '/some/root', 'cmd', 'arg1', 'arg2'],
None, True, False, True
)
mock_mntMngr.bind_mount.assert_called()
mock_mntMngr.umount.assert_called()
|