# test_log ## Модуль под тестом `utils/log/log.c` (`utils/log/log.h`) ## Категория A с fff-хуками — `log.c` не зависит от `fsl_*.h`, но имеет weak-хуки (mutex, timestamp), которые в тесте переопределяются строгими fff-фейками; линковщик выбирает их поверх слабых реализаций из `log.c` автоматически. ## Моки - `log_mutex_init` / `log_mutex_lock` / `log_mutex_unlock` — fff void-фейки, переопределяющие weak-реализации. Для проверки порядка вызовов lock/unlock используют `custom_fake`, инкрементирующий общий монотонный счётчик. - `log_get_timestamp_ms` — fff value-фейк, управляет значением метки времени в выводе. - `capture_cb` — тестовый callback вместо реального UART-транспорта: сохраняет содержимое и длину каждого вызова в `g_s_capture` для проверки через `strstr()`. ## Что проверяется - **Init** — отсутствие вывода до `log_init()` и при `NULL`-callback; callback вызывается один раз на каждый `LOG_*`; повторный `log_init()` заменяет предыдущий callback. - **Output** — наличие символа уровня (`[E]`/`[W]`/`[I]`/`[D]`/`[V]`), тега, текста сообщения (включая форматирование с аргументами) и `\r\n` в конце строки. - **Timestamp** — `log_get_timestamp_ms()` вызывается ровно один раз на каждый `LOG_*`, возвращённое значение попадает в вывод. - **Overflow** — строка длиннее `LOG_BUF_SIZE` (256 байт) обрезается, callback не получает больше `LOG_BUF_SIZE` байт, `\r\n` сохраняется в конце даже при обрезке. - **Mutex** — порядок `lock → callback → unlock` проверяется через монотонный счётчик последовательности; lock/unlock вызываются ровно один раз на лог. - **Context** — указатель контекста, переданный в `log_init()`, доходит до callback без изменений (`NULL` и ненулевой указатель). ## Гарантии - Без вызова `log_init()` (или с `NULL`-callback) логгер не производит вывод. - Вывод никогда не превышает `LOG_BUF_SIZE` байт и всегда заканчивается `\r\n`, даже при переполнении входной строки. - Каждый лог-вызов оборачивается ровно одной парой lock/unlock, callback вызывается строго между ними. - Контекст, переданный в `log_init()`, не искажается при передаче в callback. ## Запуск ```bash ctest --preset host-debug-test -R test_log -V ```