mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-31 19:16:29 +00:00
Systematic prune per AGENTS.md test policy, one pass over every major test tree (gateway, hermes_cli, tools, agent, run_agent, plugins, cli, cron, tui_gateway, honcho/openviking, root-level): - DELETE: source-reading tests (read_text/getsource on prod files), change-detector tests (exact catalog counts, model-name snapshots, config version literals), mock-echo tests (assert a mock returns what it was told), assertion-free/trivial tests, near-duplicate parametrizations (boundaries + one representative kept), async/sync twin duplicates, cosmetic within-file variations. - KEEP (mandatory): security/redaction/approval guards, message-role alternation invariants, prompt-caching/deterministic-call-id invariants, issue-number regression tests (deduped), E2E tests. - 6 test files deleted outright (script-style/no-assert or fully redundant); conftest.py, fakes/, fixtures/ untouched. - tests/acp/conftest.py added: autouse fixture stubs the live models.dev/GitHub/Copilot/Anthropic inventory fetches that ACP server tests performed on every session create — test_server.py 147s → 3.4s, and the tests are now genuinely hermetic. - Sleep-based slowness shrunk where safe (codex_ttfb_watchdog, compression_concurrent_fork, etc.); no wall-clock assertion tightened. Verification: full hermetic suite via scripts/run_tests.sh — 2439 files, 31,130 tests passed, 0 failed, 0 flaky retries, 315s wall (baseline: 583s wall, 13,564s subprocess CPU).
79 lines
2.7 KiB
Python
79 lines
2.7 KiB
Python
"""Tests for network.force_ipv4 — the socket.getaddrinfo monkey-patch."""
|
|
|
|
import importlib
|
|
import socket
|
|
|
|
|
|
|
|
def _reload_constants():
|
|
"""Reload hermes_constants to get a fresh apply_ipv4_preference."""
|
|
import hermes_constants
|
|
importlib.reload(hermes_constants)
|
|
return hermes_constants
|
|
|
|
|
|
class TestApplyIPv4Preference:
|
|
"""Tests for apply_ipv4_preference()."""
|
|
|
|
def setup_method(self):
|
|
"""Save the original getaddrinfo before each test."""
|
|
self._original = socket.getaddrinfo
|
|
|
|
def teardown_method(self):
|
|
"""Restore the original getaddrinfo after each test."""
|
|
socket.getaddrinfo = self._original
|
|
|
|
|
|
def test_patches_getaddrinfo_when_forced(self):
|
|
"""Patches socket.getaddrinfo when force=True."""
|
|
from hermes_constants import apply_ipv4_preference
|
|
original = socket.getaddrinfo
|
|
apply_ipv4_preference(force=True)
|
|
assert socket.getaddrinfo is not original
|
|
assert getattr(socket.getaddrinfo, "_hermes_ipv4_patched", False) is True
|
|
|
|
def test_double_patch_is_safe(self):
|
|
"""Calling apply twice doesn't double-wrap."""
|
|
from hermes_constants import apply_ipv4_preference
|
|
apply_ipv4_preference(force=True)
|
|
first_patch = socket.getaddrinfo
|
|
apply_ipv4_preference(force=True)
|
|
assert socket.getaddrinfo is first_patch
|
|
|
|
def test_af_unspec_becomes_af_inet(self):
|
|
"""AF_UNSPEC (default) calls get rewritten to AF_INET."""
|
|
from hermes_constants import apply_ipv4_preference
|
|
|
|
calls = []
|
|
original = socket.getaddrinfo
|
|
|
|
def mock_getaddrinfo(host, port, family=0, type=0, proto=0, flags=0):
|
|
calls.append(family)
|
|
return [(socket.AF_INET, socket.SOCK_STREAM, 6, "", ("93.184.216.34", 80))]
|
|
|
|
socket.getaddrinfo = mock_getaddrinfo
|
|
apply_ipv4_preference(force=True)
|
|
|
|
# Call with default family (AF_UNSPEC = 0)
|
|
socket.getaddrinfo("example.com", 80)
|
|
assert calls[-1] == socket.AF_INET, "AF_UNSPEC should be rewritten to AF_INET"
|
|
|
|
def test_explicit_family_preserved(self):
|
|
"""Explicit AF_INET6 requests are not intercepted."""
|
|
from hermes_constants import apply_ipv4_preference
|
|
|
|
calls = []
|
|
original = socket.getaddrinfo
|
|
|
|
def mock_getaddrinfo(host, port, family=0, type=0, proto=0, flags=0):
|
|
calls.append(family)
|
|
return [(family, socket.SOCK_STREAM, 6, "", ("::1", 80))]
|
|
|
|
socket.getaddrinfo = mock_getaddrinfo
|
|
apply_ipv4_preference(force=True)
|
|
|
|
socket.getaddrinfo("example.com", 80, family=socket.AF_INET6)
|
|
assert calls[-1] == socket.AF_INET6, "Explicit AF_INET6 should pass through"
|
|
|
|
|
|
|