Aller au contenu
Phosphoricwiki
Sommaire

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 :

DomaineCibles
Processeurtest-cpu (dont les 105 opcodes illégaux), test-cycle (oracle 65x02), test fonctionnel 6502
Mémoire et entrées-sortiestest-memory, test-io (vecteurs de temps du VIA), test-via-lazy
Imagetest-video, test-renderer, test-raster-split, test-ula-ng, test-avi
Sontest-audio (mesure du signal), test-sp0256, test-mea8000, test-midi, test-smf
Stockagetest-storage, test-jasmin, test-tape-signal, test-sedoric-tools, test-dsk2hfe
Horloge et étatstest-clock, test-savestate, test-savestate-determinism
Série et réseautest-serial, test-serial-backends, test-dtl2000, test-picowifi, test-acia6850, test-pia6821
LOCItest-loci (163 tests), test-loci-sdimg, test-loci-hw, test-loci-e2e (12 scénarios de bout en bout)
Débogage et pilotagetest-debugger, test-gdbstub, test-control, test-httpapi, test-http-parse
Menu et configurationtest-iomenu, test-iomenu-glue, test-iomenu-cli, test-cards, test-card-template
Navigateurtest-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-vectors les 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-audio mesure la fréquence d’une voix (à 0,1 %), la durée d’une enveloppe (à 2 %), l’équilibre du bruit ;
  • test-clock vé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-split exécute un vrai programme 6502 et cherche des lignes coupées en leur milieu.

Les filets de sécurité

FiletCe qu’il empêche
make test-benchune trame qui coûterait plus de 1 000 µs (5 % du budget de 20 ms) sur la machine de référence
make test-corpusune image qui changerait : des programmes locaux rejoués à cycles fixés, comparés à un manifeste d’empreintes d’écran
make test-cli-goldenun 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-claimsune formulation de précision non qualifiée dans les documents de vitrine
make test-comment-diffune branche anglaise qui différerait de la française autrement que par les commentaires
make tests-strictun test qui se tairait : tout saut non justifié dans tests/allowed_skips.txt fait échouer
make coverage-checkune 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-replay rejoue les graines et les régressions trouvées.
  • Assainisseurs : make SANITIZE=1 tests lance 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) :

FluxCe qu’il fait
linux-cideux 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-buildconstruction native et suite complète, sur un vrai Apple Silicon
releaseles 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.

Sources dans le dépôt : README.md, docs/ACCURACY.md, docs/adr/0001-makefile-seul-build.md, docs/adr/0005-miroirs-fr-en.md, docs/movie_replay.md.