Files
x/internal/util/dns/conn_test.go
T
2026-07-04 13:48:22 +08:00

110 lines
2.7 KiB
Go

package dns
import (
"bytes"
"net"
"testing"
"time"
)
func TestPacketConnRoundTrip(t *testing.T) {
serverPC, err := net.ListenPacket("udp", "127.0.0.1:0")
if err != nil {
t.Fatal(err)
}
defer serverPC.Close()
clientPC, err := net.ListenPacket("udp", "127.0.0.1:0")
if err != nil {
t.Fatal(err)
}
defer clientPC.Close()
server := ServerConn(serverPC, DomainOption("tunnel.example."))
client := ClientConn(clientPC, DomainOption("tunnel.example."))
_ = server.SetDeadline(time.Now().Add(3 * time.Second))
_ = client.SetDeadline(time.Now().Add(3 * time.Second))
requestPayload := []byte("hello over dns")
if n, err := client.WriteTo(requestPayload, server.LocalAddr()); err != nil {
t.Fatal(err)
} else if n != len(requestPayload) {
t.Fatalf("client WriteTo wrote %d bytes, want %d", n, len(requestPayload))
}
buf := make([]byte, 1500)
n, clientAddr, err := server.ReadFrom(buf)
if err != nil {
t.Fatal(err)
}
if got := buf[:n]; !bytes.Equal(got, requestPayload) {
t.Fatalf("server ReadFrom got %q, want %q", got, requestPayload)
}
responsePayload := []byte("world over dns")
if n, err := server.WriteTo(responsePayload, clientAddr); err != nil {
t.Fatal(err)
} else if n != len(responsePayload) {
t.Fatalf("server WriteTo wrote %d bytes, want %d", n, len(responsePayload))
}
n, serverAddr, err := client.ReadFrom(buf)
if err != nil {
t.Fatal(err)
}
if serverAddr.String() != server.LocalAddr().String() {
t.Fatalf("response addr = %v, want %v", serverAddr, server.LocalAddr())
}
if got := buf[:n]; !bytes.Equal(got, responsePayload) {
t.Fatalf("client ReadFrom got %q, want %q", got, responsePayload)
}
}
func TestPacketConnSetBuffer(t *testing.T) {
base := &bufferPacketConn{}
client := ClientConn(base)
if err := client.(setBuffer).SetReadBuffer(1024); err != nil {
t.Fatal(err)
}
if err := client.(setBuffer).SetWriteBuffer(2048); err != nil {
t.Fatal(err)
}
if base.readBuffer != 1024 {
t.Fatalf("read buffer = %d, want 1024", base.readBuffer)
}
if base.writeBuffer != 2048 {
t.Fatalf("write buffer = %d, want 2048", base.writeBuffer)
}
server := ServerConn(base)
if err := server.(setBuffer).SetReadBuffer(4096); err != nil {
t.Fatal(err)
}
if err := server.(setBuffer).SetWriteBuffer(8192); err != nil {
t.Fatal(err)
}
if base.readBuffer != 4096 {
t.Fatalf("read buffer = %d, want 4096", base.readBuffer)
}
if base.writeBuffer != 8192 {
t.Fatalf("write buffer = %d, want 8192", base.writeBuffer)
}
}
type bufferPacketConn struct {
net.PacketConn
readBuffer int
writeBuffer int
}
func (c *bufferPacketConn) SetReadBuffer(n int) error {
c.readBuffer = n
return nil
}
func (c *bufferPacketConn) SetWriteBuffer(n int) error {
c.writeBuffer = n
return nil
}