mirror of https://github.com/Dreamacro/clash.git
113 lines
2.6 KiB
Go
113 lines
2.6 KiB
Go
package process
|
|
|
|
import (
|
|
"net"
|
|
"net/netip"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func testConn(t *testing.T, network, address string) {
|
|
l, err := net.Listen(network, address)
|
|
if err != nil {
|
|
assert.FailNow(t, "Listen failed", err)
|
|
}
|
|
defer l.Close()
|
|
|
|
conn, err := net.Dial("tcp", l.Addr().String())
|
|
if err != nil {
|
|
assert.FailNow(t, "Dial failed", err)
|
|
}
|
|
defer conn.Close()
|
|
|
|
rConn, err := l.Accept()
|
|
if err != nil {
|
|
assert.FailNow(t, "Accept conn failed", err)
|
|
}
|
|
defer rConn.Close()
|
|
|
|
path, err := FindProcessPath(TCP, conn.LocalAddr().(*net.TCPAddr).AddrPort(), conn.RemoteAddr().(*net.TCPAddr).AddrPort())
|
|
if err != nil {
|
|
assert.FailNow(t, "Find process path failed", err)
|
|
}
|
|
|
|
exePath, err := os.Executable()
|
|
if err != nil {
|
|
assert.FailNow(t, "Get executable failed", err)
|
|
}
|
|
|
|
assert.Equal(t, exePath, path)
|
|
}
|
|
|
|
func TestFindProcessPathTCP(t *testing.T) {
|
|
t.Run("v4", func(t *testing.T) {
|
|
testConn(t, "tcp4", "127.0.0.1:0")
|
|
})
|
|
t.Run("v6", func(t *testing.T) {
|
|
testConn(t, "tcp6", "[::1]:0")
|
|
})
|
|
}
|
|
|
|
func testPacketConn(t *testing.T, network, lAddress, rAddress string) {
|
|
lConn, err := net.ListenPacket(network, lAddress)
|
|
if err != nil {
|
|
assert.FailNow(t, "ListenPacket failed", err)
|
|
}
|
|
defer lConn.Close()
|
|
|
|
rConn, err := net.ListenPacket(network, rAddress)
|
|
if err != nil {
|
|
assert.FailNow(t, "ListenPacket failed", err)
|
|
}
|
|
defer rConn.Close()
|
|
|
|
_, err = lConn.WriteTo([]byte{0}, rConn.LocalAddr())
|
|
if err != nil {
|
|
assert.FailNow(t, "Send message failed", err)
|
|
}
|
|
|
|
_, lAddr, err := rConn.ReadFrom([]byte{0})
|
|
if err != nil {
|
|
assert.FailNow(t, "Receive message failed", err)
|
|
}
|
|
|
|
path, err := FindProcessPath(UDP, lAddr.(*net.UDPAddr).AddrPort(), rConn.LocalAddr().(*net.UDPAddr).AddrPort())
|
|
if err != nil {
|
|
assert.FailNow(t, "Find process path", err)
|
|
}
|
|
|
|
exePath, err := os.Executable()
|
|
if err != nil {
|
|
assert.FailNow(t, "Find executable", err)
|
|
}
|
|
|
|
assert.Equal(t, exePath, path)
|
|
}
|
|
|
|
func TestFindProcessPathUDP(t *testing.T) {
|
|
t.Run("v4", func(t *testing.T) {
|
|
testPacketConn(t, "udp4", "127.0.0.1:0", "127.0.0.1:0")
|
|
})
|
|
t.Run("v6", func(t *testing.T) {
|
|
testPacketConn(t, "udp6", "[::1]:0", "[::1]:0")
|
|
})
|
|
t.Run("v4AnyLocal", func(t *testing.T) {
|
|
testPacketConn(t, "udp4", "0.0.0.0:0", "127.0.0.1:0")
|
|
})
|
|
t.Run("v6AnyLocal", func(t *testing.T) {
|
|
testPacketConn(t, "udp6", "[::]:0", "[::1]:0")
|
|
})
|
|
}
|
|
|
|
func BenchmarkFindProcessName(b *testing.B) {
|
|
from := netip.MustParseAddrPort("127.0.0.1:11447")
|
|
to := netip.MustParseAddrPort("127.0.0.1:33669")
|
|
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
FindProcessPath(TCP, from, to)
|
|
}
|
|
}
|