110 lines
2.7 KiB
Go
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
|
|
}
|