#!/bin/sh
set -eu

script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
repo_dir=$(dirname "$script_dir")
build_dir=${MOUSE_BUILD_DIR:-"$repo_dir/build"}
image="$build_dir/mouse-initramfs.cpio.gz"

for command in expect cpio gzip; do
    if ! command -v "$command" >/dev/null 2>&1; then
        printf '%s\n' "$command is required for the C3 integration check" >&2
        exit 1
    fi
done

if [ ! -f "$image" ]; then
    printf '%s\n' "run 'make image' before checking MOUSE" >&2
    exit 1
fi

temporary=$(mktemp -d "${TMPDIR:-/tmp}/mouse-c3-check.XXXXXX")
trap 'rm -rf "$temporary"' EXIT HUP INT TERM
base_root="$temporary/base"
mkdir "$base_root"
gzip -dc "$image" | (cd "$base_root" && cpio -id 2>/dev/null)

pack_variant() {
    name=$1
    root=$2
    output="$temporary/mouse-initramfs-$name.cpio.gz"
    (
        cd "$root"
        find . -print |
            LC_ALL=C sort |
            cpio -o --format newc -R 0:0 2>/dev/null |
            gzip -9
    ) >"$output"
    printf '%s\n' "$output"
}

run_variant() {
    name=$1
    root=$2
    mode=$3
    variant=$(pack_variant "$name" "$root")
    MOUSE_INITRAMFS="$variant" \
        "$script_dir/check-c3.exp" "$script_dir/run-qemu.sh" "$mode"
}

"$script_dir/check-c3.exp" "$script_dir/run-qemu.sh" enabled

disabled_root="$temporary/disabled"
cp -R "$base_root" "$disabled_root"
printf '%s\n' \
    '# Persistent MOUSE service policy belongs in this file.' \
    'enable_mouse_echo=NO' >"$disabled_root/etc/rc.conf"
run_variant disabled "$disabled_root" disabled

recovery_root="$temporary/recovery"
cp -R "$base_root" "$recovery_root"
install -m 0755 \
    "$repo_dir/tests/fixtures/console_login_broken" \
    "$recovery_root/etc/init.d/console_login"
run_variant recovery "$recovery_root" recovery

missing_root="$temporary/missing"
cp -R "$base_root" "$missing_root"
install -m 0755 \
    "$repo_dir/tests/fixtures/mouse_echo_missing" \
    "$missing_root/etc/init.d/mouse_echo"
run_variant missing "$missing_root" missing

cycle_root="$temporary/cycle"
cp -R "$base_root" "$cycle_root"
install -m 0755 \
    "$repo_dir/tests/fixtures/mouse_echo_cycle" \
    "$cycle_root/etc/init.d/mouse_echo"
install -m 0755 \
    "$repo_dir/tests/fixtures/cycle_peer" \
    "$cycle_root/etc/init.d/cycle_peer"
run_variant cycle "$cycle_root" cycle
