Chrono Mock
JazykČeština

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říč

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

Vyzkoušejte