"""Eigener Lauf zu Teil 3b: Bekommen zwei Verbindungen am laufenden Backend denselben Snapshot? Koordinator-Pruefskript, nicht fuers Repo. Laeuft in WSL gegen ws://127.0.0.1:8144/ws/uebersicht. Frage: Tragen die Snapshots beider Verbindungen dieselben zeit-Werte (ein Bau je Takt), und kommt der erste Snapshot einer spaeteren Verbindung sofort? Herkunft: Projektvorgabe (Spec, C4a). Was es nicht sieht: die Zahl der Broker-Anfragen selbst (die zaehlt der Test mit der Attrappe). """ import asyncio import json import sys import time import websockets PORT = sys.argv[1] if len(sys.argv) > 1 else "8144" ADRESSE = f"ws://127.0.0.1:{PORT}/ws/uebersicht" async def lies(name: str, anzahl: int, ergebnis: dict) -> None: t0 = time.monotonic() async with websockets.connect(ADRESSE) as strom: zeiten = [] for i in range(anzahl): daten = json.loads(await strom.recv()) if i == 0: ergebnis[name + "_erste_nach_s"] = round(time.monotonic() - t0, 3) zeiten.append(daten["zeit"]) ergebnis[name] = zeiten async def main() -> int: ergebnis: dict = {} erste = asyncio.create_task(lies("a", 4, ergebnis)) await asyncio.sleep(2.0) zweite = asyncio.create_task(lies("b", 3, ergebnis)) await asyncio.gather(erste, zweite) print(json.dumps(ergebnis, indent=2)) gemeinsam = set(ergebnis["a"]) & set(ergebnis["b"]) print("gemeinsame zeit-Werte:", len(gemeinsam)) befunde = [] if len(gemeinsam) < 2: befunde.append("die zwei Verbindungen teilen weniger als zwei Snapshots") if ergebnis["b"][0] not in ergebnis["a"]: befunde.append("der erste Snapshot der spaeteren Verbindung ist kein Snapshot der ersten") if ergebnis["b_erste_nach_s"] > 1.0: befunde.append(f"die spaetere Verbindung wartete {ergebnis['b_erste_nach_s']} s auf ihren ersten Snapshot") for text in befunde: print("BEFUND:", text) return 2 if befunde else 0 if __name__ == "__main__": try: sys.exit(asyncio.run(main())) except Exception as ausnahme: print("BEFUND: unerwarteter Abbruch:", repr(ausnahme)) sys.exit(2)