Trading-Plattform-Pruefung: Bestaetigung ohne Host bricht die Sicherung ab, als Fall belegt (Paket NT, Task 739)

- abendkontrolle_dockerhost_angriffe.py: Fall eine_bestaetigung_ohne_host_bricht_die_sicherung_ab
  und Mutant E739-01 (39 Faelle, 57 Mutanten, keiner ueberlebt).
- abendkontrolle.py: Docstring von ssh_lauf nennt den Vorbehalt zu Win32-OpenSSH.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_0126RDfXiECscXipzf67uypJ
This commit is contained in:
Pascal MichelandClaude Opus 5.5 committed 2026-10-12 00:09:38 +02:00
1 parent 88ec4fd40f
commit ef8059903c
2 files changed
+34 -1

No files matched your search

@@ -1155,6 +1155,32 @@ def ein_zeitlimit_beim_archiv_laesst_nur_diese_instanz_scheitern():
assert "Docker-Host nicht erreichbar" not in zeile, zeile
@fall
def eine_bestaetigung_ohne_host_bricht_die_sicherung_ab():
# Kritische Pruefung NT, Befund 1: Auch die Bestaetigung gehoert zur Grenze "Docker-Host nicht
# erreichbar" (Entscheidung 1 in Task 729), nicht nur die Summe. Nach Summe und Archiv von alpaca
# ist der Host weg, die Bestaetigung endet mit 255. Das Archiv liegt dann ohne Summendatei auf D:,
# nichts ist bestaetigt, und die Sicherung endet mit genau einer Zeile von heute.
with tempfile.TemporaryDirectory() as ordner:
wurzel = Path(ordner)
host = host_ablage(wurzel)
modul = lade()
ergebnisse_liegen(modul, wurzel)
code, notiz, befehle, _ = sicherungslauf(wurzel, "--jetzt", "2026-10-05T23:30", modul=modul, host_weg="2")
summe = host_summe(host, "alpaca")
assert code == 1, (code, notiz)
assert befehle == [
f"sicherung-summe {TAG}-alpaca", f"sicherung {TAG}-alpaca", f"sicherung-bestaetigt {TAG}-alpaca {summe}"
], befehle
assert einzige_zeile(notiz) == (
f"- 23:30 Uhr — {KOPF}: **gescheitert** #needs-review. Docker-Host nicht erreichbar "
f"(sicherung-bestaetigt {TAG}-alpaca {summe}: Exit 255; {HOST_WEG}), Sicherung abgebrochen. "
"Der nächste Lauf versucht es erneut."
), notiz
assert namen(wurzel / "ziel" / TAG) == ["alpaca.tar"], namen(wurzel / "ziel" / TAG)
assert namen(host / "bestaetigt") == [], namen(host / "bestaetigt")
@fall
def kein_kommentar_beginnt_mit_s3():
# Paket NT (Quorum 4): Die Kommentarzeile ueber SICHERUNG_NACHHOLEN_TAGE begann mit "(S3).", einem
@@ -1295,6 +1321,12 @@ MUTANTEN = [
" except ZeroDivisionError as abbruch:",
["ein_zeitlimit_beim_archiv_laesst_nur_diese_instanz_scheitern",
"eine_abgebrochene_uebertragung_hinterlaesst_nichts"]),
# Seit der kritischen Pruefung NT, Befund 1: Eine Bestaetigung ohne Host bricht die Sicherung ab.
("E739-01 Bestaetigung ohne Host nur fuer die Instanz",
' lauf = ssh_lauf(f"sicherung-bestaetigt {name} {summe}", SSH_TIMEOUT_S)',
' try:\n lauf = ssh_lauf(f"sicherung-bestaetigt {name} {summe}", SSH_TIMEOUT_S)\n'
' except HostNichtErreichbar as abbruch:\n raise RuntimeError(f"nicht bestaetigt ({abbruch})") from None',
["eine_bestaetigung_ohne_host_bricht_die_sicherung_ab"]),
("Name der Summendatei beim Host egal", ' if treffer is None or treffer.group(2) != f"{name}.tar":',
" if treffer is None:", ["eine_summendatei_des_hosts_in_falscher_form_holt_kein_archiv"]),
("Grossbuchstaben in der Summe", r'SUMMENZEILE = re.compile(r"([0-9a-f]{64}) (\S+)\n")',