logos-delivery/tests/waku_core/test_message_codec.nim
Fabiana Cecin 44a77b473e
chore: replace minprotobuf with nim-protobuf-serialization
* convert all codecs except sds_persistency to proto2
* add common/protobuf_ext.nim: generic array[N,byte] protobuf extension
* encode PeerId and MultiAddress via libp2p extensions
* encode PublicKey as seq[byte]
* change encode() to return seq[byte] and update all .encode().buffer call sites
* reduce common/protobuf.nim to ProtobufError/ProtobufResult
* add wire-format tests for message, filter v2, lightpush v3/legacy, rln proof
* adapt chat2, chat2mix, chat2bridge, wakustealthcommitments
* delete tests/common/test_protobuf_validation
* add protobuf_serialization to logos_delivery.nimble
2026-07-16 14:43:44 -03:00

78 lines
2.4 KiB
Nim

{.used.}
import std/sequtils, testutils/unittests
import logos_delivery/waku/waku_core/message/[message, codec]
import logos_delivery/waku/common/protobuf
const
Payload = @[byte 0x68, 0x69] # "hi"
ContentTopic = "/a/1/b/c"
# all-default optionals
const OldDefaultsBytes = @[
byte 0x0a, 0x02, 0x68, 0x69, 0x12, 0x08, 0x2f, 0x61, 0x2f, 0x31, 0x2f, 0x62, 0x2f,
0x63, 0x18, 0x00, 0x50, 0x00, 0x5a, 0x00, 0xaa, 0x01, 0x00, 0xf8, 0x01, 0x00,
]
# all fields set
const OldFullBytes = @[
byte 0x0a, 0x02, 0x68, 0x69, 0x12, 0x08, 0x2f, 0x61, 0x2f, 0x31, 0x2f, 0x62, 0x2f,
0x63, 0x18, 0x01, 0x50, 0xa4, 0x8b, 0xb0, 0x99, 0x09, 0x5a, 0x02, 0xaa, 0xbb, 0xaa,
0x01, 0x01, 0xcc, 0xf8, 0x01, 0x01,
]
# a proto3 peer drops defaulted fields; must still decode
const CanonicalDefaultsBytes = @[
byte 0x0a, 0x02, 0x68, 0x69, 0x12, 0x08, 0x2f, 0x61, 0x2f, 0x31, 0x2f, 0x62, 0x2f,
0x63,
]
proc defaultsMsg(): WakuMessage =
WakuMessage(payload: Payload, contentTopic: ContentTopic)
proc fullMsg(): WakuMessage =
WakuMessage(
payload: Payload,
contentTopic: ContentTopic,
version: 1,
timestamp: 1234567890,
meta: @[byte 0xaa, 0xbb],
proof: @[byte 0xcc],
ephemeral: true,
)
suite "Waku Message - codec wire format":
test "encode all-default optionals":
check defaultsMsg().encode() == OldDefaultsBytes
test "encode all fields set":
check fullMsg().encode() == OldFullBytes
test "decode all-default-optionals bytes":
let decoded = WakuMessage.decode(OldDefaultsBytes)
check decoded.isOk()
check decoded.get() == defaultsMsg()
test "decode all-fields bytes":
let decoded = WakuMessage.decode(OldFullBytes)
check decoded.isOk()
check decoded.get() == fullMsg()
test "decode tolerates omitted defaults":
let decoded = WakuMessage.decode(CanonicalDefaultsBytes)
check decoded.isOk()
check decoded.get() == defaultsMsg()
test "encode/decode round-trips":
for msg in [defaultsMsg(), fullMsg()]:
let decoded = WakuMessage.decode(msg.encode())
check decoded.isOk()
check decoded.get() == msg
test "decode rejects meta field exceeding max length":
var msg = defaultsMsg()
msg.meta = toSeq(0.byte .. 66.byte) # 67 bytes > MaxMetaAttrLength (64)
let decoded = WakuMessage.decode(msg.encode())
check decoded.isErr()
check decoded.error.kind == ProtobufErrorKind.InvalidLengthField