mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2026-02-26 16:57:08 +00:00
Currently, it can only validate whether a cycle exists in proxies, and cannot determine if it is caused by groups.
80 lines
2.7 KiB
Go
80 lines
2.7 KiB
Go
package config
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestValidateDialerProxies(t *testing.T) {
|
|
testCases := []struct {
|
|
testName string
|
|
proxy []map[string]any
|
|
errContains string
|
|
}{
|
|
{
|
|
testName: "ValidReference",
|
|
proxy: []map[string]any{ // create proxy with valid dialer-proxy reference
|
|
{"name": "base-proxy", "type": "socks5", "server": "127.0.0.1", "port": 1080},
|
|
{"name": "proxy-with-dialer", "type": "socks5", "server": "127.0.0.1", "port": 1081, "dialer-proxy": "base-proxy"},
|
|
},
|
|
errContains: "",
|
|
},
|
|
{
|
|
testName: "NotFoundReference",
|
|
proxy: []map[string]any{ // create proxy with non-existent dialer-proxy reference
|
|
{"name": "proxy-with-dialer", "type": "socks5", "server": "127.0.0.1", "port": 1081, "dialer-proxy": "non-existent-proxy"},
|
|
},
|
|
errContains: "not found",
|
|
},
|
|
{
|
|
testName: "CircularDependency",
|
|
proxy: []map[string]any{
|
|
// create proxy A that references B
|
|
{"name": "proxy-a", "type": "socks5", "server": "127.0.0.1", "port": 1080, "dialer-proxy": "proxy-c"},
|
|
// create proxy B that references C
|
|
{"name": "proxy-b", "type": "socks5", "server": "127.0.0.1", "port": 1081, "dialer-proxy": "proxy-a"},
|
|
// create proxy C that references A (creates cycle)
|
|
{"name": "proxy-c", "type": "socks5", "server": "127.0.0.1", "port": 1082, "dialer-proxy": "proxy-a"},
|
|
},
|
|
errContains: "circular",
|
|
},
|
|
{
|
|
testName: "ComplexChain",
|
|
proxy: []map[string]any{ // create a valid chain: proxy-d -> proxy-c -> proxy-b -> proxy-a
|
|
{"name": "proxy-a", "type": "socks5", "server": "127.0.0.1", "port": 1080},
|
|
{"name": "proxy-b", "type": "socks5", "server": "127.0.0.1", "port": 1081, "dialer-proxy": "proxy-a"},
|
|
{"name": "proxy-c", "type": "socks5", "server": "127.0.0.1", "port": 1082, "dialer-proxy": "proxy-b"},
|
|
{"name": "proxy-d", "type": "socks5", "server": "127.0.0.1", "port": 1083, "dialer-proxy": "proxy-c"},
|
|
},
|
|
errContains: "",
|
|
},
|
|
{
|
|
testName: "EmptyDialerProxy",
|
|
proxy: []map[string]any{ // create proxy without dialer-proxy
|
|
{"name": "simple-proxy", "type": "socks5", "server": "127.0.0.1", "port": 1080},
|
|
},
|
|
errContains: "",
|
|
},
|
|
{
|
|
testName: "SelfReference",
|
|
proxy: []map[string]any{ // create proxy that references itself
|
|
{"name": "self-proxy", "type": "socks5", "server": "127.0.0.1", "port": 1080, "dialer-proxy": "self-proxy"},
|
|
},
|
|
errContains: "circular",
|
|
},
|
|
}
|
|
|
|
for _, testCase := range testCases {
|
|
t.Run(testCase.testName, func(t *testing.T) {
|
|
config := RawConfig{Proxy: testCase.proxy}
|
|
_, _, err := parseProxies(&config)
|
|
if testCase.errContains == "" {
|
|
assert.NoError(t, err, testCase.testName)
|
|
} else {
|
|
assert.ErrorContains(t, err, testCase.errContains, testCase.testName)
|
|
}
|
|
})
|
|
}
|
|
}
|