Clash.Meta/transport/hysteria/conns/faketcp/tcp_test.go

197 lines
3.5 KiB
Go

//go:build linux
// +build linux
package faketcp
import (
"log"
"net"
"net/http"
_ "net/http/pprof"
"testing"
)
//const testPortStream = "127.0.0.1:3456"
//const testPortPacket = "127.0.0.1:3457"
const testPortStream = "127.0.0.1:3456"
const portServerPacket = "[::]:3457"
const portRemotePacket = "127.0.0.1:3457"
func init() {
startTCPServer()
startTCPRawServer()
go func() {
log.Println(http.ListenAndServe("0.0.0.0:6060", nil))
}()
}
func startTCPServer() net.Listener {
l, err := net.Listen("tcp", testPortStream)
if err != nil {
log.Panicln(err)
}
go func() {
defer l.Close()
for {
conn, err := l.Accept()
if err != nil {
log.Println(err)
return
}
go handleRequest(conn)
}
}()
return l
}
func startTCPRawServer() *TCPConn {
conn, err := Listen("tcp", portServerPacket)
if err != nil {
log.Panicln(err)
}
err = conn.SetReadBuffer(1024 * 1024)
if err != nil {
log.Println(err)
}
err = conn.SetWriteBuffer(1024 * 1024)
if err != nil {
log.Println(err)
}
go func() {
defer conn.Close()
buf := make([]byte, 1024)
for {
n, addr, err := conn.ReadFrom(buf)
if err != nil {
log.Println("server readfrom:", err)
return
}
//echo
n, err = conn.WriteTo(buf[:n], addr)
if err != nil {
log.Println("server writeTo:", err)
return
}
}
}()
return conn
}
func handleRequest(conn net.Conn) {
defer conn.Close()
for {
buf := make([]byte, 1024)
size, err := conn.Read(buf)
if err != nil {
log.Println("handleRequest:", err)
return
}
data := buf[:size]
conn.Write(data)
}
}
func TestDialTCPStream(t *testing.T) {
conn, err := Dial("tcp", testPortStream)
if err != nil {
t.Fatal(err)
}
defer conn.Close()
addr, err := net.ResolveTCPAddr("tcp", testPortStream)
if err != nil {
t.Fatal(err)
}
n, err := conn.WriteTo([]byte("abc"), addr)
if err != nil {
t.Fatal(n, err)
}
buf := make([]byte, 1024)
if n, addr, err := conn.ReadFrom(buf); err != nil {
t.Fatal(n, addr, err)
} else {
log.Println(string(buf[:n]), "from:", addr)
}
}
func TestDialToTCPPacket(t *testing.T) {
conn, err := Dial("tcp", portRemotePacket)
if err != nil {
t.Fatal(err)
}
defer conn.Close()
addr, err := net.ResolveTCPAddr("tcp", portRemotePacket)
if err != nil {
t.Fatal(err)
}
n, err := conn.WriteTo([]byte("abc"), addr)
if err != nil {
t.Fatal(n, err)
}
log.Println("written")
buf := make([]byte, 1024)
log.Println("readfrom buf")
if n, addr, err := conn.ReadFrom(buf); err != nil {
log.Println(err)
t.Fatal(n, addr, err)
} else {
log.Println(string(buf[:n]), "from:", addr)
}
log.Println("complete")
}
func TestSettings(t *testing.T) {
conn, err := Dial("tcp", portRemotePacket)
if err != nil {
t.Fatal(err)
}
defer conn.Close()
if err := conn.SetDSCP(46); err != nil {
log.Fatal("SetDSCP:", err)
}
if err := conn.SetReadBuffer(4096); err != nil {
log.Fatal("SetReaderBuffer:", err)
}
if err := conn.SetWriteBuffer(4096); err != nil {
log.Fatal("SetWriteBuffer:", err)
}
}
func BenchmarkEcho(b *testing.B) {
conn, err := Dial("tcp", portRemotePacket)
if err != nil {
b.Fatal(err)
}
defer conn.Close()
addr, err := net.ResolveTCPAddr("tcp", portRemotePacket)
if err != nil {
b.Fatal(err)
}
buf := make([]byte, 1024)
b.ReportAllocs()
b.SetBytes(int64(len(buf)))
for i := 0; i < b.N; i++ {
n, err := conn.WriteTo(buf, addr)
if err != nil {
b.Fatal(n, err)
}
if n, addr, err := conn.ReadFrom(buf); err != nil {
b.Fatal(n, addr, err)
}
}
}