erldistpy/tests
russell@unturf.com d86ef8530f
0.1.7: declare DFLAG_MANDATORY_25_DIGEST + decode dist-header replies
Against real-world OTP 26 peers the v6 handshake "succeeded" but the
first REG_SEND silently dropped on the peer side — peer accepted the
connection then closed the link with no bytes when we tried to call a
registered process. Hit during MPS↔portal wallet RPC smoke test.

Root cause: OTP 25+ requires DFLAG_MANDATORY_25_DIGEST to be present
in our advertised flag set. The digest is the hash of the OTP-25
mandatory flag set; without it the peer's dist driver loses confidence
in the negotiation and drops messages from us without surfacing an
error.

Adds DFLAG_MANDATORY_25_DIGEST to DEFAULT_FLAGS. Also extends
_decode_message to accept both legacy pass-through (0x70 ...) and
dist-header framing (0x83 0x44 0x00 ...) on receive — modern OTP may
send dist-headed messages even when we didn't negotiate
DFLAG_DIST_HDR_ATOM_CACHE. Fragments (0x83 0x45 / 0x83 0x46) still
TODO; we surface a clear ChannelError instead of silent corruption.

Send side still uses pass-through framing — we don't yet implement
the atom-cache encode/decode that DFLAG_DIST_HDR_ATOM_CACHE would
require. Peer routes our pass-through sends without issue.

122/122 tests pass including live integration against a local Erlang
node and the TLS dist suite.
2026-06-17 08:51:09 -04:00
..
__init__.py phase 0 + 1: repo bones and ETF codec 2026-06-16 10:39:01 -04:00
test_channel.py 0.1.7: declare DFLAG_MANDATORY_25_DIGEST + decode dist-header replies 2026-06-17 08:51:09 -04:00
test_epmd.py phase 2: EPMD client 2026-06-16 11:00:00 -04:00
test_etf.py etf: add MAP_EXT (tag 116) for Erlang/Elixir maps 2026-06-16 12:16:35 -04:00
test_handshake.py phase 3: v6 distribution handshake 2026-06-16 11:08:28 -04:00
test_node.py phase 5: Node.call() gen_server protocol 2026-06-16 11:33:28 -04:00
test_tls.py phase 6: TLS dist via inet_tls_dist 2026-06-16 12:06:07 -04:00