Программа не знала, из чего состоит её собственная установка, поэтому пропажу 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>
36 lines
1 KiB
Python
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()
|