← 1.0.0 scope SAPE-24

Three clients, each run against a real daemon

Status
Done
Version
1.0.0
Component
clients
Commits
7680ef7, 734520f, 02ce8b4 (Go); e92b0ba (PHP)
Opened
ISS-2, ISS-12

Description

Three clients, in three languages, in three repositories:

Each of the three is exercised against a real sapedbd process over a real socket, not against a mock of the protocol.

Why it was in 1.0.0

Every unit test on either side of a wire passes when each side agrees with itself. The TypeScript driver's own header lists what only a live server found: field names that differed, a failure payload the driver could not read, a mode the server had never implemented, and a signing label where a blank configuration field silently chose an incompatible key. None of those is findable without the two processes in one room.

The Go client had the same shape of bug and it survived until the first live invoke: Invoke sent arguments under "arguments" where the server decodes "args", so the server saw no arguments at all on every call.

How it was verified

  1. Go. declare_live_test.go starts a real sapedbd, seeds the collection through internal/server before the daemon starts, and does everything after that over a socket — the daemon is the subject, not the instrument. The assertion is not only that the call works: the pid started at the top is the pid still serving at the bottom, it was never signalled, and one connection carried both the declaration and the call that used it.
  2. TypeScript. tests/server.test.mjs spawns the Go binaries named by SAPEDB_SERVER_BIN and SAPEDB_CLI_BIN and drives dist/ — the built artifact, not the sources. Its CI job (.github/workflows/test.yml) clones the server repository beside the checkout, builds both binaries and runs the suite with them, so the live half is not an opt-in somebody forgets.
  3. PHP. tests/e2e/InvokeE2ETest.php is the one test in that package that dials a real sapedbd.
  4. fixtures/frames.json is the shared conformance artifact all three build against, and TestEveryRequestFixtureDecodesIntoTheStructThatServesIt (internal/server/fixture_decode_test.go:28) is what stops it drifting from the structs the server actually decodes.

What it did not do