Chrono Mock
ЯзыкРусский

libfaketime для Windows

Короткий ответ: libfaketime не работает в Windows и не может — он построен на LD_PRELOAD, которого в Windows нет. Chrono Mock — та же идея, построенная так, как позволяет Windows.

Почему его нельзя просто перенести

libfaketime работает так: динамический загрузчик ставит небольшую библиотеку перед библиотекой C, и вызовы time() из программы сначала попадают к подмене. Этот крючок — LD_PRELOAD в Linux и DYLD_INSERT_LIBRARIES в macOS. В его собственном README перечислены именно эти две платформы.

В Windows ничего подобного нет, а его часы в любом случае не прячутся за одной функцией. Приложения читают время через API Win32, через нативный API под ним и через то, чем их среда выполнения оборачивает любой из них, — поэтому версия этой идеи для Windows — это библиотека, внедряемая в процесс-цель и перенаправляющая набор экспортируемых функций, а не один символ.

Флаги, сопоставленные друг с другом

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 здесь по умолчанию — см. ниже
LD_PRELOAD=libfaketime.so.1 ничего задавать не нужно — инструмент внедряется сам

Так две стороны одного и того же теста выглядят так:

# 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

Где они действительно различаются

Монотонные часы устроены наоборот. libfaketime подделывает их по умолчанию и даёт вам FAKETIME_DONT_FAKE_MONOTONIC, чтобы это прекратить. Здесь высокоточный счётчик по умолчанию остаётся настоящим, потому что его масштабирование дестабилизировало отрисовку в тестах, а --scale-qpc включает его. Именно этот переключатель заставляет monotonic в Python 3.13+, Stopwatch в .NET и nanoTime в Java следовать часам сессии.

В Windows больше мест для перехвата. Помимо настенных часов есть часовой пояс, ось прошедшего времени, четыре семейства таймеров, функции задержки и ожидания и создание процессов — всего 44 каналов. Из них 30 сдвигаются, а остальные (14), включая сетевые подключения, только считаются.

Этот инструмент сообщает о собственном покрытии. Каждая сессия заканчивается вердиктом, каналами, которые приложение действительно читало, со счётчиком по каждому, и каналами, которые были упущены. Эта часть не имеет аналога ни на одной из платформ.

libfaketime старше и шире на своей территории. За ним годы использования, он покрывает широкий набор точек входа библиотеки C, а в Linux это правильный инструмент. Ничто здесь его там не заменяет.

Если вам действительно нужен сам libfaketime

Два честных пути, оба переносят тестируемую программу в Linux:

  • WSL — собрать и запустить libfaketime внутри подсистемы Linux. Подходит, когда тестируется программа для Linux, которую вы случайно разрабатываете в Windows.
  • Контейнер — та же идея, но лучше воспроизводится.

Ни один из них не помогает с приложением Windows — а именно для него этот инструмент и существует.

Попробуйте