Chrono Mock
TaalNederlands

libfaketime voor Windows

Kort antwoord: libfaketime draait niet op Windows, en kan dat ook niet - het is gebouwd op LD_PRELOAD, dat Windows niet heeft. Chrono Mock is hetzelfde idee, gebouwd zoals Windows het toestaat.

Waarom het niet eenvoudig te porten is

libfaketime werkt doordat de dynamische loader een kleine bibliotheek vóór de C-bibliotheek plaatst, zodat de aanroepen van een programma naar time() eerst bij de vervanger aankomen. Die haak is LD_PRELOAD op Linux en DYLD_INSERT_LIBRARIES op macOS. Zijn eigen README noemt precies die twee platformen.

Windows heeft geen equivalent, en zijn klok zit hoe dan ook niet achter één functie. Applicaties lezen de tijd via de Win32-API, via de native API daaronder en via alles wat hun runtime om een van beide heen wikkelt - dus de Windows-versie van dit idee is een bibliotheek die in het doelproces wordt geïnjecteerd en een reeks geëxporteerde functies omleidt in plaats van één symbool.

De opties, overgezet

libfaketimeChrono Mock
FAKETIME="2020-12-24 20:30:00" --at 2020-12-24T20:30:00
FAKETIME="+14d" --at +14d
FAKETIME="-10m" --at -10m
FAKETIME="+0 x2" --mode x2
FAKETIME_DONT_FAKE_MONOTONIC=1 hier de standaard - zie hieronder
LD_PRELOAD=libfaketime.so.1 niets in te stellen - het gereedschap injecteert

Zo zien de twee kanten van dezelfde test eruit:

# Linux
FAKETIME="2020-12-24 20:30:00" LD_PRELOAD=/usr/local/lib/libfaketime.so.1 ./test

# Windows
chrono run "C:\apps\test.exe" --at 2020-12-24T20:30:00

Waar de twee echt verschillen

Monotone klokken zijn omgekeerd. libfaketime vervalst ze standaard en geeft je FAKETIME_DONT_FAKE_MONOTONIC om dat te stoppen. Hier blijft de high-resolution teller standaard echt, omdat schalen de rendering in tests destabiliseerde, en --scale-qpc zet het aan. Die schakelaar zorgt ervoor dat Python 3.13+ monotonic, .NET Stopwatch en Java nanoTime de sessieklok volgen.

Windows heeft meer plekken om te onderscheppen. Naast de wandklok zijn er de tijdzone, de as van de verstreken tijd, vier families timers, de sleep- en wachtfuncties en het aanmaken van processen - 44 kanalen in totaal. Daarvan worden er 30 verschoven, en de overige 14, netwerkverbindingen daaronder, worden geteld.

Dit gereedschap rapporteert zijn eigen dekking. Elke sessie eindigt met een oordeel, de kanalen die de applicatie werkelijk las met een aantal per kanaal, en de kanalen die gemist zijn. Dat is het onderdeel dat op geen van beide platformen een tegenhanger heeft.

libfaketime is ouder en breder op zijn eigen terrein. Het heeft jaren gebruik achter zich, dekt een breed scala aan toegangspunten van de C-bibliotheek, en op Linux is het het juiste gereedschap. Niets hier vervangt het daar.

Als je echt libfaketime zelf wilt

Twee eerlijke routes, die allebei het geteste programma naar Linux verplaatsen:

  • WSL - libfaketime bouwen en draaien binnen het Linux-subsysteem. Prima als het geteste ding een Linux-programma is dat je toevallig op Windows ontwikkelt.
  • Een container - hetzelfde idee, reproduceerbaarder.

Geen van beide helpt bij een Windows-applicatie, het geval waarvoor dit gereedschap bestaat.

Probeer het