PD-251 — Tests & Validation (référence contractuelle, v2)¶
1) Matrice de couverture INV/CA -> TC¶
1.1 Couverture des invariants¶
| Invariant | Exigence résumée | Scénarios couvrants |
|---|---|---|
| INV-251-01 | Vérification périodique obligatoire | TC-251-01, TC-251-19 |
| INV-251-02 | Couverture chaîne complète (4 maillons) | TC-251-02, TC-251-17 |
| INV-251-03 | Confirmation avant gel (double vérification) | TC-251-03, TC-251-04 |
| INV-251-04 | Tentatives bornées [2,3] | TC-251-05 |
| INV-251-05 | Journal append-only signé | TC-251-06 |
| INV-251-06 | Gel effectif (blocage lecture/export) | TC-251-07 |
| INV-251-07 | Snapshot préalable signé HSM | TC-251-08 |
| INV-251-08 | Restauration déterministe | TC-251-09, TC-251-10 |
| INV-251-09 | Non-suppression corruption | TC-251-10, TC-251-21 |
| INV-251-10 | États terminaux fermés | TC-251-11, TC-251-20 |
| INV-251-11 | Notification propriétaire conditionnelle | TC-251-12 |
| INV-251-12 | Rapport incident probant (JSON + PDF signé) | TC-251-13 |
| INV-251-13 | SLA détection respectés | TC-251-14, TC-251-15 |
| INV-251-14 | Rapport de run systématique | TC-251-01, TC-251-17 |
| INV-251-15 | Atomicité multi-composant | TC-251-16 |
| INV-251-16 | Aucune erreur silencieuse | TC-251-02, TC-251-03, TC-251-17 |
| INV-251-17 | Versionnement probatoire restauration | TC-251-09, TC-251-10 |
1.2 Couverture des critères d'acceptation (CA)¶
| CA | Interprétation testable (alignée spec) | Scénarios couvrants |
|---|---|---|
| CA-251-01 | Run périodique déclenché + rotation de périmètre | TC-251-01, TC-251-19 |
| CA-251-02 | Vérification des 4 maillons avec statuts explicites | TC-251-02, TC-251-17 |
| CA-251-03 | Double vérification annule faux positif transitoire | TC-251-03 |
| CA-251-04 | Mismatch confirmé → SUSPECT + blocage accès public/export | TC-251-04, TC-251-05 |
| CA-251-05 | Restauration sans snapshot signé HSM → rejetée | TC-251-08 |
| CA-251-06 | Gel effectif lecture/export | TC-251-07 |
| CA-251-07 | Snapshot forensique signé HSM avant restauration | TC-251-08 |
| CA-251-08 | Restauration contrôlée (succès/échec) | TC-251-09, TC-251-10 |
| CA-251-09 | Rapport incident JSON RFC8785 + PDF signé | TC-251-13 |
| CA-251-10 | SLA de détection (1h/24h + dépassements) | TC-251-14 |
| CA-251-11 | SLA restauration (restoreSla/retry/backoff) | TC-251-15 |
| CA-251-12 | Priorisation multi-critères et seuils | TC-251-18 |
| CA-251-13 | Fréquence/périmètre (batch/parallel/timeout/window) | TC-251-19 |
| CA-251-14 | Suppression archive corrompue refusée | TC-251-21 |
| CA-251-15 | Métriques Prometheus (volumétrie run, taux corruption, durées, compteurs par état) | TC-251-22 |
| CA-251-16 | Machine à états complète + transitions interdites + atomicité | TC-251-11, TC-251-16, TC-251-20 |
2) Scénarios de test détaillés (Given/When/Then)¶
Préconditions communes (déterminisme)¶
- Horloge de test figée (
T0) et progression contrôlée. - Jeu d'archives fixe :
A-HC-001(haute criticité),A-LC-001(basse criticité),A-CORR-001(payload corrompu),A-REST-001(éligible restauration).- Hash de référence (SHA3), preuve Merkle, timestamp TSA et ancre blockchain connus/figés.
- Endpoints stockage primaire et alternatif simulés de façon reproductible.
- Journal d'audit et signatures vérifiables cryptographiquement.
- Toute erreur simulée est injectée explicitement (pas d'aléa).
TC-251-01 — Exécution périodique et rapport systématique de run¶
- INV/CA couverts : INV-251-01, INV-251-14, CA-251-01, CA-251-14
- Prérequis : scheduler actif,
scopeRotationWindowconfiguré. - Given : deux fenêtres temporelles successives avec périmètres distincts.
- When : le scheduler déclenche deux runs périodiques.
- Then : chaque run traite un périmètre conforme à la rotation et génère un rapport, y compris si aucune anomalie.
- Résultat attendu : 2 rapports de run présents, horodatés, non vides, avec statut de conformité explicite.
- Automatisable : Oui
TC-251-02 — Couverture complète des 4 maillons avec statut explicite¶
- INV/CA couverts : INV-251-02, INV-251-16, CA-251-02
- Prérequis : archive avec 4 artefacts disponibles.
- Given : un run incluant
A-HC-001. - When : la vérification de la chaîne de preuve est exécutée.
- Then : les 4 maillons (document, Merkle, TSA, blockchain) retournent chacun
OK/KO/INDETERMINE. - Résultat attendu : aucune archive du scope n'est marquée "vérifiée" si un maillon est absent ou sans statut explicite.
- Automatisable : Oui
TC-251-03 — Double vérification : faux positif I/O transitoire¶
- INV/CA couverts : INV-251-03, INV-251-16, CA-251-03
- Prérequis : première lecture primaire en erreur transitoire, relectures cohérentes.
- Given :
A-CORR-001avec échec simulé sur 1re tentative puis hash conforme. - When : la séquence de double vérification est lancée.
- Then : la 2e/3e vérification invalide le soupçon initial.
- Résultat attendu : pas de transition vers
SUSPECT, statut final non-corrompu, trace complète des tentatives. - Automatisable : Oui
TC-251-04 — Double vérification : corruption confirmée -> SUSPECT + blocage¶
- INV/CA couverts : INV-251-03, CA-251-04
- Prérequis : mismatch persistant sur primaire et alternatif.
- Given : hash observé différent du hash attendu sur toutes tentatives.
- When : la séquence de double vérification se termine.
- Then : la transition
HEALTHY -> SUSPECTest appliquée ; accès publics et export bloqués immédiatement. - Résultat attendu : état
SUSPECTatteint uniquement après confirmation multi-tentatives ; blocage effectif des accès. - Automatisable : Oui
TC-251-05 — Validation des bornes de configuration des tentatives¶
- INV/CA couverts : INV-251-04, CA-251-04
- Prérequis : moteur de validation de config actif.
- Given : jeux de configs
verificationAttemptsMax(1,2,3,4),attemptTimeouthors bornes,attemptIntervalhors bornes. - When : la configuration est chargée.
- Then : hors bornes critiques rejetées,
attemptIntervalclamped selon contrat. - Résultat attendu :
[2,3]strict pour tentatives ; rejets explicites et traçables. - Automatisable : Oui
TC-251-06 — Journal append-only signé des tentatives¶
- INV/CA couverts : INV-251-05, CA-251-05
- Prérequis : mécanisme de signature et vérification disponible.
- Given : une archive subit 3 tentatives de vérification.
- When : les événements sont écrits en journal.
- Then : chaque entrée contient timestamp, méthode, hash calculé, résultat, cause d'échec éventuelle ; aucune modification/suppression possible.
- Résultat attendu : journal vérifiable (append-only + signature valide).
- Automatisable : Oui
TC-251-07 — Gel effectif des accès publics¶
- INV/CA couverts : INV-251-06, CA-251-06
- Prérequis : archive en
SUSPECT. - Given : demandes de lecture publique et d'export sur archive suspecte.
- When : les demandes sont exécutées.
- Then : lecture/export publics sont bloqués ; les opérations d'investigation autorisées restent possibles.
- Résultat attendu : blocage strict conforme à la phase de gel.
- Automatisable : Oui
TC-251-08 — Snapshot forensique signé obligatoire avant restauration¶
- INV/CA couverts : INV-251-07, CA-251-05, CA-251-07
- Prérequis : archive
SUSPECT, HSM disponible. - Given : tentative de passage en
RESTORE_PENDING. - When : snapshot forensique est absent, puis présent/signé.
- Then : sans snapshot signé, transition refusée ; avec snapshot signé, transition autorisée.
- Résultat attendu : précondition de signature HSM strictement enforced.
- Automatisable : Oui
TC-251-09 — Restauration réussie déterministe + versionnement¶
- INV/CA couverts : INV-251-08, INV-251-17, CA-251-08
- Prérequis :
RESTORE_PENDING, CRR disponible. - Given : restauration de
A-REST-001et recalcul hash post-restauration cohérent. - When : la restauration est finalisée.
- Then : état final
RESTORED; version restaurée créée avec traçabilité de filiation. - Résultat attendu : résultat reproductible et chaîne de versionnement probatoire intacte.
- Automatisable : Oui
TC-251-10 — Restauration échouée : corruption confirmée sans suppression¶
- INV/CA couverts : INV-251-08, INV-251-09, INV-251-17, CA-251-08
- Prérequis :
RESTORE_PENDING, hash post-restauration incohérent. - Given : tentative de restauration produisant mismatch persistant.
- When : le contrôle post-restauration s'achève.
- Then : état
CORRUPTED_CONFIRMED; conservation des versions antérieures et archivage de la version corrompue. - Résultat attendu : aucune suppression silencieuse ; historique probatoire complet.
- Automatisable : Oui
TC-251-11 — États terminaux fermés¶
- INV/CA couverts : INV-251-10, CA-251-16
- Prérequis : archive en
CORRUPTED_CONFIRMEDpuisCORRUPTED_ARCHIVED. - Given : requêtes de transitions sortantes depuis états terminaux.
- When : transitions sont demandées.
- Then : toutes refusées avec code et motif, sans effet de bord.
- Résultat attendu : clôture stricte des états terminaux.
- Automatisable : Oui
TC-251-12 — Notification propriétaire strictement conditionnelle¶
- INV/CA couverts : INV-251-11, CA-251-15
- Prérequis : canaux email signé + in-app + attachement rapport disponibles.
- Given : 3 cas (SUSPECT simple,
CORRUPTED_CONFIRMED, indisponibilité >restoreSla). - When : le moteur de notification évalue les règles.
- Then : notification propriétaire uniquement dans les 2 cas autorisés ; alerte ops selon contrat.
- Résultat attendu : absence de sur-notification et absence d'omission.
- Automatisable : Oui
TC-251-13 — Rapport d'incident probant (JSON canonique + PDF signé)¶
- INV/CA couverts : INV-251-12, CA-251-09
- Prérequis : incident confirmé.
- Given : génération d'un rapport d'incident.
- When : production des artefacts JSON et PDF.
- Then : JSON canonicalisé RFC 8785 et signé HSM ; PDF signé ; cohérence entre contenus.
- Résultat attendu : artefacts probants, vérifiables, traçables.
- Automatisable : Oui
TC-251-14 — SLA de détection 1h/24h et gestion des dépassements¶
- INV/CA couverts : INV-251-13, CA-251-10, CA-251-15
- Prérequis : archives haute/basse criticité, horloge contrôlée.
- Given : détection simulée à
T0+59m,T0+61m,T0+23h,T0+25h. - When : évaluation des SLA.
- Then : respect = conforme ; dépassement = alerte ops (critique/majeure) + run non conforme.
- Résultat attendu : statut SLA déterministe et traçable.
- Automatisable : Oui
TC-251-15 — SLA restauration : expiration, retries, backoff¶
- INV/CA couverts : INV-251-13, CA-251-11, CA-251-15
- Prérequis : archive
SUSPECT, CRR indisponible temporairement. - Given :
restoreSla,restoreRetryMax,restoreRetryBackoffaux bornes et hors bornes. - When : restauration échoue jusqu'au maximum de retries.
- Then : backoff clamped si nécessaire, arrêt des retries au plafond, escalade ops, notification propriétaire si délai >
restoreSla. - Résultat attendu : conformité stricte des règles d'expiration et de retry.
- Automatisable : Oui
TC-251-16 — Atomicité multi-composant (crash pré/post-commit)¶
- INV/CA couverts : INV-251-15, CA-251-16
- Prérequis : injection de crash contrôlée.
- Given : scénario A crash pré-commit ; scénario B crash post-commit.
- When : run incident est exécuté avec pannes injectées.
- Then : A -> rollback complet sans artefact persistant ; B -> DB cohérente + rattrapage async (journal/Merkle) par réconciliation.
- Résultat attendu : absence d'état intermédiaire incohérent.
- Automatisable : Oui
TC-251-17 — Aucune erreur silencieuse / statuts explicites en cas de dépendance indisponible¶
- INV/CA couverts : INV-251-02, INV-251-14, INV-251-16, CA-251-02, CA-251-14
- Prérequis : indisponibilité forcée d'un maillon (ex: TSA timeout).
- Given : run sur archive avec dépendance externe indisponible.
- When : vérification s'exécute.
- Then : statut
INDETERMINEexplicite, run report inclut non-conformité, aucune "validation implicite". - Résultat attendu : traçabilité complète des causes d'indétermination.
- Automatisable : Oui
TC-251-18 — Priorisation multi-critères + rate limiting des opérations sensibles¶
- INV/CA couverts : CA-251-12, CA-251-15
- Prérequis : ensemble d'archives avec scores variés ; limite d'opérations sensibles configurée.
- Given : score légal/âge/criticité produisant priorités distinctes + rafale de demandes manuelles (re-run/restore).
- When : ordonnanceur trie puis exécute.
- Then : traitement prioritaire selon score ; dépassements de cadence refusés/throttlés et tracés.
- Résultat attendu : ordre d'exécution conforme, tentatives excédentaires journalisées.
- Automatisable : Oui
TC-251-19 — Bornes fréquence/périmètre (batch/parallel/timeout/window)¶
- INV/CA couverts : INV-251-01, CA-251-13
- Prérequis : validation config active.
- Given : valeurs min/max et hors bornes pour
runBatchSize,maxParallelChecks,runTimeout,scopeRotationWindow. - When : chargement de configuration.
- Then : clamps/rejets appliqués selon contrat.
- Résultat attendu : aucune config invalide exécutée silencieusement.
- Automatisable : Oui
TC-251-20 — Matrice de transitions interdites de la machine à états¶
- INV/CA couverts : INV-251-10, CA-251-16
- Prérequis : fixtures dans chaque état.
- Given : tentative exhaustive des transitions interdites documentées.
- When : API/moteur de transition reçoit ces demandes.
- Then : refus systématique avec code et motif, sans effet de bord.
- Résultat attendu : seules transitions explicitement autorisées passent.
- Automatisable : Oui
TC-251-21 — Suppression d'une archive corrompue refusée¶
- INV/CA couverts : INV-251-09, CA-251-14
- Prérequis : archive en état
CORRUPTED_CONFIRMED; variante avecCORRUPTED_ARCHIVED. - Given : une archive corrompue (
CORRUPTED_CONFIRMEDouCORRUPTED_ARCHIVED) existe en base. - When : une tentative de suppression explicite est effectuée (via API ou commande interne).
- Then : la suppression est refusée avec code d'erreur métier explicite ; l'archive reste présente et inchangée ; un événement d'audit de refus est tracé.
- Résultat attendu : aucun chemin applicatif ne permet la suppression d'une archive corrompue ; invariant de non-suppression strictement respecté.
- Automatisable : Oui
TC-251-22 — Exposition des métriques Prometheus après run complet¶
- INV/CA couverts : CA-251-15
- Prérequis : endpoint
/metricsexposé ; un run complet exécutable en environnement de test ; jeu de données incluant cas sains et corrompus. - Given : un run complet de vérification d'intégrité est exécuté, produisant des résultats variés (OK, SUSPECT, INDETERMINE).
- When : l'endpoint
/metricsest interrogé après fin de run. - Then : les métriques suivantes sont présentes et cohérentes avec les résultats du run :
- Volumétrie de run (nombre d'archives vérifiées)
- Taux de corruption (ratio archives KO / total)
- Durées de run (histogramme ou summary)
- Compteurs par état d'archive (HEALTHY, SUSPECT, RESTORED, CORRUPTED_CONFIRMED, CORRUPTED_ARCHIVED)
- Résultat attendu : les 4 familles de métriques requises sont publiées et exploitables ; aucune famille manquante.
- Automatisable : Oui
3) Scénarios de non-régression (edge cases, concurrence)¶
NR-251-01 — Concurrence de runs sur même archive¶
- Given : deux workers tentent de vérifier la même archive simultanément.
- When : les deux traitements démarrent à
T0. - Then : un seul chemin de transition d'état est retenu, absence de double-écriture incohérente.
- Attendu : idempotence et cohérence transactionnelle.
NR-251-02 — Crash entre snapshot signé et transition d'état¶
- Given : snapshot forensique signé produit.
- When : crash survient avant persistance de
RESTORE_PENDING. - Then : reprise sans doublon de snapshot, transition rejouée proprement.
- Attendu : pas de perte probatoire, pas de transition fantôme.
NR-251-03 — Rejeu d'événement de journal append-only¶
- Given : même événement async livré 2 fois.
- When : consommateur traite les deux messages.
- Then : second traitement sans duplication logique.
- Attendu : retry-safe et idempotent.
NR-251-04 — Rafale de 10x la limite nominale (rate limiting)¶
- Given : charge burst sur opérations de contrôle manuel.
- When : limite atteinte.
- Then : throttling/réjection conforme + traces complètes.
- Attendu : stabilité système sans perte de traçabilité.
NR-251-05 — Horodatages proches des frontières SLA¶
- Given : événements à
SLA-1s,SLA,SLA+1s. - When : moteur d'évaluation SLA calcule conformité.
- Then : classification correcte aux frontières.
- Attendu : absence d'erreur off-by-one.
NR-251-06 — Indisponibilité intermittente TSA/Blockchain¶
- Given : alternance dispo/indispo d'un maillon externe.
- When : run complet s'exécute.
- Then : statuts explicites par maillon, aucune validation implicite globale.
- Attendu : robustesse aux pannes transitoires sans erreur silencieuse.
4) Éléments non testables / ambiguïtés¶
- NON TESTABLE (infrastructure matérielle) : garanties physiques HSM
- Justification : on peut tester la présence/validité des signatures et la politique d'usage, mais pas certifier en test applicatif les propriétés physiques/certifications matérielles du HSM.
- Action attendue : compléter par preuves de conformité infrastructure (audit HSM séparé).