/
/
/
1"""Tests for RAM-gated buffer-size presets."""
2
3from unittest.mock import patch
4
5import pytest
6
7from music_assistant.controllers.streams import constants
8from music_assistant.controllers.streams.constants import BufferSize
9
10
11@pytest.mark.parametrize(
12 ("total_gb", "expected"),
13 [
14 (2.0, [BufferSize.MINIMAL]),
15 (3.6, [BufferSize.MINIMAL]),
16 # "4GB" hosts that report slightly less (kernel-reserved RAM, ~3.8GB) still reach
17 # Balanced: the 4GB target is checked with the reporting tolerance (floor ~3.68GB).
18 (3.7, [BufferSize.MINIMAL, BufferSize.BALANCED]),
19 (3.8, [BufferSize.MINIMAL, BufferSize.BALANCED]),
20 (4.0, [BufferSize.MINIMAL, BufferSize.BALANCED]),
21 (6.0, [BufferSize.MINIMAL, BufferSize.BALANCED]),
22 (6.9, [BufferSize.MINIMAL, BufferSize.BALANCED]),
23 # Maximum is an 8GB nominal target on the same tolerance (floor ~7.36GB), so a 7.0GB
24 # host gets Balanced only while an "8GB" box reporting ~7.4GB+ reaches Maximum.
25 (7.0, [BufferSize.MINIMAL, BufferSize.BALANCED]),
26 (7.4, [BufferSize.MINIMAL, BufferSize.BALANCED, BufferSize.MAXIMUM]),
27 (7.7, [BufferSize.MINIMAL, BufferSize.BALANCED, BufferSize.MAXIMUM]),
28 (8.0, [BufferSize.MINIMAL, BufferSize.BALANCED, BufferSize.MAXIMUM]),
29 (16.0, [BufferSize.MINIMAL, BufferSize.BALANCED, BufferSize.MAXIMUM]),
30 # unknown memory (0.0) -> offer everything (fail open)
31 (0.0, [BufferSize.MINIMAL, BufferSize.BALANCED, BufferSize.MAXIMUM]),
32 ],
33)
34def test_get_available_buffer_sizes(total_gb: float, expected: list[BufferSize]) -> None:
35 """Balanced needs ~4GB (floor ~3.68GB), Maximum ~8GB (floor ~7.36GB); unknown RAM offers all."""
36 with patch.object(constants, "TOTAL_SYSTEM_MEMORY_GB", total_gb):
37 assert constants.get_available_buffer_sizes() == expected
38
39
40@pytest.mark.parametrize(
41 ("total_gb", "expected"),
42 [
43 (2.0, BufferSize.MINIMAL),
44 (3.6, BufferSize.MINIMAL),
45 (3.7, BufferSize.BALANCED),
46 (4.0, BufferSize.BALANCED),
47 (6.9, BufferSize.BALANCED),
48 (7.0, BufferSize.BALANCED),
49 (7.4, BufferSize.MAXIMUM),
50 (7.7, BufferSize.MAXIMUM),
51 (16.0, BufferSize.MAXIMUM),
52 # unknown memory (0.0) -> Minimal default (conservative)
53 (0.0, BufferSize.MINIMAL),
54 ],
55)
56def test_default_buffer_size(total_gb: float, expected: BufferSize) -> None:
57 """The auto-selected default follows the same ~4GB/~8GB cutoffs as the available presets."""
58 with patch.object(constants, "TOTAL_SYSTEM_MEMORY_GB", total_gb):
59 assert constants._get_default_buffer_size() == expected
60