| # SPDX-License-Identifier: Apache-2.0 |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| from pathlib import Path |
| |
| import pytest |
| from click.testing import CliRunner |
| |
| from imgtool.image import Image |
| from imgtool.main import ( |
| comp_default_lp, |
| comp_default_dictsize, |
| comp_default_lc, |
| create_lzma2_header, |
| comp_default_pb, |
| imgtool, |
| ) |
| |
| VERSION = '2.0.0' |
| HEADER_SIZE = 0x200 |
| SLOT_SIZE = 0x7a000 |
| |
| |
| @pytest.fixture |
| def key_file() -> Path: |
| return Path(__file__).parents[2] / 'root-ec-p256.pem' |
| |
| |
| def check_if_compressed(out_file: Path) -> bool: |
| # Verify output file. There should be better solution to check |
| # if the output file is correctly compressed with lzma2. |
| # For now we check only if the output image contains |
| # some specific for lzma2 values. |
| img = Image(version=VERSION, header_size=HEADER_SIZE, slot_size=SLOT_SIZE, pad_header=True) |
| img.load(out_file) |
| compression_header = create_lzma2_header( |
| dictsize=comp_default_dictsize, pb=comp_default_pb, |
| lc=comp_default_lc, lp=comp_default_lp |
| ) |
| return compression_header in img.payload |
| |
| |
| @pytest.mark.parametrize( |
| 'compression, compressed', |
| [ |
| ('lzma2', True), |
| ('disabled', False) |
| ] |
| ) |
| def test_lzma2_compression(tmpdir: Path, key_file: Path, compression: str, compressed: bool): |
| """ |
| Test if lzma2 compression works by running ``imgtool sign`` |
| command and checking expected output. |
| """ |
| in_file = tmpdir / 'zephyr.bin' |
| with in_file.open("wb") as f: |
| f.write(b"hello world\x00\x00\x00\x00\x00" * 64) |
| out_file: Path = tmpdir / 'zephyr_signed.bin' |
| |
| runner = CliRunner() |
| result = runner.invoke( |
| imgtool, |
| [ |
| 'sign', |
| str(in_file), |
| str(out_file), |
| f'--header-size={HEADER_SIZE}', |
| f'--slot-size={SLOT_SIZE}', |
| f'--version={VERSION}', |
| '--pad-header', |
| f'--compression={compression}', |
| f'--key={key_file}' |
| ], |
| ) |
| assert result.exit_code == 0 |
| assert out_file.exists() |
| assert check_if_compressed(out_file) is compressed |