Chrono Mock

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.

KodZnaczenie
0działa - każdy proces, który czytał czas, widział zegar sesji
10działa częściowo - część kanałów objęta, część nie
11nie działa - podmiana nie dotarła do kluczowych kanałów
4nieokreślony - nie dało się ustalić pokrycia
1błąd użycia - zła flaga albo złe wyrażenie
2nie udało się uruchomić celu albo wstrzyknąć
12cel zniknął, co sugeruje aplikację jednoinstancyjną
3błąd wewnętrzny - rdzeń nie wystartował albo trafił na nieoczekiwany stan
5operacja 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

  • --json wypisuje 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.

Wypróbuj