From 112374e2a15f3a6c5c293e3cc575c958cfbe415d Mon Sep 17 00:00:00 2001 From: ao gong <41768719+ageorge156@users.noreply.github.com> Date: Sat, 5 Sep 2026 13:40:50 +0800 Subject: [PATCH] test(gen-script): lock in to_rule() inline-# handling with regression tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 2 个 test method 覆盖 b4a4769 修复的边界 case: - test_to_rule_strips_inline_hash_comment_before_classifying_no_resolve 锁定带 inline # 注释的条目(本次修复的真实场景) + 验证注释里出现 'no-resolve' / ',DIRECT' 字符串不被误处理 - test_to_rule_preserves_canonical_forms 锁定 happy path(纯规则、带 no-resolve、带行尾空白) 为让 test_checked_in_router_projections_match_the_rule_source 通过, 同步重生成 router/direct-plain.txt 和 router/direct-rules.yaml。 这俩投影文件自 907fe9d 起就 stale 14+ 条规则(国内 LLM、UGREEN、 Steam 段全没同步),本次连同 b4a4769 的修复一起补齐。 测试结果:python3 -m unittest discover -s tests Ran 9 tests in 0.028s — OK --- router/direct-plain.txt | 15 +++++++++++++++ router/direct-rules.yaml | 15 +++++++++++++++ tests/test_module_spec.py | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) diff --git a/router/direct-plain.txt b/router/direct-plain.txt index a1a0a2e..55e6383 100644 --- a/router/direct-plain.txt +++ b/router/direct-plain.txt @@ -33,3 +33,18 @@ DOMAIN-SUFFIX,syncthing.net IP-CIDR,110.42.0.0/16,no-resolve IP-CIDR,43.248.128.0/17,no-resolve IP-CIDR,111.170.0.0/16,no-resolve +DOMAIN-SUFFIX,steampowered.com +DOMAIN-SUFFIX,steamcommunity.com +DOMAIN-SUFFIX,steamgames.com +DOMAIN-SUFFIX,steamusercontent.com +DOMAIN-SUFFIX,steam-chat.com +DOMAIN-SUFFIX,steamstatic.com +DOMAIN-SUFFIX,steamcontent.com +DOMAIN-KEYWORD,csgo. +PROCESS-NAME,steam +PROCESS-NAME,steamwebhelper +IP-CIDR,162.254.192.0/18,no-resolve +IP-CIDR,103.10.124.0/23,no-resolve +IP-CIDR,103.28.54.0/23,no-resolve +IP-CIDR,146.66.152.0/21,no-resolve +IP-CIDR,155.133.224.0/19,no-resolve diff --git a/router/direct-rules.yaml b/router/direct-rules.yaml index 8b6c273..ee8b9ec 100644 --- a/router/direct-rules.yaml +++ b/router/direct-rules.yaml @@ -46,3 +46,18 @@ rules: - IP-CIDR,110.42.0.0/16,DIRECT,no-resolve - IP-CIDR,43.248.128.0/17,DIRECT,no-resolve - IP-CIDR,111.170.0.0/16,DIRECT,no-resolve + - DOMAIN-SUFFIX,steampowered.com,DIRECT + - DOMAIN-SUFFIX,steamcommunity.com,DIRECT + - DOMAIN-SUFFIX,steamgames.com,DIRECT + - DOMAIN-SUFFIX,steamusercontent.com,DIRECT + - DOMAIN-SUFFIX,steam-chat.com,DIRECT + - DOMAIN-SUFFIX,steamstatic.com,DIRECT + - DOMAIN-SUFFIX,steamcontent.com,DIRECT + - DOMAIN-KEYWORD,csgo.,DIRECT + - PROCESS-NAME,steam,DIRECT + - PROCESS-NAME,steamwebhelper,DIRECT + - IP-CIDR,162.254.192.0/18,DIRECT,no-resolve + - IP-CIDR,103.10.124.0/23,DIRECT,no-resolve + - IP-CIDR,103.28.54.0/23,DIRECT,no-resolve + - IP-CIDR,146.66.152.0/21,DIRECT,no-resolve + - IP-CIDR,155.133.224.0/19,DIRECT,no-resolve diff --git a/tests/test_module_spec.py b/tests/test_module_spec.py index 270278d..e907766 100644 --- a/tests/test_module_spec.py +++ b/tests/test_module_spec.py @@ -203,6 +203,42 @@ class ModuleSpecTests(unittest.TestCase): "PROCESS-NAME,OneDrive.exe,DIRECT", ) + def test_to_rule_strips_inline_hash_comment_before_classifying_no_resolve(self) -> None: + # 回归测试 (b4a4769):to_rule() 在判断 entry.endswith(',no-resolve') 之前 + # 没有剥掉行尾 # 注释,导致带 inline 注释的 Akamai Steam CDN 规则 + # 走错分支,把注释当成 entry 的一部分拼进去,生成 mihomo 解析失败的规则。 + self.assertEqual( + to_rule("IP-CIDR,162.254.192.0/18,no-resolve # Akamai Steam CDN 主段"), + "IP-CIDR,162.254.192.0/18,DIRECT,no-resolve", + ) + # 注释里出现 "no-resolve" 不能误判为 suffix + self.assertEqual( + to_rule("DOMAIN-SUFFIX,example.com # 走 no-resolve 路径"), + "DOMAIN-SUFFIX,example.com,DIRECT", + ) + # 注释里出现 ",DIRECT" 不能误拼到 proxy 字段 + self.assertEqual( + to_rule("IP-CIDR,10.0.0.0/8 # 不是 DIRECT, 是 REJECT"), + "IP-CIDR,10.0.0.0/8,DIRECT", + ) + + def test_to_rule_preserves_canonical_forms(self) -> None: + # 不带注释、不带 no-resolve + self.assertEqual( + to_rule("DOMAIN-SUFFIX,bilibili.com"), + "DOMAIN-SUFFIX,bilibili.com,DIRECT", + ) + # 带 no-resolve、无注释 + self.assertEqual( + to_rule("IP-CIDR,127.0.0.0/8,no-resolve"), + "IP-CIDR,127.0.0.0/8,DIRECT,no-resolve", + ) + # 带 no-resolve + 行尾空白 + self.assertEqual( + to_rule("IP-CIDR,127.0.0.0/8,no-resolve "), + "IP-CIDR,127.0.0.0/8,DIRECT,no-resolve", + ) + def test_clash_verge_script_adds_reachable_direct_dns_fallbacks(self) -> None: script = render_script(["PROCESS-NAME,OneDrive.exe"])