Chrono Mock
ЯзыкРусский

Смена системной даты, чтобы протестировать приложение

Это самый старый трюк на свете: выставить часы Windows на дату, которую хотите проверить, запустить программу и вернуть часы обратно. Он работает — и пока часы сдвинуты, они сдвигают и всё остальное на машине.

Что на самом деле сдвигается вместе с часами

Системные часы не принадлежат одной лишь тестируемой программе. Каждый процесс, служба и сетевой обмен на машине читает одни и те же часы, поэтому изменение, сделанное ради одного теста, — это изменение для всех.

Что читает часыЧто происходит, когда вы их сдвигаете
Вход в домен и общие папкиKerberos по умолчанию допускает расхождение часов в пять минут. Сверх этого его билеты отклоняются, а вход или доступ к общей папке завершается ошибкой.
Сертификаты и HTTPSДействителен ли сертификат, решают часы. Выставьте их за дату окончания сертификата — и каждое соединение, которое на него опирается, отклоняется как просроченное; отведите их достаточно далеко назад — и сертификат ещё не действует.
Служба времени WindowsМашина в домене берёт время у контроллера домена, и по умолчанию служба исправляет часы при любом расхождении. Выставленную вами дату могут вернуть, пока вы ещё тестируете.
Всё, что записывает времяФайлы, журналы, строки баз данных и отправленные письма, созданные при сдвинутых часах, несут дату теста и сохраняют её после того, как вы вернули часы.
ПО, запоминающее самую позднюю виденную датуНекоторые программы считают часы, пошедшие назад, подделкой — а именно это и происходит, когда вы восстанавливаете настоящую дату.

Чем дальше дата, тем больше из этого вы встретите. Машина, выставленная на 2038 год, видит просроченным любой выданный сегодня сертификат. Как проверять 2038 год без этого →

Нужно и право, которого нет у большинства учётных записей: смена системного времени — привилегия администратора, а на управляемой машине она часто вам не принадлежит.

Когда смена часов — правильный ответ

Виртуальная машина, которой больше никто не пользуется, с отключённой собственной синхронизацией часов — вполне хороший испытательный стенд. Потом вы её выбрасываете, так что ничто из записанного на ней не имеет значения. Если она у вас есть, а тест касается одной даты, это самое простое, что работает.

Проблемы начинаются, когда это машина, на которой вы работаете, машина в домене или машина, на которой одновременно работает то, что ничего не должно заметить.

Сдвиньте вместо этого часы одной программы

Сдвинутое время видит один процесс и запущенные им дочерние. Ваш вход в домен, ваши сертификаты и Windows Update его никогда не видят, так что ничего из таблицы выше не сдвигается — и потом нечего возвращать.

# Приложение видит 31 декабря 2027, 23:59:50. Всё остальное сохраняет настоящую дату.
chrono run "C:\apps\test.exe" --at 2027-12-31T23:59:50

# Начать за десять минут до полуночи и идти в 60 раз быстрее — смена года наступит через десять секунд
chrono run "C:\apps\test.exe" --at 2027-12-31T23:50:00 --mode x60

Дошла ли сдвинутая для одной программы дата до неё на самом деле — это не то, что стоит предполагать. Каждая сессия заканчивается вердиктом и списком каналов времени, которые программа действительно читала. Как понять, что подмена сработала →

Что это не заменяет

  • Программа, спрашивающая время у сервера, лежит за пределами досягаемости локальной подмены. Сессия сообщает об этом, когда видит, что программа открывает сетевое соединение, вместо того чтобы оставить вас с предположением, что тест прошёл.
  • Тестирование самой системы — службы, реагирующей на изменение настоящих часов, запланированной задачи, поведения Windows при смене часов — не имеет замены смене часов, на машине, которую вам не жалко.

Попробуйте