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