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ță
| 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 |
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.