Запускайте приложение 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-архивы ничего
не пишут в реестр.