Запускайте застосунок Windows з будь-якою датою — не чіпаючи системний годинник
Переведіть годинник одного застосунку на наступний рік, зупиніть його або прискоріть так, щоб 30-денний пробний період закінчився, поки ви заварюєте каву. Решта машини зберігає справжній час — вхід у домен, ваші сертифікати й усі інші програми працюють як зазвичай.
А потім програма скаже, чи підміна справді спрацювала.
Безкоштовно й з відкритим кодом, GPL-3.0 Без встановлення або зі встановленням Для запуску права адміністратора не потрібні Ніколи не звертається до інтернету
Як виглядає сесія
23:59:50
18:12:33
Навіщо це потрібно
Щоб протестувати все, що залежить від дати, потрібно зсунути час. Обидва звичайні способи погані.
Строк дії ліцензії, пробні періоди, поновлення підписок, чинність сертифікатів, час життя токенів, звіти на кінець місяця й року, нарахування відсотків, нагадування.
Спосіб 1 — змінити системний годинник
Це ламає вхід у домен і Kerberos, анулює сертифікати TLS, через що перестає працювати браузер, збиває з пантелику Windows Update і змушує всі інші застосунки на машині записувати хибні мітки часу. На машині в домені групова політика зазвичай блокує зміну або скасовує її за кілька хвилин, тож тест навіть не відтворюється.
Спосіб 2 — чекати
Тобто не тестувати. Випадки, що залежать від дати, пропускаються, а «ліцензія ніколи не спливає» потрапляє до клієнта.
Що вміє
Один процес мандрує в часі. Більше нічого на машині.
Будь-який момент
Конкретні дата й час або відносні — +30 days, -1 year.
Тече, стоїть або прискорений
Звичайна швидкість, зупинений годинник або цілочисельний множник. x1440
перетворює добу на хвилину.
Власний часовий пояс
Фіксоване зміщення лише для цього процесу, а системний пояс лишається рівно там, де був.
Дочірні процеси йдуть слідом
Інсталятори й лаунчери породжують дочірні процеси. Без цього тест покриває лише половину того, що запускалося.
Стрибок посеред сесії
Уперед або назад — зокрема стрибок назад, який робить ноутбук після повторної синхронізації із сервером часу.
І Electron, і Chromium
Іншим механізмом, бо їхній годинник живе в ізольованому рендерері, куди впровадження не сягає.
Те, чого не робить ніхто інший
Як зрозуміти, що підміна спрацювала?
З будь-яким іншим інструментом — ніяк. Застосунок запускається, показує якусь дату, і ви припускаєте. Але він може читати годинник через канал, який інструмент так і не перехопив, — із сервера, з бази даних, через шар середовища виконання, — і тоді «тест пройдено» не означає взагалі нічого.
- →Вердикт до початку справжнього тесту: працює / працює частково / не працює
- →Які з 44 каналів часу були покриті й скільки разів застосунок звертався до кожного
- →Які канали покриті не були — сказано прямо, ніколи не замовчується
- →Попередження з наслідками: «цей застосунок читає час із мережі — локальної підміни може бути недостатньо»
Дві хвилини з програмою
Вікно для вивчення, командний рядок для CI. Той самий рушій за обома.
# Запустити застосунок так, наче це остання секунда 2027 року chrono run "C:\apps\test.exe" --at 2027-12-31T23:59:59 # Спостерігати, як за чашку кави спливає 30-денний пробний період: x1440 — доба за хвилину chrono run "C:\apps\test.exe" --mode x1440 # Використати іменований сценарій замість дати й записати докази у файл chrono run "C:\apps\test.exe" --preset year-rollover --report session.txt
Калькулятор відповідає на другу половину тестування дат — яку дату брати:
$ chrono calc --preset year-2038 --zone +00:00 Chrono Mock - date calculator preset: year-2038 - 2038 boundary explains: Does the app survive the 32-bit Unix time boundary (2038-01-19T03:14:07Z)? base: 2038-01-19T03:14:07 result: 2038-01-19T03:14:07 formats: ISO date 2038-01-19 ISO datetime 2038-01-19T03:14:07+00:00 US 01/19/2038 PL 19.01.2038 epoch (s) 2147483647 epoch (ms) 2147483647000 FILETIME 137919572470000000 RFC 1123 Tue, 19 Jan 2038 03:14:07 GMT ... what this date lands on: at or past the 2038-01-19T03:14:07Z 32-bit time_t limit (Y2038)
У порівнянні з тим, чим ви, імовірно, користуєтеся
Як RunAsDate, але з тим, чого бракувало
RunAsDate перехоплює п’ять функцій настінного годинника й робить це добре. Ось у чому вони відрізняються — а на повній сторінці сказано й про те, де RunAsDate досі кращий.
| RunAsDate | Chrono Mock | |
|---|---|---|
| Запускає застосунок із підробленою датою | так | так |
| Канали часу, що перехоплюються | 5 | 44 (30 зсуваються, 14 лише рахуються) |
| Прискорення годинника | ні | так |
| Незалежний часовий пояс | не задокументовано | так |
| Іде за дочірніми процесами | не задокументовано | так |
| Каже, чи спрацювало | ні | так, по каналах |
| Відкритий вихідний код | фрівар, закритий | GPL-3.0 |
Отримайте програму
Розпакуйте де завгодно й запускайте, або встановіть підписаний .msi для всіх
облікових записів на комп'ютері. Для запуску права адміністратора не потрібні, а zip-архіви
нічого не пишуть у реєстр.