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:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user