Make the e2e write phase work live across all five clients
Running the matrix against a live gateway surfaced several issues: - The write phase is now opt-in (-VerifyWrite, was -SkipWrite). It runs right after register so only a small event backlog precedes the write, and asserts the reliable OnWriteComplete signal (the written value is not echoed back by a provider-driven attribute like TestChangingInt, so the value compare is best-effort). - Java was launched as bare "gradle", which .NET's Process.Start cannot exec (it is gradle.bat) — resolve the launcher and run it via cmd.exe. - The Java client's MxEventStream queue capacity was 16, which overflows on any active session's backlog-replay burst; raised to 1024. - The Rust stream-events CLI now renders the event family as the proto enum name, matching the protobuf-JSON the other four clients emit. Update docs/GatewayTesting.md for the reworked write phase. Verified live: the full five-client matrix passes with -VerifyWrite. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+28
-16
@@ -180,19 +180,30 @@ path and writes a JSON report under `artifacts/e2e/`:
|
||||
2. **Bulk** — verifies `SubscribeBulk` / `UnsubscribeBulk` on a bounded tag
|
||||
subset (skip with `-SkipBulk`).
|
||||
3. **Add-item / advise** — adds and advises every discovered test tag.
|
||||
4. **Write round-trip** — writes a per-client sentinel value to a configurable
|
||||
writable attribute (`-WriteAttribute`, default `TestChangingInt`), then
|
||||
asserts the same value is echoed back through the event stream. Skip with
|
||||
`-SkipWrite`. The Rust `stream-events` CLI emits full per-event JSON
|
||||
(`itemHandle` + `value`) so all five clients run an identical value compare.
|
||||
5. **Stream** — asserts a bounded event stream delivers at least one event
|
||||
4. **Stream** — asserts a bounded event stream delivers at least one event
|
||||
(skip with `-SkipStream`).
|
||||
6. **Parity** — asserts MXAccess error paths are rejected rather than silently
|
||||
5. **Parity** — asserts MXAccess error paths are rejected rather than silently
|
||||
succeeding: an invalid item handle and an unknown session id (skip with
|
||||
`-SkipParity`).
|
||||
7. **Auth rejection** — asserts `open-session` is rejected when the API key is
|
||||
6. **Auth rejection** — asserts `open-session` is rejected when the API key is
|
||||
missing, and (when `-RejectScopeApiKeyEnv` names an insufficient-scope key)
|
||||
when the key lacks the required scope. Skip with `-SkipAuth`.
|
||||
7. **Write round-trip** — *opt-in (`-VerifyWrite`).* Runs right after
|
||||
`register`: adds and advises a configurable writable attribute
|
||||
(`-WriteAttribute`, default `TestChangingInt`), writes a per-client
|
||||
sentinel value, then streams events and asserts an `OnWriteComplete` event
|
||||
for that item is observed — proof the write round-tripped through the
|
||||
gateway, worker, and MXAccess provider. The written value being echoed back
|
||||
in an `OnDataChange` is recorded best-effort (`echoObserved`): a
|
||||
provider-driven attribute such as `TestChangingInt` accepts the write but
|
||||
immediately overwrites it, so no data-change carries the value back. The
|
||||
Rust `stream-events` CLI emits full per-event JSON (`family`, `itemHandle`,
|
||||
`value`) so all five clients apply the same checks.
|
||||
|
||||
It is opt-in because it mutates live tag state. The phase fails fast if the
|
||||
write command is rejected — e.g. against a gateway whose worker predates
|
||||
write support (`MxAccessCommandExecutor` returning `InvalidRequest` for
|
||||
`Write`/`Write2`/`WriteSecured`/`WriteSecured2`).
|
||||
|
||||
Build the gateway and worker, start the gateway, and provide a valid API key
|
||||
before running the client e2e script:
|
||||
@@ -209,9 +220,9 @@ powershell -ExecutionPolicy Bypass -File scripts/run-client-e2e-tests.ps1 -Clien
|
||||
powershell -ExecutionPolicy Bypass -File scripts/run-client-e2e-tests.ps1 -BulkTagCount 10
|
||||
powershell -ExecutionPolicy Bypass -File scripts/run-client-e2e-tests.ps1 -SkipStream
|
||||
powershell -ExecutionPolicy Bypass -File scripts/run-client-e2e-tests.ps1 -SkipBulk
|
||||
# Write round-trip: point at a writable scalar attribute and its value type.
|
||||
powershell -ExecutionPolicy Bypass -File scripts/run-client-e2e-tests.ps1 -WriteAttribute TestChangingInt -WriteType int32
|
||||
powershell -ExecutionPolicy Bypass -File scripts/run-client-e2e-tests.ps1 -SkipWrite
|
||||
# Write round-trip (opt-in): point at a writable scalar attribute and its
|
||||
# value type.
|
||||
powershell -ExecutionPolicy Bypass -File scripts/run-client-e2e-tests.ps1 -VerifyWrite -WriteAttribute TestChangingInt -WriteType int32
|
||||
# Auth rejection: also assert an insufficient-scope key is denied.
|
||||
powershell -ExecutionPolicy Bypass -File scripts/run-client-e2e-tests.ps1 -RejectScopeApiKeyEnv MXGATEWAY_READONLY_API_KEY
|
||||
# Run all five clients concurrently as isolated child processes.
|
||||
@@ -221,11 +232,12 @@ powershell -ExecutionPolicy Bypass -File scripts/run-client-e2e-tests.ps1 -DryRu
|
||||
powershell -ExecutionPolicy Bypass -File scripts/run-client-e2e-tests.ps1 -Endpoint localhost:5000 -ApiKeyEnv MXGATEWAY_API_KEY
|
||||
```
|
||||
|
||||
The write round-trip fails loudly if `-WriteAttribute` does not name a writable
|
||||
scalar attribute, if the write is rejected, or if the sentinel value is not
|
||||
observed within `-WriteEchoMaxEvents` (default 200) streamed events. Point
|
||||
`-WriteAttribute` at a stable writable attribute, raise `-WriteEchoMaxEvents`,
|
||||
or pass `-SkipWrite` if no suitable attribute is deployed.
|
||||
When `-VerifyWrite` is enabled, the write round-trip fails loudly if the write
|
||||
command is rejected, if `-WriteAttribute` does not name a writable scalar
|
||||
attribute, or if no `OnWriteComplete` event is observed for the written item
|
||||
within `-WriteEchoMaxEvents` (default 200) streamed events. Raise
|
||||
`-WriteEchoMaxEvents` if the gateway's per-session event backlog is large
|
||||
enough to push `OnWriteComplete` past that bound.
|
||||
|
||||
## Focused Commands
|
||||
|
||||
|
||||
Reference in New Issue
Block a user