Chrono Mock
МоваУкраїнська

Тестування дат у конвеєрі

Вікно призначене для вивчення. А це друга половина: збірка для командного рядка розміром близько 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-розрядних збірках.

Спробуйте