Chrono Mock
LangueFrançais

Falsifier la date dans une application Electron

Cherchez cela et toutes les réponses consistent à modifier votre propre code - simuler l'objet Date, utiliser les faux minuteurs de votre framework de test. Rien de cela n'aide quand ce que vous avez est une application déjà compilée. Ceci exécute l'application que vous avez déjà.

Pourquoi l'injection ne l'atteint pas

Ce mode existe à cause d'un échec précis. Un minuteur Pomodoro construit sur Electron a été exécuté sous une session x60 et son compte à rebours n'a pas bougé du tout. Démonter le bundle de l'application a montré deux raisons indépendantes, et aucune n'avait de solution côté natif :

  • Le compte à rebours ne lisait aucune horloge. C'était un compteur incrémenté par setInterval, tournant dans un Web Worker. Il n'y avait aucun appel de temps à intercepter, car l'application ne demandait jamais quelle heure il était.
  • Ce worker vit dans un processus de rendu isolé, qui est précisément l'endroit où une bibliothèque injectée de l'extérieur n'entre pas.

Le mécanisme côté Windows ne peut donc pas aider ici, et la réponse est de s'adresser plutôt au moteur JavaScript propre de l'application.

Ce qui se passe à la place

L'application est lancée avec un port de débogage et un profil propre et jetable, et ses propres API de temps sont placées sur l'horloge de la session par le protocole DevTools - Date.now, le constructeur new Date(), performance.now, setTimeout et setInterval.

La substitution est installée dans chaque contexte que l'application ouvre, y compris ses Web Workers - c'est là que le minuteur se trouve généralement, et le seul endroit que l'injection native ne pouvait pas atteindre.

Rien ne change dans la façon de le piloter. La même commande, la même fenêtre, le même panneau de session avec les deux horloges et le verdict.

# La même commande que pour une application native - le mode est détecté
chrono run "%LOCALAPPDATA%\Programs\your-app\YourApp.exe" --at 2038-01-01T00:00:00 --mode x60

Deux limites à connaître avant de commencer

Le lancement est invasif, et volontairement bruyant à ce sujet.

L'application est démarrée avec un port de débogage distant ouvert et un profil neuf et isolé sous %TEMP% - elle ne tourne pas sur votre vrai profil, et ce n'est pas la copie déjà présente dans votre zone de notification. Le profil est supprimé à la fin de la session, et s'il n'a pas pu l'être, le résumé de la session le dit plutôt que de le laisser discrètement traîner.

Transmettre votre propre --user-data-dir ou --remote-debugging-port est refusé plutôt que remplacé, parce que l'accident évident - pointer la session sur votre vrai profil de navigateur - n'est pas de ceux qu'il vaut la peine d'autoriser.

Les pages lisent le fuseau horaire de la session.

Chaque page et chaque worker est placé sur le fuseau horaire de la session, un décalage fixe sans heure d'été, et vérifie le décalage qu'il lit, de sorte qu'une page qui a lu un autre fuseau est signalée. Deux limites : Intl nomme ce fuseau par un décalage comme GMT+02:00 et non par une ville, et le processus principal d'une application Electron exécute du JavaScript dans Node, que la session n'atteint pas, donc il garde l'horloge réelle - le rapport le dit.

Une chose de plus qui surprend : un intervalle déjà planifié garde son ancien rythme quand vous changez la vitesse en pleine session. Date.now, new Date() et performance.now réagissent immédiatement, un setInterval en cours non, et la session vous en avertit plutôt que de vous laisser conclure que le changement n'a rien fait.

À quel point est-il testé

Expérimental, et ce mot a ici un sens défini : il fonctionne sur les cibles pour lesquelles il a été construit, il n'a pas été testé largement, et l'audit intégré est votre source de vérité, pas cette page. Il a été vérifié à la main et non par la suite automatisée, sur une vraie application Electron sous Windows 64 bits.

La couverture est rapportée par contexte JavaScript et non par processus, puisque c'est l'unité qui existe ici. Une application inactive qui ne demande jamais l'heure produit honnêtement indéterminé - elle n'a lu aucune horloge, on ne peut donc rien affirmer sur la question de savoir si elle aurait vu la bonne. Ce que signifient les verdicts →

L'essayer