Galactic Games permet de défier quelqu'un et de jouer contre lui en direct. Les tests unitaires en couvrent une bonne partie : 8 vérifications pour le relais, 21 pour les comptes, le lobby et les résultats, et 178 pour la logique du jeu Knife Duels. Aucun ne prouve que deux vraies personnes peuvent jouer un match. Pour ça, je voulais un test qui fait exactement ce que font deux joueurs.
Le montage
- Démarrer le Worker en local et ouvrir deux fenêtres Edge headless, pilotées via le Chrome DevTools Protocol.
- Créer deux comptes neufs et mettre le jeton de connexion de chacun dans son propre navigateur.
- Mettre les deux joueurs en file d'attente pour un match et attendre qu'ils se rencontrent.
- Vérifier que les deux écrans s'accordent sur l'état du jeu, puis fermer le navigateur de l'hôte et vérifier que le match survit.
Trois choses qui ont posé problème
Le navigateur bloquait la connexion. Les builds récentes refusent le WebSocket d'une page
vers 127.0.0.1 à moins de désactiver les vérifications de réseau privé avec un indicateur de
lancement. Les premières exécutions échouaient avant même l'envoi d'un seul message.
L'injection de la connexion ne tenait pas. Ajouter le jeton avec un script qui s'exécute sur chaque nouveau document ne survivait pas à la navigation. Le définir depuis une page de la même origine, si.
Deux navigateurs s'affament l'un l'autre. Sans GPU, les deux fenêtres rendent le jeu 3D en logiciel sur la même machine. Le jeu tournait à environ un cinquième de la vitesse réelle, donc l'autre joueur semblait décalé de plusieurs secondes. Ce décalage n'existe que dans le test. Chaque attente devait être généreuse, et dans les exécutions headless, la boucle de rendu utilise un minuteur fixe de 16 ms.
La leçon
Un test de bout en bout mesure la machine de test autant que le jeu. Avant de traquer un bug de latence, vérifiez si le décalage vient du produit ou des deux navigateurs qui se disputent un seul CPU.