mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-30 19:09:28 +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).
120 lines
4.6 KiB
Python
120 lines
4.6 KiB
Python
"""Targeted tests for ``utils.base_url_hostname`` and ``base_url_host_matches``.
|
|
|
|
These helpers are used across provider routing, auxiliary client, setup
|
|
wizards, billing routes, and the trajectory compressor to avoid the
|
|
substring-match false-positive class documented in
|
|
tests/agent/test_direct_provider_url_detection.py.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from utils import base_url_hostname, base_url_host_matches
|
|
|
|
|
|
# ─── base_url_hostname ────────────────────────────────────────────────────
|
|
|
|
|
|
def test_empty_returns_empty_string():
|
|
assert base_url_hostname("") == ""
|
|
assert base_url_hostname(None) == "" # type: ignore[arg-type]
|
|
|
|
|
|
def test_plain_host_without_scheme():
|
|
assert base_url_hostname("api.openai.com") == "api.openai.com"
|
|
assert base_url_hostname("api.openai.com/v1") == "api.openai.com"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_trailing_dot_stripped():
|
|
assert base_url_hostname("https://api.openai.com./v1") == "api.openai.com"
|
|
|
|
|
|
|
|
|
|
def test_host_suffix_is_not_the_provider():
|
|
assert base_url_hostname("https://api.openai.com.example/v1") == "api.openai.com.example"
|
|
assert base_url_hostname("https://api.x.ai.example/v1") == "api.x.ai.example"
|
|
|
|
|
|
def test_port_is_ignored():
|
|
assert base_url_hostname("https://api.openai.com:443/v1") == "api.openai.com"
|
|
|
|
|
|
|
|
|
|
# ─── base_url_host_matches ────────────────────────────────────────────────
|
|
|
|
|
|
class TestBaseUrlHostMatchesExact:
|
|
def test_exact_domain_matches(self):
|
|
assert base_url_host_matches("https://openrouter.ai/api/v1", "openrouter.ai") is True
|
|
assert base_url_host_matches("https://moonshot.ai", "moonshot.ai") is True
|
|
|
|
def test_subdomain_matches(self):
|
|
# A subdomain of the registered domain should match — needed for
|
|
# api.moonshot.ai / api.kimi.com / portal.qwen.ai lookups that
|
|
# accept both the bare registrable domain and any subdomain under it.
|
|
assert base_url_host_matches("https://api.moonshot.ai/v1", "moonshot.ai") is True
|
|
assert base_url_host_matches("https://api.kimi.com/v1", "api.kimi.com") is True
|
|
assert base_url_host_matches("https://portal.qwen.ai/v1", "portal.qwen.ai") is True
|
|
|
|
|
|
class TestBaseUrlHostMatchesNegatives:
|
|
"""The reason this helper exists — defend against substring collisions."""
|
|
|
|
def test_path_segment_containing_domain_does_not_match(self):
|
|
assert base_url_host_matches("https://evil.test/moonshot.ai/v1", "moonshot.ai") is False
|
|
assert base_url_host_matches("https://proxy.example.test/openrouter.ai/v1", "openrouter.ai") is False
|
|
assert base_url_host_matches("https://proxy/api.kimi.com/v1", "api.kimi.com") is False
|
|
|
|
def test_host_suffix_does_not_match(self):
|
|
# Attacker-controlled hosts that end with the domain string are not
|
|
# the domain.
|
|
assert base_url_host_matches("https://moonshot.ai.evil/v1", "moonshot.ai") is False
|
|
assert base_url_host_matches("https://openrouter.ai.example/v1", "openrouter.ai") is False
|
|
|
|
def test_host_prefix_does_not_match(self):
|
|
# "fake-openrouter.ai" is not a subdomain of openrouter.ai.
|
|
assert base_url_host_matches("https://fake-openrouter.ai/v1", "openrouter.ai") is False
|
|
|
|
|
|
class TestBaseUrlHostMatchesEdgeCases:
|
|
def test_empty_base_url_returns_false(self):
|
|
assert base_url_host_matches("", "openrouter.ai") is False
|
|
assert base_url_host_matches(None, "openrouter.ai") is False # type: ignore[arg-type]
|
|
|
|
|
|
|
|
|
|
|
|
class TestOllamaUrlHostCheck:
|
|
"""GHSA-76xc-57q6-vm5m — ollama.com was using a raw substring match for
|
|
credential selection (same bug class as GHSA-xf8p-v2cg-h7h5 for OpenRouter).
|
|
These tests lock in that the base_url_host_matches fix correctly rejects
|
|
the same attack vectors for Ollama.
|
|
"""
|
|
|
|
def test_ollama_com_path_injection_rejected(self):
|
|
"""http://evil.test/ollama.com/v1 — ollama.com appears in the path,
|
|
not the host. Must not be treated as Ollama Cloud."""
|
|
assert base_url_host_matches(
|
|
"http://127.0.0.1:9000/ollama.com/v1", "ollama.com"
|
|
) is False
|
|
|
|
def test_ollama_com_subdomain_lookalike_rejected(self):
|
|
"""ollama.com.attacker.test is a separate host, not ollama.com."""
|
|
assert base_url_host_matches(
|
|
"http://ollama.com.attacker.test:9000/v1", "ollama.com"
|
|
) is False
|
|
|
|
|
|
|
|
|
|
def test_genuine_ollama_com_matches(self):
|
|
assert base_url_host_matches(
|
|
"https://ollama.com/api/generate", "ollama.com"
|
|
) is True
|
|
|