O alternativă la RunAsDate, cu părțile care lipseau
RunAsDate este de ani de zile răspunsul la „rulează acest program la o altă dată pe Windows” și este unul bun. Această pagină vorbește despre unde diferă cele două și despre unde RunAsDate rămâne alegerea mai bună.
Față în față
| RunAsDate | Chrono Mock | |
|---|---|---|
| Rulează o aplicație la o dată falsă | da | da |
| Lasă ceasul sistemului în pace | da | da |
| Funcții de timp interceptate | 5 | 44 (30 decalate, 14 numărate) |
| Ceas mai rapid decât cel real | nu este oferit | orice multiplicator întreg |
| Oprirea ceasului | da, implicit | da |
| Salt cât timp aplicația rulează | doar întoarcerea la data reală, după un număr fix de secunde | înainte și înapoi, în orice moment |
| Fus orar doar pentru acel proces | nedocumentat | da, decalaj fix |
| Procesele copil moștenesc sesiunea | nedocumentat | da |
| Atașarea la o aplicație care rulează deja | da, din versiunea 1.40 | nu - pornește singur aplicația |
| Mai multe aplicații cu date diferite în același timp | da | nu - o singură sesiune odată |
| Îți spune dacă a funcționat | nu | verdict, pe canale, cu numărul de apeluri |
| Aplicații Electron și Chromium | nedocumentat | mecanism separat |
| Linie de comandă pentru CI | da | da, cu coduri de ieșire și JSON |
| Cod sursă | freeware, închis | GPL-3.0 |
| Dimensiune | 47 KB de descărcat, 57 KB pe 64 de biți | ~2,4 MB linia de comandă, ~70 MB cu fereastra |
| Versiuni vechi de Windows | până la Windows 2000 | Windows 10 și 11 |
„Nedocumentat” înseamnă că funcția nu este menționată pe pagina RunAsDate. Nu este o afirmație că instrumentul nu o are. Ceasul RunAsDate stă pe loc dacă nu este activată opțiunea Move the time forward according to the real time.
Diferența care contează cel mai mult
Nu este numărul de canale. Este faptul că RunAsDate îți spune sincer, în propria documentație, că „nu va afecta aplicațiile care iau data/ora curentă dintr-o altă sursă” - și apoi te lasă să afli singur dacă a ta este una dintre ele.
Chrono Mock tratează aceeași propoziție ca pe ceva de măsurat. Fiecare sesiune se încheie cu un verdict, canalele pe care aplicația le-a citit efectiv, cu un număr pentru fiecare, canalele ratate și un avertisment când aplicația a fost văzută deschizând o conexiune de rețea înainte să întrebe vreodată ceasul.
O aplicație care pare mutată în timp, dar nu este, e mai rea decât una care nu a pornit niciodată - produce un test trecut care nu înseamnă nimic. Cum funcționează auditul →
Cinci funcții sau 44 canale
RunAsDate interceptează GetSystemTime, GetLocalTime,
GetSystemTimeAsFileTime, NtQuerySystemTime și
GetSystemTimePreciseAsFileTime. Pentru foarte multe aplicații asta este cu adevărat
suficient, pentru că acolo se citește ceasul de perete.
Restul suprafeței este locul unde tinde să se ascundă codul care depinde de dată:
- fusul orar - cele două funcții care îl raportează, plus cele șase care convertesc între fusuri, prin care un raport ajunge în ziua greșită
- axa timpului scurs - contoarele de tick-uri și timpul de întrerupere nepolarizat, ceea ce măsoară de obicei o numărătoare inversă de probă
- pauzele, ca o întârziere să fie o întârziere pe ceasul sesiunii și nu pe cel real, și așteptările pe obiecte, care sunt numărate și își păstrează durata reală
- temporizatoarele - waitable, de fereastră, de thread-pool și multimedia
- crearea de procese, ca procesele copil ale unui instalator să ruleze în aceeași sesiune, nu în ziua de azi
- conexiunile de rețea, numărate ca semn că ora poate veni de la un server
Din cele 44, 30 trec pe ceasul sesiunii. Celelalte 14 sunt doar numărate și rămân reale, așa că raportul le numește fără să pretindă că au fost decalate. Ceasul de perete și fusul orar sunt decalate în fiecare sesiune. Axa timpului scurs și așteptările sunt urmărite când ceri asta cu --scale-duration, iar contorul de înaltă rezoluție cu --scale-qpc.
Când RunAsDate este alegerea mai bună
Cu adevărat, și nu rar:
- Ai nevoie de o singură dată, la viteză normală, chiar acum. RunAsDate este o descărcare sub 60 KB, nu are o fereastră de învățat și face exact asta de mulți ani.
- Ești pe un Windows mai vechi. RunAsDate merge până la Windows 2000. Acest instrument vizează Windows 10 și 11 și nu este testat pe nimic mai vechi.
- Dimensiunea contează. 47 KB de descărcat față de ~2,4 MB pentru linia de comandă, sau ~70 MB cu fereastra, nu este o comparație strânsă.
- Nu vrei un verdict. Măsurarea acoperirii înseamnă citirea rezultatului. Dacă testul este de unică folosință, este un efort pe care nu l-ai cerut.
- Aplicația rulează deja. RunAsDate se poate atașa la un proces în execuție din versiunea 1.40. Chrono Mock pornește singur aplicația, așa că una care nu poate fi repornită îi rămâne inaccesibilă.
- Vrei mai multe aplicații cu date diferite în același timp. RunAsDate îi dă fiecăreia propria dată. Chrono Mock rulează o singură sesiune odată.
Cele două coexistă. Nimic de aici nu te oprește să păstrezi RunAsDate pentru cazul rapid.
Pentru ce nu este niciunul dintre ele
Ambele instrumente apar în căutări despre prelungirea perioadelor de probă. Acesta nu este construit pentru asta, iar niciun exemplu, preset sau pagină de aici nu va demonstra vreodată așa ceva. Chrono Mock este pentru testarea software-ului pentru care răspunzi tu - expirarea propriei licențe, propria logică de reînnoire, propriul raport de final de lună.
Este și cazul cel mai puțin probabil să funcționeze. Protecția prin licență citește de rutină ora pe căi alese ca să fie greu de interceptat - pagina de date partajată din user-mode, apeluri sistem directe, un server - iar un ceas care merge înapoi este o condiție pe care un asemenea cod este scris să o detecteze. Auditul îți va spune că nu a funcționat, ceea ce este răspunsul onest, nu unul folositor.