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 — а саме для нього цей інструмент і існує.