#!/bin/bash
# Run the qcom-va-driver hardware tests installed under
# /usr/libexec/qcom-va-driver/tests on a supported device.
#
# Every test is run even if an earlier one fails and a summary of the
# result of each test is printed at the end. Test output is written
# to a temporary directory which is kept for inspection.
#
# Exits with a non-zero status if any test failed.

T=/usr/libexec/qcom-va-driver/tests

out=$(mktemp -d -t qcom-va-driver-tests.XXXXXX) || exit 1

export LIBVA_DRIVER_NAME=qcom

mkdir -p "$out"/{async,async-hevc,wexp,wexp-nocoherent,ffmpeg,ffmpeg-nocoherent,recovery,av1}

passed=()
failed=()
results=()

run() {
    local name=$1
    shift
    echo
    echo ">>> $name: $*"
    if "$@"; then
        passed+=("$name")
        results+=("PASSED: $name")
    else
        local ret=$?
        failed+=("$name")
        results+=("FAILED: $name")
        return $ret
    fi
}

# Decoder
run decoder/main10 "$T/decoder/main10"
run decoder/prime-import "$T/decoder/prime-import" ||
    echo "WARNING: decoder/prime-import failed (may need CONFIG_DMABUF_HEAPS)" >&2

# Encoder
run encoder/api-smoke "$T/encoder/api-smoke"
run encoder/async "$T/encoder/async" "$out/async"
run encoder/async-hevc "$T/encoder/async" "$out/async-hevc" --hevc
run encoder/writable-export "$T/encoder/writable-export" "$out/wexp"
run encoder/writable-export-hevc "$T/encoder/writable-export" "$out/wexp" --hevc
run encoder/ffmpeg-smoke "$T/encoder/ffmpeg-smoke.py" "$out/ffmpeg"
run encoder/ffmpeg-smoke-hevc "$T/encoder/ffmpeg-smoke.py" "$out/ffmpeg" --hevc

# Encoder failure injection
# Coherent GEM fallback: reject coherent buffers to exercise CPU/MMAP
nocoherent=(env LD_PRELOAD="$T/encoder/reject-coherent.so")
run encoder/api-smoke-nocoherent "${nocoherent[@]}" "$T/encoder/api-smoke"
run encoder/async-nocoherent "${nocoherent[@]}" "$T/encoder/async" "$out/async"
run encoder/writable-export-nocoherent "${nocoherent[@]}" \
    "$T/encoder/writable-export" "$out/wexp-nocoherent"
run encoder/writable-export-hevc-nocoherent "${nocoherent[@]}" \
    "$T/encoder/writable-export" "$out/wexp-nocoherent" --hevc
run encoder/ffmpeg-smoke-nocoherent "${nocoherent[@]}" \
    "$T/encoder/ffmpeg-smoke.py" "$out/ffmpeg-nocoherent"
run encoder/ffmpeg-smoke-hevc-nocoherent "${nocoherent[@]}" \
    "$T/encoder/ffmpeg-smoke.py" "$out/ffmpeg-nocoherent" --hevc
# Caller timeouts and the hardware wait watchdog
run encoder/async-delay-completion env IRIS_TEST_DELAY_COMPLETION=1 \
    LD_PRELOAD="$T/encoder/delay-completion.so" "$T/encoder/async" "$out/async"
# Staged input, with the default and the CPU copy path
run encoder/async-staging env IRIS_TEST_STAGING=1 "$T/encoder/async" "$out/async"
run encoder/async-staging-cpu env IRIS_TEST_STAGING=1 IRIS_VAAPI_COPY=cpu \
    "$T/encoder/async" "$out/async"

# Long decoder tests (patched kernel required)
run decoder/error-recovery "$T/decoder/error-recovery.py" "$out/recovery" \
    --driver-dir /usr/lib/aarch64-linux-gnu/dri/ ||
    echo "WARNING: decoder/error-recovery failed (kernel patch may be missing)" >&2

run decoder/av1 env GST_VA_ALL_DRIVERS=1 "$T/decoder/av1.py" "$out/av1" \
    --driver-dir /usr/lib/aarch64-linux-gnu/dri/ --gstreamer --extended ||
    echo "WARNING: decoder/av1 failed (kernel patch may be missing)" >&2

# VPP (Vulkan)
run vpp/overlay-vulkan "$T/vpp/vpp-overlay" vulkan
run vpp/overlay-vulkan-geometry "$T/vpp/vpp-overlay" vulkan --geometry
run vpp/tonemap "$T/vpp/vpp-tonemap"
run vpp/tonemap-geometry "$T/vpp/vpp-tonemap" --geometry
run vpp/scaling-vulkan "$T/vpp/vpp-scaling" vulkan

echo
echo "Output: $out"
printf '%s\n' "${results[@]}"
echo "Passed: ${#passed[@]}, Failed: ${#failed[@]}"

[ ${#failed[@]} -eq 0 ]
