import pytest
from modelexpress.load_strategy import rdma_strategy
from modelexpress.load_strategy.rdma_strategy import (
DEFAULT_RDMA_TRANSFER_TIMEOUT_S,
MAX_SOURCE_RETRIES,
_transfer_timeout_seconds,
)
def test_unset_preserves_the_previous_hard_coded_budget(monkeypatch):
monkeypatch.delenv("MX_TRANSFER_TIMEOUT", raising=False)
assert DEFAULT_RDMA_TRANSFER_TIMEOUT_S == 300.0
assert _transfer_timeout_seconds() == 300.0
def test_the_900_default_of_the_env_var_is_not_inherited(monkeypatch):
monkeypatch.delenv("MX_TRANSFER_TIMEOUT", raising=False)
assert rdma_strategy.envs.MX_TRANSFER_TIMEOUT == 900
assert _transfer_timeout_seconds() == 300.0
def test_an_operator_can_shorten_the_budget(monkeypatch):
monkeypatch.setenv("MX_TRANSFER_TIMEOUT", "30")
assert _transfer_timeout_seconds() == 30.0
def test_an_operator_can_lengthen_the_budget(monkeypatch):
monkeypatch.setenv("MX_TRANSFER_TIMEOUT", "1800")
assert _transfer_timeout_seconds() == 1800.0
def test_an_explicit_900_is_honoured(monkeypatch):
monkeypatch.setenv("MX_TRANSFER_TIMEOUT", "900")
assert _transfer_timeout_seconds() == 900.0
def test_zero_falls_back_rather_than_meaning_unbounded(monkeypatch):
monkeypatch.setenv("MX_TRANSFER_TIMEOUT", "0")
assert _transfer_timeout_seconds() == 300.0
def test_a_negative_value_falls_back(monkeypatch):
monkeypatch.setenv("MX_TRANSFER_TIMEOUT", "-1")
assert _transfer_timeout_seconds() == 300.0
def test_a_non_numeric_value_falls_back(monkeypatch):
monkeypatch.setenv("MX_TRANSFER_TIMEOUT", "not-a-number")
assert _transfer_timeout_seconds() == 300.0
@pytest.mark.parametrize("value", ["nan", "inf", "-inf"])
def test_a_non_finite_value_falls_back(monkeypatch, value):
monkeypatch.setenv("MX_TRANSFER_TIMEOUT", value)
assert _transfer_timeout_seconds() == 300.0
def test_a_fractional_value_is_accepted(monkeypatch):
monkeypatch.setenv("MX_TRANSFER_TIMEOUT", "0.5")
assert _transfer_timeout_seconds() == 0.5
def test_the_budget_is_per_candidate_not_per_load(monkeypatch):
monkeypatch.setenv("MX_TRANSFER_TIMEOUT", "60")
assert _transfer_timeout_seconds() * MAX_SOURCE_RETRIES == 180.0