zapret-kvn/core-patches/sing_udp_buffer_test.go
loop-uh d5a4715771
Some checks failed
Windows project source guards / test (push) Has been cancelled
feat: use official Amnezia transport and organize runtime modules
2026-09-06 00:14:08 +03:00

72 lines
2.2 KiB
Go

package network_test
import (
"bytes"
"net"
"testing"
"time"
"github.com/sagernet/sing/common/buf"
N "github.com/sagernet/sing/common/network"
)
func TestZapretCompletePacketWithHeadroom(t *testing.T) {
for _, options := range []N.ReadWaitOptions{
{}, {FrontHeadroom: 262}, {FrontHeadroom: 262, RearHeadroom: 32},
{MTU: 1280, FrontHeadroom: 262, RearHeadroom: 32, ReadOverhead: 48},
{IncreaseBuffer: true, FrontHeadroom: 262, RearHeadroom: 32},
} {
packet := options.NewPacketBuffer()
payload := bytes.Repeat([]byte{0xa7}, 65527)
n, err := packet.Write(payload)
if err != nil || n != len(payload) || !bytes.Equal(packet.Bytes(), payload) {
t.Fatalf("packet truncated: options=%+v n=%d error=%v", options, n, err)
}
options.PostReturn(packet)
packet.ExtendHeader(options.FrontHeadroom)
packet.Extend(options.RearHeadroom)
packet.Release()
options.Packet = true
streamPacket := options.NewBuffer()
if n, err := streamPacket.Write(payload); err != nil || n != len(payload) {
t.Fatalf("connected datagram truncated: n=%d error=%v", n, err)
}
streamPacket.Release()
}
}
func TestZapretPacketCopyPreservesLargePayload(t *testing.T) {
payload := bytes.Repeat([]byte{0x51}, 65527)
options := N.ReadWaitOptions{MTU: 1280, FrontHeadroom: 262, RearHeadroom: 32}
packet := options.Copy(buf.As(payload))
defer packet.Release()
if !bytes.Equal(packet.Bytes(), payload) {
t.Fatalf("headroom copy truncated: %d != %d", packet.Len(), len(payload))
}
}
func TestZapretPacketReceivesLargeUDP(t *testing.T) {
listener, err := net.ListenPacket("udp4", "127.0.0.1:0")
if err != nil {
t.Fatal(err)
}
defer listener.Close()
sender, err := net.Dial("udp4", listener.LocalAddr().String())
if err != nil {
t.Fatal(err)
}
defer sender.Close()
for _, size := range []int{1200, 8193, 16385, 20000, 65497, 65507} {
payload := bytes.Repeat([]byte{byte(size)}, size)
if _, err := sender.Write(payload); err != nil {
t.Fatal(err)
}
listener.SetReadDeadline(time.Now().Add(time.Second))
packet := buf.NewPacket()
_, _, err := packet.ReadPacketFrom(listener)
if err != nil || !bytes.Equal(packet.Bytes(), payload) {
t.Errorf("UDP truncated: got=%d want=%d error=%v", packet.Len(), size, err)
}
packet.Release()
}
}