libfaketime pour Windows
Réponse courte : libfaketime ne fonctionne pas sous Windows, et ne le peut pas - il
repose sur LD_PRELOAD, que Windows n'a pas. Chrono Mock est la même idée, construite
comme Windows le permet.
Pourquoi on ne peut pas simplement le porter
libfaketime fonctionne en faisant placer par
l'éditeur de liens dynamique une petite bibliothèque devant la bibliothèque C, de sorte que les
appels d'un programme à time() arrivent d'abord au remplaçant. Ce crochet s'appelle
LD_PRELOAD sous Linux et DYLD_INSERT_LIBRARIES sous macOS. Son propre
README liste exactement ces deux plateformes.
Windows n'a pas d'équivalent, et son horloge ne se trouve de toute façon pas derrière une seule fonction. Les applications lisent l'heure par l'API Win32, par l'API native qui se trouve en dessous, et par tout ce que leur environnement d'exécution enroule autour de l'une ou de l'autre - la version Windows de cette idée est donc une bibliothèque injectée dans le processus cible, qui redirige un ensemble de fonctions exportées plutôt qu'un seul symbole.
Les options, transposées
| 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 |
le comportement par défaut ici - voir plus bas |
LD_PRELOAD=libfaketime.so.1 |
rien à définir - l'outil injecte |
Voici donc les deux faces du même 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
Là où les deux diffèrent vraiment
Les horloges monotones sont inversées. libfaketime les falsifie par défaut et
propose FAKETIME_DONT_FAKE_MONOTONIC pour l'arrêter. Ici, le compteur haute
résolution reste réel par défaut, parce que sa mise à l'échelle a déstabilisé le rendu lors des
tests, et --scale-qpc l'active. Cette option est ce qui fait suivre l'horloge de la
session à Python 3.13+ monotonic, .NET Stopwatch et Java
nanoTime.
Windows offre plus d'endroits à intercepter. Au-delà de l'horloge murale, il y a le fuseau horaire, l'axe du temps écoulé, quatre familles de minuteurs, les fonctions d'attente et de veille, et la création de processus - 44 canaux au total. Parmi eux, 30 sont décalés, et les 14 autres, dont les connexions réseau, sont comptés.
Celui-ci rapporte sa propre couverture. Chaque session se termine par un verdict, les canaux que l'application a réellement lus avec un compte pour chacun, et les canaux qui ont été manqués. C'est la partie qui n'a d'équivalent sur aucune des deux plateformes.
libfaketime est plus ancien et plus large sur son propre terrain. Il a des années d'usage derrière lui, couvre un large éventail de points d'entrée de la bibliothèque C, et sous Linux c'est le bon outil. Rien ici ne le remplace là-bas.
Si vous voulez vraiment libfaketime lui-même
Deux voies honnêtes, qui déplacent toutes deux le programme testé vers Linux :
- WSL - compiler et exécuter libfaketime dans le sous-système Linux. Convient quand ce que vous testez est un programme Linux que vous développez par hasard sous Windows.
- Un conteneur - la même idée, plus reproductible.
Ni l'une ni l'autre n'aide pour une application Windows, qui est le cas pour lequel cet outil existe.