mirror of
https://github.com/XTLS/Xray-core.git
synced 2026-05-08 14:13:22 +00:00
124 lines
2.1 KiB
Go
124 lines
2.1 KiB
Go
package finalmask_test
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"net"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/xtls/xray-core/transport/internet/finalmask"
|
|
"github.com/xtls/xray-core/transport/internet/finalmask/header/custom"
|
|
)
|
|
|
|
func mustSendRecvTcp(
|
|
t *testing.T,
|
|
from net.Conn,
|
|
to net.Conn,
|
|
msg []byte,
|
|
) {
|
|
t.Helper()
|
|
|
|
go func() {
|
|
_, err := from.Write(msg)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
}()
|
|
|
|
buf := make([]byte, 1024)
|
|
n, err := io.ReadFull(to, buf[:len(msg)])
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if n != len(msg) {
|
|
t.Fatalf("unexpected size: %d", n)
|
|
}
|
|
|
|
if !bytes.Equal(buf[:n], msg) {
|
|
t.Fatalf("unexpected data %q", buf[:n])
|
|
}
|
|
}
|
|
|
|
type layerMaskTcp struct {
|
|
name string
|
|
mask finalmask.Tcpmask
|
|
}
|
|
|
|
func TestConnReadWrite(t *testing.T) {
|
|
cases := []layerMaskTcp{
|
|
{
|
|
name: "custom",
|
|
mask: &custom.TCPConfig{
|
|
Clients: []*custom.TCPSequence{
|
|
{
|
|
Sequence: []*custom.TCPItem{
|
|
{
|
|
Packet: []byte{1},
|
|
},
|
|
{
|
|
Rand: 1,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
Servers: []*custom.TCPSequence{
|
|
{
|
|
Sequence: []*custom.TCPItem{
|
|
{
|
|
Packet: []byte{2},
|
|
},
|
|
{
|
|
Rand: 1,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, c := range cases {
|
|
t.Run(c.name, func(t *testing.T) {
|
|
mask := c.mask
|
|
|
|
maskManager := finalmask.NewTcpmaskManager([]finalmask.Tcpmask{mask})
|
|
|
|
ln, err := net.Listen("tcp", "127.0.0.1:0")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
client, err := net.Dial("tcp", ln.Addr().String())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
client, err = maskManager.WrapConnClient(client)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
server, err := ln.Accept()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
server, err = maskManager.WrapConnServer(server)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
_ = client.SetDeadline(time.Now().Add(time.Second))
|
|
_ = server.SetDeadline(time.Now().Add(time.Second))
|
|
|
|
mustSendRecvTcp(t, client, server, []byte("client -> server"))
|
|
mustSendRecvTcp(t, server, client, []byte("server -> client"))
|
|
|
|
mustSendRecvTcp(t, client, server, []byte{})
|
|
mustSendRecvTcp(t, server, client, []byte{})
|
|
})
|
|
}
|
|
}
|