Chrono Mock
IdiomaEspañol

libfaketime para Windows

Respuesta corta: libfaketime no funciona en Windows, y no puede - se basa en LD_PRELOAD, que Windows no tiene. Chrono Mock es la misma idea construida como Windows lo permite.

Por qué no se puede simplemente portar

libfaketime funciona haciendo que el cargador dinámico coloque una pequeña biblioteca delante de la biblioteca de C, de modo que las llamadas de un programa a time() lleguen primero al sustituto. Ese gancho es LD_PRELOAD en Linux y DYLD_INSERT_LIBRARIES en macOS. Su propio README enumera exactamente esas dos plataformas.

Windows no tiene un equivalente, y su reloj no vive detrás de una sola función de todos modos. Las aplicaciones leen la hora a través de la API Win32, de la API nativa que hay debajo y de lo que su entorno de ejecución envuelva alrededor de cualquiera de las dos - así que la versión de Windows de esta idea es una biblioteca inyectada en el proceso objetivo, que redirige un conjunto de funciones exportadas en lugar de un único símbolo.

Las opciones, trasladadas

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 el comportamiento por defecto aquí - véase más abajo
LD_PRELOAD=libfaketime.so.1 nada que configurar - la herramienta inyecta

Así se ven los dos lados de la misma prueba:

# 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

Dónde se diferencian de verdad

Los relojes monótonos están invertidos. libfaketime los falsea por defecto y te da FAKETIME_DONT_FAKE_MONOTONIC para impedirlo. Aquí el contador de alta resolución sigue siendo real por defecto, porque escalarlo desestabilizó el renderizado en las pruebas, y --scale-qpc lo activa. Ese interruptor es lo que hace que Python 3.13+ monotonic, .NET Stopwatch y Java nanoTime sigan el reloj de la sesión.

Windows tiene más lugares que interceptar. Además del reloj de pared están la zona horaria, el eje del tiempo transcurrido, cuatro familias de temporizadores, las funciones de espera y de suspensión, y la creación de procesos - 44 canales en total. De ellos, 30 se desplazan, y los otros 14, entre ellos las conexiones de red, se cuentan.

Esta herramienta informa de su propia cobertura. Cada sesión termina con un veredicto, los canales que la aplicación leyó realmente con un recuento para cada uno, y los canales que se pasaron por alto. Esa es la parte que no tiene equivalente en ninguna de las dos plataformas.

libfaketime es más antiguo y más amplio en su propio terreno. Tiene años de uso detrás, cubre una amplia gama de puntos de entrada de la biblioteca de C, y en Linux es la herramienta adecuada. Nada de lo de aquí la sustituye allí.

Si lo que quieres es libfaketime en sí

Dos caminos honestos, ambos trasladan el programa probado a Linux:

  • WSL - compilar y ejecutar libfaketime dentro del subsistema de Linux. Sirve cuando lo que se prueba es un programa de Linux que desarrollas, casualmente, en Windows.
  • Un contenedor - la misma idea, más reproducible.

Ninguno ayuda con una aplicación de Windows, que es el caso para el que existe esta herramienta.

Pruébalo