Skip to content

Commit dbcea53

Browse files
committed
Improved test, added scenario separation
1 parent afa4b72 commit dbcea53

1 file changed

Lines changed: 132 additions & 81 deletions

File tree

test-app/emu-test-apps/test.sh

Lines changed: 132 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,42 @@ if [[ "$ARCH_OFFSET" == "0" || "$ARCH_OFFSET" == "0x0" ]]; then
9191
fi
9292
fi
9393

94-
BOOT_OFFSET=$((BOOT_ADDR - ARCH_OFFSET))
95-
UPDATE_OFFSET=$((UPDATE_ADDR - ARCH_OFFSET))
94+
normalize_flash_addr() {
95+
local addr="$1"
96+
if [[ "$ARCH_OFFSET" == "0x08000000" ]]; then
97+
if (( addr >= 0x0c000000 && addr < 0x10000000 )); then
98+
addr=$((addr - 0x04000000))
99+
fi
100+
fi
101+
echo "$addr"
102+
}
103+
104+
BOOT_ADDR_NORM="$(normalize_flash_addr "$BOOT_ADDR")"
105+
UPDATE_ADDR_NORM="$(normalize_flash_addr "$UPDATE_ADDR")"
106+
107+
BOOT_OFFSET=$((BOOT_ADDR_NORM - ARCH_OFFSET))
108+
UPDATE_OFFSET=$((UPDATE_ADDR_NORM - ARCH_OFFSET))
96109
BOOT_OFFSET_HEX=$(printf "0x%x" "$BOOT_OFFSET")
97110
UPDATE_OFFSET_HEX=$(printf "0x%x" "$UPDATE_OFFSET")
98111

112+
get_check_config_val() {
113+
local key="$1"
114+
local val
115+
make -C "$WOLFBOOT_ROOT/tools/check_config" check_config RAM_CODE=0 >/dev/null
116+
val="$("$WOLFBOOT_ROOT/tools/check_config/check_config" | grep -m1 "^${key}" | sed 's/.*: *//')"
117+
[[ -n "$val" ]] || die "missing ${key} from tools/check_config output"
118+
echo "0x$val"
119+
}
120+
121+
BOOT_FLAGS_ADDR="$(get_check_config_val PART_BOOT_ENDFLAGS)"
122+
UPDATE_FLAGS_ADDR="$(get_check_config_val PART_UPDATE_ENDFLAGS)"
123+
BOOT_FLAGS_ADDR_NORM="$(normalize_flash_addr "$BOOT_FLAGS_ADDR")"
124+
UPDATE_FLAGS_ADDR_NORM="$(normalize_flash_addr "$UPDATE_FLAGS_ADDR")"
125+
BOOT_FLAGS_OFFSET=$((BOOT_FLAGS_ADDR_NORM - ARCH_OFFSET))
126+
UPDATE_FLAGS_OFFSET=$((UPDATE_FLAGS_ADDR_NORM - ARCH_OFFSET))
127+
BOOT_FLAGS_OFFSET_HEX=$(printf "0x%x" "$BOOT_FLAGS_OFFSET")
128+
UPDATE_FLAGS_OFFSET_HEX=$(printf "0x%x" "$UPDATE_FLAGS_OFFSET")
129+
99130
M33MU_TZ_ARGS=(--no-tz)
100131
if [[ "${TZEN}" == "1" ]]; then
101132
M33MU_TZ_ARGS=()
@@ -106,6 +137,17 @@ if command -v stdbuf >/dev/null 2>&1; then
106137
STDBUF="stdbuf -o0 -e0"
107138
fi
108139

140+
SCENARIOS_RAW="${SCENARIOS:-}"
141+
SCENARIOS_UP="$(echo "$SCENARIOS_RAW" | tr '[:lower:]' '[:upper:]' | tr -d ' ' | sed -e 's/,,*/,/g' -e 's/^,//' -e 's/,$//')"
142+
143+
want_scenario() {
144+
local s="$1"
145+
if [[ -z "$SCENARIOS_UP" ]]; then
146+
return 0
147+
fi
148+
echo "$SCENARIOS_UP" | grep -Eq "(^|,)$s(,|$)"
149+
}
150+
109151
EMU_PATH="$EMU_APPS/$EMU_DIR"
110152
WOLFBOOT_BIN="$WOLFBOOT_ROOT/wolfboot.bin"
111153
FACTORY_FLASH="$EMU_PATH/factory.bin"
@@ -203,12 +245,11 @@ assemble_factory() {
203245

204246
print_partition_flags() {
205247
local label="$1"
206-
python3 - "$FACTORY_FLASH" "$BOOT_ADDR" "$UPDATE_ADDR" "$PART_SIZE" "$SECTOR_SIZE" <<'PY' | sed "s/^/==> ${label}: /"
248+
python3 - "$FACTORY_FLASH" "$BOOT_FLAGS_OFFSET_HEX" "$UPDATE_FLAGS_OFFSET_HEX" "$SECTOR_SIZE" <<'PY' | sed "s/^/==> ${label}: /"
207249
import sys
208-
path, boot_s, update_s, size_s, sect_s = sys.argv[1:6]
250+
path, boot_s, update_s, sect_s = sys.argv[1:5]
209251
boot = int(boot_s, 0)
210252
update = int(update_s, 0)
211-
size = int(size_s, 0)
212253
sect = int(sect_s, 0)
213254
214255
def decode(state):
@@ -224,29 +265,29 @@ def decode(state):
224265
return "SUCCESS(0x00)"
225266
return f"0x{state:02x}"
226267
227-
def read_state(addr):
268+
def read_state(endflags):
228269
try:
229270
with open(path, "rb") as f:
230-
f.seek(addr + size - 4)
271+
f.seek(endflags - 4)
231272
magic = f.read(4)
232273
if magic != b"BOOT":
233274
return None
234-
f.seek(addr + size - 5)
275+
f.seek(endflags - 5)
235276
b = f.read(1)
236277
if not b:
237278
return None
238279
return b[0]
239280
except Exception:
240281
return None
241282
242-
def read_state_alt(addr):
283+
def read_state_alt(endflags):
243284
try:
244285
with open(path, "rb") as f:
245-
f.seek(addr + size - sect - 4)
286+
f.seek(endflags - sect - 4)
246287
magic = f.read(4)
247288
if magic != b"BOOT":
248289
return None
249-
f.seek(addr + size - sect - 5)
290+
f.seek(endflags - sect - 5)
250291
b = f.read(1)
251292
if not b:
252293
return None
@@ -392,83 +433,93 @@ make -C "$EMU_APPS" TARGET="$TARGET" TZEN="${TZEN:-0}" EMU_VERSION=4 IMAGE_HEADE
392433
make -C "$EMU_APPS" TARGET="$TARGET" TZEN="${TZEN:-0}" EMU_VERSION=7 IMAGE_HEADER_SIZE="$IMAGE_HEADER_SIZE" sign-emu
393434
make -C "$EMU_APPS" TARGET="$TARGET" TZEN="${TZEN:-0}" EMU_VERSION=8 IMAGE_HEADER_SIZE="$IMAGE_HEADER_SIZE" sign-emu
394435

395-
assemble_factory
396-
397-
log "Scenario A: factory boot"
398-
print_partition_flags "Scenario A: flags before factory run"
399-
log "factory run: boot image v1, expect UART get_version=1"
400-
set +e
401-
$STDBUF "$M33MU" --cpu "$EMU_CPU" --uart-stdout "${M33MU_TZ_ARGS[@]}" \
402-
--timeout "$BOOT_TIMEOUT" --quit-on-faults \
403-
"$FACTORY_FLASH" >"$EMU_PATH/factory.log" 2>&1
404-
factory_rc=$?
405-
set -e
406-
if ! grep -q "get_version=1" "$EMU_PATH/factory.log"; then
407-
tail -n 80 "$EMU_PATH/factory.log" | sed 's/^/ | /'
408-
die "factory run: expected get_version=1"
409-
fi
410-
if [[ $factory_rc -ne 0 && $factory_rc -ne 127 ]]; then
411-
die "factory run: m33mu exited with $factory_rc"
436+
if want_scenario "A"; then
437+
assemble_factory
438+
439+
log "Scenario A: factory boot"
440+
print_partition_flags "Scenario A: flags before factory run"
441+
log "factory run: boot image v1, expect UART get_version=1"
442+
set +e
443+
$STDBUF "$M33MU" --cpu "$EMU_CPU" --uart-stdout "${M33MU_TZ_ARGS[@]}" \
444+
--timeout "$BOOT_TIMEOUT" --quit-on-faults \
445+
"$FACTORY_FLASH" >"$EMU_PATH/factory.log" 2>&1
446+
factory_rc=$?
447+
set -e
448+
if ! grep -q "get_version=1" "$EMU_PATH/factory.log"; then
449+
tail -n 80 "$EMU_PATH/factory.log" | sed 's/^/ | /'
450+
die "factory run: expected get_version=1"
451+
fi
452+
if [[ $factory_rc -ne 0 && $factory_rc -ne 127 ]]; then
453+
die "factory run: m33mu exited with $factory_rc"
454+
fi
455+
log "factory run: ok (version=1)"
456+
457+
log "Scenario A: receive v7 update without trigger (expect BKPT 0x4D, stay on v1)"
458+
assemble_factory
459+
run_update_scenario "scenario_a_update_v7" "$UPDATE_IMAGE_V7" 7 0x4d
460+
print_partition_versions "Scenario A: v7 update stored, version remains 1"
412461
fi
413-
log "factory run: ok (version=1)"
414462

415-
log "Scenario A: receive v7 update without trigger (expect BKPT 0x4D, stay on v1)"
416-
assemble_factory
417-
run_update_scenario "scenario_a_update_v7" "$UPDATE_IMAGE_V7" 7 0x4d
418-
print_partition_versions "Scenario A: v7 update stored, version remains 1"
463+
if want_scenario "B"; then
464+
log "Scenario B: successful update from v1 to v4"
465+
assemble_factory
466+
print_partition_flags "Scenario B: flags before update"
467+
run_update_scenario "scenario_b_update" "$UPDATE_IMAGE_V4" 4 0x47
468+
469+
for i in 1 2; do
470+
run_log="$EMU_PATH/reboot_v4_${i}.log"
471+
log "Scenario B: reboot run $i: boot updated image v4, expect BKPT 0x4A (success)"
472+
$STDBUF "$M33MU" --cpu "$EMU_CPU" --uart-stdout "${M33MU_TZ_ARGS[@]}" \
473+
--timeout "$REBOOT_TIMEOUT" --expect-bkpt=0x4a --quit-on-faults \
474+
"$FACTORY_FLASH" >"$run_log" 2>&1 || die "reboot v4 run $i: m33mu failed"
475+
grep -q "\\[EXPECT BKPT\\] Success" "$run_log" || die "reboot v4 run $i: expected BKPT 0x4A"
476+
log "Scenario B: reboot run $i: BKPT 0x4A hit"
477+
done
478+
fi
419479

420-
log "Scenario B: successful update from v1 to v4"
421-
assemble_factory
422-
print_partition_flags "Scenario B: flags before update"
423-
run_update_scenario "scenario_b_update" "$UPDATE_IMAGE_V4" 4 0x47
480+
if want_scenario "C"; then
481+
log "Scenario C: update from v1 to v3, then fallback (no wolfBoot_success is called)"
482+
assemble_factory
483+
print_partition_flags "Scenario C: flags before update"
484+
run_update_scenario "scenario_c_update" "$UPDATE_IMAGE_V3" 3 0x47
424485

425-
for i in 1 2; do
426-
run_log="$EMU_PATH/reboot_v4_${i}.log"
427-
log "Scenario B: reboot run $i: boot updated image v4, expect BKPT 0x4A (success)"
486+
log "Scenario C: first boot after update: reboot into v3 (expect BKPT 0x4B, no success call)"
487+
run_log_v3="$EMU_PATH/reboot_v3.log"
488+
print_partition_flags "Scenario C: flags before v3 reboot"
428489
$STDBUF "$M33MU" --cpu "$EMU_CPU" --uart-stdout "${M33MU_TZ_ARGS[@]}" \
429-
--timeout "$REBOOT_TIMEOUT" --expect-bkpt=0x4a --quit-on-faults \
430-
"$FACTORY_FLASH" >"$run_log" 2>&1 || die "reboot v4 run $i: m33mu failed"
431-
grep -q "\\[EXPECT BKPT\\] Success" "$run_log" || die "reboot v4 run $i: expected BKPT 0x4A"
432-
log "Scenario B: reboot run $i: BKPT 0x4A hit"
433-
done
434-
435-
log "Scenario C: update from v1 to v3, then fallback (no wolfBoot_success is called)"
436-
assemble_factory
437-
print_partition_flags "Scenario C: flags before update"
438-
run_update_scenario "scenario_c_update" "$UPDATE_IMAGE_V3" 3 0x47
439-
440-
log "Scenario C: first boot after update: reboot into v3 (expect BKPT 0x4B, no success call)"
441-
run_log_v3="$EMU_PATH/reboot_v3.log"
442-
print_partition_flags "Scenario C: flags before v3 reboot"
443-
$STDBUF "$M33MU" --cpu "$EMU_CPU" --uart-stdout "${M33MU_TZ_ARGS[@]}" \
444-
--timeout "$REBOOT_TIMEOUT" --expect-bkpt=0x4b --persist --quit-on-faults \
445-
"$FACTORY_FLASH" >"$run_log_v3" 2>&1 || die "reboot v3 run: m33mu failed"
446-
grep -q "\\[EXPECT BKPT\\] Success" "$run_log_v3" || die "reboot v3 run: expected BKPT 0x4B"
447-
log "Scenario C: reboot v3: BKPT 0x4B hit"
448-
print_partition_flags "Scenario C: flags after v3 reboot"
449-
450-
log "Scenario C: second reboot, expect v1 after fallback"
451-
run_log_fallback="$EMU_PATH/reboot_fallback_v1.log"
452-
set +e
453-
$STDBUF "$M33MU" --cpu "$EMU_CPU" --uart-stdout "${M33MU_TZ_ARGS[@]}" \
454-
--timeout "$UPDATE_TIMEOUT" --persist --quit-on-faults \
455-
"$FACTORY_FLASH" >"$run_log_fallback" 2>&1
456-
fallback_rc=$?
457-
set -e
458-
print_partition_flags "Scenario C: flags after fallback run"
459-
print_partition_versions "Scenario C: versions after fallback run"
460-
if ! grep -q "get_version=1" "$run_log_fallback"; then
461-
tail -n 80 "$run_log_fallback" | sed 's/^/ | /'
462-
die "fallback run: expected get_version=1"
463-
fi
464-
if [[ $fallback_rc -ne 0 && $fallback_rc -ne 127 ]]; then
465-
die "fallback run: m33mu exited with $fallback_rc"
490+
--timeout "$REBOOT_TIMEOUT" --expect-bkpt=0x4b --persist --quit-on-faults \
491+
"$FACTORY_FLASH" >"$run_log_v3" 2>&1 || die "reboot v3 run: m33mu failed"
492+
grep -q "\\[EXPECT BKPT\\] Success" "$run_log_v3" || die "reboot v3 run: expected BKPT 0x4B"
493+
log "Scenario C: reboot v3: BKPT 0x4B hit"
494+
print_partition_flags "Scenario C: flags after v3 reboot"
495+
496+
log "Scenario C: second reboot, expect v1 after fallback"
497+
run_log_fallback="$EMU_PATH/reboot_fallback_v1.log"
498+
set +e
499+
$STDBUF "$M33MU" --cpu "$EMU_CPU" --uart-stdout "${M33MU_TZ_ARGS[@]}" \
500+
--timeout "$UPDATE_TIMEOUT" --persist --quit-on-faults \
501+
"$FACTORY_FLASH" >"$run_log_fallback" 2>&1
502+
fallback_rc=$?
503+
set -e
504+
print_partition_flags "Scenario C: flags after fallback run"
505+
print_partition_versions "Scenario C: versions after fallback run"
506+
if ! grep -q "get_version=1" "$run_log_fallback"; then
507+
tail -n 80 "$run_log_fallback" | sed 's/^/ | /'
508+
die "fallback run: expected get_version=1"
509+
fi
510+
if [[ $fallback_rc -ne 0 && $fallback_rc -ne 127 ]]; then
511+
die "fallback run: m33mu exited with $fallback_rc"
512+
fi
513+
log "Scenario C: fallback ok (version=1)"
466514
fi
467-
log "Scenario C: fallback ok (version=1)"
468515

469-
if [[ "$RAM_CODE" == "1" ]]; then
470-
log "Scenario S: self-update enabled (RAM_CODE=1)"
471-
log "Scenario S: not enabled in this script yet"
516+
if want_scenario "S"; then
517+
if [[ "$RAM_CODE" == "1" ]]; then
518+
log "Scenario S: self-update enabled (RAM_CODE=1)"
519+
log "Scenario S: not enabled in this script yet"
520+
else
521+
log "Scenario S: RAM_CODE disabled, skipping"
522+
fi
472523
fi
473524

474525
log "ok: $TARGET emu tests passed"

0 commit comments

Comments
 (0)