libfaketime pro Windows
Krátká odpověď: libfaketime na Windows neběží a nemůže - je postaven na
LD_PRELOAD, který Windows nemají. Chrono Mock je stejná myšlenka postavená tak, jak
to Windows dovolují.
Proč ho nelze jednoduše přenést
libfaketime funguje tak, že dynamický loader
umístí malou knihovnu před knihovnu C, takže volání time() z programu dorazí nejdřív
k náhradě. Tímto háčkem je LD_PRELOAD na Linuxu a
DYLD_INSERT_LIBRARIES na macOS. Jeho vlastní README uvádí přesně tyto dvě
platformy.
Windows nic takového nemají a jejich hodiny stejně nežijí za jednou funkcí. Aplikace čtou čas přes rozhraní Win32, přes nativní rozhraní pod ním a přes cokoli, co kolem obou obalí jejich běhové prostředí - takže varianta této myšlenky pro Windows je knihovna vložená do cílového procesu, která přesměrovává sadu exportovaných funkcí, ne jeden symbol.
Přepínače, přenesené napříč
| 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 |
zde výchozí - viz níže |
LD_PRELOAD=libfaketime.so.1 |
není co nastavovat - nástroj injektuje |
Obě strany téhož testu tedy vypadají takto:
# 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
V čem se oba skutečně liší
Monotónní hodiny jsou obráceně. libfaketime je ve výchozím stavu falšuje a dává
vám FAKETIME_DONT_FAKE_MONOTONIC, abyste to zastavili. Zde zůstává čítač s vysokým
rozlišením ve výchozím stavu skutečný, protože jeho škálování při testování destabilizovalo
vykreslování, a --scale-qpc to zapíná. Tento přepínač způsobuje, že
monotonic z Pythonu 3.13+, Stopwatch z .NET a nanoTime z
Javy následují hodiny sezení.
Windows mají víc míst k zachycení. Kromě kalendářních hodin je tu časové pásmo, osa uplynulého času, čtyři rodiny časovačů, funkce pro uspání a čekání a vytváření procesů - celkem 44 kanálů. Z nich se 30 posouvá a zbytek (14), mezi nimi síťová připojení, se počítá.
Tento nástroj hlásí vlastní pokrytí. Každé sezení končí verdiktem, kanály, které aplikace skutečně četla, s počtem u každého, a kanály, které se minuly. To je část, která nemá ekvivalent ani na jedné platformě.
libfaketime je starší a na svém území širší. Má za sebou roky používání, pokrývá širokou škálu vstupních bodů knihovny C a na Linuxu je to správný nástroj. Nic tady ho tam nenahrazuje.
Pokud skutečně chcete samotný libfaketime
Dvě upřímné cesty, obě přesouvají testovaný program na Linux:
- WSL - sestavte a spusťte libfaketime uvnitř subsystému Linux. V pořádku, když je testovaná věc linuxový program, který shodou okolností vyvíjíte na Windows.
- Kontejner - stejná myšlenka, lépe reprodukovatelná.
Ani jedno nepomůže s aplikací pro Windows, což je případ, pro který tento nástroj existuje.