| .. | ||
| README.md | ||
| test_timeout_pattern.c | ||
test_timeout_pattern
Модуль под тестом
Не отдельный файл, а паттерн таймаута
(uint32_t)(now - start) >= (uint32_t)timeout, используемый в
bsp_uart_read(), bsp_delay() и других BSP-модулях (счётчик —
bsp_tick_get_ms()). Тестируется сама математика, изолированно от железа.
Категория
A — чистая математика, без внешних зависимостей. Только Unity.
Моки
Нет.
Что проверяется
- Нормальные случаи — истёкший/неистёкший таймаут при
elapsed < timeout,elapsed == timeout,elapsed > timeout; нулевойelapsed;timeout == 0(истекает немедленно). - Wraparound — счётчик
now/startпереполняется черезUINT32_MAX; беззнаковая арифметика корректно вычисляетelapsedв этих случаях (проверено на нескольких комбинациях старта у границыUINT32_MAX). - Антипаттерн — отдельный тест демонстрирует, что альтернативная формула
now >= start + timeoutломается при переполненииstart + timeout, в отличие от используемого паттерна.
Гарантии
- Формула
(uint32_t)(now - start) >= timeoutкорректна при любом взаимном положенииnowиstart, включая переполнение 32-битного счётчика. elapsed == timeoutсчитается истёкшим таймаутом (граница включительно).timeout == 0всегда трактуется как немедленно истёкший.- Задокументировано и подтверждено тестом, почему альтернативная формула
now >= start + timeoutнебезопасна и не должна использоваться.
Запуск
ctest --preset host-debug-test -R test_timeout_pattern -V