fix(station): Anzeige-Installation absichern, apt darf nur warnen

Fixrunde 1 zu Task 6b.

- setup_pi.sh raeumt die Ablage vor dem scp ab und bricht ab, wenn
  display.py dort fehlt. Ein Reststand aus einem abgebrochenen Lauf liess
  "scp -r" ins vorhandene Ziel hineinkopieren; die Installationsschleife
  ueberspringt Verzeichnisse und fand nichts - der Lauf meldete Erfolg,
  aktivierte den Anzeigedienst und hinterliess ein leeres display/:
  203/EXEC im 5-Sekunden-Takt bei schwarzem Panel.
- Der Paketschritt steht jetzt hinter der Installation und warnt nur.
  Eine Migrationsstation steht typischerweise nicht am Netz; unter set -e
  davor hiess ein gescheitertes apt: gar keine Station statt einer Station
  ohne Panel. "apt-get update" kommt vor dem install, der Anzeigedienst
  startet nach dem Paketschritt.
- setup_pi.sh raeumt display/ auf dem Pi wie deploy.sh auf (im Repo
  geloeschte Dateien verschwinden), der Trap haengt auch an INT/TERM/HUP,
  und mktemp bekommt eine Vorlage: ohne sie beachtet BSD-mktemp TMPDIR
  nicht, und die Temp-Datei landete je nach Plattform woanders.
- test_host.sh ruft test_deploy.sh auf - 95 Zusagen liefen nur bei
  Handaufruf, darunter die Deploy-Haelfte der Anzeige-Auslieferung. Der
  Coverage-Test deckt jetzt auch die Shell-Suiten ab und zaehlt dabei nur
  nicht auskommentierte Zeilen.
- Neue Szenarien fuer alle vier Punkte, darunter die Zusage, dass beim
  gescheiterten Schreiben eines Profils keine Datei mit dem WLAN-Passwort
  liegenbleibt.
This commit is contained in:
Michael Sauer
2026-09-14 00:03:49 +02:00
parent cc398ef57a
commit 7fdccbce72
5 changed files with 325 additions and 31 deletions
+31 -8
View File
@@ -64,6 +64,34 @@ def test_every_test_file_is_reached_by_test_host():
)
def test_every_shell_suite_is_called_by_test_host():
"""Dieselbe Regel fuer die Shell-Suiten (Task 6b F1, I3).
test_deploy.sh war in tools/test_host.sh nicht aufgefuehrt und lief damit nur bei
Handaufruf - 95 Zusagen, die niemand mehr sah. Die .py-Regel oben deckt genau diese
Haelfte nicht ab, weil die Shell-Suiten nicht ueber pytest laufen, sondern einzeln
aufgerufen werden.
"""
# Nur AUSFUEHRBARE Zeilen zaehlen, keine Kommentare: der Kommentarblock ueber den
# Aufrufen nennt test_deploy.sh beim Namen, und eine blosse Textsuche waere damit
# auch dann erfuellt, wenn die Aufrufzeile fehlt - der Test waere gruen, ohne etwas
# zu pruefen (genau die Falle, die er verhindern soll).
lines = [
line.strip()
for line in TEST_HOST.read_text().splitlines()
if line.strip() and not line.strip().startswith("#")
]
missing = []
for suite in sorted((TOOLS_DIR / "station" / "tests").glob("test_*.sh")):
# So, wie test_host.sh sie aufruft: "$ROOT/tools/station/tests/<name>"
if not any(suite.name in line for line in lines):
missing.append(suite.relative_to(REPO_ROOT))
assert not missing, (
"diese Shell-Suiten ruft tools/test_host.sh nicht auf, sie laufen also nur bei "
"Handaufruf: {}".format(", ".join(str(m) for m in missing))
)
def test_python38_guard_is_among_them():
"""Die konkrete Datei, deren Ausfall den Build-Bruch damals durchgelassen haette."""
guard = (TOOLS_DIR / "mkimage" / "test_nl_mkimage.py").resolve()
@@ -76,11 +104,6 @@ def test_python38_guard_is_among_them():
)
def test_vermin_is_installed():
"""vermin fehlt -> harter Fehlschlag, kein Skip.
Eine Wache, die sich beim Fehlen ihres Werkzeugs stillschweigend abschaltet, haette
den Build-Bruch von damals genauso durchgelassen wie gar kein Test. Nachinstallieren:
pip install vermin (oder pip3 install --user vermin).
"""
import vermin # noqa: F401
# Kein eigener "ist vermin installiert"-Test hier: test_nl_mkimage.py importiert vermin
# ohnehin hart (kein Skip), und ein fehlendes Paket faellt dort mit derselben Deutlichkeit
# auf. Zwei Tests fuer dieselbe Zusage sind nur zwei Stellen zum Pflegen.