kiwi-el8/test/unit/utils/compress_test.py
Marcus Schäfer 0b13c48c21
Fixed logging behavior of Compress::get_format
The get_format() method allows to check which compression format
a given input stream has. This is done by calling the supported
compression tools in a row and let them check if they can deal
with the provided data or not. As a result error messages are
logged for streams that some tool doesn't understand. However,
those error messages are no errors and only the result of the
checking. This information in the kiwi log file is confusing
and several users already complained when they see information
like:

    EXEC: Failed with stderr: /usr/bin/xz: ...: File format not recognized

This commit changes how the compression tooling is called in a
way that no exception is raised (which leads to the above error message)
but the result returncode is used to decide on the success or
error of the respective compression tooling.
2024-07-12 15:29:37 +02:00

119 lines
3.9 KiB
Python

import logging
from unittest.mock import (
patch, Mock
)
from pytest import (
raises, fixture
)
from kiwi.utils.compress import Compress
from kiwi.exceptions import (
KiwiFileNotFound,
KiwiCompressionFormatUnknown
)
class TestCompress:
@fixture(autouse=True)
def inject_fixtures(self, caplog):
self._caplog = caplog
@patch('os.path.exists')
def setup(self, mock_exists):
mock_exists.return_value = True
self.compress = Compress('some-file', True)
@patch('os.path.exists')
def setup_method(self, cls, mock_exists):
self.setup()
def test_source_file_not_found(self):
with raises(KiwiFileNotFound):
Compress('some-file')
@patch('kiwi.command.Command.run')
def test_xz(self, mock_command):
assert self.compress.xz() == 'some-file.xz'
mock_command.assert_called_once_with(
[
'xz', '-f', '--threads=0', '--keep',
'some-file'
]
)
assert self.compress.compressed_filename == 'some-file.xz'
@patch('kiwi.command.Command.run')
def test_xz_with_custom_options(self, mock_command):
assert self.compress.xz(options=['foo', 'bar']) == 'some-file.xz'
mock_command.assert_called_once_with(
[
'xz', '-f', 'foo', 'bar', '--keep',
'some-file'
]
)
assert self.compress.compressed_filename == 'some-file.xz'
@patch('kiwi.command.Command.run')
def test_gzip(self, mock_command):
assert self.compress.gzip() == 'some-file.gz'
mock_command.assert_called_once_with(
['gzip', '-f', '-9', '--keep', 'some-file']
)
assert self.compress.compressed_filename == 'some-file.gz'
@patch('kiwi.command.Command.run')
@patch('kiwi.utils.compress.Temporary.new_file')
@patch('kiwi.utils.compress.Compress.get_format')
def test_uncompress(self, mock_format, mock_temp, mock_command):
mock_format.return_value = 'xz'
self.compress.uncompress()
mock_command.assert_called_once_with(
['xz', '-d', 'some-file']
)
assert self.compress.uncompressed_filename == 'some-file'
@patch('kiwi.command.Command.run')
@patch('kiwi.utils.compress.Temporary.new_file')
@patch('kiwi.utils.compress.Compress.get_format')
def test_uncompress_temporary(self, mock_format, mock_temp, mock_command):
tempfile = Mock()
tempfile.name = 'tempfile'
mock_temp.return_value = tempfile
mock_format.return_value = 'xz'
self.compress.uncompress(temporary=True)
mock_command.assert_called_once_with(
['bash', '-c', 'xz -c -d some-file > tempfile']
)
assert self.compress.uncompressed_filename == 'tempfile'
@patch('kiwi.utils.compress.Compress.get_format')
def test_uncompress_unknown_format(self, mock_format):
mock_format.return_value = None
with raises(KiwiCompressionFormatUnknown):
self.compress.uncompress()
@patch('kiwi.path.Path.which')
def test_get_format(self, mock_which):
mock_which.side_effect = ['xz']
xz = Compress('../data/xz_data.xz')
assert xz.get_format() == 'xz'
mock_which.side_effect = ['xz', 'gzip']
gzip = Compress('../data/gz_data.gz')
assert gzip.get_format() == 'gzip'
@patch('kiwi.command.Command.run')
def test_get_format_invalid_format(self, mock_run):
result = Mock()
result.returncode = 1
mock_run.return_value = result
invalid = Compress("../data/gz_data.gz")
invalid.supported_zipper = ["mock_zip"]
with self._caplog.at_level(logging.DEBUG):
assert invalid.get_format() is None
mock_run.assert_called_once_with(
['mock_zip', '-l', '../data/gz_data.gz'], raise_on_error=False
)