Chrono Mock
TaalNederlands

Opdrachtregelreferentie

Elke optie van beide commando's, beide tabellen met afsluitcodes en hoe je leest wat er terugkomt. De verhalende versie, met de redenering, staat op de pagina CLI en CI.

Twee commando's

chrono run start een applicatie op een andere datum en tijd. chrono calc berekent een datum en zegt wat die interessant maakt. Ze delen één stappengrammatica, dus een verschuiving die voor het ene is geschreven betekent in het andere hetzelfde.

chrono version beantwoordt een derde, veel kleinere vraag: welke build dit is, welke van de twee kernen het uitvoerbare bestand is en welke protocolversie het spreekt. Eén regel op stdout, zodat een script hem kan opvangen.

chrono license beantwoordt de vierde: onder welke licentie deze build wordt verspreid, de uitsluiting van garantie en de componenten van derden die erin zijn gelinkt. Het zegt ook waar op schijf de volledige licentietekst en de vermeldingen van derden staan, of geeft toe dat de kopie die je draait ze niet naast zich heeft. --components toont elk meegeleverd onderdeel met zijn versie in plaats van een samenvatting.

chrono presets toont de scenariocatalogus zoals --preset hem leest: elk scenario in de map, geschreven in de woorden die de grammatica van de rekenmachine leest, en elk bestand dat het zou weigeren, met de reden. --json schrijft chronomock.presets/1 en --dir noemt een andere map.

chrono run <target> [options]
chrono calc [options]
chrono version        # chrono 0.4.0 (x64, protocol 1)
chrono license        # GPL-3.0-only, and what is bundled
chrono presets        # de catalogus, zoals --preset hem leest
chrono --help          # usage for all of them

chrono run - opties

OptieWat ze doet
--at <moment> Het moment waarop begonnen wordt, in de sessiezone. Absoluut (2038-01-19T03:14:07) of relatief met een voorloopteken (+1d, -2h). Eenheden: s m h d w mo q y - m is minuten en mo is maanden. Zonder deze optie begint de sessieklok bij de echte huidige tijd, dus --mode xN alleen laat het doel gewoon sneller lopen.
--zone +HH:MM De sessiezone: de zone waarin het moment is geschreven en die de lokale-tijdaanroepen van het doel rapporteren. Een vaste offset, zonder zomertijd. Zonder deze optie de eigen zone van de host.
--mode flow|frozen|xN flow loopt op echte snelheid, frozen houdt de klok stil, xN laat hem N keer sneller lopen (x60 maakt van een uur een minuut, x1440 van een dag).
--scale-duration Versnel ook de as van de verstreken tijd: tickcounters, interrupttijd, pauzes en timers. Wachten op objecten wordt geteld en houdt zijn echte lengte. Standaard uit, omdat een wandklok en een stopwatch verschillende vragen zijn. Een timer of vertraging die op een datum en tijd is gezet volgt de sessieklok met of zonder deze optie.
--scale-qpc Schaalt ook de high-resolution teller, waaruit Python 3.13+ monotonic, .NET Stopwatch en Java nanoTime de verstreken tijd lezen. Standaard uit: een applicatie die haar rendering met die teller timet, kan er vervormd uitzien.
--ticks N Beëindigt de sessie na N hartslagen, elk één echte seconde, en rapporteert. Zonder deze optie blijft het gereedschap gekoppeld totdat het doel, en elk programma dat het startte en dat op de sessieklok draait, is afgesloten - een launcher die meteen eindigt laat de sessie aan de applicatie die hij startte.
--timeout <s> Geeft na zoveel seconden op en eindigt met 6, voor een pipeline die niet mag blijven hangen. Los van deze optie wordt een kern die 15 seconden niets zegt gestopt en eindigt ook met 6 - in beide gevallen is de run afgebroken en draagt dus geen oordeel.
--args "..." Argumenten voor het doel, als één tekenreeks, gesplitst volgens dezelfde regel die Windows gebruikt - zodat een argument met spaties de reis overleeft. Voor een Chromium-doel worden --user-data-dir en --remote-debugging-port geweigerd in plaats van overschreven: de sessie heeft een eigen geïsoleerd profiel nodig, en stilletjes draaien op je echte browserprofiel is het ene wat niet mag gebeuren.
--cwd <dir> Start het doel in die map. Zonder deze optie erft het doel de onze, wat elke run deed voordat deze optie bestond. Een lege waarde is een gebruiksfout en niet “geen map” - afwezig en leeg zijn verschillende dingen, en alleen afwezig is iets wat Windows kan krijgen. Een map die niet bestaat, stopt de sessie met target.cwd_missing voordat er iets wordt gestart, in plaats van later naar voren te komen als een doel dat niet wilde starten.
--preset <id> Neemt het moment en de snelheid uit presets/<id>.json. Sluit --at, --mode en --scale-duration uit, omdat het scenario dan de enige bron van beide is.
--param id=value Vult een scenarioparameter in. Herhaalbaar, vereist --preset. Alleen bij run valt de startdatum van een proefperiode terug op de eigen aanmaakdatum van het uitvoerbare doelbestand, zodat een proefscenario telt vanaf de dag waarop de applicatie is geïnstalleerd zonder dat je die typt.
--set-after T:M Verandert bij hartslag T de snelheid naar M. Onderweg is de vermenigvuldiger minstens 1 - bevriezen midden in de sessie wordt hier niet aangeboden.
--jump-after T:moment Laat bij hartslag T de klok naar dat moment springen, absoluut of relatief, in de sessiezone.
--force Houdt de sessie aan, ook als het openingsoordeel zegt dat de vervanging niet van kracht werd - standaard wordt het doel dan gestopt, omdat een sessie die niets bewees erger is dan geen sessie. Het oordeel verandert niet, en de afsluitcode ook niet. Dit bepaalt alleen of het doel blijft draaien.
--no-embedded Laat de webpagina's binnen de toepassing (WebView2, Qt WebEngine) op de echte klok en opent geen debugpoort. Zonder deze optie vraagt de sessie zo'n engine een lokale poort te openen en zet via die poort zijn pagina's op de sessieklok - zolang de poort open is, kan elk ander programma op deze computer hem gebruiken om die pagina's te bereiken.
--elevated-embedded Voor een toepassing die als beheerder draait, vanuit een Chrono Mock die ook als beheerder draait. WebView2 negeert voor zo'n toepassing de instelling waarmee de sessie haar pagina's bereikt, dus de sessie schrijft gedurende haar looptijd één waarde naar het register van de machine (HKLM, genoemd naar de .exe van de toepassing) en verwijdert die aan het einde. Zolang de toepassing draait, kan elk ander programma op deze computer haar pagina's via de poort bereiken, en de toepassing heeft beheerdersrechten. Niet samen met --no-embedded.
--keep-background-timers Start de webengine - de browser van een Chromium- of Electron-toepassing, of de engine binnen een toepassing - met de vertraging van timers in verborgen vensters uitgeschakeld, zodat een geminimaliseerd venster de sessiesnelheid behoudt. De toepassing werkt dan ook op volle snelheid terwijl ze verborgen is. Een toepassing die via --elevated-embedded als beheerder wordt gestart, krijgt het niet.
--dry-run Drukt af wat de sessie zou zijn en start niets: het opgeloste moment en de zone en waar ze vandaan komen, waarmee een scenario elke parameter vulde, de argumenten na het splitsen en welk van de twee mechanismen het doel zou nemen. Er wordt geen proces gestart en geen bestand geschreven, ook niet dat wat --report noemt. Het eindigt met 0 voor een haalbaar plan en met 2 voor een doel dat er niet is, de code die een echte run voor hetzelfde feit geeft. Een plan draagt geen oordeel en zegt dat - alleen een echte sessie heeft er een. Met --json is het plan data, waaronder session.elevated_embedded en session.elevated_embedded_value, de bestandsnaam waarnaar de registerwaarde zou worden genoemd wanneer de optie op een .exe-doel van toepassing is, anders null. Een naam daar is geen belofte dat er geschreven wordt: de sessie schrijft de waarde alleen als Chrono Mock zelf als beheerder draait.
--report <path> Schrijft het rapport voor mensen naar een bestand. Een ander oordeel dan werkt opent dat bestand met een banner over onbetrouwbaar bewijs, omdat bewijs dat zijn eigen twijfel verbergt erger is dan geen. Ook een sessie met het oordeel werkt krijgt deze banner wanneer de applicatie geen van de klokken heeft gelezen die de sessie vervangt, of wanneer het een Go-programma is, waarvan Chrono Mock de wandklok niet bereikt. Het bestand noemt ook de run zelf: de versie, het starttijdstip, het doel, de map ervan en de opties.
--report-args Schrijft samen met --report ook de argumenten van het doel letterlijk in dat bestand. Standaard uit, omdat een argument een wachtwoord kan bevatten - het bestand noemt dan alleen hoeveel het er waren.
--json Geeft de sessie als machineleesbare records in plaats van het rapport - dezelfde stroom die het venster zelf verwerkt. De eigen uitvoer van een consoleapplicatie gaat naar standard error, dus standard output bevat de records en niets anders. Een applicatie die nog draait als de sessie eindigt, blijft daar schrijven, zodat alles wat standard error tot het einde leest erop wacht, en de run zegt dat.

chrono run - afsluitcodes

De afsluitcode is het sessieoordeel, niet wat de applicatie teruggaf. De eigen afsluitcode van de applicatie wordt apart gemeld, in het rapport en in de sessiegegevens - de pagina CLI en CI legt uit waarom het zo om is.

CodeBetekenis
0werkt - elk proces dat de tijd las, zag de sessieklok
10werkt gedeeltelijk - sommige kanalen gedekt, andere niet
11werkt niet - de vervanging heeft de belangrijkste kanalen niet bereikt
4onbepaald - de dekking kon niet worden vastgesteld. Een eerlijk “dat kan ik niet zeggen”, nooit een voorgewend slagen
12het doel verdween direct na de injectie en liet niets achter dat op de sessieklok draait, wat wijst op een applicatie met één instantie die overdraagt aan een al lopende kopie, of op een overdracht aan een programma waar de sessie niet in kon, meestal dat van de andere bitness. Een doel dat de applicatie start en eindigt is een launcher, en de sessie gaat door voor de applicatie
1gebruiksfout - een foute optie, een foute expressie of een scenario dat dit commando niet accepteert
2het doel kon niet worden gestart of geïnjecteerd
3interne fout - de engine kon niet starten, kwam in een onverwachte toestand of stopte voordat de sessie werd afgesloten (wat haar eigen afsluitcode ook was). Zo'n run draagt geen oordeel
5de bewerking is niet opgenomen in deze release - bijvoorbeeld een scenario waarvan het moment een kalender nodig heeft die run nog niet kan laden. Bewust anders dan een gebruiksfout: je vroeg om iets wat nog niet bestaat, niet om iets verkeerds
6de run is afgebroken - --timeout verliep, of de engine reageerde 15 seconden niet meer en werd gestopt. Dit is geen oordeel: de sessie is onderbroken, dus ze bewijst niets over het doel, in welke richting dan ook
7er loopt al een andere sessie - één sessie tegelijk. Opnieuw proberen zodra die klaar is, is genoeg
8de sessie kwam tot een oordeel, maar het bewijs staat niet in het bestand dat --report noemt - de schijf was vol, of een ander programma hield het oude bestand open, dat dan blijft zoals het was. Het oordeel staat nog steeds in het rapport dat de opdracht toont

Het rapport lezen

Zonder --json eindigt de sessie in een gewoon rapport. Elke regel is een feit dat de sessie heeft waargenomen of ontbreekt - niets wordt ingevuld met een aannemelijke standaardwaarde.

Chrono Mock - session report
  target:   .\build\test.exe
  verdict:  WORKS - time substitution took effect  (processes: 1)
            every process that read time saw the session clock
  session:  fake clock reached 2038-01-19T03:14:08
            real elapsed 1.3s, fake elapsed 1.3s
  exited:   the target closed itself with code 3
  covered channels (substituted, with call counts, 10 calls in all):
            - pid 21240: GetSystemTimeAsFileTime (5 calls)
            - pid 21240: GetLocalTime (5 calls)
  observed channels (hooked but left real):
            - pid 21240: NtCreateUserProcess (0 calls)
  warnings:
            - the target opened a network connection ...
  • verdict - het familieoordeel over het ouderproces en elk kindproces, met het aantal processen. Dit is het getal dat de afsluitcode draagt.
  • exited - de eigen afsluitcode van de applicatie, en alleen als ze zichzelf afsloot. Een run begrensd met --ticks laat het doel draaien, een Chromium-sessie is er een die het gereedschap zelf sluit, en een sessie die nooit startte heeft zo'n code niet - de regel ontbreekt dan in plaats van een verzonnen nul te tonen. Een crashcode komt aan als een groot negatief getal, dus krijgt ook zijn hexadecimale vorm.
  • covered - kanalen die de vervanging bereikte, met hoe vaak elk werkelijk is aangeroepen, per proces. Aantallen worden nooit over processen heen opgeteld: de audit van het ene proces mag de cijfers van een ander niet lenen. Een teller stopt bij 1048576 en toont dan minstens dat aantal.
  • observed - kanalen die zijn onderschept maar bewust echt gelaten, zoals objectwachten en multimediatimers. Een eigen bak, zodat ze nooit als vervangen worden gelezen.
  • uncovered - kanalen die de applicatie opvroeg en die de sessie niet dekte. Dit maakt van een oordeel gedeeltelijk.
  • not fully cleaned up - alles wat het opruimen niet kon verwijderen. Afwezig bij een schone afsluiting, het normale geval.

chrono calc - opties

Geen natuurlijke taal: elke optie is één stap, en de volgorde van de opties is de volgorde van de stappen. Het resultaat na elke stap wordt afgedrukt, zodat een foute stap zichtbaar is in plaats van begraven.

OptieWat ze doet
--base today|now|<moment> Waar te beginnen, standaard today. Opgelost in de sessiezone. Een onmogelijke dag zoals 2025-02-31 wordt geweigerd, nooit stilletjes genormaliseerd naar de volgende maand.
--base-utc <moment> Net als --base, maar het begin is een moment in UTC, met een optionele afsluitende Z, in plaats van een wandklokaflezing in de sessiezone.
--shift ±N<unit> Herhaalbaar. Het teken is verplicht. Eenheden: s m h d w mo q y bd, of hun volledige namen. m is minuten, mo is maanden. Maanden, kwartalen en jaren worden met een begrenzing op de kalenderdatum gevouwen, dus een maand na 31 januari is eind februari, niet een vast aantal ticks. bd (werkdagen) heeft --calendar nodig.
--set-time HH:MM:SSStelt het tijdstip van de dag in op het huidige resultaat.
--snap <target> Springt naar een periodegrens: som eom soq eoq soy eoy (begin of einde van maand, kwartaal, jaar). Een begin is de eerste dag om 00:00:00, een einde de laatste dag om 23:59:59.
--nearest nbd|pbd De dichtstbijzijnde werkdag vooruit of achteruit, de huidige dag meegerekend als die er al een is. Heeft --calendar nodig.
--to-zone +HH:MM Een stap: drukt hetzelfde moment uit in een andere vaste offset. Het moment blijft behouden, dus de epochwaarde verschuift niet en alleen de burgerlijke velden veranderen. Niet te verwarren met --zone.
--zone +HH:MM De sessiezone, gebruikt om today en now op te lossen en het resultaat weer te geven. Zonder deze optie de zone van de host.
--calendar us-banking|us-federal|pl Laadt een feestdagenkalender. Het voegt werkdag en feestdag toe aan de metadata en maakt bd en --nearest mogelijk. De twee Amerikaanse kalenders verschillen in hoe ze een feestdag in het weekend viereren, en dat is precies het soort afwijking van een dag dat een test moet vinden. Elke kalender antwoordt voor een reeks jaren: pl vanaf 2002, us-federal vanaf 1960 en us-banking vanaf 2008. Een werkdagstap die een dag daarvoor bereikt, wordt geweigerd met exitcode 1, en een datum daarvoor wordt getoond als niet beoordeeld. Als de feestdagen van een kalender het laatst meer dan een jaar geleden aan de wet zijn getoetst, krijgt een latere dag die hij beoordeelde de markering calendar_outdated, omdat een nieuwere feestdag kan ontbreken.
--preset <id> --param id=value Een benoemd moment uit presets/<id>.json, met de parameters ingevuld. Sluit de stapopties en --analyze uit, en combineert met --calendar, --zone en --format.
--analyze <date> Leest een geplakte datum terug en zegt wat het is. Een dubbelzinnige 04/08 wordt in beide lezingen getoond, Amerikaans en Pools, in plaats van geraden - die dubbelzinnigheid is een echte bron van verkeerde bugrapporten.
--format <mask> Drukt het resultaat ook af in je eigen masker, zodat het past bij het formaat van de geteste applicatie: yyyy-MM-dd HH:mm:ss. Tokens zijn hoofdlettergevoelig in de zin van .NET en Java - M is maand, m is minuut.
--json Machine-uitvoer (chronomock.calc/1) voor alles hierboven, zodat een pipeline een datum kan berekenen en rechtstreeks terugvoeren in chrono run.
# Laatste werkdag van het kwartaal, Amerikaanse bankkalender
chrono calc --base today --snap eoq --nearest pbd --calendar us-banking

chrono calc - afsluitcodes

Een aparte, kleinere tabel: de calculator heeft geen dekkingsoordeel om te rapporteren.

CodeBetekenis
0berekend
1gebruiksfout - een foute optie, een onmogelijke datum, een bereikoverloop of een kalenderbestand zonder enkele werkdag
5de stap of eenheid is niet opgenomen in deze release, of de stap heeft een kalender nodig die je niet hebt opgegeven. Bewust gescheiden van een gebruiksfout, zodat een script “nog niet” van “fout” kan onderscheiden

Volgende