test(prefs, headless): add 16 Linux-specific tests for Phase 6 + 10
Cover the Linux branches in prefs.py that previously had no tests (font metrics, GPU spoofing, MSAA from profile, canvas noise mask per renderer, WebGL extension preservation, Xvfb workarounds, virtual_display no-op) and add construction smoke tests for _LinuxVirtualDisplay. Also fix two host-platform-dependent tests so the suite stays green on both Windows and Linux. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+57
-1
@@ -13,6 +13,8 @@ does no I/O — Xvfb is only spawned in ``start()``, which we never call.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
|
||||
import pytest
|
||||
|
||||
import invisible_playwright._headless as headless
|
||||
@@ -85,11 +87,65 @@ def test_windows_desktop_initial_state_is_clean():
|
||||
|
||||
|
||||
@pytest.mark.unit
|
||||
@pytest.mark.skipif(sys.platform != "win32", reason="exercises Win32 ctypes")
|
||||
def test_windows_desktop_stop_is_idempotent_without_start():
|
||||
"""``stop()`` after never calling ``start()`` must be a no-op, so
|
||||
``__exit__`` from a failed launch can call it unconditionally."""
|
||||
``__exit__`` from a failed launch can call it unconditionally.
|
||||
|
||||
Skipped off Windows because ``stop()`` unconditionally resolves
|
||||
``ctypes.windll.user32`` at the top of the function — that symbol
|
||||
only exists on Windows. The early-return logic is safe because
|
||||
callers only instantiate this class via ``make_virtual_display()``
|
||||
which already routes on ``sys.platform == 'win32'``.
|
||||
"""
|
||||
vd = _WindowsVirtualDesktop()
|
||||
vd.stop()
|
||||
vd.stop()
|
||||
assert vd._desktop is None
|
||||
assert vd._original_handle == 0
|
||||
|
||||
|
||||
# ──────────────────────────────────────────────────────────────────────
|
||||
# _LinuxVirtualDisplay — construction-only smoke tests. ``start()`` is
|
||||
# E2E because it spawns Xvfb; ``stop()`` is safe to call when no Xvfb
|
||||
# was ever started, so we exercise that path explicitly.
|
||||
# ──────────────────────────────────────────────────────────────────────
|
||||
|
||||
|
||||
@pytest.mark.unit
|
||||
def test_linux_virtual_display_initial_state_is_clean():
|
||||
"""Construction must not spawn Xvfb or mutate the environment — only
|
||||
``start()`` does. Mirrors the Windows construction-state test."""
|
||||
vd = _LinuxVirtualDisplay()
|
||||
assert vd._proc is None
|
||||
assert vd._display is None
|
||||
assert vd._saved_env == {}
|
||||
|
||||
|
||||
@pytest.mark.unit
|
||||
def test_linux_virtual_display_geometry_default():
|
||||
"""Default geometry is 1920x1080x24 — matches the profile sampler's
|
||||
default screen and avoids the Xvfb default of 1280x1024 which the
|
||||
fingerprint pipeline never produces."""
|
||||
vd = _LinuxVirtualDisplay()
|
||||
assert vd._geometry == "1920x1080x24"
|
||||
|
||||
|
||||
@pytest.mark.unit
|
||||
def test_linux_virtual_display_custom_geometry():
|
||||
"""Caller-supplied width/height feed straight into the Xvfb geometry
|
||||
spec; the depth is always 24 (Firefox/ANGLE assume true-color)."""
|
||||
vd = _LinuxVirtualDisplay(width=2560, height=1440)
|
||||
assert vd._geometry == "2560x1440x24"
|
||||
|
||||
|
||||
@pytest.mark.unit
|
||||
def test_linux_virtual_display_stop_without_start_is_safe():
|
||||
"""``stop()`` before ``start()`` must be a no-op — supports the
|
||||
``__exit__`` path on a launcher that failed before Xvfb was spawned.
|
||||
Verifies no AttributeError on env restore (saved_env is empty)."""
|
||||
vd = _LinuxVirtualDisplay()
|
||||
vd.stop()
|
||||
vd.stop()
|
||||
assert vd._proc is None
|
||||
assert vd._display is None
|
||||
|
||||
Reference in New Issue
Block a user