fix: avoid panic in inbound test

This commit is contained in:
wwqgtxx 2025-04-18 11:40:37 +08:00
parent 69ce4d0f8c
commit bad61f918f
9 changed files with 122 additions and 52 deletions

View File

@ -19,17 +19,23 @@ func testInboundAnyTLS(t *testing.T, inboundOptions inbound.AnyTLSOption, outbou
} }
inboundOptions.Users = map[string]string{"test": userUUID} inboundOptions.Users = map[string]string{"test": userUUID}
in, err := inbound.NewAnyTLS(&inboundOptions) in, err := inbound.NewAnyTLS(&inboundOptions)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
tunnel := NewHttpTestTunnel() tunnel := NewHttpTestTunnel()
defer tunnel.Close() defer tunnel.Close()
err = in.Listen(tunnel) err = in.Listen(tunnel)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
defer in.Close() defer in.Close()
addrPort, err := netip.ParseAddrPort(in.Address()) addrPort, err := netip.ParseAddrPort(in.Address())
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
outboundOptions.Name = "anytls_outbound" outboundOptions.Name = "anytls_outbound"
outboundOptions.Server = addrPort.Addr().String() outboundOptions.Server = addrPort.Addr().String()
@ -37,7 +43,9 @@ func testInboundAnyTLS(t *testing.T, inboundOptions inbound.AnyTLSOption, outbou
outboundOptions.Password = userUUID outboundOptions.Password = userUUID
out, err := outbound.NewAnyTLS(outboundOptions) out, err := outbound.NewAnyTLS(outboundOptions)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
defer out.Close() defer out.Close()
tunnel.DoTest(t, out) tunnel.DoTest(t, out)

View File

@ -132,7 +132,9 @@ func NewHttpTestTunnel() *TestTunnel {
go http.Serve(ln, r) go http.Serve(ln, r)
testFn := func(t *testing.T, proxy C.ProxyAdapter, proto string) { testFn := func(t *testing.T, proxy C.ProxyAdapter, proto string) {
req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s://%s%s", proto, remoteAddr, httpPath), nil) req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s://%s%s", proto, remoteAddr, httpPath), nil)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
req = req.WithContext(ctx) req = req.WithContext(ctx)
var dstPort uint16 = 80 var dstPort uint16 = 80
@ -145,7 +147,9 @@ func NewHttpTestTunnel() *TestTunnel {
DstPort: dstPort, DstPort: dstPort,
} }
instance, err := proxy.DialContext(ctx, metadata) instance, err := proxy.DialContext(ctx, metadata)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
defer instance.Close() defer instance.Close()
transport := &http.Transport{ transport := &http.Transport{
@ -174,14 +178,18 @@ func NewHttpTestTunnel() *TestTunnel {
defer client.CloseIdleConnections() defer client.CloseIdleConnections()
resp, err := client.Do(req) resp, err := client.Do(req)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
defer resp.Body.Close() defer resp.Body.Close()
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
data, err := io.ReadAll(resp.Body) data, err := io.ReadAll(resp.Body)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
assert.Equal(t, httpData, data) assert.Equal(t, httpData, data)
} }
tunnel := &TestTunnel{ tunnel := &TestTunnel{
@ -212,12 +220,15 @@ func NewHttpTestTunnel() *TestTunnel {
CloseFn: ln.Close, CloseFn: ln.Close,
DoTestFn: func(t *testing.T, proxy C.ProxyAdapter) { DoTestFn: func(t *testing.T, proxy C.ProxyAdapter) {
// Sequential testing for debugging // Sequential testing for debugging
t.Run("Sequential", func(t *testing.T) {
testFn(t, proxy, "http") testFn(t, proxy, "http")
testFn(t, proxy, "https") testFn(t, proxy, "https")
})
// Concurrent testing to detect stress // Concurrent testing to detect stress
t.Run("Concurrent", func(t *testing.T) {
wg := sync.WaitGroup{} wg := sync.WaitGroup{}
num := 50 const num = 50
for i := 0; i < num; i++ { for i := 0; i < num; i++ {
wg.Add(1) wg.Add(1)
go func() { go func() {
@ -233,6 +244,7 @@ func NewHttpTestTunnel() *TestTunnel {
}() }()
} }
wg.Wait() wg.Wait()
})
}, },
} }
return tunnel return tunnel

View File

@ -19,17 +19,23 @@ func testInboundHysteria2(t *testing.T, inboundOptions inbound.Hysteria2Option,
} }
inboundOptions.Users = map[string]string{"test": userUUID} inboundOptions.Users = map[string]string{"test": userUUID}
in, err := inbound.NewHysteria2(&inboundOptions) in, err := inbound.NewHysteria2(&inboundOptions)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
tunnel := NewHttpTestTunnel() tunnel := NewHttpTestTunnel()
defer tunnel.Close() defer tunnel.Close()
err = in.Listen(tunnel) err = in.Listen(tunnel)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
defer in.Close() defer in.Close()
addrPort, err := netip.ParseAddrPort(in.Address()) addrPort, err := netip.ParseAddrPort(in.Address())
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
outboundOptions.Name = "hysteria2_outbound" outboundOptions.Name = "hysteria2_outbound"
outboundOptions.Server = addrPort.Addr().String() outboundOptions.Server = addrPort.Addr().String()
@ -37,7 +43,9 @@ func testInboundHysteria2(t *testing.T, inboundOptions inbound.Hysteria2Option,
outboundOptions.Password = userUUID outboundOptions.Password = userUUID
out, err := outbound.NewHysteria2(outboundOptions) out, err := outbound.NewHysteria2(outboundOptions)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
defer out.Close() defer out.Close()
tunnel.DoTest(t, out) tunnel.DoTest(t, out)

View File

@ -32,7 +32,9 @@ func testSingMux(t *testing.T, tunnel *TestTunnel, out outbound.ProxyAdapter) {
Protocol: protocol, Protocol: protocol,
} }
out, err := outbound.NewSingMux(singMuxOption, &notCloseProxyAdapter{out}) out, err := outbound.NewSingMux(singMuxOption, &notCloseProxyAdapter{out})
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
defer out.Close() defer out.Close()
tunnel.DoTest(t, out) tunnel.DoTest(t, out)

View File

@ -57,17 +57,23 @@ func testInboundShadowSocks0(t *testing.T, inboundOptions inbound.ShadowSocksOpt
} }
inboundOptions.Password = password inboundOptions.Password = password
in, err := inbound.NewShadowSocks(&inboundOptions) in, err := inbound.NewShadowSocks(&inboundOptions)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
tunnel := NewHttpTestTunnel() tunnel := NewHttpTestTunnel()
defer tunnel.Close() defer tunnel.Close()
err = in.Listen(tunnel) err = in.Listen(tunnel)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
defer in.Close() defer in.Close()
addrPort, err := netip.ParseAddrPort(in.Address()) addrPort, err := netip.ParseAddrPort(in.Address())
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
outboundOptions.Name = "shadowsocks_outbound" outboundOptions.Name = "shadowsocks_outbound"
outboundOptions.Server = addrPort.Addr().String() outboundOptions.Server = addrPort.Addr().String()
@ -75,7 +81,9 @@ func testInboundShadowSocks0(t *testing.T, inboundOptions inbound.ShadowSocksOpt
outboundOptions.Password = password outboundOptions.Password = password
out, err := outbound.NewShadowSocks(outboundOptions) out, err := outbound.NewShadowSocks(outboundOptions)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
defer out.Close() defer out.Close()
tunnel.DoTest(t, out) tunnel.DoTest(t, out)

View File

@ -21,17 +21,23 @@ func testInboundTrojan(t *testing.T, inboundOptions inbound.TrojanOption, outbou
{Username: "test", Password: userUUID}, {Username: "test", Password: userUUID},
} }
in, err := inbound.NewTrojan(&inboundOptions) in, err := inbound.NewTrojan(&inboundOptions)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
tunnel := NewHttpTestTunnel() tunnel := NewHttpTestTunnel()
defer tunnel.Close() defer tunnel.Close()
err = in.Listen(tunnel) err = in.Listen(tunnel)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
defer in.Close() defer in.Close()
addrPort, err := netip.ParseAddrPort(in.Address()) addrPort, err := netip.ParseAddrPort(in.Address())
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
outboundOptions.Name = "trojan_outbound" outboundOptions.Name = "trojan_outbound"
outboundOptions.Server = addrPort.Addr().String() outboundOptions.Server = addrPort.Addr().String()
@ -39,7 +45,9 @@ func testInboundTrojan(t *testing.T, inboundOptions inbound.TrojanOption, outbou
outboundOptions.Password = userUUID outboundOptions.Password = userUUID
out, err := outbound.NewTrojan(outboundOptions) out, err := outbound.NewTrojan(outboundOptions)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
defer out.Close() defer out.Close()
tunnel.DoTest(t, out) tunnel.DoTest(t, out)

View File

@ -48,24 +48,32 @@ func testInboundTuic0(t *testing.T, inboundOptions inbound.TuicOption, outboundO
Port: "0", Port: "0",
} }
in, err := inbound.NewTuic(&inboundOptions) in, err := inbound.NewTuic(&inboundOptions)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
tunnel := NewHttpTestTunnel() tunnel := NewHttpTestTunnel()
defer tunnel.Close() defer tunnel.Close()
err = in.Listen(tunnel) err = in.Listen(tunnel)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
defer in.Close() defer in.Close()
addrPort, err := netip.ParseAddrPort(in.Address()) addrPort, err := netip.ParseAddrPort(in.Address())
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
outboundOptions.Name = "tuic_outbound" outboundOptions.Name = "tuic_outbound"
outboundOptions.Server = addrPort.Addr().String() outboundOptions.Server = addrPort.Addr().String()
outboundOptions.Port = int(addrPort.Port()) outboundOptions.Port = int(addrPort.Port())
out, err := outbound.NewTuic(outboundOptions) out, err := outbound.NewTuic(outboundOptions)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
defer out.Close() defer out.Close()
tunnel.DoTest(t, out) tunnel.DoTest(t, out)

View File

@ -21,17 +21,23 @@ func testInboundVless(t *testing.T, inboundOptions inbound.VlessOption, outbound
{Username: "test", UUID: userUUID, Flow: "xtls-rprx-vision"}, {Username: "test", UUID: userUUID, Flow: "xtls-rprx-vision"},
} }
in, err := inbound.NewVless(&inboundOptions) in, err := inbound.NewVless(&inboundOptions)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
tunnel := NewHttpTestTunnel() tunnel := NewHttpTestTunnel()
defer tunnel.Close() defer tunnel.Close()
err = in.Listen(tunnel) err = in.Listen(tunnel)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
defer in.Close() defer in.Close()
addrPort, err := netip.ParseAddrPort(in.Address()) addrPort, err := netip.ParseAddrPort(in.Address())
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
outboundOptions.Name = "vless_outbound" outboundOptions.Name = "vless_outbound"
outboundOptions.Server = addrPort.Addr().String() outboundOptions.Server = addrPort.Addr().String()
@ -39,7 +45,9 @@ func testInboundVless(t *testing.T, inboundOptions inbound.VlessOption, outbound
outboundOptions.UUID = userUUID outboundOptions.UUID = userUUID
out, err := outbound.NewVless(outboundOptions) out, err := outbound.NewVless(outboundOptions)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
defer out.Close() defer out.Close()
tunnel.DoTest(t, out) tunnel.DoTest(t, out)

View File

@ -21,17 +21,23 @@ func testInboundVMess(t *testing.T, inboundOptions inbound.VmessOption, outbound
{Username: "test", UUID: userUUID, AlterID: 0}, {Username: "test", UUID: userUUID, AlterID: 0},
} }
in, err := inbound.NewVmess(&inboundOptions) in, err := inbound.NewVmess(&inboundOptions)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
tunnel := NewHttpTestTunnel() tunnel := NewHttpTestTunnel()
defer tunnel.Close() defer tunnel.Close()
err = in.Listen(tunnel) err = in.Listen(tunnel)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
defer in.Close() defer in.Close()
addrPort, err := netip.ParseAddrPort(in.Address()) addrPort, err := netip.ParseAddrPort(in.Address())
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
outboundOptions.Name = "vmess_outbound" outboundOptions.Name = "vmess_outbound"
outboundOptions.Server = addrPort.Addr().String() outboundOptions.Server = addrPort.Addr().String()
@ -41,7 +47,9 @@ func testInboundVMess(t *testing.T, inboundOptions inbound.VmessOption, outbound
outboundOptions.Cipher = "auto" outboundOptions.Cipher = "auto"
out, err := outbound.NewVmess(outboundOptions) out, err := outbound.NewVmess(outboundOptions)
assert.NoError(t, err) if !assert.NoError(t, err) {
return
}
defer out.Close() defer out.Close()
tunnel.DoTest(t, out) tunnel.DoTest(t, out)