Files
2026-07-13 12:24:33 +08:00

174 lines
6.2 KiB
Python

# SPDX-License-Identifier: Apache-2.0
"""
Unit tests for RESP adapter environment variable support.
These tests verify the precedence logic (config > env var > default)
without requiring a live Redis server.
"""
# Standard
import os
class TestRESPL2AdapterEnvVars:
"""Test env var resolution in the MP-mode RESP L2 adapter factory."""
def test_env_vars_used_when_config_empty(self, monkeypatch):
"""Env vars should be used when config values are empty/default."""
# First Party
from lmcache.v1.distributed.l2_adapters.resp_l2_adapter import (
RESPL2AdapterConfig,
)
monkeypatch.setenv("LMCACHE_RESP_HOST", "env-host")
monkeypatch.setenv("LMCACHE_RESP_PORT", "7777")
monkeypatch.setenv("LMCACHE_RESP_USERNAME", "env-user")
monkeypatch.setenv("LMCACHE_RESP_PASSWORD", "env-pass")
config = RESPL2AdapterConfig(host="", port=0, username="", password="")
host = config.host or os.environ.get("LMCACHE_RESP_HOST", "")
port = (
config.port
if config.port
else int(os.environ.get("LMCACHE_RESP_PORT", "0"))
)
username = config.username or os.environ.get("LMCACHE_RESP_USERNAME", "")
password = config.password or os.environ.get("LMCACHE_RESP_PASSWORD", "")
assert host == "env-host"
assert port == 7777
assert username == "env-user"
assert password == "env-pass"
def test_config_overrides_env_vars(self, monkeypatch):
"""Config values should take precedence over env vars."""
# First Party
from lmcache.v1.distributed.l2_adapters.resp_l2_adapter import (
RESPL2AdapterConfig,
)
monkeypatch.setenv("LMCACHE_RESP_HOST", "env-host")
monkeypatch.setenv("LMCACHE_RESP_PORT", "7777")
monkeypatch.setenv("LMCACHE_RESP_USERNAME", "env-user")
monkeypatch.setenv("LMCACHE_RESP_PASSWORD", "env-pass")
config = RESPL2AdapterConfig(
host="cfg-host",
port=8888,
username="cfg-user",
password="cfg-pass",
)
host = config.host or os.environ.get("LMCACHE_RESP_HOST", "")
port = (
config.port
if config.port
else int(os.environ.get("LMCACHE_RESP_PORT", "0"))
)
username = config.username or os.environ.get("LMCACHE_RESP_USERNAME", "")
password = config.password or os.environ.get("LMCACHE_RESP_PASSWORD", "")
assert host == "cfg-host"
assert port == 8888
assert username == "cfg-user"
assert password == "cfg-pass"
def test_defaults_when_no_env_and_no_config(self, monkeypatch):
"""Without env vars or config, values should be empty/zero."""
# First Party
from lmcache.v1.distributed.l2_adapters.resp_l2_adapter import (
RESPL2AdapterConfig,
)
monkeypatch.delenv("LMCACHE_RESP_HOST", raising=False)
monkeypatch.delenv("LMCACHE_RESP_PORT", raising=False)
monkeypatch.delenv("LMCACHE_RESP_USERNAME", raising=False)
monkeypatch.delenv("LMCACHE_RESP_PASSWORD", raising=False)
config = RESPL2AdapterConfig(host="", port=0, username="", password="")
host = config.host or os.environ.get("LMCACHE_RESP_HOST", "")
port = (
config.port
if config.port
else int(os.environ.get("LMCACHE_RESP_PORT", "0"))
)
username = config.username or os.environ.get("LMCACHE_RESP_USERNAME", "")
password = config.password or os.environ.get("LMCACHE_RESP_PASSWORD", "")
assert host == ""
assert port == 0
assert username == ""
assert password == ""
class TestRESPConnectorAdapterEnvVars:
"""Test env var resolution in the non-MP RESP connector adapter."""
def test_env_vars_used_when_extra_config_empty(self, monkeypatch):
"""Env vars should be used when extra_config has no credentials."""
monkeypatch.setenv("LMCACHE_RESP_USERNAME", "env-user")
monkeypatch.setenv("LMCACHE_RESP_PASSWORD", "env-pass")
extra_config = {}
cfg_username = str(extra_config.get("username", ""))
cfg_password = str(extra_config.get("password", ""))
username = cfg_username or os.environ.get("LMCACHE_RESP_USERNAME", "")
password = cfg_password or os.environ.get("LMCACHE_RESP_PASSWORD", "")
assert username == "env-user"
assert password == "env-pass"
def test_extra_config_overrides_env_vars(self, monkeypatch):
"""extra_config values should take precedence over env vars."""
monkeypatch.setenv("LMCACHE_RESP_USERNAME", "env-user")
monkeypatch.setenv("LMCACHE_RESP_PASSWORD", "env-pass")
extra_config = {"username": "cfg-user", "password": "cfg-pass"}
cfg_username = str(extra_config.get("username", ""))
cfg_password = str(extra_config.get("password", ""))
username = cfg_username or os.environ.get("LMCACHE_RESP_USERNAME", "")
password = cfg_password or os.environ.get("LMCACHE_RESP_PASSWORD", "")
assert username == "cfg-user"
assert password == "cfg-pass"
def test_host_port_env_var_fallback(self, monkeypatch):
"""Host/port env vars should be used when URL values are empty."""
monkeypatch.setenv("LMCACHE_RESP_HOST", "env-host")
monkeypatch.setenv("LMCACHE_RESP_PORT", "9999")
parsed_host = ""
parsed_port = 0
host = parsed_host or os.environ.get("LMCACHE_RESP_HOST", "")
port = (
parsed_port
if parsed_port
else int(os.environ.get("LMCACHE_RESP_PORT", "0"))
)
assert host == "env-host"
assert port == 9999
def test_url_overrides_env_vars(self, monkeypatch):
"""URL-parsed values should take precedence over env vars."""
monkeypatch.setenv("LMCACHE_RESP_HOST", "env-host")
monkeypatch.setenv("LMCACHE_RESP_PORT", "9999")
parsed_host = "url-host"
parsed_port = 6379
host = parsed_host or os.environ.get("LMCACHE_RESP_HOST", "")
port = (
parsed_port
if parsed_port
else int(os.environ.get("LMCACHE_RESP_PORT", "0"))
)
assert host == "url-host"
assert port == 6379