libfaketime per Windows
Risposta breve: libfaketime non gira su Windows, e non può - è costruito su
LD_PRELOAD, che Windows non ha. Chrono Mock è la stessa idea costruita nel modo che
Windows consente.
Perché non si può semplicemente portare
libfaketime funziona facendo mettere al loader
dinamico una piccola libreria davanti alla libreria C, così le chiamate di un programma a
time() arrivano prima al sostituto. Quel gancio è LD_PRELOAD su Linux e
DYLD_INSERT_LIBRARIES su macOS. Il suo stesso README elenca esattamente quelle due
piattaforme.
Windows non ha un equivalente, e il suo orologio comunque non sta dietro una sola funzione. Le applicazioni leggono l'ora attraverso l'API Win32, attraverso l'API nativa sottostante e attraverso qualunque cosa il loro runtime avvolga intorno all'una o all'altra - quindi la versione Windows di questa idea è una libreria iniettata nel processo di destinazione, che reindirizza un insieme di funzioni esportate invece di un solo simbolo.
Le opzioni, trasposte
| 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 |
il comportamento predefinito qui - vedi sotto |
LD_PRELOAD=libfaketime.so.1 |
niente da impostare - lo strumento inietta |
Ecco dunque i due lati dello stesso test:
# 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
Dove i due differiscono davvero
Gli orologi monotonici sono invertiti. libfaketime li falsifica per impostazione
predefinita e ti dà FAKETIME_DONT_FAKE_MONOTONIC per fermarlo. Qui il contatore ad
alta risoluzione resta reale per impostazione predefinita, perché scalarlo ha destabilizzato il
rendering nei test, e --scale-qpc lo attiva. Quell'interruttore è ciò che fa seguire
l'orologio della sessione a Python 3.13+ monotonic, .NET Stopwatch e Java
nanoTime.
Windows ha più punti da intercettare. Oltre all'orologio a muro ci sono il fuso orario, l'asse del tempo trascorso, quattro famiglie di timer, le funzioni di sleep e di attesa e la creazione di processi - 44 canali in tutto. Di questi, 30 vengono spostati, e gli altri 14, tra cui le connessioni di rete, vengono contati.
Questo strumento riporta la propria copertura. Ogni sessione termina con un verdetto, i canali che l'applicazione ha davvero letto con un conteggio per ciascuno, e i canali che sono stati mancati. È la parte che non ha equivalente su nessuna delle due piattaforme.
libfaketime è più vecchio e più ampio sul proprio terreno. Ha anni di utilizzo alle spalle, copre un'ampia gamma di punti d'ingresso della libreria C, e su Linux è lo strumento giusto. Nulla qui lo sostituisce lì.
Se vuoi proprio libfaketime in persona
Due strade oneste, entrambe spostano su Linux il programma sotto test:
- WSL - compilare ed eseguire libfaketime dentro il sottosistema Linux. Va bene quando ciò che si testa è un programma Linux che per caso sviluppi su Windows.
- Un container - la stessa idea, più riproducibile.
Nessuna delle due aiuta con un'applicazione Windows, che è il caso per cui questo strumento esiste.