Code-only commit. The Phase-2 functional tests + PARITY.md are written and locally consistent, but the e2e cold-verify on cc-ci is BLOCKED by abra deploy timing out (900s) on the matrix-synapse stack. The deploy hits the orchestrator's wait_healthy timeout — synapse + postgres-autoupgrade are too slow on this host (28GB disk, 3.5GB RAM, single node). Even after pruning Docker images (freed disk from 90% → 55% used), the deploy still times out. Root cause appears to be CPU/IO-bound startup on this host rather than disk space. What's landed (code-only): - tests/matrix-synapse/PARITY.md: parity table; the 3 recipe-maintainer shell-script tests (compress_state / test_complexity_limit / test_purge) deferred with technical rationale (operational regressions against persistent state — incompatible with the ephemeral per-run model). Phase-2 health_check added (the corpus has no health_check.py). - tests/matrix-synapse/functional/test_health_check.py: GET /_matrix/client/versions → 200 + JSON. - tests/matrix-synapse/functional/test_federation_version.py: GET /_matrix/federation/v1/version → 200, asserts server.name='Synapse' + non-empty server.version (plan §4.3 prescribed). - tests/matrix-synapse/functional/test_register_and_message.py: plan §4.3 prescribed test — registers two users via the public client API (m.login.dummy UIAA flow), logs in, creates a private_chat room, invites + joins user_b, sends an m.room.message with a uuid marker, reads the room's messages, asserts the marker appears in user_b's view. Non-vacuous full client-API roundtrip. - tests/matrix-synapse/recipe_meta.py: EXTRA_ENV adds ENABLE_REGISTRATION=true (lets the test use public client registration; admin endpoints aren't routed publicly by this recipe) and TIMEOUT=900 (overrides the recipe's default 300s abra-deploy convergence timeout). **Cold-verify status: BLOCKED on cc-ci host capacity for matrix-synapse deploys** — needs operator review (more disk / RAM / a heavier-recipe sequencing strategy). Filed in JOURNAL-2 + PushNotification. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
46 lines
2.1 KiB
Python
46 lines
2.1 KiB
Python
"""matrix-synapse — recipe-specific functional test (Phase 2 P3, ≥2 beyond parity).
|
|
|
|
Plan §4.3 explicitly names `/_matrix/federation/v1/version` as a matrix-synapse-specific test
|
|
target ("federation endpoint reachable"). This endpoint is the canonical "is this server
|
|
discoverable on the Matrix federation" probe — every Synapse exposes it, and federating servers
|
|
hit it to learn the running implementation + version.
|
|
|
|
This test fetches `/_matrix/federation/v1/version` and asserts:
|
|
1. Status 200.
|
|
2. JSON body with the documented `server` envelope: `{ "server": { "name": ..., "version": ... } }`.
|
|
3. `server.name` is the string `"Synapse"` (the running implementation).
|
|
4. `server.version` is a non-empty string (the running synapse build).
|
|
|
|
Non-vacuous: a generic matrix-compatible server with a different implementation name (e.g.
|
|
Dendrite) would fail the `name == "Synapse"` check. A misconfigured Synapse that hasn't booted
|
|
its federation subsystem returns 502; a homeserver with federation disabled returns 403/404.
|
|
|
|
Runs in the custom tier against the shared post-install live deployment.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import sys
|
|
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "..", "runner"))
|
|
from harness import http as harness_http # noqa: E402
|
|
|
|
|
|
def test_federation_version_endpoint(live_app):
|
|
"""GET /_matrix/federation/v1/version → 200, JSON with server.name=Synapse."""
|
|
url = f"https://{live_app}/_matrix/federation/v1/version"
|
|
status, body = harness_http.retry_http_get(url, expect_status=200, max_wait=60, interval=3)
|
|
assert status == 200, f"GET {url} HTTP {status} (expected 200)"
|
|
assert isinstance(body, dict), f"federation version returned non-dict: {type(body).__name__}"
|
|
server = body.get("server")
|
|
assert isinstance(server, dict), (
|
|
f"federation version response missing 'server' envelope: {body!r}"
|
|
)
|
|
name = server.get("name")
|
|
assert name == "Synapse", f"server.name={name!r}, expected 'Synapse'"
|
|
version = server.get("version")
|
|
assert isinstance(version, str) and len(version) > 0, (
|
|
f"server.version is not a non-empty string: {version!r}"
|
|
)
|