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
| libfaketime | Chrono 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.