186 lines
16 KiB
Markdown
186 lines
16 KiB
Markdown
# Что означают 40 прежних падений
|
||
|
||
Это 40 неуспешных автоматических тестов, а не 40 зарегистрированных падений сервера во время матча. Они уже были в журнале первого этапа и сохранились во втором этапе. Здесь разобран конкретный журнал второго этапа: `409 passed, 40 failed`.
|
||
|
||
**37 тестов проверяют текст исходников, имена helper/переменных или номера старых сборок. 3 исполняют старый сценарий пакетной отправки Mapping с подменой методов, которые текущий путь больше не вызывает.** Часть требований к таймерам противоречит друг другу: одни требуют переустановку на Resume, другие её запрещают; одни требуют PauseCountdown, другие SuspendCountdown.
|
||
|
||
Это не доказывает отсутствия дефектов в затронутых функциях. Например, старое время удаления было настоящим дефектом, который эти проверки не воспроизводили: прежний тест проверял список команд, но не различал длительность и текущее положение нативного счётчика.
|
||
|
||
## Mapping: что действительно проверено
|
||
|
||
Текущий BUILD113 использует последовательные vmix.command через WebSocket, без ожидания ACK. Три BUILD97 теста подключают подставные send_vmix_batch/send_vmix_command, но не живой WebSocket для send. В журнале всех трёх есть предупреждение об отсутствующем WebSocket, после чего падает assert all(...ok...).
|
||
|
||
В новом исправлении добавлены отдельные тесты нынешнего пути: 372 команды проходят в правильном порядке только одному Agent; при обрыве отправка хвоста прекращается с ошибкой; при недоставленном назначении матча поля не отправляются. Автоматические повторы старого batch-протокола не восстановлены.
|
||
|
||
**Реальное ограничение:** успех отправки означает доставку WebSocket кадра, а не подтверждённое выполнение vMix. Ошибка функции, имени поля или Input может возникнуть уже на стороне Agent/vMix. Безопасное улучшение на будущее — неблокирующая сверка ACK/состояния и диагностика, без задержки локальных часов и без слепого повтора toggle-команд.
|
||
|
||
## Все 40 проверок
|
||
|
||
Пути ниже относятся к каталогу проекта; приведена причина конкретного падения, а не обещание полной исправности соответствующего раздела.
|
||
|
||
1. `tests/test_build101_simple_timer_runtime.py::test_timer_start_stop_protocol_is_minimal`
|
||
|
||
Ищет старую запись ветки stop/pause в vmixCountdownSyncCommands, а рабочие переходы вынесены в vmixGameCountdownControlCommands.
|
||
|
||
2. `tests/test_build103_space_timer_fast_transport.py::test_space_edge_is_single_fire_and_local_timer_changes_before_transport`
|
||
|
||
Требует строку delivery_mode: "timer-fast". Текущий режим называется timer-fast-ordered и передаёт команды отдельными упорядоченными кадрами.
|
||
|
||
3. `tests/test_build103_space_timer_fast_transport.py::test_timer_fast_contract_and_build_version`
|
||
|
||
Требует точное сравнение fast_timer = delivery_mode == "timer-fast"; сейчас принимаются оба режима, включая timer-fast-ordered.
|
||
|
||
4. `tests/test_build104_timer_stop_no_rollback.py::test_pause_stop_sends_only_pause_only_command`
|
||
|
||
Разрезает текст старого helper по прежнему if; разделитель отсутствует, возникает IndexError вместо проверки действующей паузы.
|
||
|
||
5. `tests/test_build104_timer_stop_no_rollback.py::test_explicit_edit_still_can_seed_stopped_clock`
|
||
|
||
Извлекает ветку set из старого vmixCountdownSyncCommands. Действующая установка времени выполняется другим helper.
|
||
|
||
6. `tests/test_build104_timer_stop_no_rollback.py::test_penalty_pause_preserves_native_vmix_frozen_value`
|
||
|
||
Ищет старое условие preservePausedCountdown/assignmentChanged. Переход теперь выбирается по назначению, running и явной правке.
|
||
|
||
7. `tests/test_build105_suspend_countdown_pause.py::test_space_pause_uses_suspend_not_stop_reset`
|
||
|
||
Как BUILD104, разрезает текст по прежней записи if. IndexError не является выполнением Countdown.
|
||
|
||
8. `tests/test_build105_suspend_countdown_pause.py::test_explicit_reset_set_path_keeps_stop_then_set`
|
||
|
||
Требует старый порядок Stop → Set в старом helper. Текущая явная установка использует Set → Stop.
|
||
|
||
9. `tests/test_build105_suspend_countdown_pause.py::test_penalty_normal_pause_uses_suspend`
|
||
|
||
Ищет прежний текст условия сохранения паузы; текущая машина переходов хранит running в назначении Input.
|
||
|
||
10. `tests/test_build106_runtime_authoritative_timer.py::test_countdown_start_hard_reseeds_before_start`
|
||
|
||
Сравнивает позиции StopCountdown и SetCountdown в широком фрагменте текста, захватывающем несколько helper. Не исполняет отправку.
|
||
|
||
11. `tests/test_build106_runtime_authoritative_timer.py::test_pause_is_reseeded_from_runtime_not_native_clock`
|
||
|
||
Ожидает старую ветку, которая переустанавливала время на каждой паузе. Текущая пауза сохраняет собственное положение vMix.
|
||
|
||
12. `tests/test_build106_runtime_authoritative_timer.py::test_scoreboard_show_syncs_timer_before_overlay_steps`
|
||
|
||
Требует ветку timerState.running ? "start" : "set" при показе титра. Сейчас показ не перезапускает уже работающий игровой счётчик.
|
||
|
||
13. `tests/test_build106_runtime_authoritative_timer.py::test_build106_version`
|
||
|
||
Требует буквальную версию 2026.08.24.9. Это проверка прежнего номера сборки.
|
||
|
||
14. `tests/test_build107_pause_change_countdown.py::test_start_uses_change_then_start_without_stop_or_set_duration`
|
||
|
||
Извлекает широкий текст от комментария старого helper и запрещает StopCountdown во всём остатке. Захватывает другие допустимые ветки.
|
||
|
||
15. `tests/test_build107_pause_change_countdown.py::test_runtime_version`
|
||
|
||
Требует буквальную версию 2026.08.24.10. Это проверка прежнего номера сборки.
|
||
|
||
16. `tests/test_build108_native_pause_no_resync.py::test_game_clock_helper_only_seeds_on_set`
|
||
|
||
Требует PauseCountdown. Текущая пауза использует SuspendCountdown — команду паузы без сброса.
|
||
|
||
17. `tests/test_build108_native_pause_no_resync.py::test_explicit_time_change_seeds_even_before_first_space`
|
||
|
||
Требует буквальный вызов helper(..., "set"). Теперь выбор зависит от running: set или set_running.
|
||
|
||
18. `tests/test_build110_match_roster_atomic_switch.py::test_selected_game_cache_is_match_scoped_and_local`
|
||
|
||
Ищет имя cachedRostersReady в tournament-menu.js; оно отсутствует в текущем процессе открытия матча.
|
||
|
||
19. `tests/test_build110_match_roster_atomic_switch.py::test_first_time_match_waits_for_core_roster_before_polling`
|
||
|
||
Ищет старую ветку if (!manual && !cachedRostersReady). Это поиск текста, а не проверка полученного состава.
|
||
|
||
20. `tests/test_build111_agent_match_handoff.py::test_mapping_is_refreshed_only_after_roster_enrichment`
|
||
|
||
Через index ищет ту же удалённую ветку cachedRostersReady, поэтому не доходит до проверки порядка обновления Mapping.
|
||
|
||
21. `tests/test_build44_strength_vmix_sync.py::test_runtime_refreshes_only_changed_mapping_when_strength_changes`
|
||
|
||
Требует прежнее выражение reason="runtime_strength_changed" if only_changed else "manual_apply". Изменение диагностической строки не исполняет обновление состава.
|
||
|
||
22. `tests/test_build56_trigger_save_onair.py::test_quick_panel_on_air_tracking_has_ack_confirmed_fallback`
|
||
|
||
Требует регулярное выражение OverlayInput([1-4]); текущий парсер поддерживает каналы 1–8.
|
||
|
||
23. `tests/test_build59_toasts_and_adaptive_runtime.py::test_runtime_can_grow_in_f11_and_large_viewports`
|
||
|
||
Требует прежние константы масштабирования maxScale 1.6/1.8. Не измеряет фактический размер или доступность интерфейса.
|
||
|
||
24. `tests/test_build62_quick_panel_onair_reconcile.py::test_overlay_parser_accepts_legacy_function_strings`
|
||
|
||
Повторно требует диапазон OverlayInput([1-4]); текущая поддержка расширена до 1–8.
|
||
|
||
25. `tests/test_build86_penalty_context_prepared_titles.py::test_prepared_titles_is_forced_to_last_runtime_tab_and_uses_hockey_api_directly`
|
||
|
||
Требует точную строку перестановки prepared_titles через filter. Текущий интерфейс формирует вкладки иначе.
|
||
|
||
26. `tests/test_build93_countdown_reseed_on_start.py::test_game_countdown_resume_is_reseeded_before_start`
|
||
|
||
Требует объединённую ветку start/restart/resume. Сейчас новый старт и продолжение разделены, чтобы пауза не давала скачок.
|
||
|
||
27. `tests/test_build93_countdown_reseed_on_start.py::test_hockey_timer_shortcut_reseeds_game_and_penalty_on_resume`
|
||
|
||
Считает вызовы старого vmixCountdownSyncCommands. Рабочие игровые/штрафные переходы используют другие helper.
|
||
|
||
28. `tests/test_build93_countdown_reseed_on_start.py::test_native_mode_still_has_no_per_second_countdown_transport`
|
||
|
||
Ищет прежний текстовый mirror на timer_tick. Нативные Countdown не требуют такого посекундного зеркала.
|
||
|
||
29. `tests/test_build95_countdown_explicit_start_stop_sync.py::test_main_countdown_start_pause_stop_all_hard_sync_web_value`
|
||
|
||
Требует вызов старого vmixCountdownSyncCommands для старта/паузы/остановки; рабочий helper заменён.
|
||
|
||
30. `tests/test_build95_countdown_explicit_start_stop_sync.py::test_combined_shortcut_changes_web_first_then_synchronizes_vmix`
|
||
|
||
Требует присутствие старого helper в обработчике пробела. Порядок локального изменения и доставки нужно проверять поведением.
|
||
|
||
31. `tests/test_build97_mapping_chunked_transport.py::test_mapping_chunk_transport_sends_300_plus_links_in_small_batches`
|
||
|
||
Подменяет send_vmix_batch и ждёт 372 команды в 12 пакетах. Текущий код вызывает send/vmix.command, а WebSocket тест не подключает; результат закономерно offline.
|
||
|
||
32. `tests/test_build97_mapping_chunked_transport.py::test_mapping_transport_splits_timeout_batch_and_keeps_going`
|
||
|
||
Подменяет пакетную отправку и ждёт дробление timeout-пакета 35 → ≤10 команд с повторами. В текущем последовательном режиме такого алгоритма нет; WebSocket не подключён.
|
||
|
||
33. `tests/test_build97_mapping_chunked_transport.py::test_mapping_transport_retries_isolated_failed_command`
|
||
|
||
Подменяет прежние batch/single методы и ждёт повтор одного ошибочного элемента. Текущий путь использует send без этих повторов и без подключённого WebSocket.
|
||
|
||
34. `tests/test_build97_mapping_chunked_transport.py::test_build97_runtime_version_and_mapping_diagnostics`
|
||
|
||
Требует диагностическую метку chunked_batch/legacy; действующая метка — sequential_no_ack.
|
||
|
||
35. `tests/test_build98_timer_countdown_sync_fixed_pin.py::test_countdown_start_is_simple_set_start`
|
||
|
||
Запрещает SuspendCountdown в слишком широком извлечённом фрагменте, захватывающем ветку паузы другого helper.
|
||
|
||
36. `tests/test_build98_timer_countdown_sync_fixed_pin.py::test_pause_and_stop_freeze_without_reseed`
|
||
|
||
Через split ищет старую запись stop/pause, получает IndexError до какого-либо исполнения таймера.
|
||
|
||
37. `tests/test_mapping_admin_visibility.py::test_mapping_has_series_autolink_and_visible_sql_table_grid`
|
||
|
||
Ищет переменную tableGridHeight в admin-directories.js. Это привязка к прежней реализации сетки, а не проверка самой таблицы.
|
||
|
||
38. `tests/test_shortcut_sequences.py::test_hockey_timer_shortcut_supports_native_countdown_and_legacy_text_mirror`
|
||
|
||
Запрещает SuspendCountdown во всём app.js, хотя эта команда нужна для текущей паузы без сброса.
|
||
|
||
39. `tests/test_shortcut_sequences.py::test_overlay_group_repeat_uses_transition_out_not_all_off`
|
||
|
||
Требует литералы OverlayInput1Out и т. д.; текущий код генерирует команды шаблоном для выбранных каналов.
|
||
|
||
40. `tests/test_shortcut_sequences.py::test_build90_native_countdown_avoids_per_second_transport`
|
||
|
||
Требует условие step.penalty_vmix_mode === "countdown". Текущая синхронизация удалений использует нативный Countdown всегда.
|
||
|
||
## Что осталось сделать с набором тестов
|
||
|
||
Согласовать актуальные правила для основного таймера, удалений, Mapping и открытия матча, затем заменить проверки старых строк на исполнение сценариев. В частности: реальный результат паузы/продолжения, положение переиспользованного Countdown, порядок кадров, поведение при offline/ошибке, отображение составов и работа Overlay 1–8. Старые версии сборок не должны быть обязательным содержимым текущего app.py.
|
||
|
||
В этой поставке все прежние 40 тестов оставлены и по-прежнему видны как failed. Итог нового полного прогона: **421 passed, 40 failed**, без новых падающих идентификаторов. Изменены только три другие текстовые проверки BUILD77/BUILD95 под прямо запрошенное поведение готового удаления; его исполнение дополнительно покрыто новыми тестами.
|