zapretgui/tests/test_gui_gil_switch_interval.py
loop-uh f100d1f7ef Проверять целостность поставки и чинить её самостоятельно
Программа не знала, из чего состоит её собственная установка, поэтому
пропажу winws2.exe обнаруживал только конструктор runner-а — в самом конце
цепочки запуска, и наружу шёл голый FileNotFoundError с советом
«Переустановите программу».

Что добавлено:

- install_integrity: манифест поставки (_internal/install_manifest.json),
  быстрая проверка по размеру и полная по SHA-256, классификация причины
  (файл удалили после установки / установка неполная / файлы повреждены).
- Генерация манифеста в installer stage и отказ сборки, если в поставке
  нет движка, WinDivert.dll или драйвера: непустого каталога exe
  недостаточно, чтобы релиз оказался рабочим.
- Preflight перед запуском DPI с учётом нужного движка, фоновая проверка
  после старта окна и полная проверка на первом запуске после обновления.
- Самовосстановление тем же конвейером, которым идёт обновление: сначала
  сохранённый установщик из кэша (работает без сети), затем загрузка.
  Лимит — одна попытка на запуск и три в сутки, иначе антивирус и
  программа уходят в петлю переустановок.
- Многострочный диагноз больше не печатается построчно уровнем ERROR:
  одна ошибка запуска даёт одно уведомление вместо четырёх.

В коммит также попала параллельная работа по другим подсистемам
(watchdog обновления, blockcheck-verdict, ui-guard), потому что модули
целостности опираются на её update_paths.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 15:07:14 +03:00

36 lines
1 KiB
Python

from __future__ import annotations
import inspect
import sys
import unittest
from main.qt_runtime import GIL_SWITCH_INTERVAL_SEC, apply_gui_gil_switch_interval, ensure_qt_runtime
class GuiGilSwitchIntervalTests(unittest.TestCase):
def setUp(self) -> None:
self._original_interval = sys.getswitchinterval()
self.addCleanup(sys.setswitchinterval, self._original_interval)
def test_default_interval_is_lowered_for_gui_responsiveness(self) -> None:
sys.setswitchinterval(0.005)
apply_gui_gil_switch_interval()
self.assertEqual(sys.getswitchinterval(), GIL_SWITCH_INTERVAL_SEC)
def test_already_lower_interval_is_kept(self) -> None:
sys.setswitchinterval(0.0005)
apply_gui_gil_switch_interval()
self.assertEqual(sys.getswitchinterval(), 0.0005)
def test_qt_runtime_applies_the_interval(self) -> None:
source = inspect.getsource(ensure_qt_runtime)
self.assertIn("apply_gui_gil_switch_interval()", source)
if __name__ == "__main__":
unittest.main()