3.1 KiB
test_cli
Модуль под тестом
firmware/test/src/cli.c — построчный разбор JSON-протокола от USB CDC и
диспетчеризация команд.
Категория
B — зависит от bsp_usb_cdc, protocol_send_*, test_runner_*,
bsp_prov_read_uid, подменяемых через fff.
Моки
bsp_usb_cdc_write/bsp_usb_cdc_read (чтение эмулируется хелпером
inject(), который наполняет внутренний буфер «как будто USB» и вызывает
cli_process()), protocol_send_pong, protocol_send_error,
protocol_send_uid_response, protocol_send_version_response,
test_runner_run_all, test_runner_run_single, test_runner_run_selected,
test_runner_on_confirm, test_runner_send_list, bsp_prov_read_uid.
Кастомные custom_fake (capture_run_single, capture_on_confirm,
capture_uid_response, capture_run_selected) копируют строковые
аргументы по значению, т.к. cli.c передаёt указатели на собственные
локальные буферы, которые становятся dangling после возврата
cli_process().
Что проверяется
- Команды (
type: cmd) —ping→pong,run_all→запуск всех,run+id→запуск одного с передачей id,get_uid(успех и ошибка чтения UID),get_version,list_tests,run_selectedс массивом id. - Подтверждения (
type: confirm) — диспетчеризацияconfirmed: true/falseс корректным id. - Ошибки протокола — отсутствует
typeили обязательное поле (id/confirmed/tests) →PARSE_ERR; неизвестныйtype/cmd→UNKNOWN_CMD; строка длиннееCLI_LINE_BUF_SIZE→LINE_TOO_LONG. - Построчный ввод — пустая строка игнорируется,
\r\nобрабатывается как\n, две команды в одном чтении диспетчеризуются обе по отдельности.
Гарантии
- Каждая валидная команда приводит ровно к одному вызову соответствующего
обработчика (
test_runner_*/protocol_send_*). - Любая ошибка парсинга или неизвестная команда отправляет ровно один
protocol_send_error()с точным, стабильным кодом ошибки. - Построчный парсер корректно разделяет несколько команд в одном чтении и
не путает
\r\nи\n. - Переполнение буфера строки не приводит к падению — возвращается
контролируемая ошибка
LINE_TOO_LONG.
Запуск
ctest --preset host-debug-test -R test_cli -V