kiwi-el8/test/unit/path_test.py
Dan Čermák d28a7e935c
New method: Path.access - thin wrapper arround os.access
This function calls os.access, but first checks whether the input parameters are
sane, instead of simply returning false when the file in question does not exist
or an invalid mode was specified.
2019-03-26 15:20:49 +01:00

127 lines
4.4 KiB
Python

from mock import patch, call
from pytest import raises
import os
from kiwi.path import Path
from kiwi.exceptions import KiwiFileAccessError
class TestPath(object):
def test_sort_by_hierarchy(self):
ordered = Path.sort_by_hierarchy(
['usr', 'usr/bin', 'etc', 'usr/lib']
)
assert ordered == ['usr', 'etc', 'usr/bin', 'usr/lib']
@patch('kiwi.command.Command.run')
def test_create(self, mock_command):
Path.create('foo')
mock_command.assert_called_once_with(
['mkdir', '-p', 'foo']
)
@patch('kiwi.command.Command.run')
def test_wipe(self, mock_command):
Path.wipe('foo')
mock_command.assert_called_once_with(
['rm', '-r', '-f', 'foo']
)
@patch('kiwi.command.Command.run')
def test_remove(self, mock_command):
Path.remove('foo')
mock_command.assert_called_once_with(
['rmdir', 'foo']
)
@patch('kiwi.command.Command.run')
@patch('kiwi.logger.log.warning')
def test_remove_hierarchy(self, mock_log_warn, mock_command):
Path.remove_hierarchy('/my_root/tmp/foo/bar')
assert mock_command.call_args_list == [
call(['rmdir', '--ignore-fail-on-non-empty', '/my_root/tmp/foo/bar']),
call(['rmdir', '--ignore-fail-on-non-empty', '/my_root/tmp/foo'])
]
mock_log_warn.assert_called_once_with(
'remove_hierarchy: path /my_root/tmp is protected'
)
@patch('os.access')
@patch('os.environ.get')
@patch('os.path.exists')
def test_which(self, mock_exists, mock_env, mock_access):
mock_env.return_value = '/usr/local/bin:/usr/bin:/bin'
mock_exists.return_value = True
assert Path.which('some-file') == '/usr/local/bin/some-file'
mock_exists.return_value = False
assert Path.which('some-file') is None
mock_env.return_value = None
mock_exists.return_value = True
assert Path.which('some-file', ['alternative']) == \
'alternative/some-file'
mock_access.return_value = False
mock_env.return_value = '/usr/local/bin:/usr/bin:/bin'
assert Path.which('some-file', access_mode=os.X_OK) is None
mock_access.return_value = True
assert Path.which('some-file', access_mode=os.X_OK) == \
'/usr/local/bin/some-file'
assert Path.which('some-file', custom_env={'PATH': 'custom_path'}) == \
'custom_path/some-file'
@patch('os.access')
@patch('os.environ.get')
@patch('os.path.exists')
@patch('kiwi.logger.log.debug')
def test_which_not_found_log(
self, mock_log, mock_exists, mock_env, mock_access
):
mock_env.return_value = '/usr/local/bin:/usr/bin:/bin'
mock_exists.return_value = False
assert Path.which('file') is None
mock_log.assert_called_once_with(
'"file": in paths "%s" exists: "False" mode match: not checked' %
mock_env.return_value
)
@patch('os.access')
@patch('os.environ.get')
@patch('os.path.exists')
@patch('kiwi.logger.log.debug')
def test_which_not_found_for_mode_log(
self, mock_log, mock_exists, mock_env, mock_access
):
mock_env.return_value = '/usr/local/bin:/usr/bin:/bin'
mock_exists.return_value = True
mock_access.return_value = False
assert Path.which('file', access_mode=os.X_OK) is None
mock_log.assert_called_once_with(
'"file": in paths "%s" exists: "True" mode match: "False"' %
mock_env.return_value
)
def test_access_invalid_mode(self):
with raises(ValueError) as val_err_exc:
Path.access("/some/non-existent-file/", 128)
assert "0x80" in str(val_err_exc)
def test_access_with_non_existent_file(self):
non_existent = "/some/file/that/should/not/exist"
with raises(KiwiFileAccessError) as kfae_exc:
Path.access(non_existent, os.F_OK)
assert non_existent in str(kfae_exc)
@patch('os.stat')
@patch('os.access')
def test_access_with_args(self, mock_access, mock_stat):
mock_access.return_value = True
fname = "arbitrary"
mode = os.R_OK
assert Path.access(fname, mode, effective_ids=True)
mock_stat.assert_called_once_with(fname)
mock_access.assert_called_once_with(fname, mode, effective_ids=True)