Chrono Mock
LangueFrançais

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

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

L'essayer