aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/tests/test_platform.py
blob: 2725df606dee204f03504631a7702fb699f9485f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
"""Tests for meshbay_node.platform — the OS-specific paths and tool resolution.

The behaviour is selected on `sys.platform` at call time, so it is exercised
here by monkeypatching that (and `os.environ`) rather than only on the OS the
suite happens to run on.
"""

import asyncio
import sys
from pathlib import Path
from unittest.mock import Mock

import pytest
from meshbay_node import platform as plat

# ── Directories ──────────────────────────────────────────────────────────────

@pytest.mark.parametrize("fn,tail", [
    (plat.config_dir, ()),
    (plat.data_dir, ("data",)),
    (plat.state_dir, ("state",)),
])
def test_windows_dirs_live_under_localappdata(fn, tail, monkeypatch, tmp_path):
    monkeypatch.setattr(sys, "platform", "win32")
    monkeypatch.setenv("LOCALAPPDATA", str(tmp_path))
    assert fn() == tmp_path.joinpath("meshbay", *tail)


@pytest.mark.parametrize("fn,expected_tail", [
    (plat.config_dir, (".config", "meshbay")),
    (plat.data_dir, (".local", "share", "meshbay")),
    (plat.state_dir, (".local", "state", "meshbay")),
])
def test_posix_dirs_follow_xdg(fn, expected_tail, monkeypatch):
    monkeypatch.setattr(sys, "platform", "linux")
    assert fn() == Path.home().joinpath(*expected_tail)


def test_windows_dirs_fall_back_to_home_without_localappdata(monkeypatch):
    monkeypatch.setattr(sys, "platform", "win32")
    monkeypatch.delenv("LOCALAPPDATA", raising=False)
    assert plat.config_dir() == Path.home() / "meshbay"


# ── File permissions ─────────────────────────────────────────────────────────

def test_chmod_private_is_a_noop_on_windows(monkeypatch):
    monkeypatch.setattr(sys, "platform", "win32")
    fake = Mock(spec=Path)
    plat.chmod_private(fake)
    fake.chmod.assert_not_called()


def test_chmod_private_applies_mode_off_windows(monkeypatch, tmp_path):
    monkeypatch.setattr(sys, "platform", "linux")
    f = tmp_path / "secret"
    f.write_text("x", encoding="utf-8")
    called = {}
    monkeypatch.setattr(type(f), "chmod", lambda self, m: called.setdefault("mode", m))
    plat.chmod_private(f)
    assert called["mode"] == 0o600


# ── Media tools ──────────────────────────────────────────────────────────────

def test_check_media_tools_raises_when_ffmpeg_is_missing(monkeypatch):
    monkeypatch.setattr(plat.shutil, "which", lambda _n: None)
    with pytest.raises(RuntimeError, match="not found in PATH"):
        plat.check_media_tools()


def test_check_media_tools_stores_the_resolved_paths(monkeypatch):
    monkeypatch.setattr(plat.shutil, "which",
                        lambda n: f"/opt/bin/{n}.exe")
    plat.check_media_tools("ffmpeg", "ffprobe")
    assert plat.ffmpeg_cmd() == "/opt/bin/ffmpeg.exe"
    assert plat.ffprobe_cmd() == "/opt/bin/ffprobe.exe"


# ── Event loop ───────────────────────────────────────────────────────────────

def test_use_compatible_event_loop_is_a_noop_off_windows(monkeypatch):
    monkeypatch.setattr(sys, "platform", "linux")
    before = asyncio.get_event_loop_policy()
    plat.use_compatible_event_loop()
    assert asyncio.get_event_loop_policy() is before


@pytest.mark.skipif(sys.platform != "win32",
                    reason="WindowsSelectorEventLoopPolicy exists only on win32")
def test_use_compatible_event_loop_selects_the_selector_loop_on_windows():
    plat.use_compatible_event_loop()
    assert isinstance(asyncio.get_event_loop_policy(),
                      asyncio.WindowsSelectorEventLoopPolicy)