Erlang test layout

View Source

Erlang test and fixture module names remain globally flat and unchanged. The directories below mirror the ownership hierarchy under src/; they do not create namespaces or change EUnit/Common Test module names.

Test pathProduction owner
test/agents/src/agents/
test/artifacts/src/artifacts/
test/auth/src/auth/
test/callbacks/src/callbacks/
test/context/src/context/
test/core/src/core/
test/developer/src/developer/
test/evaluation/src/evaluation/
test/integrations/src/integrations/, plus explicit cross-feature integration and stress suites
test/live/src/live/
test/memory/src/memory/
test/models/src/models/
test/plugins/src/plugins/
test/protocols/src/protocols/
test/runtime/src/runtime/
test/sessions/src/sessions/
test/storage/src/storage/
test/telemetry/src/telemetry/
test/tools/src/tools/
test/workflows/src/workflows/
test/readme/README examples and opt-in provider integration evidence

The 0.8 and 0.9 model-provider slices mirror their deeper production ownership:

Test pathProduction owner
test/auth/credentials/Provider credential/profile-generation resolution and the existing credential lifecycle
test/models/profiles/Binary model profiles, aliases, capability ceilings, locked request options, and Live resolution
test/models/transport/Shared HTTP headers, synchronous/streaming 64 KiB header/trailer bounds, Gun request/SSE transport, incremental SSE, and injected transport fixtures
test/models/openai/Native OpenAI Responses request/content/provider behavior
test/models/openai/request/Pure Responses content, request, response, and SSE event codecs
test/models/openai/realtime/OpenAI Realtime provider codec and fixed-origin WebSocket transport
test/models/anthropic/Native Anthropic Messages provider behavior
test/models/anthropic/request/Pure Messages content, request, response, and SSE lifecycle codecs
test/models/compatible/Compatible Chat Completions provider behavior
test/models/compatible/request/Pure compatible content, request/response, and SSE codecs
test/models/vertex/Vertex publisher-model validation plus deterministic GenerateContent/SSE request, response, and transport behavior
test/live/core/Provider-neutral contiguous multi-frame/no-op admission, priority ordering, profile resolution, ownership, and flow control
test/live/voice/Negotiated format framing, 16/24 kHz input, bridge ownership, and acknowledgement behavior

The expanded in-development 0.10 scope keeps the same ownership rule:

Test path0.10 development owner
test/storage/adk_scope_sharded_test.erlShared/global-quota routing, exact-scope concurrency, volatile capacity, and durable idle reclamation
test/runtime/services/Built-in service-profile compilation, atomic bundle generations, application supervision, and durable_local ownership/health/restart/fail-closed coverage for its private Mnesia memory outbox
test/agents/adk_agent_config_test.erl and adk_agent_composition_test.erlSchema-v2 JSON/strict-YAML config, sealed immutable registry, and data-only composition
test/tools/connectors/Connector descriptor/manifest/toolset policy boundaries; package suites under packages/*/test/ execute every advertised operation through the registry, Agent Config, and adk_toolset and verify policy metadata, with packages/build_connector_packages.sh as the sole offline all-package build/test/extraction gate
test/artifacts/adk_artifact_gcs_test.erl, adk_artifact_stream_test.erl, and adk_artifact_effect_journal*_test.erlGCS-compatible immutable storage, bounded transfer, and journal/reconciliation boundaries
test/memory/embedding/, test/memory/vector/, test/memory/policy/, and test/memory/outbox/Bounded embedding/vector/hybrid references, opt-in governance, epoch-bound durable ingestion, registry hydration/identity claim barriers, constant-row health/majority readiness, indexed maintenance, and terminal-cap migration/pruning
test/protocols/mcp/adk_mcp_*foundation_test.erl, adk_mcp_oauth_test.erl, adk_mcp_pool_test.erl, and adk_mcp_sse_stream_test.erlExplicit protocol eras, catalogs, OAuth/PKCE, pooling, and incremental SSE; the streamable-HTTP CT fixture is local, not an external SDK matrix
test/protocols/a2a/v1/adk_a2a_v1_{agent_executor,client_stream,task_store,push}_test.erlRunner execution, callback streaming, bounded persistence, and process-local push
test/evaluation/adk_eval_service_test.erlEvaluation service, bounded raw-submission workers, canonical store ownership, and ETS/Mnesia lifecycle/recovery
test/evaluation/adk_eval_store_hardening_test.erlAtomic creation, byte quotas/headroom, baseline-aware pruning, ordered paging, and Mnesia restore repair checks
test/evaluation/adk_eval_report_parity_test.erlCanonical JSON/Markdown/JUnit/SARIF/annotations byte parity across direct, stored-result API, authenticated HTTP, existing eval-run, stdout, and file paths; approximately 1.4 MiB and exact/one-byte-under/16 MiB boundaries
test/evaluation/adk_eval_{builtin_metric,ensemble,simulation,statistics,review,export,worker_rpc,dev_api}_test.erlAdvanced bounded metric/simulator/ensemble/review/statistics/export/RPC/developer foundations
test/telemetry/adk_trace_store*_test.erlMetadata retention, cursor/capacity/privacy behavior, and observability exporter
test/telemetry/adk_trace_runtime_test.erlStrict app configuration and automatic bus/Runner/workflow-facade trace wiring
test/workflows/core/adk_workflow_trace_store_test.erlOpaque workflow lifecycle integration, owner-bound TTL renewal, and PID compatibility
test/developer/adk_dev_{graph_trace,eval_http,payload_inspection}_test.erlBounded graph/trace/evaluation surfaces and explicit redacted development-only payload inspection
test/runtime/deployment/, test/deployment/, and erlang_adk_startup_testLifecycle/draining, strict OTLP environment wiring, closed/health/application-config mode boundaries, health-only listener startup, descriptor-limit/PID1 contracts, both Cloud Run maximum annotations (not a singleton proof), render-first Cloud/GKE assets, and credential-safe managed-runtime feasibility boundaries; not live infrastructure evidence

These paths do not imply that 0.10 is released; their candidate evidence stays in VERSION_0_10_0.md.

Keep remote provider calls out of ordinary *_test.erl modules. Deterministic provider tests inject adk_model_fixture_transport, fake Live transports, or pure wire frames. A billable/network suite belongs in the owning provider directory, must use an explicit opt-in environment flag, and must report a missing credential as a skip rather than silently falling back to fixtures.

Only tests for the public facade and OTP application shell remain directly in test/, matching the root production modules. Shared helpers belong beside the subsystem that owns their behavior. Repository-level shell and TLS fixtures remain at test/ and test/fixtures/ because README and Phoenix release checks consume those stable paths.

Rebar3 enables one recursive test source root only in the test profile. Do not configure overlapping nested roots: ordinary EUnit/Common Test discovery must have one source entry per module, while default builds, releases, and Hex packages must not contain test helpers. Rebar3 may create temporary suite-directory copies internally when an explicit ct --suite path is selected; those are build artifacts, not additional source roots.

Use application include paths such as -include("adk_event.hrl").; never make an include depend on a test module's directory depth. Add new test modules and their dedicated fixtures to the directory that owns the tested lifecycle. Shared fixtures should still have one clear owner: for example, the injected model HTTP fixture belongs under test/models/transport/, while a provider- specific event fixture belongs under that provider's request/ or realtime/ directory. Test helper modules must never enter default builds or Hex packages.

Run the complete deterministic gate from the repository root:

./rebar3 do clean, compile, eunit, ct, dialyzer