Un'alternativa a RunAsDate, con le parti che mancavano
RunAsDate è da anni la risposta a «esegui questo programma a una data diversa su Windows», ed è una buona risposta. Questa pagina riguarda dove i due differiscono e dove RunAsDate resta la scelta migliore.
Fianco a fianco
| RunAsDate | Chrono Mock | |
|---|---|---|
| Esegue un'applicazione a una data falsa | sì | sì |
| Lascia in pace l'orologio di sistema | sì | sì |
| Funzioni di tempo intercettate | 5 | 44 (30 spostati, 14 contati) |
| Orologio più veloce del tempo reale | non offerto | qualsiasi moltiplicatore intero |
| Congelare l'orologio | sì, di default | sì |
| Saltare mentre l'app è in esecuzione | solo il ritorno alla data reale, dopo un numero fisso di secondi | avanti e indietro, verso qualsiasi momento |
| Fuso orario solo per quel processo | non documentato | sì, scostamento fisso |
| I processi figlio ereditano la sessione | non documentato | sì |
| Agganciarsi a un'applicazione già in esecuzione | sì, dalla versione 1.40 | no - avvia l'applicazione da sé |
| Più applicazioni con date diverse insieme | sì | no - una sessione alla volta |
| Ti dice se ha funzionato | no | verdetto, per canale, con conteggio delle chiamate |
| Applicazioni Electron e Chromium | non documentato | meccanismo separato |
| Riga di comando per la CI | sì | sì, con codici di uscita e JSON |
| Codice sorgente | freeware, chiuso | GPL-3.0 |
| Dimensione | 47 KB da scaricare, 57 KB per 64 bit | ~2,4 MB la riga di comando, ~70 MB con la finestra |
| Versioni vecchie di Windows | fino a Windows 2000 | Windows 10 e 11 |
«Non documentato» significa che la funzione non è menzionata nella pagina di RunAsDate. Non è un'affermazione che lo strumento ne sia privo. L'orologio di RunAsDate resta fermo a meno che la sua opzione Move the time forward according to the real time non sia attiva.
La differenza che conta di più
Non è il numero di canali. È che RunAsDate dice onestamente, nella propria documentazione, che «non influirà sulle applicazioni che ricavano la data e l'ora correnti da un'altra fonte» - e poi ti lascia scoprire se la tua è una di quelle.
Chrono Mock tratta quella stessa frase come qualcosa da misurare. Ogni sessione termina con un verdetto, i canali che l'applicazione ha davvero letto con un conteggio per ciascuno, i canali mancati e un avviso quando l'applicazione è stata vista aprire una connessione di rete prima ancora di chiedere l'ora all'orologio.
Un'applicazione che sembra spostata nel tempo ma non lo è è peggio di una che non è mai partita - produce un test superato che non significa nulla. Come funziona l'audit →
Cinque funzioni, o 44 canali
RunAsDate intercetta GetSystemTime, GetLocalTime,
GetSystemTimeAsFileTime, NtQuerySystemTime e
GetSystemTimePreciseAsFileTime. Per moltissime applicazioni è davvero sufficiente,
perché è lì che si legge l'orologio a muro.
Il resto della superficie è dove il codice che dipende dalla data tende a nascondersi:
- il fuso orario - le due funzioni che lo riportano, più le sei che convertono tra fusi, ed è così che un report finisce nel giorno sbagliato
- l'asse del tempo trascorso - conteggi di tick e tempo di interrupt non distorto, che è ciò che di solito misura il conto alla rovescia di una prova
- le pause, perché un ritardo sia un ritardo sull'orologio della sessione e non su quello reale, e le attese su oggetti, che vengono contate e mantengono la loro durata reale
- timer - attendibili, di finestra, di thread pool e multimediali
- creazione di processi, perché i figli di un installer girino nella stessa sessione invece che nel giorno di oggi
- le connessioni di rete, contate come segno che l'ora può venire da un server
Dei 44, 30 passano sull'orologio della sessione. Gli altri 14 vengono solo contati e restano reali, così il report li elenca senza affermare che siano stati spostati. L'orologio a muro e il fuso orario vengono spostati in ogni sessione. L'asse del tempo trascorso e le attese vengono osservati quando lo chiedi con --scale-duration, il contatore ad alta risoluzione con --scale-qpc.
Quando RunAsDate è la scelta migliore
Davvero, e non di rado:
- Ti serve una data, a velocità normale, subito. RunAsDate è un download di meno di 60 KB, non ha una finestra da imparare e fa esattamente questo da molti anni.
- Sei su un Windows più vecchio. RunAsDate arriva fino a Windows 2000. Questo strumento punta a Windows 10 e 11 e non è testato su nulla di più vecchio.
- Le dimensioni contano. 47 KB da scaricare contro ~2,4 MB per la riga di comando, o ~70 MB con la finestra, non è un confronto ravvicinato.
- Non vuoi un verdetto. Misurare la copertura significa leggere il risultato. Se il test è usa e getta, è un costo che non avevi chiesto.
- L'applicazione è già in esecuzione. RunAsDate sa agganciarsi a un processo in esecuzione dalla versione 1.40. Chrono Mock avvia l'applicazione da sé, quindi una che non si può riavviare resta fuori dalla sua portata.
- Vuoi più applicazioni con date diverse insieme. RunAsDate dà a ciascuna la propria data. Chrono Mock gestisce una sessione alla volta.
I due possono anche convivere. Nulla qui ti impedisce di tenere RunAsDate per il caso rapido.
Per che cosa nessuno dei due è pensato
Entrambi gli strumenti compaiono nelle ricerche sul prolungamento dei periodi di prova. Questo non è costruito per quello, e nessun esempio, scenario o pagina qui lo dimostrerà mai. Chrono Mock serve a testare software di cui sei responsabile - la scadenza della tua licenza, la tua logica di rinnovo, il tuo report di fine mese.
È anche il caso con meno probabilità di funzionare. La protezione delle licenze legge regolarmente l'ora attraverso vie scelte perché siano difficili da intercettare - la pagina dati condivisa in modalità utente, le chiamate di sistema dirette, un server - e un orologio che va all'indietro è una condizione che quel codice è scritto per rilevare. L'audit ti dirà che non ha funzionato, che è la risposta onesta e non una risposta utile.