blob: a4439c26fba07c5df9cc488ecfe36380630467f3 [file] [log] [blame]
# Copyright (c) 2023 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: Apache-2.0
from __future__ import annotations
import logging
from pathlib import Path
from twister_harness import DeviceAdapter, Shell, MCUmgr
from utils import (
find_in_config,
match_lines,
match_no_lines,
check_with_shell_command,
check_with_mcumgr_command,
)
from test_upgrade import create_signed_image, PROJECT_NAME
logger = logging.getLogger(__name__)
def test_downgrade_prevention(dut: DeviceAdapter, shell: Shell, mcumgr: MCUmgr):
"""
Verify that the application is not downgraded
1) Device flashed with MCUboot and an application that contains SMP server.
Image version is 1.1.1+1
2) Prepare an update of an application containing the SMP server, where
image version is 0.0.0 (lower than version of the original app)
3) Upload the application update to slot 1 using mcumgr
4) Flag the application update in slot 1 as 'pending' by using mcumgr 'test'
5) Restart the device, verify that downgrade prevention mechanism
blocked the image swap
6) Verify that the original application is booted (version 1.1.1)
"""
origin_version = find_in_config(
Path(dut.device_config.build_dir) / PROJECT_NAME / 'zephyr' / '.config',
'CONFIG_MCUBOOT_IMGTOOL_SIGN_VERSION'
)
check_with_shell_command(shell, origin_version)
assert origin_version != '0.0.0+0'
logger.info('Prepare upgrade image with lower version')
image_to_test = create_signed_image(dut.device_config.build_dir, '0.0.0+0')
logger.info('Upload image with mcumgr')
dut.disconnect()
mcumgr.image_upload(image_to_test)
logger.info('Test uploaded APP image')
second_hash = mcumgr.get_hash_to_test()
mcumgr.image_test(second_hash)
mcumgr.reset_device()
dut.connect()
output = dut.readlines_until('Launching primary slot application')
match_no_lines(output, ['Starting swap using move algorithm'])
match_lines(output, ['erased due to downgrade prevention'])
logger.info('Verify that the original APP is booted')
check_with_shell_command(shell, origin_version)
dut.disconnect()
check_with_mcumgr_command(mcumgr, origin_version)