Reticulum-Go/pkg/resource/split_test.go

67 lines
1.8 KiB
Go

// SPDX-License-Identifier: Apache-2.0
// Copyright (c) 2024-2026 Quad4.io
package resource
import (
"bytes"
"testing"
)
func identityEncrypt(plain []byte) ([]byte, error) {
return append([]byte(nil), plain...), nil
}
func TestPrepareOutboundSplitsLargePayload(t *testing.T) {
body := bytes.Repeat([]byte("abcdefgh"), (MaxEfficientSize/8)+64)
res, err := New(body, false)
if err != nil {
t.Fatal(err)
}
if err := res.PrepareOutboundForLink(identityEncrypt, 200); err != nil {
t.Fatal(err)
}
if !res.IsSplit() {
t.Fatal("expected split resource")
}
if res.GetSegmentIndex() != 1 {
t.Fatalf("segment index: got %d want 1", res.GetSegmentIndex())
}
if res.GetTotalSegments() < 2 {
t.Fatalf("total segments: got %d want >= 2", res.GetTotalSegments())
}
adv := NewResourceAdvertisement(res)
if adv == nil || !adv.Split {
t.Fatal("advertisement missing split flag")
}
if adv.SegmentIndex != 1 || adv.TotalSegments != res.GetTotalSegments() {
t.Fatalf("adv segments: i=%d l=%d", adv.SegmentIndex, adv.TotalSegments)
}
orig := res.GetOriginalHash()
if err := res.PrepareNextOutboundSegment(identityEncrypt, 200); err != nil {
t.Fatal(err)
}
if res.GetSegmentIndex() != 2 {
t.Fatalf("segment index after next: got %d want 2", res.GetSegmentIndex())
}
if !bytes.Equal(res.GetOriginalHash(), orig) {
t.Fatal("original hash changed across segments")
}
}
func TestPrepareOutboundSmallNotSplit(t *testing.T) {
res, err := New([]byte("small"), false)
if err != nil {
t.Fatal(err)
}
if err := res.PrepareOutboundForLink(identityEncrypt, 200); err != nil {
t.Fatal(err)
}
if res.IsSplit() {
t.Fatal("small resource should not split")
}
if res.GetTotalSegments() != 1 || res.GetSegmentIndex() != 1 {
t.Fatalf("segments: i=%d l=%d", res.GetSegmentIndex(), res.GetTotalSegments())
}
}