Files
buzzer/buzzer_tool/smoke_test.sh
2026-03-02 00:25:40 +01:00

166 lines
3.5 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
ROOT_DIR="$(cd -- "$SCRIPT_DIR/.." && pwd)"
CLI="$ROOT_DIR/buzzer_tool/buzzer.py"
PORT=""
BAUDRATE=""
TIMEOUT=""
REMOTE_BASE="/lfs/smoke"
KEEP_TMP=0
usage() {
cat <<EOF
Usage: $(basename "$0") -p <port> [-b baudrate] [-t timeout] [--remote-base /lfs/path] [--keep-tmp]
Beispiel:
$(basename "$0") -p /dev/tty.usbmodem14101 -b 115200 -t 5
EOF
}
while [[ $# -gt 0 ]]; do
case "$1" in
-p|--port)
PORT="$2"
shift 2
;;
-b|--baudrate)
BAUDRATE="$2"
shift 2
;;
-t|--timeout)
TIMEOUT="$2"
shift 2
;;
--remote-base)
REMOTE_BASE="$2"
shift 2
;;
--keep-tmp)
KEEP_TMP=1
shift
;;
-h|--help)
usage
exit 0
;;
*)
echo "Unbekanntes Argument: $1" >&2
usage
exit 1
;;
esac
done
if [[ -z "$PORT" ]]; then
echo "Fehler: --port ist erforderlich" >&2
usage
exit 1
fi
COMMON_ARGS=("-p" "$PORT" "--no-auto-info")
if [[ -n "$BAUDRATE" ]]; then
COMMON_ARGS+=("-b" "$BAUDRATE")
fi
if [[ -n "$TIMEOUT" ]]; then
COMMON_ARGS+=("-t" "$TIMEOUT")
fi
run_cli() {
python3 "$CLI" "${COMMON_ARGS[@]}" "$@"
}
TMP_DIR="$(mktemp -d -t buzzer-smoke-XXXXXX)"
cleanup() {
if [[ "$KEEP_TMP" -eq 0 ]]; then
rm -rf "$TMP_DIR"
else
echo "Temporärer Ordner bleibt erhalten: $TMP_DIR"
fi
}
trap cleanup EXIT
echo "[1/9] Erzeuge sehr kleine Testdateien mit Nullen in $TMP_DIR"
python3 - "$TMP_DIR" <<'PY'
import os
import sys
base = sys.argv[1]
files = {
"z0.bin": 0,
"z1.bin": 1,
"z8.bin": 8,
"z16.bin": 16,
"z64.bin": 64,
"z100k.bin": 102400,
}
for name, size in files.items():
with open(os.path.join(base, name), "wb") as f:
f.write(b"\x00" * size)
print("Created:", ", ".join(f"{k}:{v}B" for k,v in files.items()))
PY
echo "[2/9] Bereinige altes Remote-Testverzeichnis (falls vorhanden)"
run_cli rm -r "$REMOTE_BASE" >/dev/null 2>&1 || true
echo "[3/9] Lege Remote-Verzeichnis an"
run_cli mkdir "$REMOTE_BASE"
echo "[4/9] Upload der kleinen Null-Dateien"
run_cli put "$TMP_DIR"/*.bin "$REMOTE_BASE/"
echo "[5/9] Prüfe remote stat"
run_cli stat "$REMOTE_BASE/z0.bin"
run_cli stat "$REMOTE_BASE/z64.bin"
echo "[6/9] Teste rename/mv"
run_cli mv "$REMOTE_BASE/z16.bin" "$REMOTE_BASE/z16_renamed.bin"
run_cli stat "$REMOTE_BASE/z16_renamed.bin"
echo "[7/9] Pull + get_file (Alias)"
run_cli pull "$REMOTE_BASE/z1.bin" "$TMP_DIR/pull_z1.bin"
run_cli get_file "$REMOTE_BASE/z100k.bin" "$TMP_DIR/get_file_z100k.bin"
echo "[8/9] Vergleiche heruntergeladene Dateien"
python3 - "$TMP_DIR" <<'PY'
import os
import sys
TAG_MAGIC = b"TAG!"
TAG_FOOTER_LEN = 7
base = sys.argv[1]
checks = [
("z1.bin", "pull_z1.bin"),
("z8.bin", "get_file_z8.bin"),
]
for original_name, pulled_name in checks:
original_path = os.path.join(base, original_name)
pulled_path = os.path.join(base, pulled_name)
with open(original_path, "rb") as f:
original = f.read()
with open(pulled_path, "rb") as f:
pulled = f.read()
if len(pulled) < len(original) + TAG_FOOTER_LEN:
raise SystemExit(f"Pulled file zu kurz: {pulled_name}")
if pulled[:len(original)] != original:
raise SystemExit(f"Audio-Präfix stimmt nicht: {pulled_name}")
if pulled[-4:] != TAG_MAGIC:
raise SystemExit(f"TAG-Footer fehlt: {pulled_name}")
print("Vergleich OK (audio + tags)")
PY
echo "[9/9] Rekursives Löschen + Abschlussliste"
run_cli rm -r "$REMOTE_BASE"
run_cli ls /lfs
echo "✅ Smoke-Test erfolgreich abgeschlossen"