kiwi-el8/test/unit/tasks/result_bundle_test.py
Marcus Schäfer 0ee9e22556
Only wipe bundle dir when required
The given result bundle dir must only be wiped if the
request to turn the result files into an rpm was given.
Only in this case the given bundle dir must start empty
2021-09-10 22:42:23 +02:00

283 lines
10 KiB
Python

import os
import sys
import logging
from mock import (
patch, call, Mock, mock_open
)
from pytest import (
raises, fixture
)
from ..test_helper import argv_kiwi_tests
import kiwi
from kiwi.tasks.result_bundle import ResultBundleTask
from kiwi.system.result import Result
from kiwi.exceptions import KiwiBundleError
class TestResultBundleTask:
@fixture(autouse=True)
def inject_fixtures(self, caplog):
self._caplog = caplog
def setup(self):
sys.argv = [
sys.argv[0], 'result', 'bundle', '--target-dir', 'target_dir',
'--bundle-dir', 'bundle_dir', '--id', 'Build_42'
]
self.abs_target_dir = os.path.abspath('target_dir')
self.abs_bundle_dir = os.path.abspath('bundle_dir')
self.xml_state = Mock()
self.xml_state.get_image_version = Mock(
return_value='1.2.3'
)
self.xml_state.xml_data.get_name = Mock(
return_value='test-image'
)
self.result = Result(self.xml_state)
self.result.add(
key='keyname', filename='test-image-1.2.3',
use_for_bundle=True, compress=True, shasum=True
)
kiwi.tasks.result_bundle.Help = Mock(
return_value=Mock()
)
self.task = ResultBundleTask()
runtime_config = Mock()
runtime_config.is_bundle_compression_requested = Mock(
return_value=True
)
self.task.runtime_config = runtime_config
def teardown(self):
sys.argv = argv_kiwi_tests
def _init_command_args(self):
self.task.command_args = {}
self.task.command_args['help'] = False
self.task.command_args['bundle'] = False
self.task.command_args['--target-dir'] = 'target_dir'
self.task.command_args['--bundle-dir'] = 'bundle_dir'
self.task.command_args['--id'] = 'Build_42'
self.task.command_args['--zsync-source'] = None
self.task.command_args['--package-as-rpm'] = None
def test_process_invalid_bundle_directory(self):
self._init_command_args()
self.task.command_args['--bundle-dir'] = \
self.task.command_args['--target-dir']
self.task.command_args['bundle'] = True
with raises(KiwiBundleError):
self.task.process()
@patch('kiwi.tasks.result_bundle.Result.load')
@patch('kiwi.tasks.result_bundle.Command.run')
@patch('kiwi.tasks.result_bundle.Path.create')
@patch('kiwi.tasks.result_bundle.Path.which')
@patch('kiwi.tasks.result_bundle.Compress')
@patch('kiwi.tasks.result_bundle.Checksum')
@patch('os.path.exists')
def test_process_result_bundle(
self, mock_exists, mock_checksum, mock_compress,
mock_path_which, mock_path_create, mock_command, mock_load
):
# This file won't be copied with build id
self.result.add(
key='noversion', filename='test-image-noversion',
use_for_bundle=True, compress=False, shasum=False
)
checksum = Mock()
compress = Mock()
mock_path_which.return_value = 'zsyncmake'
compress.compressed_filename = 'compressed_filename'
mock_compress.return_value = compress
mock_checksum.return_value = checksum
mock_exists.return_value = False
mock_load.return_value = self.result
self._init_command_args()
self.task.command_args['bundle'] = True
self.task.command_args['--zsync-source'] = 'http://example.com/zsync'
m_open = mock_open()
with patch('builtins.open', m_open, create=True):
self.task.process()
mock_load.assert_called_once_with(
os.sep.join([self.abs_target_dir, 'kiwi.result'])
)
mock_path_create.assert_called_once_with(self.abs_bundle_dir)
assert mock_command.call_args_list == [
call([
'cp', 'test-image-1.2.3',
os.sep.join([self.abs_bundle_dir, 'test-image-1.2.3-Build_42'])
]),
call([
'zsyncmake', '-e',
'-u', 'http://example.com/zsync/compressed_filename',
'-o', 'compressed_filename.zsync',
'compressed_filename'
]),
call([
'cp', 'test-image-noversion',
os.sep.join([self.abs_bundle_dir, 'test-image-noversion'])
])
]
mock_compress.assert_called_once_with(
os.sep.join([self.abs_bundle_dir, 'test-image-1.2.3-Build_42'])
)
mock_checksum.assert_called_once_with(
compress.compressed_filename
)
checksum.sha256.assert_called_once_with()
m_open.return_value.write.assert_called_once_with(
'{0} compressed_filename{1}'.format(
checksum.sha256.return_value, os.linesep
)
)
@patch('kiwi.tasks.result_bundle.Privileges.check_for_root_permissions')
@patch('kiwi.tasks.result_bundle.Result.load')
@patch('kiwi.tasks.result_bundle.Command.run')
@patch('kiwi.tasks.result_bundle.Path.create')
@patch('kiwi.tasks.result_bundle.Path.which')
@patch('kiwi.tasks.result_bundle.Path.wipe')
@patch('kiwi.tasks.result_bundle.Compress')
@patch('kiwi.tasks.result_bundle.Checksum')
@patch('os.path.exists')
@patch('os.chdir')
@patch('os.unlink')
@patch('glob.iglob')
def test_process_result_bundle_as_rpm(
self, mock_iglob, mock_unlink, mock_chdir, mock_exists, mock_checksum,
mock_compress, mock_path_wipe, mock_path_which, mock_path_create,
mock_command, mock_load, mock_Privileges_check_for_root_permissions
):
checksum = Mock()
compress = Mock()
mock_path_which.return_value = 'zsyncmake'
compress.compressed_filename = 'compressed_filename'
mock_compress.return_value = compress
mock_checksum.return_value = checksum
mock_exists.return_value = False
mock_load.return_value = self.result
self._init_command_args()
self.task.command_args['bundle'] = True
self.task.command_args['--package-as-rpm'] = True
mock_iglob.return_value = [
os.sep.join([self.abs_bundle_dir, 'test-image-1.2.3-Build_42'])
]
m_open = mock_open()
with patch('builtins.open', m_open, create=True):
self.task.process()
mock_path_wipe.assert_called_once_with(self.abs_bundle_dir)
mock_Privileges_check_for_root_permissions.assert_called_once_with()
assert mock_command.call_args_list == [
call(
[
'cp', 'test-image-1.2.3',
os.sep.join(
[self.abs_bundle_dir, 'test-image-1.2.3-Build_42']
)
]
),
call(
[
'rpmbuild', '--nodeps', '--nocheck', '--rmspec', '-bb',
os.sep.join([self.abs_bundle_dir, 'test-image.spec'])
]
),
call(
['bash', '-c', 'mv noarch/*.rpm . && rmdir noarch']
)
]
mock_chdir.assert_called_once_with(
self.abs_bundle_dir
)
mock_unlink.assert_called_once_with(
os.sep.join([self.abs_bundle_dir, 'test-image-1.2.3-Build_42'])
)
@patch('kiwi.tasks.result_bundle.Result.load')
@patch('kiwi.tasks.result_bundle.Command.run')
@patch('kiwi.tasks.result_bundle.Path.create')
@patch('os.path.exists')
def test_process_result_bundle_name_includes_version(
self, mock_exists, mock_path_create, mock_command, mock_load
):
result = Result(self.xml_state)
result.add(
key='nameincludesversion', filename='test-1.2.3-image-1.2.3',
use_for_bundle=True, compress=False, shasum=False
)
self.xml_state.xml_data.get_name = Mock(
return_value='test-1.2.3-image'
)
mock_exists.return_value = False
mock_load.return_value = result
self._init_command_args()
self.task.process()
mock_load.assert_called_once_with(
os.sep.join([self.abs_target_dir, 'kiwi.result'])
)
mock_path_create.assert_called_once_with(self.abs_bundle_dir)
assert mock_command.call_args_list == [
call([
'cp', 'test-1.2.3-image-1.2.3',
os.sep.join([
self.abs_bundle_dir,
'test-1.2.3-image-1.2.3-Build_42'
])
])
]
@patch('kiwi.tasks.result_bundle.Result.load')
@patch('kiwi.tasks.result_bundle.Command.run')
@patch('kiwi.tasks.result_bundle.Path.create')
@patch('kiwi.tasks.result_bundle.Path.which')
@patch('kiwi.tasks.result_bundle.Compress')
@patch('kiwi.tasks.result_bundle.Checksum')
@patch('os.path.exists')
def test_process_result_bundle_zsyncmake_missing(
self, mock_exists, mock_checksum, mock_compress,
mock_path_which, mock_path_create, mock_command, mock_load
):
checksum = Mock()
compress = Mock()
mock_path_which.return_value = None
compress.compressed_filename = 'compressed_filename'
mock_compress.return_value = compress
mock_checksum.return_value = checksum
mock_exists.return_value = False
mock_load.return_value = self.result
self._init_command_args()
self.task.command_args['bundle'] = True
self.task.command_args['--zsync-source'] = 'http://example.com/zsync'
with patch('builtins.open'):
with self._caplog.at_level(logging.WARNING):
self.task.process()
assert '--> zsyncmake missing, zsync setup skipped' in \
self._caplog.text
def test_process_result_bundle_help(self):
self._init_command_args()
self.task.command_args['help'] = True
self.task.command_args['bundle'] = True
self.task.process()
self.task.manual.show.assert_called_once_with(
'kiwi::result::bundle'
)