#!/usr/bin/env bash set -Eeuo pipefail TEST_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P) RUNTIME_DIR=$(cd -- "$TEST_DIR/.." && pwd -P) TEST_TMP=$(mktemp -d "${TMPDIR:-/tmp}/rk1-runtime-tests.XXXXXXXX") cleanup() { rm -rf -- "$TEST_TMP" } trap cleanup EXIT fail() { printf 'FAIL: %s\n' "$*" >&2 exit 1 } pass() { printf 'PASS: %s\n' "$*" } bash -n \ "$RUNTIME_DIR/install-rknn-runtime.sh" \ "$RUNTIME_DIR/rk1-media-selftest" \ "$RUNTIME_DIR/rk1-media-diagnostics" pass "shell syntax" "$RUNTIME_DIR/install-rknn-runtime.sh" --help >/dev/null "$RUNTIME_DIR/rk1-media-selftest" --help >/dev/null "$RUNTIME_DIR/rk1-media-diagnostics" --help >/dev/null pass "command help" mkdir -p \ "$TEST_TMP/empty/sys" \ "$TEST_TMP/empty/proc" \ "$TEST_TMP/empty/dev" \ "$TEST_TMP/empty/rknn" RK1_SYSFS_ROOT="$TEST_TMP/empty/sys" \ RK1_PROCFS_ROOT="$TEST_TMP/empty/proc" \ RK1_DEV_ROOT="$TEST_TMP/empty/dev" \ RKNN_HOME="$TEST_TMP/empty/rknn" \ "$RUNTIME_DIR/rk1-media-selftest" --quick --json \ >"$TEST_TMP/empty.json" grep -q '"overall":"warn"' "$TEST_TMP/empty.json" || fail "empty-hardware JSON does not report a warning" grep -q '"checks":\[' "$TEST_TMP/empty.json" || fail "empty-hardware JSON has no checks" pass "absent hardware degrades safely" FAKE="$TEST_TMP/fake" mkdir -p \ "$FAKE/sys/class/drm/card0-HDMI-A-1" \ "$FAKE/sys/class/devfreq/fb000000.gpu" \ "$FAKE/sys/class/devfreq/fdab0000.npu" \ "$FAKE/sys/class/net/eth0" \ "$FAKE/sys/block/mmcblk0" \ "$FAKE/sys/block/nvme0n1" \ "$FAKE/sys/bus/platform/drivers/dwhdmi-rockchip/fde80000.hdmi" \ "$FAKE/sys/bus/platform/drivers/rockchip-hdptx-phy-hdmi/fed60000.hdmiphy" \ "$FAKE/sys/bus/platform/drivers/panthor/fb000000.gpu" \ "$FAKE/sys/bus/platform/drivers/mpp_rkvdec2/fdc38100.rkvdec-core" \ "$FAKE/sys/bus/platform/drivers/mpp_rkvenc2/fdbd0000.rkvenc-core" \ "$FAKE/sys/bus/platform/drivers/mpp_av1dec/av1-decoder" \ "$FAKE/sys/bus/platform/drivers/rga2/fdb80000.rga" \ "$FAKE/sys/bus/platform/drivers/rga3/fdb60000.rga" \ "$FAKE/sys/bus/platform/drivers/RKNPU/fdab0000.npu" \ "$FAKE/proc/device-tree" \ "$FAKE/proc/asound" \ "$FAKE/dev/dri" \ "$FAKE/rknn" printf 'connected\n' >"$FAKE/sys/class/drm/card0-HDMI-A-1/status" printf '3840x2160\n1920x1080\n' >"$FAKE/sys/class/drm/card0-HDMI-A-1/modes" printf 'fake-edid' >"$FAKE/sys/class/drm/card0-HDMI-A-1/edid" printf 'Turing Machines RK1\0' >"$FAKE/proc/device-tree/model" printf ' 0 [rockchiphdmi]: rockchip-hdmi - rockchip-hdmi\n' \ >"$FAKE/proc/asound/cards" printf 'up\n' >"$FAKE/sys/class/net/eth0/operstate" printf '1\n' >"$FAKE/sys/class/net/eth0/carrier" touch "$FAKE/dev/dri/renderD128" RK1_SYSFS_ROOT="$FAKE/sys" \ RK1_PROCFS_ROOT="$FAKE/proc" \ RK1_DEV_ROOT="$FAKE/dev" \ RKNN_HOME="$FAKE/rknn" \ "$RUNTIME_DIR/rk1-media-selftest" --quick --json \ >"$TEST_TMP/fake.json" grep -q '"name":"card0-HDMI-A-1","status":"pass"' \ "$TEST_TMP/fake.json" || fail "fake connected HDMI was not detected" grep -q '"name":"kernel-driver","status":"pass","message":"Panthor' \ "$TEST_TMP/fake.json" || fail "fake Panthor binding was not detected" pass "synthetic hardware inventory" if command -v python3 >/dev/null 2>&1; then python3 -m json.tool "$TEST_TMP/empty.json" >/dev/null python3 -m json.tool "$TEST_TMP/fake.json" >/dev/null pass "JSON validity" fi RK1_SYSFS_ROOT="$FAKE/sys" \ RK1_PROCFS_ROOT="$FAKE/proc" \ RK1_DEV_ROOT="$FAKE/dev" \ RKNN_HOME="$FAKE/rknn" \ "$RUNTIME_DIR/rk1-media-diagnostics" --directory \ --output "$TEST_TMP/diagnostics" >/dev/null [[ -s "$TEST_TMP/diagnostics/selftest.json" ]] || fail "diagnostic bundle is missing selftest.json" [[ -s "$TEST_TMP/diagnostics/drm-connectors.txt" ]] || fail "diagnostic bundle is missing connector data" [[ -s "$TEST_TMP/diagnostics/kernel-media.log" ]] || fail "diagnostic bundle is missing filtered kernel data" pass "diagnostic collection" if [[ -n ${RKNN_SOURCE_DIR:-} ]]; then [[ -d "$RKNN_SOURCE_DIR" ]] || fail "RKNN_SOURCE_DIR is not a directory" bundled_source="$TEST_TMP/bundled-rknn-source" mkdir -p \ "$bundled_source/rknpu2/runtime/Linux/librknn_api/include" \ "$bundled_source/rknpu2/runtime/Linux/librknn_api/aarch64" \ "$bundled_source/rknpu2/examples/rknn_api_demo/model/RK3588" \ "$bundled_source/rknpu2/examples/rknn_api_demo/model" cp "$RKNN_SOURCE_DIR/LICENSE" "$bundled_source/LICENSE" cp "$RKNN_SOURCE_DIR/rknpu2/runtime/Linux/librknn_api/include/rknn_api.h" \ "$bundled_source/rknpu2/runtime/Linux/librknn_api/include/rknn_api.h" cp "$RKNN_SOURCE_DIR/rknpu2/runtime/Linux/librknn_api/aarch64/librknnrt.so" \ "$bundled_source/rknpu2/runtime/Linux/librknn_api/aarch64/librknnrt.so" cp "$RKNN_SOURCE_DIR/rknpu2/examples/rknn_api_demo/model/RK3588/mobilenet_v1.rknn" \ "$bundled_source/rknpu2/examples/rknn_api_demo/model/RK3588/mobilenet_v1.rknn" cp "$RKNN_SOURCE_DIR/rknpu2/examples/rknn_api_demo/model/dog_224x224.jpg" \ "$bundled_source/rknpu2/examples/rknn_api_demo/model/dog_224x224.jpg" mkdir -p "$TEST_TMP/rootfs" "$RUNTIME_DIR/install-rknn-runtime.sh" \ --rootfs "$TEST_TMP/rootfs" --source-dir "$bundled_source" installed_runtime="$TEST_TMP/rootfs/opt/rknn/2.3.2/lib/librknnrt.so" installed_model="$TEST_TMP/rootfs/opt/rknn/2.3.2/share/models/rk3588/mobilenet_v1.rknn" [[ -x "$TEST_TMP/rootfs/opt/rknn/2.3.2/bin/rknn-inference-test" ]] || fail "compiled inference test is missing" [[ $(sha256sum "$installed_runtime" | awk '{print $1}') == \ d31fc19c85b85f6091b2bd0f6af9d962d5264a4e410bfb536402ec92bac738e8 ]] || fail "installed runtime checksum differs" [[ $(sha256sum "$installed_model" | awk '{print $1}') == \ 381dae3b7038a98b10f6ec9dcdbb094a49247341856fb294e692ef518218fcfb ]] || fail "installed model checksum differs" pass "pinned RKNN installation" else printf 'SKIP: installer integration (set RKNN_SOURCE_DIR to a v2.3.2 checkout)\n' fi printf 'All runtime tests passed.\n'