#!/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 < [-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"