Testowanie dat w potoku
Okno służy do eksploracji. To jest druga połowa: wersja konsolowa o rozmiarze około 1,6 MB, bez środowiska do instalowania, której kod wyjścia jest werdyktem pokrycia, a nie kodem samego celu.
Kod wyjścia to werdykt
To jest decyzja projektowa, która czyni narzędzie skryptowalnym. Gdy sesja się kończy, kod wyjścia odpowiada na pytanie „czy podmiana czasu zadziałała", a nie „co zwróciła aplikacja". Potok może więc paść na podmianie, która po cichu się nie odbyła - czyli na porażce wartej padnięcia, bo wszystko poniżej niej to test, który niczego nie dowiódł.
Kod wyjścia samego celu nadal jest raportowany, w danych sesji.
| Kod | Znaczenie |
|---|---|
| 0 | działa - każdy proces, który czytał czas, widział zegar sesji |
| 10 | działa częściowo - część kanałów objęta, część nie |
| 11 | nie działa - podmiana nie dotarła do kluczowych kanałów |
| 4 | nieokreślony - nie dało się ustalić pokrycia |
| 1 | błąd użycia - zła flaga albo złe wyrażenie |
| 2 | nie udało się uruchomić celu albo wstrzyknąć |
| 12 | cel zniknął, co sugeruje aplikację jednoinstancyjną |
| 3 | błąd wewnętrzny - rdzeń nie wystartował albo trafił na nieoczekiwany stan |
| 5 | operacja niezbudowana w tym wydaniu |
Wszystkie flagi obu komend i ta sama tabela dla kalkulatora stoją w dokumentacji wiersza poleceń.
Przebiegi ograniczone czasowo
Potok nie może czekać, aż aplikację okienkową zamknie człowiek. --ticks N
kończy sesję po N uderzeniach bicia - po jednej prawdziwej sekundzie każde - i
raportuje to, co znalazł do tego momentu. Pokrycie i tak ustala się w pierwszych
chwilach procesu, więc krótkie ograniczenie zwykle w zupełności wystarcza.
# Dziesięć sekund, potem koniec i raport chrono run ".\build\test.exe" --preset year-rollover --ticks 10 --report evidence.txt
Wyjście maszynowe i dowód
--jsonwypisuje sesję jako rekordy czytelne maszynowo zamiast raportu dla człowieka - te same fakty, razem z pokryciem per kanał.--report <ścieżka>zapisuje raport dla człowieka do pliku, co nadaje się na artefakt budowania. Sesja z werdyktem innym niż works prowadzi ten plik banerem o nierzetelnym dowodzie, zamiast chować zastrzeżenie na dole.- Kalkulator też mówi
--json, więc potok może policzyć potrzebną datę i podać ją z powrotem.
# Policz datę, potem uruchom w niej chrono calc --base today --snap eom --json chrono run ".\build\test.exe" --preset month-end --ticks 10 --json
Krok, z grubsza
- name: Month-end behaviour
shell: pwsh
run: |
.\chrono.exe run ".\build\test.exe" --preset month-end --ticks 10 --report evidence.txt
# niezerowy kod wyjścia znaczy tu, że podmiana się nie odbyła, więc test
# poniżej niczego by nie dowiódł
- name: Keep the evidence
uses: actions/upload-artifact@v7
with:
name: chrono-evidence
path: evidence.txt
Dwa uczciwe zastrzeżenia o runnerach
- Potrzebny jest runner z Windowsem. Nie ma wersji na Linuksa ani macOS-a i nie będzie - na Linuksie libfaketime już to pokrywa.
- Antywirus na hostowanym runnerze może zablokować wstrzyknięcie. Przesuwanie czasu oznacza wstrzyknięcie biblioteki do procesu celu, czyli udokumentowaną technikę Windows, której używa również złośliwe oprogramowanie. Runner, który to zablokuje, wyprodukuje kod wyjścia mówiący o tym wprost, a nie fałszywe zaliczenie - ale warto się o tym przekonać, zanim się na tym oprzesz.
Z tego samego powodu własny zestaw testów end-to-end tego projektu chodzi na prawdziwych maszynach, a nie na hostowanym runnerze. Jego ciągła integracja buduje i testuje jednostkowo całość, a samą podmianę ćwiczy się ręcznie na prawdziwych aplikacjach, na obu bitowościach, przed wydaniem.