"""mumble — INSTALL overlay (Phase 1e HC3): assertion-only + additive, runs alongside the generic install tier (which proves the mumble-web HTTP sidecar serves over Traefik — the readiness signal). This overlay ADDS the assertion that mumble's actual purpose — the voice server — is up: the murmur control channel accepts a TLS connection on the host-published 64738 right after install. (The full protocol handshake + channel presence is exercised in the custom tier; here we assert the install produced a listening voice server, not only a web UI.) """ import socket import time def test_voice_server_listening(live_app): deadline = time.time() + 120 last_err = None while time.time() < deadline: try: with socket.create_connection(("127.0.0.1", 64738), timeout=10): return except OSError as e: # noqa: PERF203 last_err = e time.sleep(3) raise AssertionError( f"mumble voice server not listening on 127.0.0.1:64738 after install — {last_err}" )