Chrysostomos Nanakos bb6ab1befa
chore: Block exchange protocol rewrite (#1411)
Signed-off-by: Chrysostomos Nanakos <chris@include.gr>
2026-04-25 00:37:42 +00:00

276 lines
7.6 KiB
Nim

import pkg/unittest2
import pkg/storage/blockexchange/protocol/message
import ../../examples
import ../../helpers
suite "BlockAddress protobuf encoding":
test "Should encode and decode block address":
let
treeCid = Cid.example
address = BlockAddress(treeCid: treeCid, index: 42)
var buffer = initProtoBuffer()
buffer.write(1, address)
buffer.finish()
var decoded: ProtoBuffer
check buffer.getField(1, decoded).isOk
let res = BlockAddress.decode(decoded)
check res.isOk
check res.get.treeCid == treeCid
check res.get.index == 42
test "Should encode and decode block address with index 0":
let
blockCid = Cid.example
address = BlockAddress(treeCid: blockCid, index: 0)
var buffer = initProtoBuffer()
buffer.write(1, address)
buffer.finish()
var decoded: ProtoBuffer
check buffer.getField(1, decoded).isOk
let res = BlockAddress.decode(decoded)
check res.isOk
check res.get.treeCid == blockCid
check res.get.index == 0
suite "WantListEntry protobuf encoding":
test "Should encode and decode WantListEntry":
let
treeCid = Cid.example
entry = WantListEntry(
address: BlockAddress(treeCid: treeCid, index: 10),
priority: 5,
cancel: false,
wantType: WantType.WantHave,
sendDontHave: true,
rangeCount: 100,
)
var buffer = initProtoBuffer()
buffer.write(1, entry)
buffer.finish()
var decoded: ProtoBuffer
check buffer.getField(1, decoded).isOk
let res = WantListEntry.decode(decoded)
check res.isOk
check res.get.address.treeCid == treeCid
check res.get.address.index == 10
check res.get.priority == 5
check res.get.cancel == false
check res.get.wantType == WantType.WantHave
check res.get.sendDontHave == true
check res.get.rangeCount == 100
test "Should handle WantListEntry with cancel flag":
let
blockCid = Cid.example
entry = WantListEntry(
address: BlockAddress(treeCid: blockCid, index: 0),
priority: 1,
cancel: true,
wantType: WantType.WantHave,
sendDontHave: false,
rangeCount: 0,
)
var buffer = initProtoBuffer()
buffer.write(1, entry)
buffer.finish()
var decoded: ProtoBuffer
check buffer.getField(1, decoded).isOk
let res = WantListEntry.decode(decoded)
check res.isOk
check res.get.cancel == true
suite "WantList protobuf encoding":
test "Should encode and decode empty WantList":
let wantList = WantList(entries: @[], full: false)
var buffer = initProtoBuffer()
buffer.write(1, wantList)
buffer.finish()
var decoded: ProtoBuffer
check buffer.getField(1, decoded).isOk
let res = WantList.decode(decoded)
check res.isOk
check res.get.entries.len == 0
check res.get.full == false
test "Should encode and decode WantList with entries":
let
treeCid = Cid.example
wantList = WantList(
entries: @[
WantListEntry(
address: BlockAddress(treeCid: treeCid, index: 0),
priority: 1,
cancel: false,
wantType: WantType.WantHave,
sendDontHave: false,
rangeCount: 10,
),
WantListEntry(
address: BlockAddress(treeCid: treeCid, index: 1),
priority: 2,
cancel: false,
wantType: WantType.WantHave,
sendDontHave: true,
rangeCount: 0,
),
],
full: true,
)
var buffer = initProtoBuffer()
buffer.write(1, wantList)
buffer.finish()
var decoded: ProtoBuffer
check buffer.getField(1, decoded).isOk
let res = WantList.decode(decoded)
check res.isOk
check res.get.entries.len == 2
check res.get.entries[0].rangeCount == 10
check res.get.entries[1].sendDontHave == true
check res.get.full == true
suite "BlockPresence protobuf encoding":
test "Should encode and decode BlockPresence with DontHave":
let
treeCid = Cid.example
presence = BlockPresence(
address: BlockAddress(treeCid: treeCid, index: 0),
kind: BlockPresenceType.DontHave,
ranges: @[],
)
var buffer = initProtoBuffer()
buffer.write(1, presence)
buffer.finish()
var decoded: ProtoBuffer
check buffer.getField(1, decoded).isOk
let res = BlockPresence.decode(decoded)
check res.isOk
check res.get.kind == BlockPresenceType.DontHave
check res.get.ranges.len == 0
test "Should encode and decode BlockPresence with HaveRange":
let
treeCid = Cid.example
presence = BlockPresence(
address: BlockAddress(treeCid: treeCid, index: 0),
kind: BlockPresenceType.HaveRange,
ranges: @[(start: 0'u64, count: 100'u64), (start: 200'u64, count: 50'u64)],
)
var buffer = initProtoBuffer()
buffer.write(1, presence)
buffer.finish()
var decoded: ProtoBuffer
check buffer.getField(1, decoded).isOk
let res = BlockPresence.decode(decoded)
check res.isOk
check res.get.kind == BlockPresenceType.HaveRange
check res.get.ranges.len == 2
check res.get.ranges[0].start == 0
check res.get.ranges[0].count == 100
check res.get.ranges[1].start == 200
check res.get.ranges[1].count == 50
test "Should encode and decode BlockPresence with Complete":
let
treeCid = Cid.example
presence = BlockPresence(
address: BlockAddress(treeCid: treeCid, index: 0),
kind: BlockPresenceType.Complete,
ranges: @[],
)
var buffer = initProtoBuffer()
buffer.write(1, presence)
buffer.finish()
var decoded: ProtoBuffer
check buffer.getField(1, decoded).isOk
let res = BlockPresence.decode(decoded)
check res.isOk
check res.get.kind == BlockPresenceType.Complete
suite "Full Message protobuf encoding":
test "Should encode and decode empty Message":
let
msg = Message(wantList: WantList(entries: @[], full: false), blockPresences: @[])
encoded = msg.protobufEncode()
decoded = Message.protobufDecode(encoded)
check decoded.isOk
check decoded.get.wantList.entries.len == 0
check decoded.get.blockPresences.len == 0
test "Should encode and decode Message with WantList":
let
treeCid = Cid.example
msg = Message(
wantList: WantList(
entries: @[
WantListEntry(
address: BlockAddress(treeCid: treeCid, index: 0),
priority: 1,
cancel: false,
wantType: WantType.WantHave,
sendDontHave: false,
rangeCount: 100,
)
],
full: false,
),
blockPresences: @[],
)
encoded = msg.protobufEncode()
decoded = Message.protobufDecode(encoded)
check decoded.isOk
check decoded.get.wantList.entries.len == 1
check decoded.get.wantList.entries[0].rangeCount == 100
test "Should encode and decode Message with BlockPresences":
let
treeCid = Cid.example
msg = Message(
wantList: WantList(entries: @[], full: false),
blockPresences: @[
BlockPresence(
address: BlockAddress(treeCid: treeCid, index: 0),
kind: BlockPresenceType.HaveRange,
ranges: @[(start: 0'u64, count: 500'u64)],
)
],
)
encoded = msg.protobufEncode()
decoded = Message.protobufDecode(encoded)
check decoded.isOk
check decoded.get.blockPresences.len == 1
check decoded.get.blockPresences[0].kind == BlockPresenceType.HaveRange
check decoded.get.blockPresences[0].ranges.len == 1
check decoded.get.blockPresences[0].ranges[0].count == 500