# Тестирование ## Уровни 1. Unit: URI, policy, version, renderer, redaction и metadata. 2. Failure injection: candidate rejection, restart failure, URI/config restore, unmanaged config, corrupted/legacy last-good. 3. Packaging: MPL-2.0, exact dependency, cross-release rejection, same-release reinstall и postinst guard. 4. Real binary: официальный sing-box 1.14.0 для Gecko и Salamander configs. 5. Privileged Linux: TUN, systemd, nftables, routing и DNS. 6. HY2XS acceptance: Gecko TCP/UDP/DNS, failures, reconnect и reboot. ## Unit tests На Linux: ```bash make check ``` На Windows с isolated Python: ```powershell E:\python-31312\python.exe -c "import sys,unittest; sys.path[:0]=[r'F:\projects\singbox_glue',r'F:\projects\singbox_glue\src']; s=unittest.defaultTestLoader.discover('tests',top_level_dir='.'); r=unittest.TextTestRunner(verbosity=2).run(s); raise SystemExit(not r.wasSuccessful())" ``` ## Real binary ```bash SING_BOX_1_14_0=/usr/bin/sing-box make test ``` Тест сначала проверяет exact version/tags. На Linux выполняется `check`; на Windows — schema decoding через `format`, поскольку Windows binary не может создать Linux auto-redirect. ## Privileged Debian acceptance В disposable Incus/VM с двумя NIC проверить: 1. собрать package и выполнить чистую установку; 2. повторно установить ровно 0.2.0 поверх согласованного состояния; 3. подтвердить отказ переходов 0.1.x → 0.2.0 и другой release → 0.2.0; 4. применить Gecko config и подтвердить отсутствие `last-good` после первого apply; 5. проверить table 2022, rule 9000/32768, marks и NFQUEUE 100; 6. до установления HY2 разрешить hostname endpoint через `bootstrap-dns` по `eth0`, без recursion в `172.19.0.2`; 7. подтвердить DoH `remote-dns` через `hy2-out`; 8. с хоста выполнить `getent hosts example.com`, `dig @8.8.8.8 example.com` и `dig +tcp @8.8.8.8 example.com`; 9. повторить оба `dig` с workload за `eth1` и через `tcpdump`/nft counters подтвердить отсутствие реального TCP/UDP 53 через `eth0`; 10. при наличии `systemd-resolved` проверить DNS и route-only domain `~.` для `tun-sb0`; отдельно повторить запуск без доступного `resolvectl`; 11. проверить TCP/UDP и внешний VPN IP с workload за `eth1`; 12. подтвердить отсутствие прямого WAN при остановленном sing-box; 13. проверить credential failure и same-release rollback; 14. проверить отказ legacy/mismatched metadata и unmanaged identical config; 15. проверить смену A-record, reconnect, stop/start и reboot recovery; 16. после stop убедиться в очистке sing-box nftables/resolved state, после start — в полном восстановлении. Server-side Gecko E2E выполняется с production-compatible HY2XS. Salamander E2E выполняется на disposable server, явно настроенном в compatibility-режим; это не автоматический fallback и не default новой production-установки. Platform hijack не обслуживает DNS, направленный на локальный LAN IP gateway. Такой сценарий допустим только после добавления отдельного DNS listener и не входит в acceptance версии 0.2.0.