155 lines
5.0 KiB
Python
155 lines
5.0 KiB
Python
from __future__ import annotations
|
|
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
from opensquilla.sandbox.backend import linux_readiness as mod
|
|
|
|
|
|
def test_detects_wsl1_from_proc_version() -> None:
|
|
assert mod.proc_version_indicates_wsl1("Linux version 4.4.0 Microsoft")
|
|
assert not mod.proc_version_indicates_wsl1("Linux version 5.15.90.1-microsoft-standard-WSL2")
|
|
|
|
|
|
def test_user_namespace_failure_patterns() -> None:
|
|
output = subprocess.CompletedProcess(
|
|
args=["bwrap"],
|
|
returncode=1,
|
|
stdout=b"",
|
|
stderr=b"bwrap: No permissions to create a new namespace\n",
|
|
)
|
|
|
|
assert mod.is_user_namespace_failure(output)
|
|
|
|
|
|
def test_probe_reports_missing_bwrap(monkeypatch) -> None:
|
|
monkeypatch.setattr(mod.shutil, "which", lambda name: None)
|
|
monkeypatch.setattr(mod, "is_wsl1", lambda: False)
|
|
|
|
probe = mod.probe_bwrap()
|
|
|
|
assert not probe.available
|
|
assert probe.reason == "missing_bwrap"
|
|
assert "bubblewrap" in probe.message.lower()
|
|
|
|
|
|
def test_probe_reports_user_namespace_unavailable(monkeypatch, tmp_path: Path) -> None:
|
|
fake_bwrap = tmp_path / "bwrap"
|
|
fake_bwrap.write_text("#!/bin/sh\n", encoding="utf-8")
|
|
monkeypatch.setattr(mod.shutil, "which", lambda name: str(fake_bwrap))
|
|
monkeypatch.setattr(mod, "is_wsl1", lambda: False)
|
|
def fake_run(argv, **kwargs):
|
|
if "--help" in argv:
|
|
return subprocess.CompletedProcess(
|
|
args=argv,
|
|
returncode=0,
|
|
stdout=b"--perms\n",
|
|
stderr=b"",
|
|
)
|
|
return subprocess.CompletedProcess(
|
|
args=argv,
|
|
returncode=1,
|
|
stdout=b"",
|
|
stderr=b"No permissions to create a new namespace",
|
|
)
|
|
|
|
monkeypatch.setattr(mod.subprocess, "run", fake_run)
|
|
|
|
probe = mod.probe_bwrap()
|
|
|
|
assert not probe.available
|
|
assert probe.reason == "user_namespace_unavailable"
|
|
|
|
|
|
def test_probe_reports_supported_bwrap(monkeypatch, tmp_path: Path) -> None:
|
|
fake_bwrap = tmp_path / "bwrap"
|
|
fake_bwrap.write_text("#!/bin/sh\n", encoding="utf-8")
|
|
calls: list[list[str]] = []
|
|
|
|
def fake_run(argv, **kwargs):
|
|
calls.append(list(argv))
|
|
if "--help" in argv:
|
|
return subprocess.CompletedProcess(
|
|
args=argv,
|
|
returncode=0,
|
|
stdout=b"--argv0\n--perms\n",
|
|
stderr=b"",
|
|
)
|
|
return subprocess.CompletedProcess(args=argv, returncode=0, stdout=b"", stderr=b"")
|
|
|
|
monkeypatch.setattr(mod.shutil, "which", lambda name: str(fake_bwrap))
|
|
monkeypatch.setattr(mod, "is_wsl1", lambda: False)
|
|
monkeypatch.setattr(mod.subprocess, "run", fake_run)
|
|
|
|
probe = mod.probe_bwrap()
|
|
|
|
assert probe.available
|
|
assert probe.path == str(fake_bwrap)
|
|
assert probe.supports_argv0 is True
|
|
assert probe.supports_perms is True
|
|
assert probe.supports_proc is True
|
|
assert calls[0] == [str(fake_bwrap), "--help"]
|
|
|
|
|
|
def test_probe_rejects_bwrap_without_required_perms_support(monkeypatch, tmp_path: Path) -> None:
|
|
fake_bwrap = tmp_path / "bwrap"
|
|
fake_bwrap.write_text("#!/bin/sh\n", encoding="utf-8")
|
|
|
|
def fake_run(argv, **kwargs):
|
|
if "--help" in argv:
|
|
return subprocess.CompletedProcess(
|
|
args=argv,
|
|
returncode=0,
|
|
stdout=b"--argv0\n",
|
|
stderr=b"",
|
|
)
|
|
return subprocess.CompletedProcess(args=argv, returncode=0, stdout=b"", stderr=b"")
|
|
|
|
monkeypatch.setattr(mod.shutil, "which", lambda name: str(fake_bwrap))
|
|
monkeypatch.setattr(mod, "is_wsl1", lambda: False)
|
|
monkeypatch.setattr(mod.subprocess, "run", fake_run)
|
|
|
|
probe = mod.probe_bwrap()
|
|
|
|
assert not probe.available
|
|
assert probe.reason == "missing_bwrap_perms"
|
|
assert probe.supports_perms is False
|
|
|
|
|
|
def test_probe_reports_available_bwrap_without_proc_mount_support(
|
|
monkeypatch,
|
|
tmp_path: Path,
|
|
) -> None:
|
|
fake_bwrap = tmp_path / "bwrap"
|
|
fake_bwrap.write_text("#!/bin/sh\n", encoding="utf-8")
|
|
calls: list[list[str]] = []
|
|
|
|
def fake_run(argv, **kwargs):
|
|
calls.append(list(argv))
|
|
if "--help" in argv:
|
|
return subprocess.CompletedProcess(
|
|
args=argv,
|
|
returncode=0,
|
|
stdout=b"--argv0\n--perms\n",
|
|
stderr=b"",
|
|
)
|
|
if "--proc" in argv:
|
|
return subprocess.CompletedProcess(
|
|
args=argv,
|
|
returncode=1,
|
|
stdout=b"",
|
|
stderr=b"bwrap: Can't mount proc on /newroot/proc: Operation not permitted",
|
|
)
|
|
return subprocess.CompletedProcess(args=argv, returncode=0, stdout=b"", stderr=b"")
|
|
|
|
monkeypatch.setattr(mod.shutil, "which", lambda name: str(fake_bwrap))
|
|
monkeypatch.setattr(mod, "is_wsl1", lambda: False)
|
|
monkeypatch.setattr(mod.subprocess, "run", fake_run)
|
|
|
|
probe = mod.probe_bwrap()
|
|
|
|
assert probe.available
|
|
assert probe.reason == "ready"
|
|
assert probe.supports_proc is False
|
|
assert any("--proc" in call for call in calls)
|