NE:ONE interoperability¶
NE:ONE
(Open Logistics Foundation, OLFL-1.3) is the reference ONE Record server and,
at the pinned commit 9d485f63…, implements API 2.2.0 with data model 3.2.
The interoperability suite (tests/Interop/) uses it as a comparison oracle:
the same graph is published to a running NE:ONE through this package's client
and to this package's server, both are read back and compared as RDF graphs
with the comparer. Every difference is either a bug
here or a numbered entry in spec questions.
Running it¶
NE:ONE is built from source at the pinned commit by
tests/Interop/neone/Dockerfile (a Lambda Twelve file; NE:ONE itself is not
part of this repository) and started by tests/Interop/run.sh, which also
generates the RS256 key pair the tests sign tokens with and mounts its public
half as the only issuer NE:ONE trusts.
ddev interop # DDEV: NE:ONE on the host, PHPUnit in the web container
bash tests/Interop/run.sh # PHP on the Docker host (CI)
NEONE_IMAGE=my-neone:local ddev interop # reuse an image instead of building
CI runs the suite on every push to main and on demand; the build from source
takes a while, so it is not part of the pull-request matrix.
What is compared¶
| Flow | Result |
|---|---|
| Server information, version negotiation (NE:ONE lists 2.2.0, the client speaks 2.2.0) | identical |
| A shipment, a piece and a company with embedded values and a party, created with predefined URIs, read back | identical modulo the differences below |
| A change request by the data holder, accepted, revision 2, audit trail | identical |
| A logistics event posted and listed, with event-code filters | identical modulo server-set properties |
| A partner refused (403), then granted access through an access delegation request the holder accepts | identical outcome |
Known differences¶
All recorded in spec questions with what this package does about them.
| NE:ONE | This package | Handling | |
|---|---|---|---|
| Response shape | Flattened: a top-level @graph whenever an object has embedded nodes, @vocab for cargo: |
One nested node | The JSON-LD reader accepts a top-level @graph and roots it at the object asked for (question 24) |
@type |
Every superclass added (Piece, PhysicalLogisticsObject, LogisticsObject) |
The declared classes | Compared on the most specific classes; ChangeBuilder never diffs types (question 21) |
| Embedded ids | neone:<uuid> |
internal:<uuid5> |
Both treated as blank nodes in comparison (question 3) |
| Revision literals | xsd:int |
xsd:positiveInteger / native integer |
Same value in comparison (question 5) |
| Timestamps | Millisecond lexical form (…:00.000Z) |
As received | Canonicalised in comparison (question 5) |
| Received events | creationDate, eventFor and recordingOrganization set by the server |
Body kept as posted, eventFor from the path |
Excluded from the event comparison (question 22) |
PATCH /action-requests/{id}?status= |
204, applied on the next evaluation tick | 204, applied at once | Tests poll (question 23) |
Content-Type |
application/ld+json;charset=UTF-8, no version |
The negotiated version echoed | The client reads the version it asked for when none is echoed (question 10) |