zapret-kvn/tests/test_source_layout.py
loop-uh da7eb54ab5
Some checks failed
Windows project source guards / test (push) Failing after 24s
Тест скорости меряет Hysteria2; точнее замер и быстрее обнаружение обрыва
Hysteria2 больше не пропускается «протокол не поддерживается ядром xray»:
серверы из ссылки hy2:// меряются временным официальным клиентом Hysteria —
тем же ядром и тем же адаптером конфига (обфускация, закрепление
сертификата, port hopping), что и рабочее подключение, через его локальный
HTTP-прокси.  Клиент запускается из собственного пути
runtime/speedtest/hysteria-speedtest.exe, и правило process_path → direct в
плане TUN теперь покрывает оба временных ядра: замер кандидата не уходит в
туннель через текущий сервер.  Без ядра Hysteria или исходной ссылки сервер
пропускается с понятной причиной и не помечается мёртвым.

По итогам ревью оконного замера:
- ответ из пары чанков больше не выглядит рекордной скоростью: первый чанк
  не входит в числитель, совсем короткий ответ делится на всё время запроса;
- у попытки есть общий бюджет времени, а чтение не ждёт полного чанка: еле
  живой сервер не растягивает замер на десятки секунд;
- фоновый пинг активного сервера в тишине идёт раз в 10 с, а не в 20: мёртвый
  канал авто-переключение замечает быстрее.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 00:22:34 +03:00

56 lines
2.3 KiB
Python

"""Package moves must preserve startup paths and bundled error resources."""
import importlib
import json
from pathlib import Path
import unittest
from unittest.mock import patch
import build
from xray_fluent.constants import BASE_DIR
from xray_fluent.diagnostics import runtime_errors
from xray_fluent.platform.windows import startup
ROOT = Path(__file__).resolve().parents[1]
class SourceLayoutTests(unittest.TestCase):
def test_root_contains_only_package_identity_and_constants(self):
self.assertEqual(
{path.name for path in (ROOT / "xray_fluent").glob("*.py")},
{"__init__.py", "constants.py"},
)
def test_responsibility_packages_are_importable(self):
for name in (
"application.controller", "profiles.models", "profiles.storage",
"importer.link_parser", "diagnostics.export", "network.http_utils",
"platform.windows.proxy_manager", "updates.app_updater",
"engines.singbox", "engines.xray", "engines.hysteria",
"engines.amnezia.manager", "engines.zapret.manager",
):
with self.subTest(module=name):
importlib.import_module("xray_fluent." + name)
def test_development_startup_still_targets_repository_entry_point(self):
with patch.object(startup.sys, "frozen", False, create=True):
target = startup.startup_target()
self.assertIn(f'"{ROOT / "main.py"}"', target.arguments)
self.assertEqual(target.working_dir, ROOT)
self.assertEqual(BASE_DIR, ROOT)
def test_builder_bundles_catalog_beside_its_consumer(self):
class CommandCaptured(Exception):
pass
with patch.object(build, "ensure_venv"), patch.object(build, "_remove_path_strict"), patch.object(build, "_windows_path", side_effect=str), patch.object(
build, "_run", side_effect=CommandCaptured,
) as run:
with self.assertRaises(CommandCaptured):
build.build_exe()
command = run.call_args.args[0]
resource = command[command.index("--add-data") + 1]
catalog = Path(runtime_errors.__file__).with_name("runtime-errors.json")
self.assertEqual(resource, str(catalog) + ";xray_fluent/diagnostics")
self.assertIsInstance(json.loads(catalog.read_text(encoding="utf-8"))["rules"], list)