class TestResultBundleTask:
    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

    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'.format(checksum.sha256.return_value))

    @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.logger.log.warning')
    @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, mock_log):
        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'):
            self.task.process()

        mock_log.assert_called_once_with(
            '--> zsyncmake missing, zsync setup skipped')

    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')
Esempio n. 2
0
class TestResultBundleTask(object):
    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.context_manager_mock = mock.Mock()
        self.file_mock = mock.Mock()
        self.enter_mock = mock.Mock()
        self.exit_mock = mock.Mock()
        self.enter_mock.return_value = self.file_mock
        setattr(self.context_manager_mock, '__enter__', self.enter_mock)
        setattr(self.context_manager_mock, '__exit__', self.exit_mock)

        self.file_mock.read.return_value = b'data'

        self.xml_state = mock.Mock()
        self.xml_state.get_image_version = mock.Mock(
            return_value='1.2.3'
        )

        self.result = Result(self.xml_state)
        self.result.add(
            key='keyname', filename='filename-1.2.3',
            use_for_bundle=True, compress=True, shasum=True
        )

        kiwi.tasks.result_bundle.Help = mock.Mock(
            return_value=mock.Mock()
        )
        self.task = ResultBundleTask()

    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'

    @raises(KiwiBundleError)
    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
        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.Compress')
    @patch('kiwi.tasks.result_bundle.Checksum')
    @patch('os.path.exists')
    @patch_open
    def test_process_result_bundle(
        self, mock_open, mock_exists, mock_checksum, mock_compress,
        mock_path, mock_command, mock_load
    ):
        checksum = mock.Mock()
        compress = mock.Mock()
        compress.compressed_filename = 'compressed_filename'
        mock_compress.return_value = compress
        mock_checksum.return_value = checksum
        mock_exists.return_value = False
        mock_open.return_value = self.context_manager_mock
        mock_load.return_value = self.result
        self._init_command_args()
        self.task.command_args['bundle'] = True

        self.task.process()

        mock_load.assert_called_once_with(os.sep.join([self.abs_target_dir, 'kiwi.result']))
        mock_path.assert_called_once_with(self.abs_bundle_dir)
        mock_command.assert_called_once_with(
            [
                'cp', 'filename-1.2.3',
                os.sep.join([self.abs_bundle_dir, 'filename-1.2.3-Build_42'])
            ]
        )
        mock_compress.assert_called_once_with(
            os.sep.join([self.abs_bundle_dir, 'filename-1.2.3-Build_42'])
        )
        mock_checksum.assert_called_once_with(
            compress.compressed_filename
        )
        checksum.sha256.assert_called_once_with()

    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'
        )
Esempio n. 3
0
class TestResultBundleTask(object):
    def setup(self):
        sys.argv = [
            sys.argv[0], 'result', 'bundle', '--target-dir', 'target_dir',
            '--bundle-dir', 'bundle_dir', '--id', 'Build_42'
        ]
        self.context_manager_mock = mock.Mock()
        self.file_mock = mock.Mock()
        self.enter_mock = mock.Mock()
        self.exit_mock = mock.Mock()
        self.enter_mock.return_value = self.file_mock
        setattr(self.context_manager_mock, '__enter__', self.enter_mock)
        setattr(self.context_manager_mock, '__exit__', self.exit_mock)

        self.file_mock.read.return_value = b'data'

        self.xml_state = mock.Mock()
        self.xml_state.get_image_version = mock.Mock(
            return_value='1.2.3'
        )

        self.result = Result(self.xml_state)
        self.result.add(
            key='keyname', filename='filename-1.2.3',
            use_for_bundle=True, compress=True, shasum=True
        )

        kiwi.tasks.result_bundle.Help = mock.Mock(
            return_value=mock.Mock()
        )
        self.task = ResultBundleTask()

    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'

    @raises(KiwiBundleError)
    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
        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.Compress')
    @patch('kiwi.tasks.result_bundle.Checksum')
    @patch('os.path.exists')
    @patch('builtins.open')
    def test_process_result_bundle(
        self, mock_open, mock_exists, mock_checksum, mock_compress,
        mock_path, mock_command, mock_load
    ):
        checksum = mock.Mock()
        compress = mock.Mock()
        compress.compressed_filename = 'compressed_filename'
        mock_compress.return_value = compress
        mock_checksum.return_value = checksum
        mock_exists.return_value = False
        mock_open.return_value = self.context_manager_mock
        mock_load.return_value = self.result
        self.__init_command_args()
        self.task.command_args['bundle'] = True

        self.task.process()

        mock_load.assert_called_once_with('target_dir/kiwi.result')
        mock_path.assert_called_once_with('bundle_dir')
        mock_command.assert_called_once_with(
            [
                'cp', '-l', 'filename-1.2.3',
                'bundle_dir/filename-1.2.3-Build_42'
            ]
        )
        mock_compress.assert_called_once_with(
            'bundle_dir/filename-1.2.3-Build_42'
        )
        mock_checksum.assert_called_once_with(
            compress.compressed_filename
        )
        checksum.sha256.assert_called_once_with()

    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'
        )
Esempio n. 4
0
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')
Esempio n. 5
0
class TestResultBundleTask(object):
    def setup(self):
        sys.argv = [
            sys.argv[0],
            "result",
            "bundle",
            "--target-dir",
            "target_dir",
            "--bundle-dir",
            "bundle_dir",
            "--id",
            "Build_42",
        ]
        self.context_manager_mock = mock.Mock()
        self.file_mock = mock.Mock()
        self.enter_mock = mock.Mock()
        self.exit_mock = mock.Mock()
        self.enter_mock.return_value = self.file_mock
        setattr(self.context_manager_mock, "__enter__", self.enter_mock)
        setattr(self.context_manager_mock, "__exit__", self.exit_mock)

        self.file_mock.read.return_value = b"data"

        self.xml_state = mock.Mock()
        self.xml_state.get_image_version = mock.Mock(return_value="1.2.3")

        self.result = Result(self.xml_state)
        self.result.add(key="keyname", filename="filename-1.2.3", use_for_bundle=True, compress=True, shasum=True)

        kiwi.tasks.result_bundle.Help = mock.Mock(return_value=mock.Mock())
        self.task = ResultBundleTask()

    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"

    @raises(KiwiBundleError)
    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
        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.Compress")
    @patch("kiwi.tasks.result_bundle.Checksum")
    @patch("os.path.exists")
    @patch_open
    def test_process_result_bundle(
        self, mock_open, mock_exists, mock_checksum, mock_compress, mock_path, mock_command, mock_load
    ):
        checksum = mock.Mock()
        compress = mock.Mock()
        compress.compressed_filename = "compressed_filename"
        mock_compress.return_value = compress
        mock_checksum.return_value = checksum
        mock_exists.return_value = False
        mock_open.return_value = self.context_manager_mock
        mock_load.return_value = self.result
        self._init_command_args()
        self.task.command_args["bundle"] = True

        self.task.process()

        mock_load.assert_called_once_with("target_dir/kiwi.result")
        mock_path.assert_called_once_with("bundle_dir")
        mock_command.assert_called_once_with(["cp", "-l", "filename-1.2.3", "bundle_dir/filename-1.2.3-Build_42"])
        mock_compress.assert_called_once_with("bundle_dir/filename-1.2.3-Build_42")
        mock_checksum.assert_called_once_with(compress.compressed_filename)
        checksum.sha256.assert_called_once_with()

    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")