Skip to content

Discharge every abstract test of Annex A - #63

Merged
estebanzimanyi merged 3 commits into
masterfrom
ats/annex-a-complete
Aug 30, 2026
Merged

Discharge every abstract test of Annex A#63
estebanzimanyi merged 3 commits into
masterfrom
ats/annex-a-complete

Conversation

@estebanzimanyi

Copy link
Copy Markdown
Member

Annex A is the only conformance instrument Part 1 has, and each of its 45 abstract tests rests on evidence. Three commits of one topic.

The conformance job runs MobilityDB master, which is what this tier is built against. A job pinned to a release measures a MobilityDB the project does not develop, so a defect fixed upstream reads as a live one: deleting a temporal value whose span covers a whole composing sequence segfaults the backend on 1.3.0 and answers correctly on master. Naming a version somebody can install is a reason to also run a release, never a reason to develop against one.

Two POSTs answer 201, which Annex A requires of a POST that creates a sub-resource. Appending a temporal primitive geometry, and appending values to a temporal property, each create one.

Three live tests carry the remaining abstract tests — the moving-feature lifecycle (features-post, mf-delete, tgsequence-post, tpgeometry-delete), the temporal-property values (tproperty-post, tpvalue-delete) and the query parameters (leaf, subTrajectory). Each lifecycle creates its own subject and removes it, so the fixture the read-side tests assert against stays as it is. Each parameter assertion is that the answer moves: a parameter read and not acted on cannot be told from one ignored.

atsDischargedBy names, per abstract test needing a backend, the live test that discharges it, and the registry reports that name in place of an unconditional "awaits its live assertion", which reports a row a named group asserts as outstanding and makes the tier's own coverage report understate its conformance. The map is built from what a test calls: the temporal-property lifecycle posts to the plural route, so it discharges tproperties-post-success and not the singular tproperty-post-success. TestATSEveryLiveRowIsDischarged keeps every row carrying an entry that names a test the suite declares, and fails in both directions — a dropped entry, and an entry naming a test that does not exist.

Against master: 12 live groups pass, 0 placeholder skips, 17 of 17 backend-needing abstract tests discharged, and the 13 sample documents are identical.

The conformance job builds MobilityDB from master source and runs the Annex A
tests that need data against it. Master is what this tier is written against: a
job pinned to a release measures a MobilityDB the project no longer develops, so
a defect already fixed upstream reads as a live one and blocks work that is not
blocked, and deleting a temporal value whose span covers a whole composing
sequence segfaults the backend on 1.3.0 and answers correctly on master. Naming
a version somebody can install is a reason to also run a release, never a reason
to develop against one.

A published image is not the source either. The mobilitydb/mobilitydb tags are
built by MobilityDB/MobilityDB-docker, a separate repository on its own
schedule, so what a tag carries is that repository's packaging rather than the
source under test: 18-3.6-master fails to load the library on a missing
libgdal.so.39, and 17-3.5-master exits its own entrypoint because the pointcloud
extension it asks for is not available. The build recipe is MobilityDB's own
.github/workflows/pgversion.yml, and its apt hardening is taken from the
checkout rather than copied, so the job follows the project's build as it
changes. The families stay at their defaults, which is the surface the routes
reach, and loading the extension is a step of its own so that a database which
cannot carry MobilityDB says so before the fixture runs.
Appending a temporal primitive geometry to a feature, and appending values to a
temporal property, each answer 201: both create a sub-resource, and Annex A
requires 201 or 202 of the POST that does so.
Three live tests carry the abstract tests that had none: the moving-feature
lifecycle (features-post, mf-delete, tgsequence-post, tpgeometry-delete), the
temporal-property values (tproperty-post, tpvalue-delete) and the query
parameters (leaf, subTrajectory). Each lifecycle creates its own subject and
removes it, so the fixture the read-side tests assert against is untouched, and
each parameter assertion is that the answer MOVES: a parameter read and not
acted on cannot be told from one ignored.

`atsDischargedBy` names, per abstract test needing a backend, the live test that
discharges it, and the registry reports that name rather than an unconditional
"awaits its live assertion" — which reports a row a named group already asserts
as outstanding, so the tier's own coverage report understates its conformance.
The map is built from what a test CALLS: the temporal-property lifecycle posts
to the plural route, so it discharges tproperties-post-success and not the
singular tproperty-post-success. `TestATSEveryLiveRowIsDischarged` keeps every
row carrying an entry that names a test the suite declares.
@estebanzimanyi
estebanzimanyi merged commit db37923 into master Aug 30, 2026
3 of 4 checks passed
@estebanzimanyi
estebanzimanyi deleted the ats/annex-a-complete branch August 30, 2026 23:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant