Chrono Mock
JęzykPolski

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

 RunAsDateChrono Mock
Uruchamia aplikację z fałszywą datątaktak
Nie rusza zegara systemowegotaktak
Przechwycone funkcje czasu544 (30 przesuniętych, 14 liczonych)
Zegar szybszy niż rzeczywistynieoferowanedowolny całkowity mnożnik
Zamrożenie zegaratak, domyślnietak
Skok w trakcie działania aplikacjitylko powrót do prawdziwej daty, po zadanej liczbie sekundw przód i w tył, do dowolnego momentu
Strefa czasowa tylko dla tego procesunieudokumentowanetak, stały offset
Procesy potomne dziedziczą sesjęnieudokumentowanetak
Dołączenie do już działającej aplikacjitak, od wersji 1.40nie - uruchamia aplikację sam
Kilka aplikacji z różnymi datami naraztaknie - jedna sesja naraz
Mówi, czy zadziałałoniewerdykt, per kanał, z liczbą wywołań
Aplikacje Electron i Chromiumnieudokumentowaneosobny mechanizm
Wiersz poleceń do CItaktak, z kodami wyjścia i JSON-em
Kod źródłowyfreeware, zamkniętyGPL-3.0
Rozmiar47 KB do pobrania, 57 KB dla 64 bitów~2,4 MB wiersz poleceń, ~70 MB z oknem
Stare wersje Windowswstecz do Windows 2000Windows 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ą.

Wypróbuj