Chrono Mock
МоваУкраїнська

Альтернатива RunAsDate з тим, чого бракувало

RunAsDate уже багато років залишається відповіддю на «запусти цю програму з іншою датою у Windows», і це хороша відповідь. Ця сторінка про те, чим вони відрізняються і де RunAsDate досі кращий.

Пліч-о-пліч

 RunAsDateChrono Mock
Запускає застосунок із підробленою датоютактак
Не чіпає системний годинниктактак
Функції часу, що перехоплюються544 (30 зсуваються, 14 лише рахуються)
Годинник швидший за справжній часне пропонуєтьсябудь-який цілочисельний множник
Зупинка годинникатак, типовотак
Стрибок під час роботи застосункулише повернення до реальної дати через задану кількість секундвперед і назад, на будь-який момент
Часовий пояс лише для цього процесуне задокументованотак, фіксоване зміщення
Дочірні процеси успадковують сесіюне задокументованотак
Підключення до вже запущеної програмитак, починаючи з версії 1.40ні - він запускає програму сам
Кілька програм з різними датами одночаснотакні - одна сесія за раз
Каже, чи спрацювалонівердикт, по каналах, із лічильниками викликів
Застосунки Electron і Chromiumне задокументованоокремий механізм
Командний рядок для CIтактак, з кодами завершення й JSON
Вихідний кодфрівар, закритийGPL-3.0
Розмірзавантаження 47 КБ, 57 КБ для 64 біт~2,4 МБ командний рядок, ~70 МБ з вікном
Старі версії Windowsаж до Windows 2000Windows 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 призначений для тестування програмного забезпечення, за яке ви відповідаєте, — вашого власного спливу ліцензії, вашої власної логіки поновлення, вашого власного звіту на кінець місяця.

Це також випадок, у якому робота найменш імовірна. Захист ліцензії зазвичай читає час шляхами, обраними так, щоб їх було важко перехопити, — спільна сторінка даних у користувацькому режимі, прямі системні виклики, сервер, — а відкат годинника назад — умова, яку такий код пишуть, щоб виявляти. Аудит скаже вам, що не спрацювало, і це чесна відповідь, а не корисна.

Спробуйте