- functional/_mumble_proto.py: stdlib Mumble TLS protocol client (adapted from corpus mumble_connect.py) - 3 parity ports: test_tcp_health, test_protocol_handshake (channel presence+ServerSync), test_web_client - 2 NEW recipe-specific (P3): welcome-text + max-users config round-trips over the protocol - P4: ops.py + test_backup/test_restore seed ci_marker in /data/mumble-server.sqlite (recipe's own backupbot DB), busy_timeout for live-server locks - test_install overlay: voice server listening on 64738 (beyond web-sidecar readiness) - recipe_meta: COMPOSE_FILE=compose.yml:mumbleweb:host-ports; WELCOME_TEXT/USERS markers - PARITY.md mapping table Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
27 lines
1.0 KiB
Python
27 lines
1.0 KiB
Python
"""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}"
|
|
)
|