# Тестирование ## Уровни 1. Unit: URI, policy, version, renderer, redaction. 2. Failure injection: candidate rejection, restart failure, URI/config rollback, idempotency и manual rollback swap. 3. Real binary: `sing-box 1.13.19 check` на Linux и schema/format validation на Windows. 4. Privileged Linux: TUN, nftables, systemd и локальный HTTP connectivity healthcheck. 5. Canary: DNS A change без endpoint CIDR и credential rotation. 6. Reboot: guard ordering, persisted config и path watcher. ## Unit tests ```bash make check ``` Тест с реальным бинарником включается явно: ```bash SING_BOX_1_13_19=/usr/bin/sing-box make test ``` Он предварительно проверяет exact version, `with_quic` и `with_gvisor`. Windows-бинарник не может создать Linux auto-redirect и поэтому выполняет `format` полной схемы; обязательный `check` остаётся в Linux CI/Incus. ## Privileged acceptance В disposable Incus-контейнере с двумя NIC: 1. установить sing-box 1.13.19 и пакет; 2. применить test URI; 3. проверить таблицу 2022 и marks; 4. подтвердить, что `eth1 -> eth0` отклоняется без sing-box; 5. подтвердить TCP/UDP/DNS через TUN при рабочем HY2; 6. сломать credential и проверить автоматический rollback; 7. изменить A-запись endpoint, не меняя URI/config; 8. перезагрузить контейнер и повторить doctor. Отдельный dependency failure test выполняется только в disposable Incus: 1. остановить sing-box и guard; 2. временно задать в test policy отсутствующий upstream interface; 3. убедиться, что `systemctl start sing-box.service` завершается ошибкой из-за неуспешного guard; 4. восстановить policy и подтвердить успешный совместный запуск; 5. проверить drop-in командой `systemd-analyze verify` и содержимое собранного Debian-пакета через `dpkg-deb -c`. Локальный HTTPS healthcheck не заменяет запросы DNS/TCP/UDP с реального workload за `eth1`. При остановленном sing-box такой workload не должен получить прямой доступ через `eth0`. Production A-запись не используется для эксперимента: нужен staging hostname.