Альтернатива RunAsDate з тим, чого бракувало
RunAsDate уже багато років залишається відповіддю на «запусти цю програму з іншою датою у Windows», і це хороша відповідь. Ця сторінка про те, чим вони відрізняються і де RunAsDate досі кращий.
Пліч-о-пліч
| RunAsDate | Chrono Mock | |
|---|---|---|
| Запускає застосунок із підробленою датою | так | так |
| Не чіпає системний годинник | так | так |
| Функції часу, що перехоплюються | 5 | 44 (30 зсуваються, 14 лише рахуються) |
| Годинник швидший за справжній час | не пропонується | будь-який цілочисельний множник |
| Зупинка годинника | так, типово | так |
| Стрибок під час роботи застосунку | лише повернення до реальної дати через задану кількість секунд | вперед і назад, на будь-який момент |
| Часовий пояс лише для цього процесу | не задокументовано | так, фіксоване зміщення |
| Дочірні процеси успадковують сесію | не задокументовано | так |
| Підключення до вже запущеної програми | так, починаючи з версії 1.40 | ні - він запускає програму сам |
| Кілька програм з різними датами одночасно | так | ні - одна сесія за раз |
| Каже, чи спрацювало | ні | вердикт, по каналах, із лічильниками викликів |
| Застосунки Electron і Chromium | не задокументовано | окремий механізм |
| Командний рядок для CI | так | так, з кодами завершення й JSON |
| Вихідний код | фрівар, закритий | GPL-3.0 |
| Розмір | завантаження 47 КБ, 57 КБ для 64 біт | ~2,4 МБ командний рядок, ~70 МБ з вікном |
| Старі версії Windows | аж до Windows 2000 | Windows 10 і 11 |
«Не задокументовано» означає, що функцію не згадано на сторінці RunAsDate. Це не твердження, що в інструмента її немає. Годинник RunAsDate стоїть, доки не ввімкнено його параметр Move the time forward according to the real time.
Найважливіша відмінність
Це не кількість каналів. Це те, що RunAsDate чесно каже у власній документації, що він «не вплине на застосунки, які беруть поточні дату й час з іншого джерела», — а потім залишає вас самих з’ясовувати, чи не з таких ваш.
Chrono Mock ставиться до цього самого речення як до того, що треба виміряти. Кожна сесія закінчується вердиктом, каналами, які застосунок справді читав, із лічильником по кожному, пропущеними каналами й попередженням, коли застосунок помічено за відкриттям мережевого з’єднання ще до того, як він узагалі спитав годинник.
Застосунок, що виглядає зсунутим у часі, але насправді таким не є, гірший за той, що так і не запустився, — він дає пройдений тест, який нічого не означає. Як працює аудит →
П’ять функцій чи 44 каналів
RunAsDate перехоплює GetSystemTime, GetLocalTime,
GetSystemTimeAsFileTime, NtQuerySystemTime і
GetSystemTimePreciseAsFileTime. Для дуже багатьох застосунків цього справді
достатньо, бо саме там читається настінний годинник.
Решта поверхні — там, де зазвичай ховається код, що залежить від дати:
- часовий пояс - дві функції, які його повідомляють, і шість, які переводять час між поясами, через що звіт потрапляє не на той день
- вісь минулого часу — лічильники тіків і неупереджений час переривань, тобто те, що зазвичай вимірює зворотний відлік пробного періоду
- затримки сну, щоб затримка йшла за годинником сесії, а не за реальним, і очікування об’єктів, які рахуються і зберігають свою реальну тривалість
- таймери — очікувані, віконні, пулу потоків і мультимедійні
- створення процесів, щоб дочірні процеси інсталятора працювали в тій самій сесії, а не в сьогоднішньому дні
- мережеві підключення, які рахуються як ознака того, що час може надходити із сервера
Із 44 каналів на годинник сесії переходить 30. Решта (14) лише рахується і залишається реальною, тому звіт називає їх, не стверджуючи, що їх зсунуто. Настінний годинник і часовий пояс зсуваються в кожній сесії. Вісь минулого часу та очікування відстежуються, коли ви просите про це через --scale-duration, а лічильник високої роздільності через --scale-qpc.
Коли RunAsDate — кращий вибір
Справді, і не так уже й рідко:
- Вам потрібна одна дата, зі звичайною швидкістю, просто зараз. RunAsDate завантажується архівом менш як 60 КБ, не має вікна, яке треба вивчати, і робить саме це вже багато років.
- Ви на старішій Windows. RunAsDate сягає Windows 2000. Цей інструмент розрахований на Windows 10 і 11 і на старіших не тестувався.
- Розмір має значення. Завантаження в 47 КБ проти ~2,4 МБ для командного рядка або ~70 МБ з вікном - це не близьке порівняння.
- Вердикт вам не потрібен. Вимірювання покриття означає, що треба читати результат. Якщо тест одноразовий, це зайвий клопіт, про який ви не просили.
- Програма вже запущена. RunAsDate з версії 1.40 уміє підключатися до процесу, що працює. Chrono Mock запускає програму сам, тому програма, яку не можна перезапустити, йому недоступна.
- Вам потрібні кілька програм з різними датами одночасно. RunAsDate дає кожній свою дату. Chrono Mock веде одну сесію за раз.
Вони до того ж можуть співіснувати. Ніщо тут не заважає вам залишити RunAsDate для швидкого випадку.
Для чого не призначений жоден із них
Обидва інструменти трапляються в пошукових запитах про продовження пробних періодів. Цей не призначений для такого, і жоден приклад, сценарій чи сторінка тут цього ніколи не покажуть. Chrono Mock призначений для тестування програмного забезпечення, за яке ви відповідаєте, — вашого власного спливу ліцензії, вашої власної логіки поновлення, вашого власного звіту на кінець місяця.
Це також випадок, у якому робота найменш імовірна. Захист ліцензії зазвичай читає час шляхами, обраними так, щоб їх було важко перехопити, — спільна сторінка даних у користувацькому режимі, прямі системні виклики, сервер, — а відкат годинника назад — умова, яку такий код пишуть, щоб виявляти. Аудит скаже вам, що не спрацювало, і це чесна відповідь, а не корисна.