Chrono Mock
JazykČeština

Testování dat v pipeline

Okno slouží ke zkoumání. Tohle je druhá polovina: sestavení pro příkazový řádek o velikosti zhruba 2,4 MB, bez běhového prostředí k instalaci, jehož návratový kód je verdikt o pokrytí, ne kód cílové aplikace.

Návratový kód je verdikt

Toto je rozhodnutí v návrhu, které z nástroje dělá skriptovatelný nástroj. Když sezení skončí, návratový kód odpovídá na otázku „zabrala náhrada času?“, ne „co vrátila aplikace?“. Pipeline tak může selhat na náhradě, která se tiše neuskutečnila - což je přesně to selhání, na kterém má smysl selhat, protože vše, co po něm následuje, je test, který nic neprokázal.

Vlastní návratový kód cílové aplikace se hlásí dál, v datech sezení.

KódVýznam
0funguje - každý proces, který četl čas, viděl hodiny sezení
10funguje částečně - některé kanály pokryté, jiné ne
11nefunguje - náhrada času se nedostala ke klíčovým kanálům
4neurčeno - pokrytí se nepodařilo zjistit
1chyba použití - špatný přepínač nebo špatný výraz
2cíl se nepodařilo spustit nebo do něj injektovat
12cíl zmizel, což naznačuje aplikaci s jedinou instancí
3vnitřní chyba - jádro se nepodařilo spustit, narazilo na nečekaný stav, nebo se zastavilo dřív, než sezení uzavřelo (bez ohledu na vlastní návratový kód cíle). Takový běh nemá verdikt
5operace není v tomto vydání sestavena
6běh byl přerušen - vypršel --timeout, nebo jádro přestalo na 15 sekund odpovídat a bylo zastaveno. Není to verdikt: sezení bylo přerušeno, takže nic o cíli neprokazuje ani jedním směrem
7už běží jiné sezení - vždy jen jedno sezení naráz. Stačí to zkusit znovu, až skončí
8sezení došlo k verdiktu, ale jeho důkaz není v souboru, který určuje --report - disk byl plný, nebo jiný program držel starý soubor otevřený, a ten pak zůstane beze změny. Verdikt je dál ve zprávě, kterou příkaz vypíše

Všechny přepínače obou příkazů a stejná tabulka pro kalkulačku jsou v referenci příkazového řádku.

Omezené běhy

Pipeline nemůže čekat, až člověk zavře desktopovou aplikaci. --ticks N ukončí sezení po N tepech - každý trvá jednu skutečnou vteřinu - a ohlásí, co do té doby zjistilo. Pokrytí se stejně určí v prvních okamžicích procesu, takže obvykle stačí krátký limit.

# Deset vteřin, pak zastavit a ohlásit
chrono run ".\build\test.exe" --preset year-rollover --ticks 10 --report evidence.txt

Strojový výstup a důkazy

  • --json vypíše sezení jako strojově čitelné záznamy místo zprávy pro lidi - stejná fakta, včetně pokrytí po jednotlivých kanálech.
  • --report <path> zapíše zprávu pro lidi do souboru, který dobře poslouží jako artefakt sestavení. Sezení, jehož verdikt je jiný než funguje, začíná tento soubor bannerem o nespolehlivých důkazech, místo aby výhradu schovalo na konec.
  • Kalkulačka umí --json také, takže pipeline může datum, které potřebuje, vypočítat a poslat zpět.
# Vypočítat datum a pak spustit s ním
chrono calc --base today --snap eom --json
chrono run ".\build\test.exe" --preset month-end --ticks 10 --json

Krok zhruba takto

- name: Month-end behaviour
  shell: pwsh
  run: |
    .\chrono.exe run ".\build\test.exe" --preset month-end --ticks 10 --report evidence.txt
    # nenulový návratový kód znamená, že náhrada času nezabrala, takže
    # test za ním by nic neprokázal

- name: Keep the evidence
  uses: actions/upload-artifact@v7
  with:
    name: chrono-evidence
    path: evidence.txt

Dvě upřímná upozornění k runnerům

  • Potřebuje runner s Windows. Sestavení pro Linux ani macOS neexistuje a nebude - na Linuxu tuto roli už plní libfaketime.
  • Antivirus na hostovaném runneru může injektáž zablokovat. Posun času znamená vložení knihovny do cílového procesu, což je zdokumentovaná technika Windows, kterou používá i malware. Runner, který ji zablokuje, vrátí návratový kód, který to říká, místo falešného úspěchu - ale je to věc, kterou je dobré zjistit dřív, než se na ni spolehnete.

Ze stejného důvodu běží komplexní testovací sada tohoto projektu na skutečných strojích, ne na hostovaném runneru. Jeho kontinuální integrace všechno sestaví a otestuje jednotkovými testy a samotná náhrada času se před každým vydáním zkouší ručně na skutečných aplikacích, a to v 32bitové i 64bitové variantě.

Vyzkoušejte