Chrono Mock
LinguaItaliano

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

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

Provalo