Chrono Mock
LimbaRomână

libfaketime pentru Windows

Răspuns scurt: libfaketime nu rulează pe Windows și nici nu poate - este construit pe LD_PRELOAD, pe care Windows nu îl are. Chrono Mock este aceeași idee, construită așa cum permite Windows.

De ce nu poate fi pur și simplu portat

libfaketime funcționează punând încărcătorul dinamic să așeze o mică bibliotecă în fața bibliotecii C, astfel încât apelurile unui program la time() ajung mai întâi la înlocuitor. Acel hook este LD_PRELOAD pe Linux și DYLD_INSERT_LIBRARIES pe macOS. README-ul propriu enumeră exact aceste două platforme.

Windows nu are un echivalent, iar ceasul lui oricum nu se află în spatele unei singure funcții. Aplicațiile citesc ora prin API-ul Win32, prin API-ul nativ de sub el și prin orice împachetează runtime-ul lor în jurul oricăruia dintre ele - așadar versiunea de Windows a acestei idei este o bibliotecă injectată în procesul țintă, care redirecționează un set de funcții exportate, nu un singur simbol.

Flag-urile, puse în corespondență

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 implicit aici - vezi mai jos
LD_PRELOAD=libfaketime.so.1 nimic de setat - instrumentul injectează

Așadar, cele două părți ale aceluiași test arată așa:

# 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

Unde diferă cu adevărat cele două

Ceasurile monotone sunt inversate. libfaketime le falsifică implicit și îți dă FAKETIME_DONT_FAKE_MONOTONIC ca să oprești asta. Aici contorul de înaltă rezoluție rămâne real implicit, pentru că scalarea lui a destabilizat randarea în teste, iar --scale-qpc activează scalarea. Acel comutator este ceea ce face ca monotonic din Python 3.13+, Stopwatch din .NET și nanoTime din Java să urmeze ceasul sesiunii.

Windows are mai multe locuri de interceptat. Dincolo de ceasul de perete există fusul orar, axa timpului scurs, patru familii de temporizatoare, funcțiile de sleep și de așteptare și crearea de procese - 44 canale în total. Dintre ele, 30 sunt decalate, iar celelalte 14, printre care conexiunile de rețea, sunt numărate.

Acesta își raportează propria acoperire. Fiecare sesiune se încheie cu un verdict, canalele pe care aplicația le-a citit efectiv, cu un număr pentru fiecare, și canalele ratate. Aceasta este partea fără echivalent pe niciuna dintre platforme.

libfaketime este mai vechi și mai larg pe terenul lui. Are ani de utilizare în spate, acoperă o gamă largă de puncte de intrare ale bibliotecii C și, pe Linux, este instrumentul potrivit. Nimic de aici nu îl înlocuiește acolo.

Dacă îți dorești de fapt libfaketime însuși

Două variante sincere, ambele mutând programul testat pe Linux:

  • WSL - compilează și rulează libfaketime în subsistemul Linux. Bine când ceea ce testezi este un program Linux pe care îl dezvolți pe Windows.
  • Un container - aceeași idee, mai reproductibilă.

Niciuna nu ajută cu o aplicație Windows, cazul pentru care există acest instrument.

Încearcă-l