All checks were successful
Zapret source guards / validate (push) Successful in 8s
Ваша сеть. Проверка показывает, под каким адресом компьютер виден из интернета, чей это провайдер (название, номер сети, диапазон, страна) и какой адрес у самого компьютера: за роутером, за общим адресом провайдера (100.64.0.0/10) или трафик идёт через прокси либо VPN (у компьютера свой адрес в интернете, а снаружи виден другой). Внешний адрес спрашивается у Cloudflare по его адресу, без DNS; владелец сети — шифрованным запросом, чтобы за него не ответил перехватчик. Если работают другие программы обхода или VPN, об этом сказано здесь же: вся проверка описывает сеть вместе с ними. Блок есть в журнале, в отчёте и отдельной карточкой. Telegram. Приложение ходит не на сайт, а по адресам пяти дата-центров, и блокируют их отдельно. Теперь с каждым устанавливается соединение; неудачное повторяется после паузы. Один молчащий дата-центр — не проблема (приложение возьмёт другой), в итог попадает только случай, когда молчат все пять, каждый проверен дважды. Проверка идёт в режимах «Только сайты» и «Полная». Хостинги. Из списка убраны 11 мёртвых адресов (отдавали 403, 404, 301, просроченный или чужой сертификат, пропали из DNS) и добавлены 9 проверенных из списка проекта dpi-checkers (Apache-2.0), в том числе два новых провайдера — BuyVM и Microsoft Azure. Все 57 адресов на момент проверки отдают больше 24 КБ. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
87 lines
3.8 KiB
Python
87 lines
3.8 KiB
Python
import unittest
|
|
from concurrent.futures import ThreadPoolExecutor
|
|
|
|
from blockcheck.ui.result_cards_model import build_cards
|
|
from diagnostics import telegram_check as tg
|
|
from diagnostics.verdict import Level
|
|
|
|
|
|
def _run(connect):
|
|
with ThreadPoolExecutor(max_workers=8) as pool:
|
|
return tg.check_telegram(pool.submit, lambda future: future.result(), connect=connect, pause=lambda _s: None)
|
|
|
|
|
|
class TelegramCheckTests(unittest.TestCase):
|
|
def test_all_centers_answer(self) -> None:
|
|
servers = _run(lambda _address, _port: (True, 42.0))
|
|
report = tg.summarize_telegram(servers)
|
|
|
|
self.assertEqual(len(servers), 5)
|
|
self.assertEqual({item.attempts for item in servers}, {1})
|
|
self.assertEqual(report.level, Level.OK)
|
|
self.assertIn("5 из 5", report.headline)
|
|
|
|
def test_failed_connection_is_retried_once(self) -> None:
|
|
calls: dict[str, int] = {}
|
|
|
|
def connect(address, _port):
|
|
calls[address] = calls.get(address, 0) + 1
|
|
# Первый дата-центр «теряет пакет»: первая попытка не проходит, вторая проходит.
|
|
if address == tg.DATA_CENTERS[0].address and calls[address] == 1:
|
|
return False, None
|
|
return True, 10.0
|
|
|
|
servers = _run(connect)
|
|
|
|
self.assertEqual(calls[tg.DATA_CENTERS[0].address], 2)
|
|
self.assertEqual(servers[0].attempts, 2)
|
|
self.assertTrue(servers[0].connected)
|
|
self.assertEqual(tg.summarize_telegram(servers).level, Level.OK)
|
|
|
|
def test_one_silent_center_is_a_warning_not_a_block(self) -> None:
|
|
silent = tg.DATA_CENTERS[4].address
|
|
report = tg.summarize_telegram(_run(lambda address, _port: (False, None) if address == silent else (True, 5.0)))
|
|
|
|
self.assertEqual(report.level, Level.WARN)
|
|
self.assertIn("4 из 5", report.headline)
|
|
|
|
def test_all_silent_twice_is_a_failure_with_proxy_advice(self) -> None:
|
|
servers = _run(lambda _address, _port: (False, None))
|
|
report = tg.summarize_telegram(servers)
|
|
|
|
self.assertEqual({item.attempts for item in servers}, {2})
|
|
self.assertEqual(report.level, Level.FAIL)
|
|
self.assertIn("каждый проверен дважды", report.headline)
|
|
self.assertIn("Telegram Proxy", report.advice[0])
|
|
|
|
def test_cancelled_check_is_unknown(self) -> None:
|
|
report = tg.summarize_telegram(_run(lambda _address, _port: (None, None)))
|
|
|
|
self.assertEqual(report.level, Level.UNKNOWN)
|
|
|
|
def test_centers_live_in_more_than_one_network(self) -> None:
|
|
networks = {".".join(center.address.split(".")[:2]) for center in tg.DATA_CENTERS}
|
|
|
|
self.assertGreaterEqual(len(networks), 2)
|
|
self.assertEqual(len({center.address for center in tg.DATA_CENTERS}), 5)
|
|
|
|
def test_card_lists_every_center(self) -> None:
|
|
[card] = build_cards({
|
|
"telegram": {
|
|
"level": "warn",
|
|
"headline": "Часть дата-центров Telegram не принимает соединения: отвечают 1 из 2",
|
|
"advice": ["Включите встроенный Telegram Proxy."],
|
|
"items": [
|
|
{"name": "DC1 (Майами)", "address": "149.154.175.53", "state": "ok", "text": "соединение за 60 мс"},
|
|
{"name": "DC5 (Сингапур)", "address": "91.108.56.130", "state": "fail", "text": "не соединился, 2 попытки"},
|
|
],
|
|
}
|
|
})
|
|
|
|
self.assertEqual((card.key, card.level, card.status), ("telegram", "warn", "Отвечают 1 из 2"))
|
|
self.assertEqual([line.state for line in card.lines], ["ok", "fail"])
|
|
self.assertEqual(card.sections[-1].title, "Что делать")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|