83 lines
3.1 KiB
Bash
Executable File
83 lines
3.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# ==============================================================================
|
|
# scripts/crash-test.sh
|
|
# Stresstest für ink-notes Speicher- und Autosave-Robustheit.
|
|
# Simuliert harte Programmabstürze (SIGKILL / kill -9) während Schreibvorgängen
|
|
# und verifiziert die Integrität der Notizbücher und Seiten.
|
|
# ==============================================================================
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
|
|
ITERATIONS="${1:-200}"
|
|
TEST_DIR="${REPO_ROOT}/target/crash_test_workspace"
|
|
CRASH_SIM_BIN="${REPO_ROOT}/target/release/crash_sim"
|
|
|
|
echo "=================================================================="
|
|
echo " ink-notes Crash- & Datenverlust-Stresstest"
|
|
echo " Iterationen: ${ITERATIONS}"
|
|
echo " Testverzeichnis: ${TEST_DIR}"
|
|
echo "=================================================================="
|
|
|
|
# 1. Sicherstellen, dass das Test-Binary gebaut ist
|
|
if [ ! -f "${CRASH_SIM_BIN}" ]; then
|
|
echo "Baue crash_sim Release-Binary..."
|
|
cargo build --release --bin crash_sim --manifest-path "${REPO_ROOT}/Cargo.toml"
|
|
fi
|
|
|
|
# 2. Sauberes Testverzeichnis anlegen und Notizbuch initialisieren
|
|
rm -rf "${TEST_DIR}"
|
|
mkdir -p "${TEST_DIR}"
|
|
"${CRASH_SIM_BIN}" init "${TEST_DIR}"
|
|
|
|
SUCCESS_COUNT=0
|
|
INTERRUPTED_WRITES=0
|
|
|
|
trap 'rm -rf "${TEST_DIR}"' EXIT
|
|
|
|
echo "Starte Testlauf mit ${ITERATIONS} SIGKILL-Zyklen..."
|
|
|
|
for i in $(seq 1 "${ITERATIONS}"); do
|
|
# Worker im Hintergrund starten
|
|
"${CRASH_SIM_BIN}" worker "${TEST_DIR}" > /dev/null 2>&1 &
|
|
WORKER_PID=$!
|
|
|
|
# Zufällige Schlafdauer zwischen 2ms und 35ms, um Schreiboperationen mitten im Flug zu treffen
|
|
# RANDOM % 33 + 2 ergibt 2..34 Millisekunden
|
|
MS_DELAY=$(( (RANDOM % 33) + 2 ))
|
|
DELAY="0.$(printf "%03d" "$MS_DELAY")"
|
|
sleep "${DELAY}"
|
|
|
|
# Harter Prozessabbruch ohne Clean-up (SIGKILL)
|
|
if kill -9 "${WORKER_PID}" 2>/dev/null; then
|
|
INTERRUPTED_WRITES=$((INTERRUPTED_WRITES + 1))
|
|
fi
|
|
wait "${WORKER_PID}" 2>/dev/null || true
|
|
|
|
# Integritäts- und Konsistenzprüfung
|
|
if ! "${CRASH_SIM_BIN}" verify "${TEST_DIR}" > /dev/null 2>&1; then
|
|
echo ""
|
|
echo "❌ FEHLER in Iteration ${i}!"
|
|
echo "Notizbuch im Zustand nach Absturz nicht konsistent ladbar!"
|
|
"${CRASH_SIM_BIN}" verify "${TEST_DIR}" || true
|
|
trap - EXIT
|
|
exit 1
|
|
fi
|
|
|
|
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
|
|
if [ $((i % 25)) -eq 0 ] || [ "${i}" -eq "${ITERATIONS}" ]; then
|
|
echo " [$(date +%T)] Iteration ${i}/${ITERATIONS} bestanden (erfolgreich unterbrochene Schreibvorgänge: ${INTERRUPTED_WRITES})."
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
echo "=================================================================="
|
|
echo "✅ ALLE ${ITERATIONS} CRASH-TESTS ERFOLGREICH BESTANDEN!"
|
|
echo " - Überstandene SIGKILLs: ${INTERRUPTED_WRITES}"
|
|
echo " - Konsistente Ladevorgänge: ${SUCCESS_COUNT}/${ITERATIONS}"
|
|
echo " - Keine korrupten JSON-Dateien ohne Quarantäne"
|
|
echo " - Keine unvollständigen Atom-Schreibungen"
|
|
echo "=================================================================="
|