1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

Merge pull request #11707 from kaspar030/add_riotboot_test_script

tests/riotboot: add automatic test
This commit is contained in:
Francisco 2019-07-15 13:31:48 +02:00 committed by GitHub
commit 23c918805e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 75 additions and 6 deletions

View File

@ -13,16 +13,26 @@ BINDIR_APP = $(BINDIR)/$(APPLICATION)
#
export SLOT0_OFFSET SLOT0_LEN SLOT1_OFFSET SLOT1_LEN
# Mandatory APP_VER, set to epoch by default
APP_VER ?= $(shell date +%s)
# Mandatory APP_VER, set to epoch by default, or "0" for CI build
ifeq (1, RIOT_CI_BUILD)
APP_VER ?= 0
else
APP_VER ?= $(shell date +%s)
endif
# Final target for slot 0 with riot_hdr
SLOT0_RIOT_BIN = $(BINDIR_APP)-slot0.riot.bin
SLOT1_RIOT_BIN = $(BINDIR_APP)-slot1.riot.bin
SLOT_RIOT_BINS = $(SLOT0_RIOT_BIN) $(SLOT1_RIOT_BIN)
# if RIOTBOOT_SKIP_COMPILE is set to 1, "make riotboot/slot[01](-flash)"
# will not depend on the base elf files, thus skipping the compilation step.
# This results in the equivalent to "make flash-only" for
# "make riotboot/flash-slot[01]".
ifneq (1, $(RIOTBOOT_SKIP_COMPILE))
$(BINDIR_APP)-%.elf: $(BASELIBS)
$(Q)$(_LINK) -o $@
endif
# Slot 0 and 1 firmware offset, after header
SLOT0_IMAGE_OFFSET := $$(($(SLOT0_OFFSET) + $(RIOTBOOT_HDR_LEN)))
@ -33,6 +43,14 @@ $(BINDIR_APP)-slot0.elf: FW_ROM_LEN=$$((SLOT0_LEN - $(RIOTBOOT_HDR_LEN)))
$(BINDIR_APP)-slot0.elf: ROM_OFFSET=$(SLOT0_IMAGE_OFFSET)
$(BINDIR_APP)-slot1.elf: FW_ROM_LEN=$$((SLOT1_LEN - $(RIOTBOOT_HDR_LEN)))
$(BINDIR_APP)-slot1.elf: ROM_OFFSET=$(SLOT1_IMAGE_OFFSET)
SLOT_RIOT_ELFS = $(BINDIR_APP)-slot0.elf $(BINDIR_APP)-slot1.elf
# ensure both slot elf files are always linked
# this ensures that both "make test" and "make test-murdock" can rely on them
# being present without having to trigger re-compilation.
ifneq (1, $(RIOTNOLINK))
link: $(SLOT_RIOT_ELFS)
endif
# Create binary target with RIOT header
$(SLOT_RIOT_BINS): %.riot.bin: %.hdr %.bin

View File

@ -18,5 +18,16 @@ DEVELHELP ?= 1
# Change this to 0 show compiler invocation lines by default:
QUIET ?= 1
# The test script assumes initially version "0" is flashed,
# as done by the CI.
# Thus default to that (instead of epoch set by makefiles/boot/riotboot.inc.mk).
APP_VER?=0
# The test needs the linked slot binaries without header in order to be able to
# create final binaries with specific APP_VER values. The CI RasPi test workers
# don't compile themselves, thus add the required files here so they will be
# submitted along with the test jobs.
TEST_EXTRA_FILES=$(SLOT_RIOT_ELFS)
include ../Makefile.tests_common
include $(RIOTBASE)/Makefile.include

View File

@ -17,5 +17,24 @@ This test should foremost give you an overview how to use riotboot:
In this test two modules `riotboot_hdr` and `riotboot_slot` are used to showcase
the access to riotboot shared functions.
- `make test` can be executed to run the automatic Python test that checks
basic functionalities of riotboot
Automatic test
==============
This application's "test" target can be used to test basic riotboot
functionality:
BOARD=<board> make flash test
This will:
1. flash bootloader and slot0 with APP_VER=0, invalidate slot1
2. verify slot0 has been booted and has APP_VER set to 0
3. flash slot1 with APP_VER set to 1
4. verify slot1 has booted and shows APP_VER==1
5. flash slot0 with APP_VER set to 2
6. verify slot0 has booted and shows APP_VER==2
If this test runs correctly, it shows that riotboot's basic functions and are
working properly on the target board.

View File

@ -0,0 +1,14 @@
#!/bin/sh
export RIOTBOOT_SKIP_COMPILE=1
set -e
${APPDIR}/tests/common/assert_slotnum.py 0 0
APP_VER=1 make -C${APPDIR} riotboot/flash-slot1
${APPDIR}/tests/common/assert_slotnum.py 1 1
APP_VER=2 make -C${APPDIR} riotboot/flash-slot0
${APPDIR}/tests/common/assert_slotnum.py 0 2
echo "[TEST PASSED]"

View File

@ -9,11 +9,18 @@
import sys
from testrunner import run
slotnum = int(sys.argv[1])
app_ver = int(sys.argv[2])
print("expecting slot number %s, app_ver %s" % (slotnum, app_ver))
def testfunc(child):
global slotnum
global app_ver
# Ask for current slot, should be 0 or 1
child.sendline("curslotnr")
child.expect("Current slot=[0-1]")
child.expect("Current slot=%s" % (slotnum))
child.expect('>')
# Ask for current slot header info and checks for basic output integrity
@ -21,7 +28,7 @@ def testfunc(child):
# Magic number is "RIOT" (always in little endian)
child.expect_exact("Image magic_number: 0x544f4952")
# Other info is hardware/app dependant so we just check basic compliance
child.expect("Image Version: 0x[0-9a-fA-F]{8}")
child.expect("Image Version: %s" % ("{0:#0{1}x}".format(app_ver, 10)))
child.expect("Image start address: 0x[0-9a-fA-F]{8}")
child.expect("Header chksum: 0x[0-9a-fA-F]{8}")
child.expect('>')