64 lines
2.7 KiB
Go
64 lines
2.7 KiB
Go
package obfs
|
|
|
|
import (
|
|
"net"
|
|
"syscall"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// fakeUDPLikeConn satisfies udpLikePacketConn without being a *net.UDPConn,
|
|
// representing wrappers like realm.PunchPacketConn that proxy SyscallConn /
|
|
// Set{Read,Write}Buffer through to a real UDP socket.
|
|
type fakeUDPLikeConn struct{}
|
|
|
|
func (fakeUDPLikeConn) ReadFrom([]byte) (int, net.Addr, error) { return 0, nil, nil }
|
|
func (fakeUDPLikeConn) WriteTo([]byte, net.Addr) (int, error) { return 0, nil }
|
|
func (fakeUDPLikeConn) Close() error { return nil }
|
|
func (fakeUDPLikeConn) LocalAddr() net.Addr { return &net.UDPAddr{} }
|
|
func (fakeUDPLikeConn) SetDeadline(time.Time) error { return nil }
|
|
func (fakeUDPLikeConn) SetReadDeadline(time.Time) error { return nil }
|
|
func (fakeUDPLikeConn) SetWriteDeadline(time.Time) error { return nil }
|
|
func (fakeUDPLikeConn) SyscallConn() (syscall.RawConn, error) { return nil, nil }
|
|
func (fakeUDPLikeConn) SetReadBuffer(int) error { return nil }
|
|
func (fakeUDPLikeConn) SetWriteBuffer(int) error { return nil }
|
|
|
|
type fakePlainConn struct{}
|
|
|
|
func (fakePlainConn) ReadFrom([]byte) (int, net.Addr, error) { return 0, nil, nil }
|
|
func (fakePlainConn) WriteTo([]byte, net.Addr) (int, error) { return 0, nil }
|
|
func (fakePlainConn) Close() error { return nil }
|
|
func (fakePlainConn) LocalAddr() net.Addr { return &net.UDPAddr{} }
|
|
func (fakePlainConn) SetDeadline(time.Time) error { return nil }
|
|
func (fakePlainConn) SetReadDeadline(time.Time) error { return nil }
|
|
func (fakePlainConn) SetWriteDeadline(time.Time) error { return nil }
|
|
|
|
type noopObfs struct{}
|
|
|
|
func (noopObfs) Obfuscate(in, out []byte) int { return copy(out, in) }
|
|
func (noopObfs) Deobfuscate(in, out []byte) int { return copy(out, in) }
|
|
|
|
func TestWrapPacketConnUsesUDPVariantForUDPConn(t *testing.T) {
|
|
udp, err := net.ListenUDP("udp", &net.UDPAddr{})
|
|
require.NoError(t, err)
|
|
defer udp.Close()
|
|
|
|
wrapped := wrapPacketConn(udp, noopObfs{})
|
|
_, ok := wrapped.(*obfsPacketConnUDP)
|
|
assert.True(t, ok, "wrapping a *net.UDPConn should return *obfsPacketConnUDP")
|
|
}
|
|
|
|
func TestWrapPacketConnUsesUDPVariantForUDPLikeWrapper(t *testing.T) {
|
|
wrapped := wrapPacketConn(fakeUDPLikeConn{}, noopObfs{})
|
|
_, ok := wrapped.(*obfsPacketConnUDP)
|
|
assert.True(t, ok, "wrapping a udpLikePacketConn should return *obfsPacketConnUDP")
|
|
}
|
|
|
|
func TestWrapPacketConnFallsBackForPlainPacketConn(t *testing.T) {
|
|
wrapped := wrapPacketConn(fakePlainConn{}, noopObfs{})
|
|
_, isUDP := wrapped.(*obfsPacketConnUDP)
|
|
assert.False(t, isUDP, "wrapping a plain net.PacketConn should not return *obfsPacketConnUDP")
|
|
}
|