Skip to content

Run the eleven tests the suite skips - #110

Merged
estebanzimanyi merged 1 commit into
MobilityDB:masterfrom
estebanzimanyi:ci/run-the-tests-ci-skips
Sep 1, 2026
Merged

Run the eleven tests the suite skips#110
estebanzimanyi merged 1 commit into
MobilityDB:masterfrom
estebanzimanyi:ci/run-the-tests-ci-skips

Conversation

@estebanzimanyi

@estebanzimanyi estebanzimanyi commented Aug 31, 2026

Copy link
Copy Markdown
Member

A green run of this suite reads 257 passed, 11 skipped. A skipped test asserts
nothing and is indistinguishable from a passing one in the job's conclusion, so
eleven assertions had stopped holding the model to MEOS without anything saying
so. Every one of them guards on a precondition this job already had the material
for and never named. Supplied and asserted, the suite reads 268 passed, 0 skipped.

Three causes, and the second is a defect rather than a circumstance.

MEOS_LIBRARY_PATH and MEOS_INCLUDE_DIR were unset. The ctypes engine suite
decodes, invokes and round-trips against a real libmeos, and the vendored test
splits the installed headers by owner; the job builds and installs both and
pointed neither at the tests. That is nine of the eleven.

object_model_parity.py read sys.argv at IMPORT time to resolve its paths.
The test suite imports it, so it read the RUNNER's flags: under
pytest tests/ -q -rs the PyMEOS oracle resolved to the literal path -rs,
which no checkout has, and both parity gates skipped themselves. The command
line is now read in main(), where it belongs, and the oracle also honours
$PYMEOS_FACTORY so a job whose PyMEOS checkout is not a sibling can name it.
CI checks PyMEOS out and names it.

Turning the engine suite on exposed what it had stopped catching.
build_type_encodings() picks the decoder for the opaque Temporal by an
alphabetical tiebreak it documents as arbitrary — there is no generic
temporal_in to prefer — and the tests asserted the identity of that tiebreak's
winner, tbool_in, together with a tbool literal. MobilityDB gaining
tbigint moved the pick, so the suite decoded {t@...} with tbigint_in. The
first assertion failed on the name and the resulting MEOS error state carried
into two more tests, one of them reporting a garbage -374120624. The tests now
follow the pick instead of naming it: a literal per subtype keyed by decoder, and
an assertion of what the design does guarantee — the decoder is one of the
subtype-narrow readers, the encoder IS the generic temporal_out.

A Refuse a silent skip step fails the job on any skip. With every precondition
supplied and asserted, a skip means a guard reads a condition this job no longer
satisfies, which is a defect worth a red.

.gitignore gains .prefix/ and _pymeos/: the suite now runs against a built
libmeos and a PyMEOS checkout, so both appear in a working tree and neither is
the tree's to carry.

Running the engine suite also exposed a test that could not have been reliable.
test_opaque_outparam_round_trip called encode("geo_as_ewkt", ptr) with no
aux, but geo_as_ewkt(const GSERIALIZED *, int maxdd) takes two arguments and
encode() builds its argtypes from the aux it is given, so maxdd read
whatever the register held. Measured over six runs it raised
The value must be strictly positive on four of them, with a different value
each time, and passed on two — the pass being luck of the address, not evidence.
With maxdd supplied it is 6 of 6, and the engine suite is 8 of 8 over repeated
runs. The defect predates this change; it was invisible because the test never
ran.

A green run of this suite reads `257 passed, 11 skipped`. A skipped test asserts
nothing and is indistinguishable from a passing one in the job's conclusion, so
eleven assertions had stopped holding the model to MEOS without anything saying
so. Every one of them guards on a precondition this job already had the material
for and never named. Supplied and asserted, the suite reads 268 passed, 0 skipped.

Three causes, and the second is a defect rather than a circumstance.

`MEOS_LIBRARY_PATH` and `MEOS_INCLUDE_DIR` were unset. The ctypes engine suite
decodes, invokes and round-trips against a real libmeos, and the vendored test
splits the installed headers by owner; the job builds and installs both and
pointed neither at the tests. That is nine of the eleven.

`object_model_parity.py` read `sys.argv` at IMPORT time to resolve its paths.
The test suite imports it, so it read the RUNNER's flags: under
`pytest tests/ -q -rs` the PyMEOS oracle resolved to the literal path `-rs`,
which no checkout has, and both parity gates skipped themselves. The command
line is now read in `main()`, where it belongs, and the oracle also honours
`$PYMEOS_FACTORY` so a job whose PyMEOS checkout is not a sibling can name it.
CI checks PyMEOS out and names it.

Turning the engine suite on exposed what it had stopped catching.
`build_type_encodings()` picks the decoder for the opaque `Temporal` by an
alphabetical tiebreak it documents as arbitrary — there is no generic
`temporal_in` to prefer — and the tests asserted the identity of that tiebreak's
winner, `tbool_in`, together with a `tbool` literal. MobilityDB gaining
`tbigint` moved the pick, so the suite decoded `{t@...}` with `tbigint_in`. The
first assertion failed on the name and the resulting MEOS error state carried
into two more tests, one of them reporting a garbage `-374120624`. The tests now
follow the pick instead of naming it: a literal per subtype keyed by decoder, and
an assertion of what the design does guarantee — the decoder is one of the
subtype-narrow readers, the encoder IS the generic `temporal_out`.

A `Refuse a silent skip` step fails the job on any skip. With every precondition
supplied and asserted, a skip means a guard reads a condition this job no longer
satisfies, which is a defect worth a red.

`.gitignore` gains `.prefix/` and `_pymeos/`: the suite now runs against a built
libmeos and a PyMEOS checkout, so both appear in a working tree and neither is
the tree's to carry.

Running the engine suite also exposed a test that could not have been reliable.
`test_opaque_outparam_round_trip` called `encode("geo_as_ewkt", ptr)` with no
aux, but `geo_as_ewkt(const GSERIALIZED *, int maxdd)` takes two arguments and
`encode()` builds its argtypes from the aux it is given, so `maxdd` read
whatever the register held. Measured over six runs it raised
`The value must be strictly positive` on four of them, with a different value
each time, and passed on two — the pass being luck of the address, not evidence.
With `maxdd` supplied it is 6 of 6, and the engine suite is 8 of 8 over repeated
runs. The defect predates this change; it was invisible because the test never
ran.
@estebanzimanyi
estebanzimanyi force-pushed the ci/run-the-tests-ci-skips branch from 59b075f to ae7f7de Compare August 31, 2026 22:59
@estebanzimanyi
estebanzimanyi merged commit b05518a into MobilityDB:master Sep 1, 2026
2 checks passed
@estebanzimanyi
estebanzimanyi deleted the ci/run-the-tests-ci-skips branch September 1, 2026 00:11
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