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

Спробуйте