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 — это библиотека, внедряемая в процесс-цель и перенаправляющая набор экспортируемых функций, а не один символ.
Флаги, сопоставленные друг с другом
| 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 |
здесь по умолчанию — см. ниже |
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 — а именно для него этот инструмент и существует.