Les tests
Chaque affirmation de Phosphoric est adossée à un test qui la ferait tomber. Voici ce qui tourne, depuis les registres d’une puce jusqu’au navigateur, et comment un saut de test est empêché de passer inaperçu.
Dans cette page
La suite
make tests lance 70 suites, 1 362 vérifications, toutes au vert. Elles couvrent chaque
composant, du processeur au menu F1 :
| Domaine | Cibles |
|---|---|
| Processeur | test-cpu (dont les 105 opcodes illégaux), test-cycle (oracle 65x02), test fonctionnel 6502 |
| Mémoire et entrées-sorties | test-memory, test-io (vecteurs de temps du VIA), test-via-lazy |
| Image | test-video, test-renderer, test-raster-split, test-ula-ng, test-avi |
| Son | test-audio (mesure du signal), test-sp0256, test-mea8000, test-midi, test-smf |
| Stockage | test-storage, test-jasmin, test-tape-signal, test-sedoric-tools, test-dsk2hfe |
| Horloge et états | test-clock, test-savestate, test-savestate-determinism |
| Série et réseau | test-serial, test-serial-backends, test-dtl2000, test-picowifi, test-acia6850, test-pia6821 |
| LOCI | test-loci (163 tests), test-loci-sdimg, test-loci-hw, test-loci-e2e (12 scénarios de bout en bout) |
| Débogage et pilotage | test-debugger, test-gdbstub, test-control, test-httpapi, test-http-parse |
| Menu et configuration | test-iomenu, test-iomenu-glue, test-iomenu-cli, test-cards, test-card-template |
| Navigateur | test-web-loci, test-web-iomenu, test-web-picowifi (Chrome sans affichage) |
Les oracles externes
Un test écrit par le projet peut se tromper avec lui. Phosphoric s’appuie donc aussi sur des références qui ne viennent pas de lui :
- SingleStepTests/65x02 : 10 000 cas par opcode, avec la trace du bus attendue cycle par cycle. Quatre propriétés notées séparément, et les deux cœurs jugés dans la même exécution, pour qu’aucun ne progresse en cassant l’autre.
6502_functional_test: le test fonctionnel de référence du 6502, qui passe en entier.- Les vecteurs ne sont pas dans le dépôt (environ 1 Go, tiers) :
make fetch-vectorsles télécharge, et la CI a une étape à part pour eux.
Mesurer au lieu de comparer
Plusieurs tests mesurent un comportement au lieu de comparer des octets figés :
test-audiomesure la fréquence d’une voix (à 0,1 %), la durée d’une enveloppe (à 2 %), l’équilibre du bruit ;test-clockvérifie qu’un appel de l’horloge fait avancer d’exactement un cycle, que les périphériques reçoivent un cycle à la fois, et que le compteur du processeur égale la position du balayage sur une trame ;test-raster-splitexécute un vrai programme 6502 et cherche des lignes coupées en leur milieu.
Les filets de sécurité
| Filet | Ce qu’il empêche |
|---|---|
make test-bench | une trame qui coûterait plus de 1 000 µs (5 % du budget de 20 ms) sur la machine de référence |
make test-corpus | une image qui changerait : des programmes locaux rejoués à cycles fixés, comparés à un manifeste d’empreintes d’écran |
make test-cli-golden | un changement de comportement en refactorant : environ 116 lignes de commande rejouées sur l’ancien et le nouveau binaire ; code de sortie, sorties et fichiers produits doivent être identiques |
make test-docs-claims | une formulation de précision non qualifiée dans les documents de vitrine |
make test-comment-diff | une branche anglaise qui différerait de la française autrement que par les commentaires |
make tests-strict | un test qui se tairait : tout saut non justifié dans tests/allowed_skips.txt fait échouer |
make coverage-check | une couverture des lignes de src/ qui baisserait sous son plancher |
La robustesse
- Fuzzing (
make fuzz, libFuzzer et clang) des lecteurs de fichiers : configuration, disquettes, images HFE, requêtes HTTP, sauvegardes d’état, films de rejeu, fichiers MIDI, symboles, cassettes.make test-fuzz-replayrejoue les graines et les régressions trouvées. - Assainisseurs :
make SANITIZE=1 testslance toute la suite sous ASan et UBSan. - Fuites :
make valgrind; le projet annonce zéro fuite. - Analyse statique : avertissements du compilateur, cppcheck, flawfinder.
La CI
Quatre flux de travail tournent sur la branche anglaise, dont le code est identique à celui de la française (décision 0005) :
| Flux | Ce qu’il fait |
|---|---|
linux-ci | deux constructions, suite complète en mode strict, oracle et test fonctionnel, budget de performance, Valgrind ; puis la suite sous ASan et UBSan, 30 s de fuzzing par cible, et le plancher de couverture |
windows-build | .exe construit sur Linux, avec SDL2.dll, et ses tests |
macos-build | construction native et suite complète, sur un vrai Apple Silicon |
release | les paquets d’une version : Linux x86_64 et Windows x86_64 (sans les ROM) |
Les films de rejeu
--record enregistre les entrées du clavier d’une session, trame par trame ; --replay les rejoue.
La seule entrée non déterministe de l’émulation est la matrice du clavier (8 octets) : en la rejouant
bit pour bit, une session se reproduit exactement. Deux rejeux donnent des captures identiques à
l’octet près.
C’est un outil de régression : on enregistre une fois, on rejoue sans affichage, on compare une capture de référence. Le format est un texte lisible, que l’on peut comparer ligne à ligne.