Тестування дат у конвеєрі
Вікно призначене для вивчення. А це друга половина: збірка для командного рядка розміром близько 2,4 МБ, без середовища виконання, яке треба встановлювати, чий код завершення — це вердикт про покриття, а не код самої цілі.
Код завершення — це вердикт
Саме це проєктне рішення робить інструмент придатним для скриптів. Коли сесія закінчується, код завершення відповідає на питання «чи подіяла підміна часу», а не «що повернув застосунок». Тож конвеєр може впасти на підміні, яка тихо не відбулася, — а це саме та помилка, на якій варто падати, бо все, що йде після неї, — тест, який нічого не довів.
Власний код завершення цілі все одно повідомляється — у даних сесії.
| Код | Значення |
|---|---|
| 0 | працює — кожен процес, що читав час, бачив годинник сесії |
| 10 | працює частково — частина каналів покрита, частина ні |
| 11 | не працює — підміна не дійшла до ключових каналів |
| 4 | не визначено — покриття встановити не вдалося |
| 1 | помилка використання — хибний прапорець або хибний вираз |
| 2 | ціль не вдалося запустити або впровадитися в неї |
| 12 | ціль зникла, що вказує на застосунок з єдиним екземпляром |
| 3 | внутрішня помилка — ядро не змогло запуститися, натрапило на несподіваний стан або зупинилося до закриття сесії (яким би не був його власний код завершення). Такий запуск не має вердикту |
| 5 | операцію не включено в цю збірку |
| 6 | запуск обірвано — вичерпано --timeout або ядро перестало відповідати на 15 секунд і було зупинене. Це не вердикт: сесію перервано, тому вона нічого не доводить щодо цілі ні в той, ні в інший бік |
| 7 | уже працює інша сесія - одночасно лише одна сесія. Досить спробувати знову, коли вона завершиться |
| 8 | сесія дійшла до вердикту, але її доказу немає у файлі, вказаному в --report - диск був заповнений або інша програма тримала старий файл відкритим, і він лишається без змін. Вердикт і далі є у звіті, який виводить команда |
Усі прапорці обох команд і така сама таблиця для калькулятора є в довіднику з командного рядка.
Обмежені запуски
Конвеєр не може чекати, поки людина закриє настільний застосунок.
--ticks N завершує сесію після N тактів — по одній справжній секунді кожен — і
повідомляє, що вдалося з’ясувати на той момент. Покриття в будь-якому разі визначається в перші
миті роботи процесу, тож зазвичай вистачає короткого обмеження.
# Десять секунд, потім зупинитися й відзвітувати chrono run ".\build\test.exe" --preset year-rollover --ticks 10 --report evidence.txt
Машинний вивід і докази
--jsonвидає сесію у вигляді машиночитних записів замість звіту для людей — ті самі факти, зокрема покриття по каналах.--report <path>записує звіт для людей у файл, що непогано підходить як артефакт збірки. Якщо вердикт сесії — будь-що, крім працює, файл відкривається банером про ненадійні докази, а не ховає застереження наприкінці.- Калькулятор теж розмовляє мовою
--json, тож конвеєр може обчислити потрібну дату й передати її назад.
# Обчислити дату, потім запустити з нею chrono calc --base today --snap eom --json chrono run ".\build\test.exe" --preset month-end --ticks 10 --json
Крок, приблизно
- name: Month-end behaviour
shell: pwsh
run: |
.\chrono.exe run ".\build\test.exe" --preset month-end --ticks 10 --report evidence.txt
# ненульовий код тут означає, що підміна не спрацювала, тому
# тест після нього нічого б не довів
- name: Keep the evidence
uses: actions/upload-artifact@v7
with:
name: chrono-evidence
path: evidence.txt
Два чесні застереження щодо раннерів
- Потрібен раннер на Windows. Збірок для Linux і macOS немає й не буде — на Linux це завдання вже вирішує libfaketime.
- Антивірус на розміщеному раннері може заблокувати впровадження. Зсув часу означає впровадження бібліотеки в процес-ціль — це задокументована техніка Windows, якою користуються й шкідливі програми. Раннер, що її блокує, поверне код завершення, який про це говорить, а не хибний успіх, — але про це варто дізнатися, перш ніж ви почнете від нього залежати.
З тієї самої причини власний наскрізний набір тестів цього проєкту працює на справжніх машинах, а не на розміщеному раннері. Його безперервна інтеграція збирає й перевіряє модульними тестами все інше, а сама підміна перед кожним випуском перевіряється вручну на реальних застосунках — як у 32-розрядних, так і в 64-розрядних збірках.