mirror of
https://github.com/logos-storage/logos-storage-nim.git
synced 2026-05-12 06:19:33 +00:00
276 lines
7.6 KiB
Nim
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
|