166 lines
3.5 KiB
Bash
Executable File
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"
|