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ód | Význam |
|---|---|
| 0 | funguje - každý proces, který četl čas, viděl hodiny sezení |
| 10 | funguje částečně - některé kanály pokryté, jiné ne |
| 11 | nefunguje - náhrada času se nedostala ke klíčovým kanálům |
| 4 | neurčeno - pokrytí se nepodařilo zjistit |
| 1 | chyba použití - špatný přepínač nebo špatný výraz |
| 2 | cíl se nepodařilo spustit nebo do něj injektovat |
| 12 | cíl zmizel, což naznačuje aplikaci s jedinou instancí |
| 3 | vnitř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 |
| 5 | operace není v tomto vydání sestavena |
| 6 | bě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 |
| 7 | už běží jiné sezení - vždy jen jedno sezení naráz. Stačí to zkusit znovu, až skončí |
| 8 | sezení 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
--jsonvypíš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í
--jsontaké, 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ě.