9.9 KiB
Проверка SIRMENT/core — 7 октября 2026
Изменены тесты и Markdown. Исходники src при этой доработке не редактировались;
сохранённые изменения автора проекта оставлены на месте.
Уточнённые ожидания
Тесты проверяют согласованное поведение системы:
- Ошибка разбора входного пакета может завершать обработчик этого клиента. Проверяется закрытие транспорта, сохранение записи на окно восстановления, последующее удаление записи/маршрутов и работа другого TCP-соединения. Разрешается только проверенное исключение конкретного плохого клиента; остальные ошибки не скрываются.
- Отсутствующая команда отключает сразу. Неверная команда до handshake проверяется на установленном лимите из пяти логических ошибок.
- Отказ handshake означает только буквальный JSON
false. Остальные значенияstatus, включая0,null, пустые строку/массив/объект, должны разрешать продолжение. Проверяются три представителя: True, False и Other = 0. Требование boolean и перебор всех ложных значений удалены. - Полезная нагрузка данных сохраняется и пересылается как исходное JSON-значение, без преобразования в словарь. Содержимое heartbeat не используется.
connection.payload.tokenхранится какauthробота; отсутствие/null и строковый токен проверяются отдельно от UID/upf восстановления. Будущая whitelist-проверка не вводится.- Фоновые отправки продолжают работать отдельными задачами. Проверяется, что ожидание отправки не блокирует обработку данных.
- Сетевая ошибка фоновой отправки должна быть видна с исходным исключением. Стандартное логирование asyncio допустимо. Немедленное отключение от одной ошибки отдельной задачи не требуется; закрытие проверяется через настоящий EOF.
- При разрыве во время отправки допустимы сетевая ошибка или отмена задачи. Проверяются однократное закрытие и работа другого соединения.
- Ошибка закрытия вводится в
writer.wait_closedнастоящегоConnection.close, чтобы проверить защиту на уровне транспорта и последующую очистку менеджером.
Удалены искусственная сериализация Python set, обязательная отмена уже
запланированной отправки при смене состояния, запрет сообщения
Task exception was never retrieved и требование нулевого числа исключений
при корректном отключении некорректного клиента. Реальные TCP-интеграционные
тесты сохранены; мок сервера не используется.
Последний полный прогон
Среда: Windows, Python 3.11.15 из Anaconda sites, pytest 9.1.1,
pytest-cov 7.1.0, coverage 7.16.2.
python -m pytest -q --cov=src --cov-branch --cov-report=term-missing --cov-report=xml
106 сценариев: 105 passed, 1 failed.
| Причина | Падений | Что происходит |
|---|---|---|
| test_handshake_status_follows_protocol[other] | 1 | Other = 0 должен разрешать handshake; текущий if not status запускает retry, и ожидание heartbeat_answer завершается TimeoutError |
True проходит полный handshake и heartbeat. False сохраняет ready, вызывает повторный handshake и допускает последующий успешный ответ True. Значение 0 выбрано единственным Other: оно отличает буквальный false от ложности Python.
Сохранённые исправления автора проекта в Connection.close и Session.send проверены: проходят обработка ошибки writer.wait_closed с последующей очисткой, запрет новых отправок в stop/migrated, handshake, heartbeat и фоновые отправки.
Проходят также изоляция/очистка некорректных пакетов, TCP-фрейминг, гонка watcher/finally, восстановление, видимость фоновых сетевых ошибок, разрыв во время отправки и настоящий main.py/TCP.run в отдельном процессе. Тесты не имеют xfail или пропусков. Исходники src не исправлялись тестами.
Покрытие последнего прогона
pytest-cov с учётом ветвей показывает 99%:
- строки: 192 из 193, 99,48%;
- ветви: 55 из 56, 98,21%.
Дочерний процесс включён в покрытие: main.py и TCP.run выполнены. Единственный непокрытый путь — отсутствующий UID в SessionManager.getitem, строка 63. Отдельный тест простого getter ради процента не добавлен.
Высокий процент не отменяет оставшееся расхождение status: один тест падает. Порог 100% и исключения ради повышения процента не вводились.
Воспроизводимость и ограничения
Общий клиент находится в отслеживаемом examples/client.py; fixture не зависит
от игнорируемого src/.test. Перенос ранее проверен чистым локальным Git-клоном
снимка рабочих файлов: клиент доступен без этой папки. Новая редакция тестов
проверена в рабочем дереве; повторный клон этого снимка не запускался.
Процессный тест выполняет настоящий main.py через tests/entrypoint_runner.py.
Обёртка меняет только адрес/порт настоящего asyncio.start_server на
127.0.0.1:0, запускает собственный stdin-контроль отмены главной корутины
и позволяет сохранить покрытие дочернего процесса. Production CLI настройки
порта и обработка SIGTERM/CTRL+C самим main.py не проверяются.
Сохранены проверки реконекта: перенос данных и динамических метаданных, маршруты в обе стороны, отдельный handshake, неверный upf, активная/отсутствующая/перенесённая сессия, однократность и безопасность старой очистки после восстановления.
Оставшиеся ограничения:
- Сроки 60 секунд до первого heartbeat, 5 секунд после heartbeat и 60 секунд восстановления проверяются управляемыми часами, без настоящих длинных пауз.
- Проверяется выбранное пересечение watcher/TCP-finally, но не длительный стресс множества соединений, переполнение буферов и задержки event loop.
- Не охвачены все поля метаданных/типы UID и upf, повреждённый UTF-8, предельная длина пакетов и исчерпание ресурсов.
- Не проверена доступная внешнему JSON-клиенту ошибка сериализации: искусственный Python set не является таким сценарием.
- Linux/Gitea/Docker в этой среде не запускались.
- GUI/API и автоматическое создание маршрутов, авторизация по whitelist, полноценное переключение диалектов, WebSocket/sio и сохранение состояния после перезапуска ещё не реализованы и не предполагаются тестами.
- Отдельного ответа о результате восстановления пока нет; правило объединения старых и новых статических метаданных и назначение com ещё не закреплены.
Команды запуска и методика описаны в README.md.