- dns/winapi.py: GetAdaptersAddresses без GAA_FLAG_INCLUDE_ALL_INTERFACES (из-за него на странице были WFP/QoS/Npcap-фильтры, отладчик ядра и т.п.), признаки «аппаратный / фильтр / разъём» из GetIfEntry2, адаптер интернета через GetBestInterfaceEx, DNS читается GetInterfaceDnsSettings вместо реестра, пишется SetInterfaceDnsSettings (DoH на Windows 11), кэш — DnsFlushResolverCache. - dns/adapters.py: показываются настоящие сетевые карты (в том числе внутри виртуалки) и адаптер, через который идёт интернет (Hyper-V vEthernet); внутренние сети Hyper-V/VMware/VirtualBox/WSL, VPN и Wi-Fi Direct не показываются и не меняются. - Адаптер опознаётся по GUID; запись только адаптерам со страницы — Windows молча заводит ветку реестра под любой GUID. - Страница: таблетки со значком Ethernet/Wi-Fi и пометками «интернет» / «не подключён», по умолчанию отмечены только подключённые, отметки сохраняются после применения; ошибки Windows видны во всплывашке. - Шаблоны DoH берутся из списка серверов (один источник), IPv6 тоже с DoH. - Новые DNS из профилей hosts: AstraCat и GeoHide (проверены с Windows). - Удалены мёртвые dns_core, dns_force, dns_worker, «DNS при запуске», ключи force_dns_enabled и dns_crash_count. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
47 lines
1.5 KiB
Python
47 lines
1.5 KiB
Python
from __future__ import annotations
|
|
|
|
import unittest
|
|
|
|
|
|
class DnsIpv6ProviderApplyTests(unittest.TestCase):
|
|
def test_provider_dns_plan_accepts_ipv6_only_when_ipv6_is_available(self) -> None:
|
|
from dns.page_plans import build_provider_dns_plan
|
|
|
|
plan = build_provider_dns_plan(
|
|
name="Мой IPv6 DNS",
|
|
data={"ipv4": [], "ipv6": ["2001:4860:4860::8888"]},
|
|
ipv6_available=True,
|
|
)
|
|
|
|
self.assertTrue(plan.valid)
|
|
self.assertEqual(plan.ipv4, [])
|
|
self.assertEqual(plan.ipv6, ["2001:4860:4860::8888"])
|
|
|
|
def test_provider_dns_plan_rejects_ipv6_only_when_ipv6_is_unavailable(self) -> None:
|
|
from dns.page_plans import build_provider_dns_plan
|
|
|
|
plan = build_provider_dns_plan(
|
|
name="Мой IPv6 DNS",
|
|
data={"ipv4": [], "ipv6": ["2001:4860:4860::8888"]},
|
|
ipv6_available=False,
|
|
)
|
|
|
|
self.assertFalse(plan.valid)
|
|
self.assertIn("нет DNS", plan.log_message)
|
|
|
|
class DnsProviderPlanTests(unittest.TestCase):
|
|
def test_ipv6_addresses_are_kept_even_without_ipv6_route(self) -> None:
|
|
from dns.page_plans import build_provider_dns_plan
|
|
|
|
plan = build_provider_dns_plan(
|
|
name="Cloudflare",
|
|
data={"ipv4": ["1.1.1.1"], "ipv6": ["2606:4700:4700::1111"]},
|
|
ipv6_available=False,
|
|
)
|
|
|
|
self.assertTrue(plan.valid)
|
|
self.assertEqual(plan.ipv6, ["2606:4700:4700::1111"])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|