refactor(agent): route 块改由 buildRoute 统一产出,合并 ACL 与 WARP

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-07-23 01:52:39 +08:00
parent 597d6ab68b
commit 4155fc8542
4 changed files with 122 additions and 17 deletions
+81
View File
@@ -256,3 +256,84 @@ func TestACLRules_InactiveYieldsNil(t *testing.T) {
t.Errorf("enabled=false rules() = %v, want nil", got)
}
}
// buildRoute 四态矩阵:ACL×WARP 开关的四种组合。
func TestBuildRoute_Matrix(t *testing.T) {
acl := &ACLConfig{
Enabled: true,
AllowDpUUIDs: []string{"uuid-me"},
Targets: []ACLTarget{{Domain: []string{"brain.51yanmei.com"}}},
}
warp := &WarpConfig{
Enabled: true, PrivateKey: "k", PeerPublicKey: "pk",
Endpoint: "162.159.192.1:2408", Address: []string{"172.16.0.2/32"},
Domains: []string{"reddit.com"},
}
t.Run("都关 → 不产出 route(向后兼容)", func(t *testing.T) {
if got := buildRoute(nil, nil); got != nil {
t.Errorf("buildRoute(nil,nil) = %v, want nil", got)
}
})
t.Run("仅 WARP → sniff + warp 规则(与改动前逐字节一致)", func(t *testing.T) {
r := buildRoute(nil, warp)
rules := r["rules"].([]any)
if len(rules) != 2 {
t.Fatalf("规则数 = %d, want 2", len(rules))
}
if rules[0].(map[string]any)["action"] != "sniff" {
t.Error("首条不是 sniff")
}
if rules[1].(map[string]any)["outbound"] != warpOutboundTag {
t.Error("次条不是 warp 分流")
}
if r["final"] != directOutboundTag {
t.Errorf("final = %v, want %q", r["final"], directOutboundTag)
}
})
t.Run("仅 ACL → sniff + 放行 + 拒绝", func(t *testing.T) {
r := buildRoute(acl, nil)
rules := r["rules"].([]any)
if len(rules) != 3 {
t.Fatalf("规则数 = %d, want 3", len(rules))
}
if rules[0].(map[string]any)["action"] != "sniff" {
t.Error("首条不是 sniff")
}
if _, ok := rules[1].(map[string]any)["user"]; !ok {
t.Error("第二条不是放行规则")
}
if rules[2].(map[string]any)["action"] != "reject" {
t.Error("第三条不是拒绝规则")
}
})
t.Run("都开 → sniff + ACL(放行,拒绝) + warp,且 sniff 只出现一次", func(t *testing.T) {
r := buildRoute(acl, warp)
rules := r["rules"].([]any)
if len(rules) != 4 {
t.Fatalf("规则数 = %d, want 4", len(rules))
}
sniffs := 0
for _, x := range rules {
if x.(map[string]any)["action"] == "sniff" {
sniffs++
}
}
if sniffs != 1 {
t.Errorf("sniff 出现 %d 次, want 1", sniffs)
}
if rules[0].(map[string]any)["action"] != "sniff" {
t.Error("sniff 必须最先")
}
// ACL 全部规则必须排在 warp 之前:被拒绝的目的地不该有机会走 warp 出口
if rules[3].(map[string]any)["outbound"] != warpOutboundTag {
t.Error("warp 规则必须排在最后")
}
if rules[2].(map[string]any)["action"] != "reject" {
t.Error("ACL 拒绝规则必须排在 warp 之前")
}
})
}