zapretgui/tests/test_profile_normalizer.py
loop-uh e9f1913f04 fix
2026-06-17 23:47:29 +03:00

145 lines
5.4 KiB
Python

from __future__ import annotations
import unittest
from profile.normalizer import normalize_preset_profiles
from profile.parser import parse_preset_text
class ProfileNormalizerTests(unittest.TestCase):
def test_splits_multiple_hostlists_and_drops_excludes_from_split_profiles(self) -> None:
preset = parse_preset_text(
"\n".join(
(
"--filter-tcp=80,443",
"--hostlist=lists/discord.txt",
"--hostlist=lists/other.txt",
"--hostlist-exclude=lists/list-exclude.txt",
"--payload=tcp",
"--out-range=-d10",
"--lua-desync=hostfakesplit_multi:hosts=google.com",
"",
)
),
engine="winws2",
)
result = normalize_preset_profiles(preset)
self.assertTrue(result.changed)
self.assertEqual(result.split_profile_count, 1)
self.assertEqual(result.created_profile_count, 1)
self.assertEqual(len(result.preset.profiles), 2)
self.assertEqual(result.preset.profiles[0].match.hostlist_lines, ["--hostlist=lists/discord.txt"])
self.assertEqual(result.preset.profiles[1].match.hostlist_lines, ["--hostlist=lists/other.txt"])
for profile in result.preset.profiles:
self.assertEqual(profile.match.hostlist_exclude_lines, [])
self.assertIn("--out-range=-d10", [segment.text for segment in profile.segments])
self.assertIn("--payload=tcp", [segment.text for segment in profile.segments])
self.assertIn("--lua-desync=hostfakesplit_multi:hosts=google.com", [segment.text for segment in profile.segments])
def test_splits_mixed_hostlist_and_ipset_into_separate_profiles(self) -> None:
preset = parse_preset_text(
"\n".join(
(
"--filter-tcp=443",
"--hostlist=lists/discord.txt",
"--ipset=lists/ipset-discord.txt",
"--lua-desync=pass",
"",
)
),
engine="winws2",
)
result = normalize_preset_profiles(preset)
self.assertTrue(result.changed)
self.assertEqual(len(result.preset.profiles), 2)
self.assertEqual(result.preset.profiles[0].match.hostlist_lines, ["--hostlist=lists/discord.txt"])
self.assertEqual(result.preset.profiles[1].match.ipset_lines, ["--ipset=lists/ipset-discord.txt"])
def test_keeps_catalog_profile_with_multiple_ipsets_unchanged(self) -> None:
preset = parse_preset_text(
"\n".join(
(
"--name=Каталожный набор IP",
"--filter-tcp=80,443-65535",
"--ipset=lists/ipset-one.txt",
"--ipset=lists/ipset-two.txt",
"--ipset=lists/ipset-three.txt",
"--ipset=lists/ipset-four.txt",
"--payload=tls_client_hello",
"--out-range=-d8",
"--lua-desync=pass",
"",
)
),
engine="winws2",
)
result = normalize_preset_profiles(
preset,
preserved_match_signatures=(preset.profiles[0].match_signature,),
)
self.assertFalse(result.changed)
self.assertEqual(len(result.preset.profiles), 1)
self.assertEqual(
result.preset.profiles[0].match.ipset_lines,
[
"--ipset=lists/ipset-one.txt",
"--ipset=lists/ipset-two.txt",
"--ipset=lists/ipset-three.txt",
"--ipset=lists/ipset-four.txt",
],
)
def test_keeps_all_profile_with_only_excludes_unchanged(self) -> None:
preset = parse_preset_text(
"\n".join(
(
"--filter-tcp=80,443",
"--hostlist-exclude=lists/list-exclude.txt",
"--ipset-exclude=lists/ipset-exclude.txt",
"--lua-desync=pass",
"",
)
),
engine="winws2",
)
result = normalize_preset_profiles(preset)
self.assertFalse(result.changed)
self.assertEqual(len(result.preset.profiles), 1)
self.assertEqual(result.preset.profiles[0].match.hostlist_exclude_lines, ["--hostlist-exclude=lists/list-exclude.txt"])
self.assertEqual(result.preset.profiles[0].match.ipset_exclude_lines, ["--ipset-exclude=lists/ipset-exclude.txt"])
def test_splits_winws1_profiles_and_preserves_strategy_lines(self) -> None:
preset = parse_preset_text(
"\n".join(
(
"--filter-tcp=80,443",
"--hostlist=lists/discord.txt",
"--hostlist=lists/other.txt",
"--dpi-desync=fake,split2",
"--dup=2",
"",
)
),
engine="winws1",
)
result = normalize_preset_profiles(preset)
self.assertTrue(result.changed)
self.assertEqual(len(result.preset.profiles), 2)
for profile in result.preset.profiles:
texts = [segment.text for segment in profile.segments]
self.assertIn("--dpi-desync=fake,split2", texts)
self.assertIn("--dup=2", texts)
if __name__ == "__main__":
unittest.main()