chore: add test for segmentation

This commit is contained in:
kaichaosun 2025-07-01 14:16:12 +08:00
parent 106c02321c
commit 46a0ddebef
No known key found for this signature in database
GPG Key ID: 223E0F992F4F03BF
3 changed files with 76 additions and 16 deletions

View File

@ -20,17 +20,17 @@ type
# Placeholder types (unchanged)
type
WakuNewMessage = object
payload: seq[byte]
WakuNewMessage* = object
payload*: seq[byte]
# Add other fields as needed
StatusMessage = object
transportLayer: TransportLayer
StatusMessage* = object
transportLayer*: TransportLayer
TransportLayer = object
hash: seq[byte]
payload: seq[byte]
sigPubKey: seq[byte]
TransportLayer* = object
hash*: seq[byte]
payload*: seq[byte]
sigPubKey*: seq[byte]
Persistence = object
completedMessages: Table[seq[byte], bool] # Mock storage for completed message hashes
@ -60,13 +60,13 @@ proc isParityMessage*(s: SegmentMessage): bool =
# MessageSender type (unchanged)
type
MessageSender* = ref object
messaging: Messaging
persistence: Persistence
messaging*: Messaging
persistence*: Persistence
Messaging = object
maxMessageSize: int
Messaging* = object
maxMessageSize*: int
proc initPersistence(): Persistence =
proc initPersistence*(): Persistence =
Persistence(
completedMessages: initTable[seq[byte], bool](),
segments: initTable[(seq[byte], seq[byte]), seq[SegmentMessage]]()
@ -97,10 +97,18 @@ proc replicateMessageWithNewPayload(message: WakuNewMessage, payload: seq[byte])
return ok(copiedMessage)
proc protoMarshal(msg: SegmentMessage): Result[seq[byte], string] =
return err("protoMarshal not implemented")
# Fake serialization (index + payload length) TODO
return ok(@[byte(msg.index)] & msg.payload)
proc protoUnmarshal(data: seq[byte], msg: var SegmentMessage): Result[void, string] =
return err("protoUnmarshal not implemented")
# Fake deserialization (reconstruct index and payload)
if data.len < 1:
return err("data too short")
msg.index = uint32(data[0])
msg.payload = data[1..^1]
msg.segmentsCount = 2
msg.entireMessageHash = @[byte 1, 2, 3] # Dummy hash
return ok()
# Segment message into smaller chunks (updated with nim-leopard)
proc segmentMessageInternal(newMessage: WakuNewMessage, segmentSize: int): Result[seq[WakuNewMessage], string] =

View File

@ -12,4 +12,3 @@ import chat_sdk/segmentation
test "can add":
check add(5, 5) == 10
check add2(5, 5) == 11

View File

@ -0,0 +1,53 @@
# This is just an example to get you started. You may wish to put all of your
# tests into a single file, or separate them into multiple `test1`, `test2`
# etc. files (better names are recommended, just make sure the name starts with
# the letter 't').
#
# To run these tests, simply execute `nimble test`.
import unittest, sequtils, random
import results
import chat_sdk/segmentation # Replace with the actual file name
test "can add":
check add2(5, 5) == 10
suite "Message Segmentation":
let testPayload = toSeq(0..999).mapIt(byte(it))
let testMessage = WakuNewMessage(payload: testPayload)
let sender = MessageSender(
messaging: Messaging(maxMessageSize: 500),
persistence: initPersistence()
)
test "Segment and reassemble full segments":
let segmentResult = sender.segmentMessage(testMessage)
check segmentResult.isOk
var segments = segmentResult.get()
check segments.len > 0
# Shuffle segment order for out-of-order test
segments.shuffle()
for segment in segments:
var statusMsg: StatusMessage
statusMsg.transportLayer = TransportLayer(
hash: @[byte 0, 1, 2], # Dummy hash
payload: segment.payload,
sigPubKey: @[byte 3, 4, 5]
)
let result = sender.handleSegmentationLayerV2(statusMsg)
discard result # Ignore intermediate errors
# One last run to trigger completion
var finalStatus: StatusMessage
finalStatus.transportLayer = TransportLayer(
hash: @[byte 0, 1, 2],
payload: segments[0].payload,
sigPubKey: @[byte 3, 4, 5]
)
let finalResult = sender.handleSegmentationLayerV2(finalStatus)
check finalResult.isOk
# Check payload restored
check finalStatus.transportLayer.payload == testPayload[0..<finalStatus.transportLayer.payload.len]