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 | 44 (30 przesuniętych, 14 liczonych) |
| Zegar szybszy niż rzeczywisty | nieoferowane | dowolny całkowity mnożnik |
| Zamrożenie zegara | tak, domyślnie | tak |
| Skok w trakcie działania aplikacji | tylko powrót do prawdziwej daty, po zadanej liczbie sekund | w przód i w tył, do dowolnego momentu |
| Strefa czasowa tylko dla tego procesu | nieudokumentowane | tak, stały offset |
| Procesy potomne dziedziczą sesję | nieudokumentowane | tak |
| Dołączenie do już działającej aplikacji | tak, od wersji 1.40 | nie - uruchamia aplikację sam |
| Kilka aplikacji z różnymi datami naraz | tak | nie - jedna sesja naraz |
| Mówi, czy zadziałało | nie | werdykt, per kanał, z liczbą wywołań |
| Aplikacje Electron i Chromium | nieudokumentowane | 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 | 47 KB do pobrania, 57 KB dla 64 bitów | ~2,4 MB wiersz poleceń, ~70 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. Zegar RunAsDate stoi, dopóki nie włączysz jego opcji Move the time forward according to the real time.
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 44 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 - dwie funkcje, które ją podają, plus sześć konwersji między strefami, przez które 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, żeby opóźnienie było opóźnieniem na zegarze sesji, a nie na prawdziwym, oraz czekania na obiekty, które są liczone i zachowują prawdziwą długość
- 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
- połączenia sieciowe, liczone jako znak, że czas może pochodzić z serwera
Z 44 kanałów na zegar sesji trafia 30. Reszta (14) jest tylko liczona i zostaje prawdziwa, więc raport ją wymienia, nie twierdząc, że została przesunięta. Zegar ścienny i strefa czasowa są przesuwane w każdej sesji. Oś czasu trwania i czekania są obserwowane, gdy poprosisz o to przez --scale-duration, a licznik wysokiej rozdzielczości przez --scale-qpc.
Kiedy RunAsDate jest lepszym wyborem
Naprawdę i wcale nie rzadko:
- Potrzebujesz jednej daty, w normalnym tempie, teraz. RunAsDate to pobranie poniżej 60 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. 47 KB do pobrania wobec ~2,4 MB dla wiersza poleceń albo ~70 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ś.
- Aplikacja już działa. RunAsDate od wersji 1.40 potrafi dołączyć do działającego procesu. Chrono Mock uruchamia aplikację sam, więc taka, której nie da się uruchomić ponownie, jest poza jego zasięgiem.
- Chcesz kilku aplikacji z różnymi datami naraz. RunAsDate daje każdej własną datę. Chrono Mock prowadzi jedną sesję naraz.
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ą.