package shield import ( "testing" "dns-server/config" ) func TestRuleParsing(t *testing.T) { // 创建一个简单的配置 cfg := &config.ShieldConfig{ LocalRulesFile: "", RemoteRulesCacheDir: ".", UpdateInterval: 3600, StatsFile: "", StatsSaveInterval: 300, HostsFile: "", Blacklists: []config.BlacklistEntry{}, } // 测试规则 testCases := []struct { rule string domain string blocked bool desc string }{ // 测试关键字匹配规则 {"/ad.qq.com/", "ad.qq.com", true, "精确匹配"}, {"/ad.qq.com/", "sub.ad.qq.com", true, "子域名包含匹配"}, {"/ad/", "ad.example.com", true, "开头匹配"}, {"/ad/", "example.ad.com", true, "中间匹配"}, {"/ad/", "example.com.ad", true, "结尾匹配"}, {"/AD/", "ad.example.com", true, "不区分大小写匹配"}, {"/example.com/", "example.com", true, "特殊字符转义匹配"}, {"/ad/", "example.com", false, "不包含关键字,不应匹配"}, {"/test/", "example.com", false, "不同关键字,不应匹配"}, // 测试排除规则 {"@@/ad/", "ad.example.com", false, "排除规则,不应匹配"}, } // 运行测试 for _, tc := range testCases { t.Run(tc.desc, func(t *testing.T) { // 为每个测试用例创建一个新的屏蔽管理器实例 manager := NewShieldManager(cfg) // 添加规则 manager.AddRule(tc.rule) // 检查域名是否被屏蔽 result := manager.CheckDomainBlockDetails(tc.domain) blocked := result["blocked"].(bool) // 验证结果 if blocked != tc.blocked { t.Errorf("Rule %q: Domain %q expected %t, got %t", tc.rule, tc.domain, tc.blocked, blocked) } }) } }