59 lines
2.3 KiB
Python
59 lines
2.3 KiB
Python
"""Regression: WSL voice detection must honor PIPEWIRE_REMOTE, not only PULSE_SERVER.
|
|
|
|
detect_audio_environment() honors forwarded audio (has_forwarded_audio =
|
|
PULSE_SERVER or PIPEWIRE_REMOTE or a reachable socket) in the SSH and container
|
|
blocks, but the WSL block previously checked only PULSE_SERVER — so a WSL user
|
|
with PipeWire forwarding (PIPEWIRE_REMOTE) was wrongly blocked from voice mode.
|
|
These tests mock /proc/version so they reproduce the WSL path on any host.
|
|
"""
|
|
import builtins
|
|
import io
|
|
from unittest.mock import MagicMock
|
|
|
|
WSL = "Linux version 5.15.0-microsoft-standard-WSL2 (oe-user@oe-host)"
|
|
|
|
|
|
def _force_wsl(monkeypatch, content=WSL):
|
|
real_open = builtins.open
|
|
def fake_open(file, *a, **k):
|
|
if str(file) == "/proc/version":
|
|
return io.StringIO(content)
|
|
return real_open(file, *a, **k)
|
|
monkeypatch.setattr(builtins, "open", fake_open)
|
|
|
|
|
|
def _base(monkeypatch):
|
|
for v in ("SSH_CLIENT", "SSH_TTY", "SSH_CONNECTION", "PULSE_SERVER"):
|
|
monkeypatch.delenv(v, raising=False)
|
|
monkeypatch.delenv("PIPEWIRE_REMOTE", raising=False)
|
|
monkeypatch.setattr("hermes_constants.is_container", lambda: False)
|
|
monkeypatch.setattr("tools.voice_mode._pulse_socket_reachable", lambda: False)
|
|
sd = MagicMock(); sd.query_devices.return_value = [{"name": "dev"}]
|
|
monkeypatch.setattr("tools.voice_mode._import_audio", lambda: (sd, MagicMock()))
|
|
|
|
|
|
def test_wsl_with_pipewire_remote_allows_voice(monkeypatch):
|
|
_base(monkeypatch)
|
|
monkeypatch.setenv("PIPEWIRE_REMOTE", "/run/user/1000/pipewire-0")
|
|
_force_wsl(monkeypatch)
|
|
from tools.voice_mode import detect_audio_environment
|
|
result = detect_audio_environment()
|
|
assert result["available"] is True, result["warnings"]
|
|
|
|
|
|
def test_wsl_with_pulse_server_still_allows_voice(monkeypatch):
|
|
_base(monkeypatch)
|
|
monkeypatch.setenv("PULSE_SERVER", "unix:/mnt/wslg/PulseServer")
|
|
_force_wsl(monkeypatch)
|
|
from tools.voice_mode import detect_audio_environment
|
|
assert detect_audio_environment()["available"] is True
|
|
|
|
|
|
def test_wsl_without_forwarding_still_blocks(monkeypatch):
|
|
_base(monkeypatch)
|
|
_force_wsl(monkeypatch) # no PULSE_SERVER, no PIPEWIRE_REMOTE
|
|
from tools.voice_mode import detect_audio_environment
|
|
res = detect_audio_environment()
|
|
assert res["available"] is False
|
|
assert any("WSL" in w for w in res["warnings"])
|