Fix E2E test gaps and add comprehensive E2E + parity test suites
- Fix pull consumer fetch: send original stream subject in HMSG (not inbox) so NATS client distinguishes data messages from control messages - Fix MaxAge expiry: add background timer in StreamManager for periodic pruning - Fix JetStream wire format: Go-compatible anonymous objects with string enums, proper offset-based pagination for stream/consumer list APIs - Add 42 E2E black-box tests (core messaging, auth, TLS, accounts, JetStream) - Add ~1000 parity tests across all subsystems (gaps closure) - Update gap inventory docs to reflect implementation status
This commit is contained in:
57
docs/plans/2026-03-12-e2e-tests-design.md
Normal file
57
docs/plans/2026-03-12-e2e-tests-design.md
Normal file
@@ -0,0 +1,57 @@
|
||||
# NATS.E2E.Tests — Design
|
||||
|
||||
**Date:** 2026-03-12
|
||||
**Status:** Approved
|
||||
|
||||
## Overview
|
||||
|
||||
A true black-box E2E test project that launches `NATS.Server.Host` as a child process and connects using only `NATS.Client.Core` from NuGet. No project references to any server code.
|
||||
|
||||
## Components
|
||||
|
||||
### 1. `NatsServerProcess` — Server Lifecycle Helper
|
||||
|
||||
- Builds the host binary once (or locates pre-built output)
|
||||
- Launches `dotnet exec <path>/NATS.Server.Host.dll -p <port>` as a child process
|
||||
- Allocates a free port per instance
|
||||
- Waits for the server to be ready by polling TCP connect (with timeout)
|
||||
- On dispose: sends SIGINT / kills process, waits for exit
|
||||
- Captures stdout/stderr for diagnostics on failure
|
||||
|
||||
### 2. `NatsServerFixture` — xUnit Collection Fixture
|
||||
|
||||
- Implements `IAsyncLifetime`
|
||||
- Creates one `NatsServerProcess` per test class (or shared via collection)
|
||||
- Exposes `Port` and a `CreateClient()` helper that returns a connected `NatsConnection`
|
||||
|
||||
### 3. Initial Tests
|
||||
|
||||
- `ConnectAndPingTest` — Client connects, PING/PONG succeeds
|
||||
- `PubSubTest` — Two clients, publish on a subject, subscriber receives the message
|
||||
- `RequestReplyTest` — One client subscribes and replies, another sends a request and gets the response
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
tests/NATS.E2E.Tests/
|
||||
NATS.E2E.Tests.csproj # xUnit + NATS.Client.Core only, no server refs
|
||||
Infrastructure/
|
||||
NatsServerProcess.cs # Process lifecycle management
|
||||
NatsServerFixture.cs # xUnit fixture
|
||||
BasicTests.cs # Connect, PubSub, Request/Reply
|
||||
```
|
||||
|
||||
## Key Decisions
|
||||
|
||||
- **Binary discovery**: The fixture runs `dotnet build` on the host project and locates the output DLL via the known relative path from the solution root.
|
||||
- **Ready detection**: TCP connect poll to the allocated port with 10s timeout, 100ms interval.
|
||||
- **Process cleanup**: `Process.Kill()` with a graceful SIGINT attempt first.
|
||||
- **No shared state**: Each test class gets its own server process and port — full isolation.
|
||||
- **Timeout**: All async test operations use 10s CancellationTokenSource to avoid hangs.
|
||||
|
||||
## Out of Scope (YAGNI)
|
||||
|
||||
- No TLS/auth E2E tests in the initial project
|
||||
- No cluster/route/gateway/leaf-node multi-server tests
|
||||
- No JetStream E2E
|
||||
- No custom config file testing
|
||||
Reference in New Issue
Block a user