Feature: add inbounds
for flexible binding inbound (#2818)
This commit is contained in:
@ -209,23 +209,27 @@ func newLargeDataPair() (chan hashPair, chan hashPair, func(t *testing.T) error)
|
||||
return pingCh, pongCh, test
|
||||
}
|
||||
|
||||
func testPingPongWithSocksPort(t *testing.T, port int) {
|
||||
func testPingPongWithSocksPort(t *testing.T, port int) error {
|
||||
l, err := Listen("tcp", ":10001")
|
||||
require.NoError(t, err)
|
||||
defer l.Close()
|
||||
|
||||
pingCh, pongCh, test := newPingPongPair()
|
||||
go func() {
|
||||
l, err := Listen("tcp", ":10001")
|
||||
require.NoError(t, err)
|
||||
defer l.Close()
|
||||
|
||||
c, err := l.Accept()
|
||||
require.NoError(t, err)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
buf := make([]byte, 4)
|
||||
_, err = io.ReadFull(c, buf)
|
||||
require.NoError(t, err)
|
||||
if _, err = io.ReadFull(c, buf); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
pingCh <- buf
|
||||
_, err = c.Write([]byte("pong"))
|
||||
require.NoError(t, err)
|
||||
if _, err = c.Write([]byte("pong")); err != nil {
|
||||
return
|
||||
}
|
||||
}()
|
||||
|
||||
go func() {
|
||||
@ -233,20 +237,23 @@ func testPingPongWithSocksPort(t *testing.T, port int) {
|
||||
require.NoError(t, err)
|
||||
defer c.Close()
|
||||
|
||||
_, err = socks5.ClientHandshake(c, socks5.ParseAddr("127.0.0.1:10001"), socks5.CmdConnect, nil)
|
||||
require.NoError(t, err)
|
||||
if _, err = socks5.ClientHandshake(c, socks5.ParseAddr("127.0.0.1:10001"), socks5.CmdConnect, nil); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
_, err = c.Write([]byte("ping"))
|
||||
require.NoError(t, err)
|
||||
if _, err = c.Write([]byte("ping")); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
buf := make([]byte, 4)
|
||||
_, err = io.ReadFull(c, buf)
|
||||
require.NoError(t, err)
|
||||
if _, err = io.ReadFull(c, buf); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
pongCh <- buf
|
||||
}()
|
||||
|
||||
test(t)
|
||||
return test(t)
|
||||
}
|
||||
|
||||
func testPingPongWithConn(t *testing.T, c net.Conn) error {
|
||||
@ -655,7 +662,7 @@ log-level: silent
|
||||
defer cleanup()
|
||||
|
||||
require.True(t, TCPing(net.JoinHostPort("127.0.0.1", "10000")))
|
||||
testPingPongWithSocksPort(t, 10000)
|
||||
require.NoError(t, testPingPongWithSocksPort(t, 10000))
|
||||
}
|
||||
|
||||
func Benchmark_Direct(b *testing.B) {
|
||||
|
78
test/listener_test.go
Normal file
78
test/listener_test.go
Normal file
@ -0,0 +1,78 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"net"
|
||||
"strconv"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
C "github.com/Dreamacro/clash/constant"
|
||||
"github.com/Dreamacro/clash/listener"
|
||||
"github.com/Dreamacro/clash/tunnel"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestClash_Listener(t *testing.T) {
|
||||
basic := `
|
||||
log-level: silent
|
||||
port: 7890
|
||||
socks-port: 7891
|
||||
redir-port: 7892
|
||||
tproxy-port: 7893
|
||||
mixed-port: 7894
|
||||
`
|
||||
|
||||
err := parseAndApply(basic)
|
||||
require.NoError(t, err)
|
||||
defer cleanup()
|
||||
|
||||
time.Sleep(waitTime)
|
||||
|
||||
for i := 7890; i <= 7894; i++ {
|
||||
require.True(t, TCPing(net.JoinHostPort("127.0.0.1", strconv.Itoa(i))), "tcp port %d", i)
|
||||
}
|
||||
}
|
||||
|
||||
func TestClash_ListenerCreate(t *testing.T) {
|
||||
basic := `
|
||||
log-level: silent
|
||||
`
|
||||
err := parseAndApply(basic)
|
||||
require.NoError(t, err)
|
||||
defer cleanup()
|
||||
|
||||
time.Sleep(waitTime)
|
||||
tcpIn := tunnel.TCPIn()
|
||||
udpIn := tunnel.UDPIn()
|
||||
|
||||
ports := listener.Ports{
|
||||
Port: 7890,
|
||||
}
|
||||
listener.ReCreatePortsListeners(ports, tcpIn, udpIn)
|
||||
require.True(t, TCPing("127.0.0.1:7890"))
|
||||
require.Equal(t, ports, *listener.GetPorts())
|
||||
|
||||
inbounds := []C.Inbound{
|
||||
{
|
||||
Type: C.InboundTypeHTTP,
|
||||
BindAddress: "127.0.0.1:7891",
|
||||
},
|
||||
}
|
||||
listener.ReCreateListeners(inbounds, tcpIn, udpIn)
|
||||
require.True(t, TCPing("127.0.0.1:7890"))
|
||||
require.Equal(t, ports, *listener.GetPorts())
|
||||
|
||||
require.True(t, TCPing("127.0.0.1:7891"))
|
||||
require.Equal(t, len(inbounds), len(listener.GetInbounds()))
|
||||
|
||||
ports.Port = 0
|
||||
ports.SocksPort = 7892
|
||||
listener.ReCreatePortsListeners(ports, tcpIn, udpIn)
|
||||
require.False(t, TCPing("127.0.0.1:7890"))
|
||||
require.True(t, TCPing("127.0.0.1:7892"))
|
||||
require.Equal(t, ports, *listener.GetPorts())
|
||||
|
||||
require.True(t, TCPing("127.0.0.1:7891"))
|
||||
require.Equal(t, len(inbounds), len(listener.GetInbounds()))
|
||||
}
|
33
test/rule_test.go
Normal file
33
test/rule_test.go
Normal file
@ -0,0 +1,33 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"net"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestClash_RuleInbound(t *testing.T) {
|
||||
basic := `
|
||||
socks-port: 7890
|
||||
inbounds:
|
||||
- socks://127.0.0.1:7891
|
||||
- type: socks
|
||||
bind-address: 127.0.0.1:7892
|
||||
rules:
|
||||
- INBOUND-PORT,7891,REJECT
|
||||
log-level: silent
|
||||
`
|
||||
|
||||
err := parseAndApply(basic)
|
||||
require.NoError(t, err)
|
||||
defer cleanup()
|
||||
|
||||
require.True(t, TCPing(net.JoinHostPort("127.0.0.1", "7890")))
|
||||
require.True(t, TCPing(net.JoinHostPort("127.0.0.1", "7891")))
|
||||
require.True(t, TCPing(net.JoinHostPort("127.0.0.1", "7892")))
|
||||
|
||||
require.Error(t, testPingPongWithSocksPort(t, 7891))
|
||||
require.NoError(t, testPingPongWithSocksPort(t, 7890))
|
||||
require.NoError(t, testPingPongWithSocksPort(t, 7892))
|
||||
}
|
Reference in New Issue
Block a user