test: cover adapter-wrapped probe stubs and repeat-probe stability

Trim the salvaged test to the ≤2-invariant bar: one parametrized test asserting
repeat probes stay resolvable (the user-visible contract from #87654) and that
neither a bare stub nor a Codex-adapter-wrapped stub lands under the runtime
cache key. The guard now keys on aux_probe_mode being active rather than on the
client's type, which is what covers the wrapped case.
This commit is contained in:
teknium1
2026-09-13 11:01:51 -07:00
committed by Teknium
parent a714ff9823
commit 093c58ca77
+16 -31
View File
@@ -34,40 +34,25 @@ class TestAuxProbeMode:
with aux._client_cache_lock:
assert key not in aux._client_cache
def test_probe_stub_never_cached_via_get_cached_client(self):
"""The inline store in _get_cached_client must honour the same guard.
test_probe_stub_never_cached above covers _store_cached_client(), but
_get_cached_client() assigns to _client_cache directly instead of
calling it. That is the path check_fns actually take inside
aux_probe_mode(), so without a guard there the probe poisons the entry
and the next runtime caller with the same key gets a dead client.
@pytest.mark.parametrize("wrap", [False, True], ids=["bare-stub", "adapter-wrapped-stub"])
def test_repeat_probes_stay_resolvable_and_never_cache(self, wrap):
"""Probes go through _get_cached_client's inline store, not _store_cached_client,
so the stub (bare, or wrapped in a Codex adapter whose leaf is the stub) used to
land under the runtime key; the next probe then hit _compat_model() on the stub
and check_vision_requirements() flipped to False for the process (#87654).
"""
import agent.auxiliary_client as aux
stub = aux._AuxProbeClientStub()
try:
with patch.object(
aux, "resolve_provider_client", lambda *a, **k: (stub, "m")
):
with aux.aux_probe_mode():
client, _model = aux._get_cached_client("probe-guard-test", "m")
assert client is stub
with aux._client_cache_lock:
poisoned = [
key
for key, entry in aux._client_cache.items()
if isinstance(entry[0], aux._AuxProbeClientStub)
]
assert poisoned == [], f"probe stub reached the cache: {poisoned}"
finally:
with aux._client_cache_lock:
for key in [
k
for k, e in aux._client_cache.items()
if isinstance(e[0], aux._AuxProbeClientStub)
]:
del aux._client_cache[key]
def _resolve(*a, **k):
stub = aux._AuxProbeClientStub(api_key="k", base_url="https://x.invalid/v1")
return (aux.CodexAuxiliaryClient(stub, "v/m") if wrap else stub), "v/m"
aux.shutdown_cached_clients()
with patch.object(aux, "resolve_provider_client", _resolve), aux.aux_probe_mode():
answers = [aux._get_cached_client("probe-guard-test", "vendor/model")[0] is not None for _ in range(3)]
assert answers == [True, True, True]
with aux._client_cache_lock:
assert not [k for k in aux._client_cache if k[1:2] == (False,) and k[-1] == "vendor/model"]
def test_probe_stub_raises_on_runtime_use(self):
import agent.auxiliary_client as aux