From cd0db3f9d39af37301cc6b9f1fd11cbcf8e17c07 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:38:08 +0300 Subject: [PATCH] test scripts: known-file picker for the file actions The UPDATE file / READ file step editor's path field gains the selector the APDU builder's SELECT rows use: the loaded file-manager tree, the custom files and the standard uicc_files.json list, merged by rfmFileEntries, grouped by root with a filter. Picking a file fills test-f-path; the text field stays authoritative (a name path or an unlisted file can still be typed) and the current path is preselected when known. Only EFs are offered - the action reads/writes a file, so a DF/ADF is not a target. v3.38.0: server.py VERSION, pyproject.toml and the PWA header; sw cache simple-v478 (help/index changed); a CHANGELOG [3.38.0] section, the help EN/RU, docs/test-scripts.md and the AGENTS notes. Tests: frontend/tests/testscripts.test.js - the option list/grouping, the EF-only filter, the filter input, the pick->path fill and the form's picker render for write and read. 1061 Python + 1071 frontend. --- CHANGELOG.md | 13 ++++++ docs/test-scripts.md | 7 +++- frontend/help-ru.html | 2 +- frontend/help.html | 2 +- frontend/index.html | 59 +++++++++++++++++++++++++++- frontend/sw.js | 2 +- frontend/tests/testscripts.test.js | 63 ++++++++++++++++++++++++++++++ pyproject.toml | 2 +- pysim_simple_server/server.py | 2 +- 9 files changed, 145 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f586d9..ae64517 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,19 @@ every change carries a descriptive commit message. ## [Unreleased] +## [3.38.0] — 2026-10-24 + +### Added + +- **Known-file picker in the test-script file actions.** The `UPDATE file` / + `READ file` step editor's path field gains the selector the APDU builder's + SELECT rows use: the file-manager tree, the custom files and the standard + file list (`uicc_files.json`), grouped by root with a filter, filling the + path. Only EFs are offered (the action reads/writes a file; a DF/ADF is not + a target); the text field stays authoritative, so a name path or a file the + lists do not carry can still be typed, and the picker preselects the current + path when it is known. + ## [3.37.0] — 2026-10-23 ### Added diff --git a/docs/test-scripts.md b/docs/test-scripts.md index 9536e6c..c488823 100644 --- a/docs/test-scripts.md +++ b/docs/test-scripts.md @@ -329,7 +329,12 @@ consecutive runs continue correctly. | `proactive-drain` | `respond`, `first`, `attempts` 1–1000 (default 3), `interval_ms` (default 200), `require` | drain the card's announced proactive commands and confirm it is idle (see below) | `path` is `/`-separated: `MF` (or `3F00`) or an ADF name/AID first, then FIDs -or file names - e.g. `MF/7F20/6F07`, `ADF.USIM/EF.TEST`. +or file names - e.g. `MF/7F20/6F07`, `ADF.USIM/EF.TEST`. The step editor's +**pick a known file** selector (the same source merge as the APDU builder's +SELECT picker: the loaded file tree, custom files and the standard +`uicc_files.json` list, grouped by root, with a filter) fills the path; +only EFs are listed, and the text field stays authoritative (typing a name +path or an unlisted file is always possible). `file-write` sends a direct terminal-side UPDATE BINARY/RECORD - it does **not** fire the card's EVENT_REMOTE_FILE_UPDATE (that event reports an update done by diff --git a/frontend/help-ru.html b/frontend/help-ru.html index b92427c..d99af3f 100644 --- a/frontend/help-ru.html +++ b/frontend/help-ru.html @@ -575,7 +575,7 @@

У вкладки четыре представления: список наборов (по умолчанию; Добавить набор / Редактировать / Запустить / Экспорт / Удалить), редактор набора (скрипты набора в порядке выполнения — необязательный 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 продолжаются с того значения, которое израсходовала предыдущая итерация.