From c6a6bf0bc63eb4991c5e3e88386bb238bb1fefbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D1=82=D0=BE=D0=BD=20=D0=A2=D1=80=D0=BE=D1=88?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Sat, 24 Oct 2026 10:59:58 +0300 Subject: [PATCH] load tests: raise the iteration cap to 1,000,000,000 Both layers: the server's _TEST_LOAD_MAX and the PWA's TEST_ITERATIONS_MAX plus the two input max attributes. The value stays inside 2^53-1 (the JavaScript safe-integer range), so the counters and the progress display survive the JSON/JS round trip exactly; the practical ceiling is the run duration (50 ms/iteration ~1.6 years at the cap). The server's range error names the new cap automatically. The frontend tests read the cap from index.html instead of stubbing a literal, and clamp at it (above the cap, exactly at it, and the input max). Docs: api.md, test-scripts.md, help EN/RU, the CHANGELOG (folded into the unreleased 3.38.0) and the AGENTS notes. sw cache simple-v479. 1061 Python + 1071 frontend. --- CHANGELOG.md | 9 +++++++++ docs/api.md | 2 +- docs/test-scripts.md | 2 ++ frontend/help-ru.html | 2 +- frontend/help.html | 2 +- frontend/index.html | 6 +++--- frontend/sw.js | 2 +- frontend/tests/test_load.test.js | 16 ++++++++++------ pysim_simple_server/server.py | 2 +- 9 files changed, 29 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ae64517..9584d80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,15 @@ every change carries a descriptive commit message. lists do not carry can still be typed, and the picker preselects the current path when it is known. +### Changed + +- The load-test **iteration cap is raised to 1,000,000,000** (from 1,000,000) in + both layers: the PWA's `TEST_ITERATIONS_MAX` and the two field `max` + attributes, and the server's `_TEST_LOAD_MAX`. The value is well inside the + JavaScript safe-integer range (2^53-1), so the counters and the progress + display stay exact; the practical ceiling is the run duration (at 50 ms per + iteration the cap is ~1.6 years). + ## [3.37.0] — 2026-10-23 ### Added diff --git a/docs/api.md b/docs/api.md index 4193acf..c4a9c6c 100644 --- a/docs/api.md +++ b/docs/api.md @@ -1006,7 +1006,7 @@ on every stop** as long as the card is in the reader; a card reset (session change) stops the suite, skips the remaining members and is flagged in the report. -`iterations` (optional, 1-1,000,000, default 1) repeats the script or the +`iterations` (optional, 1-1,000,000,000, default 1) repeats the script or the whole suite: successful iterations are discarded (only the counter and the timing are kept; the per-step log is not retained), the first iteration that ends in an **error** stops the loop and keeps that iteration's report, a diff --git a/docs/test-scripts.md b/docs/test-scripts.md index c488823..28ef78d 100644 --- a/docs/test-scripts.md +++ b/docs/test-scripts.md @@ -241,6 +241,8 @@ a manual stop ends it after the current iteration, and a card session change between iterations is an error. The SCP80 counter state is shared across iterations, so packets continue from what the previous iteration consumed. The iteration count is a run parameter - the stored script/suite is unchanged. +The accepted range is **1 to 1,000,000,000** (the PWA clamps, the server +answers 400 above it). ## A card that stops answering diff --git a/frontend/help-ru.html b/frontend/help-ru.html index d99af3f..a1cbfc0 100644 --- a/frontend/help-ru.html +++ b/frontend/help-ru.html @@ -573,7 +573,7 @@

8.9 Тест-скрипт

Тест-скрипт — упорядоченный список действий и ожиданий проактивных команд, выполняемый на подключённой карте на стороне сервера. Пока запуск активен, карта принадлежит скрипту: остальные операции с картой отклоняются (HTTP 409), фоновый опрос STATUS и автоматическая обработка проактивных команд приостанавливаются — объявленная картой команда остаётся ожидающей для скрипта, и оба механизма возобновляются по завершении запуска. Собственные BIP-команды карты (OPEN/SEND/RECEIVE/CLOSE CHANNEL, GET CHANNEL STATUS) — исключение: терминал отвечает на них по-настоящему: каналы продолжают работать во время запуска, а BIP-события приходят для каналов, открытых самой картой (управление BIP остаётся заблокированным) — если только respond шага не переопределяет ответ через raw TLV или результат, отличный от ok; отчёт о запуске хранится в памяти (в том числе после перезагрузки страницы) до нажатия Очистить отчёт. Скрипты хранятся в хранилище на сервере (~/.pysim-simple-server/test_scripts.json, --test-scripts), поэтому все браузеры работают с одним набором; изменения записываются в хранилище по мере правки (кнопки «Сохранить» нет — черновик без валидного шага остаётся локальным); экспорт/импорт JSON остаётся для резервных копий и переноса скриптов между стендами (старый экспорт из localStorage импортируется как есть). Карта, переставшая отвечать, не подвешивает запуск молча: через 30 с без прогресса сторожевой таймер помечает запуск как ошибку с указанием шага, ставит флаг остановки и пытается прервать зависший обмен, разрывая связь PC/SC в фоновом потоке (связь помечается устаревшей, так что следующий Equip пересоздаёт её). Драйвер с собственным тайм-аутом карты завершает шаг обычным путём.

У вкладки четыре представления: список наборов (по умолчанию; Добавить набор / Редактировать / Запустить / Экспорт / Удалить), редактор набора (скрипты набора в порядке выполнения — необязательный setup первым и teardown последним, с пометками ролей; у каждого скрипта Запустить/Редактировать/Переместить/Скопировать/Удалить, политика при ошибке остановить (по умолчанию) / продолжить и Требуется ADM), редактор скрипта (список шагов; кнопка Старт выполняет только этот скрипт и показывает результат под шагами — он не сохраняется) и отчёт набора (после запуска набора: статус каждого скрипта, таблица шагов с ожидаемым/фактическим, примечание об ошибке и выдержка из журнала запуска; сводка с успешно/предупреждения/ошибки/пропущено, время выполнения, счётчики SCP80 до → после по каждому keyset, пресет и предупреждение о смене сессии карты; экспорт в JSON или Markdown). Запуск набора выполняет его скрипты по порядку в одной сессии карты, без сбросов и без продолжения с места остановки; при ошибке решает, остановится ли набор на этом скрипте или запустится следующий, teardown выполняется всегда при остановке или ошибке (пока карта в ридере), чтобы следующий тест начался с чистого состояния, а сброс карты останавливает набор и отмечается в отчёте. Начать со сброса карты сбрасывает карту и выполняет полную переинициализацию перед запуском набора (скрипты затем работают со свежеинициализированной картой); пресет должен по-прежнему совпадать с ICCID карты, а требуемый ADM проверяется заново для новой сессии карты. Инициализация поглощает начальные proactive-команды карты, поэтому скрипт не поймает первую команду после сброса (они остаются в журнале proactive). Требуется ADM (у набора или скрипта) проверяет ключ ADM из подобранного пресета один раз перед запуском — ошибка отклоняет запуск (проверьте вручную через значок ADM; автоматических повторов нет). Скрипты хранятся в хранилище наборов (~/.pysim-simple-server/test_suites.json, --test-suites); каждый скрипт принадлежит ровно одному набору, и скрипт можно переместить или скопировать в другой набор (экспорт набора — это пакет с набором и его скриптами; старый экспорт только скриптов импортируется в автоматически созданный набор «Imported scripts»).

-

Прогон можно повторить: поле «Итерации» рядом с Start / Run suite выполняет скрипт или весь набор указанное число раз — это нагрузочный тест. Успешные итерации не сохраняются: в статусе видны только счётчик (итерация k / N) и время, журнал шагов остаётся пустым, а память не растёт при любом числе итераций. Первая итерация, завершившаяся ошибкой, останавливает цикл и сохраняет свой полный отчёт (шаги, неудачные проверки, фрагмент журнала, отчёт по скриптам набора); Остановить завершает работу после текущей итерации, а смена карты между итерациями считается ошибкой (следующая карта никогда не запускается со скриптом другой карты). Число итераций — параметр прогона, сохранённый скрипт/набор не меняется; счётчики SCP80 продолжаются с того значения, которое израсходовала предыдущая итерация.

+

Прогон можно повторить: поле «Итерации» рядом с Start / Run suite выполняет скрипт или весь набор указанное число раз — это нагрузочный тест. Успешные итерации не сохраняются: в статусе видны только счётчик (итерация k / N) и время, журнал шагов остаётся пустым, а память не растёт при любом числе итераций. Первая итерация, завершившаяся ошибкой, останавливает цикл и сохраняет свой полный отчёт (шаги, неудачные проверки, фрагмент журнала, отчёт по скриптам набора); Остановить завершает работу после текущей итерации, а смена карты между итерациями считается ошибкой (следующая карта никогда не запускается со скриптом другой карты). Число итераций — параметр прогона, сохранённый скрипт/набор не меняется; счётчики SCP80 продолжаются с того значения, которое израсходовала предыдущая итерация. Поле принимает от 1 до 1 000 000 000 итераций (практический предел — длительность прогона).