kiwi-el8/test/unit/utils/veritysetup_test.py
Alexandre Detiste fb69627ad3
Use unittest.mock from core python everywhere
mock was an independent module that has been merged into the Python standard library.
2024-02-18 22:15:30 +01:00

179 lines
6.8 KiB
Python

import io
from textwrap import dedent
from pytest import raises
from unittest.mock import (
patch, Mock, MagicMock, call
)
from kiwi.utils.veritysetup import VeritySetup
from kiwi.exceptions import KiwiOffsetError
import kiwi.defaults as defaults
class TestVeritySetup:
@patch('os.path.getsize')
def setup(self, mock_os_path_getsize):
mock_os_path_getsize.return_value = 4096
self.veritysetup = VeritySetup('image_file', data_blocks=10)
self.veritysetup_full = VeritySetup('image_file')
self.verity_dict = {
'UUID': '',
'Hashtype': '1',
'Datablocks': '10',
'Datablocksize': '4096',
'Hashblocksize': '4096',
'Hashalgorithm': 'sha256',
'Salt': 'fb074d1db50...',
'Roothash': 'e2728628377...'
}
@patch('os.path.getsize')
def setup_method(self, cls, mock_os_path_getsize):
self.setup()
@patch('kiwi.utils.veritysetup.Command.run')
def test_format(self, mock_Command_run):
self.veritysetup.format()
mock_Command_run.assert_called_once_with(
[
'veritysetup', 'format', 'image_file', 'image_file',
'--no-superblock', '--hash-offset=4096',
'--hash-block-size=4096', '--data-blocks=10',
'--data-block-size=4096',
]
)
@patch('kiwi.utils.veritysetup.Command.run')
@patch('kiwi.utils.veritysetup.Temporary.new_file')
@patch('os.path.getsize')
def test_get_hash_byte_size(
self, mock_os_path_getsize, mock_Temporary_new_file, mock_Command_run
):
tempfile = Mock()
tempfile.name = 'tempfile'
mock_Temporary_new_file.return_value = tempfile
assert self.veritysetup.get_hash_byte_size() == \
mock_os_path_getsize.return_value
mock_Command_run.assert_called_once_with(
[
'veritysetup', 'format', 'image_file', 'tempfile',
'--no-superblock', '--hash-block-size=4096', '--data-blocks=10',
'--data-block-size=4096',
]
)
@patch('kiwi.utils.veritysetup.Command.run')
def test_format_full(self, mock_Command_run):
verity_call = Mock()
verity_call.output = dedent('''\n
VERITY header information for mysquash.img
UUID:
Hash type: 1
Data blocks: 10
Data block size: 4096
Hash block size: 4096
Hash algorithm: sha256
Salt: fb074d1db50...
Root hash: e2728628377...
''')
mock_Command_run.return_value = verity_call
assert self.veritysetup_full.format() == self.verity_dict
mock_Command_run.assert_called_once_with(
[
'veritysetup', 'format', 'image_file', 'image_file',
'--no-superblock', '--hash-offset=4096',
'--hash-block-size=4096'
]
)
def test_store_credentials(self):
self.veritysetup.verity_call = Mock()
self.veritysetup.verity_dict = self.verity_dict
target_block_id = Mock()
target_block_id.get_blkid.return_value = 'uuid'
with patch('builtins.open', create=True) as mock_open:
mock_open.return_value = MagicMock(spec=io.IOBase)
file_handle = mock_open.return_value.__enter__.return_value
self.veritysetup.store_credentials(
'credentials_file', target_block_id
)
assert file_handle.write.call_args_list == [
call('Datablocks: 10\n'),
call('Datablocksize: 4096\n'),
call('Hashalgorithm: sha256\n'),
call('Hashblocksize: 4096\n'),
call('Hashtype: 1\n'),
call('Roothash: e2728628377...\n'),
call('Salt: fb074d1db50...\n'),
call('UUID: \n'),
call('Root hashoffset: 4096'),
call('\n'),
call('Superblock: --no-superblock'),
call('\n')
]
@patch('kiwi.utils.veritysetup.BlockID')
def test_get_block_storage_filesystem(self, mock_BlockID):
block_id = Mock()
mock_BlockID.return_value = block_id
block_id.get_filesystem.return_value = 'ext3'
assert self.veritysetup.get_block_storage_filesystem() == 'ext3'
block_id.get_filesystem.side_effect = Exception
assert self.veritysetup.get_block_storage_filesystem() == ''
@patch('os.path.getsize')
def test_write_verification_metadata_raises(self, mock_os_path_getsize):
mock_os_path_getsize.return_value = 8192
metadata_file = Mock()
self.veritysetup.verification_metadata_file = metadata_file
with raises(KiwiOffsetError):
self.veritysetup.write_verification_metadata('/some/device')
@patch('os.path.getsize')
def test_write_verification_metadata(self, mock_os_path_getsize):
mock_os_path_getsize.return_value = 4096
metadata_file = Mock()
metadata_file.name = 'metadata_file'
self.veritysetup.verification_metadata_file = metadata_file
with patch('builtins.open', create=True) as mock_open:
mock_open.return_value = MagicMock(spec=io.IOBase)
file_handle = mock_open.return_value.__enter__.return_value
self.veritysetup.write_verification_metadata('/some/device')
assert mock_open.call_args_list == [
call('metadata_file', 'rb'),
call('/some/device', 'r+b')
]
file_handle.seek.assert_called_once_with(
-defaults.DM_METADATA_OFFSET, 2
)
file_handle.write.assert_called_once_with(
file_handle.read.return_value
)
@patch.object(VeritySetup, 'get_block_storage_filesystem')
def test_create_verity_verification_metadata(
self, mock_get_block_storage_filesystem
):
mock_get_block_storage_filesystem.return_value = 'ext4'
self.veritysetup.verity_dict = self.verity_dict
with patch('builtins.open', create=True) as mock_open:
mock_open.return_value = MagicMock(spec=io.IOBase)
file_handle = mock_open.return_value.__enter__.return_value
self.veritysetup.create_verity_verification_metadata()
assert file_handle.write.call_args_list == [
call(b'1 ext4 ro verity'),
call(b'\xff'),
call(b'1 4096 4096 10 1 sha256 e2728628377... fb074d1db50...'),
call(b'\xff'),
call(b'\x00')
]
@patch('kiwi.utils.veritysetup.Signature')
def test_sign_verification_metadata(self, mock_Signature):
metadata_file = Mock()
metadata_file.name = 'metadata_file'
self.veritysetup.verification_metadata_file = metadata_file
self.veritysetup.sign_verification_metadata()
mock_Signature.return_value.sign.assert_called_once_with()