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

tests/riotboot: migrate to full python test script

This commit is contained in:
Francisco Molina 2019-07-16 08:59:49 +02:00
parent dbbdd703ea
commit 12761934bc
6 changed files with 89 additions and 81 deletions

View File

@ -13,13 +13,9 @@ BINDIR_APP = $(BINDIR)/$(APPLICATION)
#
export SLOT0_OFFSET SLOT0_LEN SLOT1_OFFSET SLOT1_LEN
# Mandatory APP_VER, set to epoch by default, or "0" for CI build
ifeq (1, RIOT_CI_BUILD)
APP_VER ?= 0
else
EPOCH := $(shell date +%s)
APP_VER ?= $(EPOCH)
endif
# Mandatory APP_VER, set to epoch by default
EPOCH := $(shell date +%s)
APP_VER ?= $(EPOCH)
# Final target for slot 0 with riot_hdr
SLOT0_RIOT_BIN = $(BINDIR_APP)-slot0.$(APP_VER).riot.bin

View File

@ -16,11 +16,6 @@ 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
# Ensure both slot bin files are always generated and linked to avoid compiling
# during the test. This ensures that "BUILD_IN_DOCKER=1 make test"
# can rely on them being present without having to trigger re-compilation.

View File

@ -27,14 +27,14 @@ functionality:
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
1. flash bootloader and slot0, invalidate slot1
2. get the running slot and current APP_VER
3. flash slot1 with APP_VER set to 1
4. verify slot1 has booted and shows APP_VER==1
3. flash slot1 with APP_VER + 1
4. verify slot1 has booted and shows version = APP_VER + 1
5. flash slot0 with APP_VER set to 2
6. verify slot0 has booted and shows APP_VER==2
5. flash slot0 with APP_VER + 2
4. verify slot0 has booted and shows version = APP_VER + 2
If this test runs correctly, it shows that riotboot's basic functions and are
If this test runs correctly, it shows that riotboot's basic functions are
working properly on the target board.

79
tests/riotboot/tests/01-run.py Executable file
View File

@ -0,0 +1,79 @@
#!/usr/bin/env python3
# Copyright (C) 2018 Federico Pellegrin <fede@evolware.org>
# Copyright (C) 2019 Francisco Molina <francois-xavier.molina@inria.fr>
#
# This file is subject to the terms and conditions of the GNU Lesser
# General Public License v2.1. See the file LICENSE in the top level
# directory for more details.
import sys
import subprocess
from testrunner import run
def flash_slot(slotnum, version):
cmd = [
"make",
"RIOTBOOT_SKIP_COMPILE=1",
"riotboot/flash-slot{}".format(slotnum),
"APP_VER={}".format(version),
]
assert subprocess.call(cmd) == 0
def assert_check_slot(child, slotnum, version):
# Check if it's running on the expected slot
child.expect_exact('>')
child.sendline("curslotnr")
child.expect_exact("Current slot={}".format(slotnum))
# Ask for current slot header info and check for basic output integrity
child.expect_exact('>')
child.sendline("curslothdr")
# Magic number is "RIOT" (always in little endian)
child.expect_exact("Image magic_number: 0x544f4952")
# Other info is hardware/app dependent so we just check basic compliance
child.expect_exact("Image Version: {0:#0{1}x}".format(version, 10))
child.expect(r"Image start address: 0x[0-9a-fA-F]{8}\r\n")
child.expect(r"Header chksum: 0x[0-9a-fA-F]{8}\r\n")
# Ask for address of slot 0
child.expect_exact('>')
child.sendline("getslotaddr 0")
child.expect(r"Slot 0 address=0x[0-9a-fA-F]{8}\r\n")
# Ask for data of all slots
child.expect_exact('>')
child.sendline("dumpaddrs")
child.expect(r"slot 0: metadata: 0x[0-9a-fA-F]{1,8} "
r"image: 0x[0-9a-fA-F]{8}\r\n")
child.expect(r"slot 1: metadata: 0x[0-9a-fA-F]{1,8} "
r"image: 0x[0-9a-fA-F]{8}\r\n")
child.expect_exact('>')
def testfunc(child):
# Ask for current slot, should be 0 or 1
child.expect_exact('>')
child.sendline("curslotnr")
child.expect(r"Current slot=([0-1])")
slotnum = int(child.match.group(1))
# Ask for current APP_VER
child.expect_exact('>')
child.sendline("curslothdr")
child.expect(r"Image Version: (?P<app_ver>0x[0-9a-fA-F]{8})\r\n")
current_app_ver = int(child.match.group("app_ver"), 16)
# Flash to both slots and verify basic functions
for version in [current_app_ver + 1, current_app_ver + 2]:
slotnum = slotnum ^ 1
flash_slot(slotnum, version)
assert_check_slot(child, slotnum, version)
print("TEST PASSED")
if __name__ == "__main__":
sys.exit(run(testfunc))

View File

@ -1,14 +0,0 @@
#!/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

@ -1,48 +0,0 @@
#!/usr/bin/env python3
# Copyright (C) 2018 Federico Pellegrin <fede@evolware.org>
#
# This file is subject to the terms and conditions of the GNU Lesser
# General Public License v2.1. See the file LICENSE in the top level
# directory for more details.
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=%s" % (slotnum))
child.expect('>')
# Ask for current slot header info and checks for basic output integrity
child.sendline("curslothdr")
# Magic number is "RIOT" (always in little endian)
child.expect_exact("Image magic_number: 0x544f4952")
# Other info is hardware/app dependent so we just check basic compliance
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('>')
# Ask for address of slot 0
child.sendline("getslotaddr 0")
child.expect("Slot 0 address=0x[0-9a-fA-F]{8}")
child.expect('>')
# Ask for data of all slots
child.sendline("dumpaddrs")
child.expect("slot 0: metadata: 0x[0-9a-fA-F]{1,8} image: 0x[0-9a-fA-F]{8}")
child.expect('>')
if __name__ == "__main__":
sys.exit(run(testfunc))