Alternatywa dla RunAsDate, z tym, czego brakowało
RunAsDate od lat jest odpowiedzią na „uruchom ten program z inną datą na Windows" i jest to dobra odpowiedź. Ta strona jest o tym, czym te dwa narzędzia się różnią - i w czym RunAsDate nadal wygrywa.
Obok siebie
| RunAsDate | Chrono Mock | |
|---|---|---|
| Uruchamia aplikację z fałszywą datą | tak | tak |
| Nie rusza zegara systemowego | tak | tak |
| Przechwycone funkcje czasu | 5 | 41 kanałów |
| Zegar szybszy niż rzeczywisty | nieoferowane | dowolny całkowity mnożnik |
| Zamrożenie zegara | nieoferowane | tak |
| Skok w trakcie działania aplikacji | nieoferowane | w przód i w tył |
| Strefa czasowa tylko dla tego procesu | nieudokumentowane | tak, stały offset |
| Procesy potomne dziedziczą sesję | nieudokumentowane | tak |
| Mówi, czy zadziałało | nie | werdykt, per kanał, z liczbą wywołań |
| Aplikacje Electron i Chromium | nieoferowane | osobny mechanizm |
| Wiersz poleceń do CI | tak | tak, z kodami wyjścia i JSON-em |
| Kod źródłowy | freeware, zamknięty | GPL-3.0 |
| Rozmiar | poniżej 40 KB | 1,6 MB CLI, 69 MB z oknem |
| Stare wersje Windows | wstecz do Windows 2000 | Windows 10 i 11 |
„Nieudokumentowane" znaczy, że funkcja nie jest wspomniana na stronie RunAsDate. To nie jest twierdzenie, że narzędzie jej nie ma.
Różnica, która waży najwięcej
To nie jest liczba kanałów. To fakt, że RunAsDate uczciwie pisze we własnej dokumentacji, że „nie wpłynie na aplikacje, które biorą bieżącą datę i godzinę z innego źródła" - i zostawia cię z ustaleniem, czy twoja jest jedną z nich.
Chrono Mock traktuje to samo zdanie jako coś do zmierzenia. Każda sesja kończy się werdyktem, listą kanałów, które aplikacja naprawdę czytała, z liczbą wywołań każdego, listą kanałów pominiętych oraz ostrzeżeniem, gdy aplikacja otwierała połączenie sieciowe, zanim w ogóle zapytała o zegar.
Aplikacja, która wygląda na przesuniętą w czasie, a nie jest, jest gorsza niż taka, która w ogóle nie wystartowała - produkuje zdany test, który nic nie znaczy. Jak działa audyt →
Pięć funkcji albo 41 kanałów
RunAsDate przechwytuje GetSystemTime, GetLocalTime,
GetSystemTimeAsFileTime, NtQuerySystemTime oraz
GetSystemTimePreciseAsFileTime. Dla bardzo wielu aplikacji to naprawdę
wystarcza, bo właśnie tam czytany jest zegar ścienny.
Reszta powierzchni to miejsca, w których kod zależny od daty lubi się chować:
- strefa czasowa - cztery funkcje plus cała rodzina konwersji między strefami, przez którą raport ląduje w złym dniu
- oś czasu trwania - liczniki taktów i nieobciążony czas przerwań, czyli to, co zwykle mierzy odliczanie wersji próbnej
- uśpienia i czekania, żeby opóźnienie było opóźnieniem na zegarze sesji, a nie na prawdziwym
- timery - nastawialne, okienkowe, z puli wątków i multimedialne
- tworzenie procesów, żeby dzieci instalatora działały w tej samej sesji, a nie w dniu dzisiejszym
Kiedy RunAsDate jest lepszym wyborem
Naprawdę i wcale nie rzadko:
- Potrzebujesz jednej daty, w normalnym tempie, teraz. RunAsDate waży poniżej 40 KB, nie ma okna do nauczenia się i robi dokładnie to od wielu lat.
- Jesteś na starszym Windowsie. RunAsDate sięga wstecz do Windows 2000. To narzędzie celuje w Windows 10 i 11 i nie jest testowane nigdzie starzej.
- Rozmiar ma znaczenie. 40 KB wobec 1,6 MB dla wiersza poleceń albo 69 MB z oknem to nie jest bliskie porównanie.
- Nie chcesz werdyktu. Mierzenie pokrycia oznacza czytanie wyniku. Jeśli test jest jednorazowy, to narzut, o który nie prosiłeś.
Te dwa narzędzia zresztą współistnieją. Nic tu nie każe ci porzucać RunAsDate do szybkich przypadków.
Do czego żadne z nich nie służy
Oba narzędzia pojawiają się w wyszukiwaniach o przedłużaniu wersji próbnych. To nie jest do tego zbudowane i żaden przykład, preset ani strona tutaj nigdy tego nie pokaże. Chrono Mock służy do testowania oprogramowania, za które odpowiadasz - własnego wygasania licencji, własnej logiki odnowień, własnego raportu na koniec miesiąca.
Jest to zresztą przypadek, w którym najmniej prawdopodobne jest, że zadziała. Ochrona licencji rutynowo czyta czas drogami dobranymi tak, żeby trudno je było przechwycić - współdzielona strona danych trybu użytkownika, bezpośrednie wywołania systemowe, serwer - a cofający się zegar to warunek, pod który taki kod jest wprost pisany. Audyt powie ci, że nie zadziałało, co jest odpowiedzią uczciwą, a nie użyteczną.