PD-52 — Scenarios de tests contractuels
1. References
- Specification : PD-52-specification.md
- Epic : PD-187 - BLOCKCHAIN
- JIRA : PD-52
- Repos concernes : ProbatioVault-backend, ProbatioVault-infra
- Documents associes : PD-52-besoin.md, learnings PD-36/PD-7/PD-37
2. Matrice de couverture
2.1 Invariants → Tests
| ID Invariant | ID Critere | ID Test(s) | Couverture | Commentaire |
| INV-52-01 | CA-52-01, CA-52-02 | TC-NOM-01, TC-NOM-02 | Oui | Polygon et Arbitrum couverts separement |
| INV-52-02 | CA-52-06 | TC-NOM-08, TC-INV-02 | Oui | Verification testnet-only dans config et transactions |
| INV-52-03 | CA-52-04, CA-52-09 | TC-NOM-06, TC-INV-03a, TC-INV-03b, TC-INV-03c | Oui | Secret prive jamais en clair (code, env, logs, traces) |
| INV-52-04 | CA-52-03 | TC-NOM-03, TC-NOM-04, TC-NOM-05, TC-INV-04 | Oui | Un et un seul mode selectionne |
| INV-52-05 | CA-52-03 | TC-ERR-03, TC-ERR-04 | Oui | Refus si mode indisponible |
| INV-52-06 | CA-52-07 | TC-NOM-09, TC-INV-06 | Oui | Primaire + secondaire par reseau |
| INV-52-07 | CA-52-07 | TC-NOM-09, TC-ERR-01 | Oui | Bascule automatique transparente |
| INV-52-08 | CA-52-10 | TC-NOM-12, TC-INV-08 | Oui | Hash et metadonnees non identifiantes uniquement |
| INV-52-09 | CA-52-06, CA-52-11 | TC-NOM-08, TC-ERR-08 | Oui | Finalite apres seuil de confirmations |
| INV-52-10 | CA-52-08 | TC-NOM-10 | Oui | Metriques minimales exposables |
| INV-52-11 | - | TC-INV-11a, TC-INV-11b | Oui | Erreurs deterministes sans fuite de secret |
| INV-52-12 | CA-52-12 | TC-NOM-13, TC-INV-12 | Oui | Tests executes en CI |
| INV-52-13 | - | TC-INV-13 | Oui | Seuil confirmations configurable |
2.2 Criteres d'acceptation → Tests
| ID Critere | ID Test(s) | Couverture | Commentaire |
| CA-52-01 | TC-NOM-01 | Oui | 10 appels Polygon |
| CA-52-02 | TC-NOM-02 | Oui | 10 appels Arbitrum |
| CA-52-03 | TC-NOM-03, TC-NOM-04, TC-NOM-05 | Oui | Couverture S1, S2, S3 |
| CA-52-04 | TC-NOM-06 | Oui | Signature verifiable |
| CA-52-05 | TC-NOM-07 | Oui | Ecart gas < 25% |
| CA-52-06 | TC-NOM-08 | Oui | Confirmation <= 30s |
| CA-52-07 | TC-NOM-09 | Oui | Failover < 5s |
| CA-52-08 | TC-NOM-10 | Oui | 4 metriques presentes |
| CA-52-09 | TC-NOM-11, TC-INV-03a, TC-INV-03b, TC-INV-03c | Oui | Audit multi-couche |
| CA-52-10 | TC-NOM-12 | Oui | Payload inspect |
| CA-52-11 | TC-ERR-08 | Oui | Reorg gere |
| CA-52-12 | TC-NOM-13, TC-INV-12 | Oui | CI verte + couverture >= 80% |
| CA-52-13 | TC-ERR-14 | Oui | Validation payload entrante |
2.3 Cas d'erreur → Tests
| ID Cas d'erreur | ID Test(s) | Couverture | Commentaire |
| ERR-52-01 | TC-ERR-01 | Oui | Bascule automatique |
| ERR-52-02 | TC-ERR-02 | Oui | Erreur bloquante RPC_UNAVAILABLE |
| ERR-52-03 | TC-ERR-03 | Oui | CUSTODY_MODE_MISSING |
| ERR-52-04 | TC-ERR-04 | Oui | CUSTODY_MODE_INVALID |
| ERR-52-05 | TC-ERR-05 | Oui | SIGNATURE_VERIFICATION_FAILED |
| ERR-52-06 | TC-ERR-06 | Oui | INSUFFICIENT_FUNDS |
| ERR-52-07 | TC-ERR-07 | Oui | GAS_PRICE_CEILING_EXCEEDED |
| ERR-52-08 | TC-ERR-08 | Oui | Reorg avant finalite |
| ERR-52-09 | TC-ERR-09 | Oui | Fuite de secret detectee |
| ERR-52-10 | TC-ERR-10 | Oui | CUSTODY_MODE_AMBIGUOUS |
| ERR-52-11 | TC-ERR-11 | Oui | CUSTODY_MODE_UNKNOWN |
| ERR-52-12 | TC-ERR-12 | Oui | RPC_INVALID_ENDPOINT |
| ERR-52-13 | TC-ERR-13 | Oui | MAINNET_FORBIDDEN |
| ERR-52-14 | TC-ERR-14 | Oui | PAYLOAD_VALIDATION_FAILED |
3. Scenarios de test — Flux nominaux
TEST-ID: TC-NOM-01
Reference spec: FN-52-01, CA-52-01, INV-52-01
GIVEN
- Un endpoint RPC Polygon testnet (Amoy) valide et accessible
- Le service est demarre avec la configuration Polygon active
WHEN
- 10 appels consecutifs `eth_blockNumber` sont executes sur l'endpoint Polygon
THEN
- Les 10 appels retournent un numero de bloc valide (entier > 0)
- Aucun appel ne retourne d'erreur
- Le temps de reponse de chaque appel est journalise
AND
- Le journal contient 10 entrees de succes consecutives pour Polygon
- Les numeros de blocs sont monotones non decroissants
TEST-ID: TC-NOM-02
Reference spec: FN-52-01, CA-52-02, INV-52-01
GIVEN
- Un endpoint RPC Arbitrum testnet (Sepolia) valide et accessible
- Le service est demarre avec la configuration Arbitrum active
WHEN
- 10 appels consecutifs `eth_blockNumber` sont executes sur l'endpoint Arbitrum
THEN
- Les 10 appels retournent un numero de bloc valide (entier > 0)
- Aucun appel ne retourne d'erreur
- Le temps de reponse de chaque appel est journalise
AND
- Le journal contient 10 entrees de succes consecutives pour Arbitrum
- Les numeros de blocs sont monotones non decroissants
TEST-ID: TC-NOM-03
Reference spec: FN-52-02, CA-52-03, INV-52-04
GIVEN
- Le mode de custody S1 (CloudHSM/PKCS#11) est configure
- L'infrastructure CloudHSM est accessible en environnement de test
- Aucun autre mode (S2, S3) n'est active simultanement
WHEN
- Un test de capacite de signature secp256k1 est execute via PKCS#11
THEN
- Le mode S1 est marque "valide"
- Le journal de selection affiche un unique mode actif : S1
- La signature produite est verifiable cryptographiquement
AND
- Aucun fallback implicite vers un autre mode n'est tente
- L'evenement de selection est journalise avec horodatage
TEST-ID: TC-NOM-04
Reference spec: FN-52-02, CA-52-03, INV-52-04
GIVEN
- Le mode de custody S2 (AWS KMS ECC_SECG_P256K1 ou Vault Transit) est configure
- Les droits IAM/Vault sont actifs en environnement de test
- Aucun autre mode (S1, S3) n'est active simultanement
WHEN
- Un test de capacite de signature secp256k1 est execute via KMS ou Vault Transit
THEN
- Le mode S2 est marque "valide"
- Le journal de selection affiche un unique mode actif : S2
- La signature produite est verifiable cryptographiquement
AND
- Aucun fallback implicite vers un autre mode n'est tente
- L'evenement de selection est journalise avec horodatage
TEST-ID: TC-NOM-05
Reference spec: FN-52-02, CA-52-03, INV-52-04
GIVEN
- Le mode de custody S3 (hybride HSM + secret chiffre Vault) est configure
- Le materiel derive est accessible et le secret est stocke chiffre dans Vault
- Aucun autre mode (S1, S2) n'est active simultanement
WHEN
- Un test de capacite de signature secp256k1 est execute sur le materiel derive
THEN
- Le mode S3 est marque "valide"
- Le journal de selection affiche un unique mode actif : S3
- La signature produite est verifiable cryptographiquement
- Le secret reste chiffre au repos dans Vault (non extrait en clair)
AND
- Aucun fallback implicite vers un autre mode n'est tente
- L'evenement de selection est journalise avec horodatage
TEST-ID: TC-NOM-06
Reference spec: FN-52-03, CA-52-04, INV-52-03
GIVEN
- Un message canonique de test defini (ex: "ProbatioVault-PD52-connectivity-check")
- Une adresse wallet de service attendue connue
- Un custody mode valide selectionne
WHEN
- Le wallet signe le message canonique
THEN
- Une signature Ethereum (r, s, v) est retournee
- La verification ecrecover retrouve l'adresse wallet attendue
- La signature est conforme au format EIP-191 ou EIP-712
AND
- A aucun moment la cle privee n'apparait dans les logs ou la reponse
- L'operation de signature est journalisee (horodatage, adresse, hash du message)
TEST-ID: TC-NOM-07
Reference spec: FN-52-04, CA-52-05
GIVEN
- Une transaction type d'ancrage est construite (payload minimal representatif)
- Le reseau cible est un testnet (Polygon ou Arbitrum)
- Le wallet dispose de fonds testnet suffisants
WHEN
- Le systeme estime le gas pour cette transaction
- Puis la transaction est effectivement executee
THEN
- L'estimation de gas est un entier positif
- Le gas reellement consomme est mesure apres execution
- L'ecart relatif |gas_estime - gas_reel| / gas_reel est inferieur a 25%
AND
- L'estimation et la mesure reelle sont journalisees pour audit
- La comparaison est disponible dans les metriques
TEST-ID: TC-NOM-08
Reference spec: FN-52-05, CA-52-06, INV-52-02, INV-52-09
GIVEN
- Une transaction de test est prete pour emission sur un testnet cible
- Le wallet dispose de fonds testnet suffisants
- Le custody mode est valide
- Le seuil de confirmations est configure (valeur connue)
WHEN
- La transaction est emise sur le testnet
- Le systeme suit le hash de transaction jusqu'a inclusion et confirmations
THEN
- La transaction est incluse dans un bloc
- Le nombre de confirmations atteint le seuil configure
- La transaction est marquee "finalisee" uniquement apres atteinte du seuil
- Le temps total emission → finalisation est <= 30 secondes
AND
- Le hash de transaction est journalise
- L'etat de confirmation est tracable dans le journal
- La transaction est bien sur testnet (chain ID testnet verifie)
TEST-ID: TC-NOM-09
Reference spec: FN-52-06, CA-52-07, INV-52-06, INV-52-07
GIVEN
- Un provider primaire et un provider secondaire sont configures pour un reseau
- Le provider primaire est rendu indisponible (simulation: coupure, timeout)
- Le provider secondaire est operationnel
WHEN
- Un appel RPC (ex: `eth_blockNumber`) est execute
THEN
- Le systeme detecte l'echec sur le provider primaire
- La bascule vers le provider secondaire est automatique
- L'appel RPC retourne un resultat valide via le secondaire
- Le temps total de bascule est < 5 secondes
AND
- L'appelant applicatif n'a pas connaissance du failover (transparence)
- Le changement de provider est journalise (provider source, provider cible, duree de bascule)
- Le provider actif est mis a jour dans les metriques
TEST-ID: TC-NOM-10
Reference spec: FN-52-07, CA-52-08, INV-52-10
GIVEN
- Le service est en execution avec au moins un reseau connecte
- Des transactions ont ete effectuees (ou le service tourne depuis > 1 minute)
WHEN
- L'endpoint ou le rapport d'observabilite est consulte
THEN
- Les metriques suivantes sont presentes :
1. Latence RPC (derniere mesure)
2. Gas price (derniere mesure)
3. Solde wallet (en unites natives du reseau)
4. Provider actif (identifiant du provider en cours d'utilisation)
- Chaque metrique est horodatee
AND
- Les valeurs sont coherentes avec l'etat runtime observe
- Le format est exploitable pour supervision et alerting (JSON ou Prometheus)
TEST-ID: TC-NOM-11
Reference spec: CA-52-09, INV-52-03
GIVEN
- Une campagne de tests complete a ete executee
- Les logs applicatifs, les fichiers de configuration et le code source sont accessibles
WHEN
- Un audit automatise est execute sur :
1. Les logs applicatifs (recherche de patterns cle privee hexadecimale 64 chars, mnemonic, seed)
2. Les fichiers de configuration (recherche de cle en clair)
3. Le code source (recherche de hardcoded secrets)
4. Les variables d'environnement runtime
5. Les traces (OpenTelemetry ou autre)
THEN
- Aucune cle privee en clair n'est detectee dans aucune des 5 sources
- Aucun materiel secret exploitable n'est expose
AND
- Le rapport d'audit est genere avec zero finding critique
TEST-ID: TC-NOM-12
Reference spec: CA-52-10, INV-52-08
GIVEN
- Au moins une transaction type d'ancrage a ete emise sur testnet
- Le payload de la transaction est inspectable (via explorateur testnet ou API)
WHEN
- Le payload (data field) de la transaction est inspecte
THEN
- Le payload contient exclusivement des hash (hexadecimaux)
- Aucun champ ne contient de donnees personnelles (noms, emails, adresses physiques)
- Aucune metadonnee identifiante n'est presente
AND
- L'inspection est reproductible via le hash de transaction
- Le format du payload est documente pour audit
TEST-ID: TC-NOM-13
Reference spec: CA-52-12, INV-52-12
GIVEN
- Le code source est commite dans le repository
- Le pipeline CI est configure et operationnel
- Les tests unitaires et d'integration sont ecrits
WHEN
- Le pipeline CI est declenche
THEN
- Les tests unitaires s'executent avec succes
- Les tests d'integration s'executent avec succes
- La couverture unitaire est >= 80%
- Le pipeline est vert (statut success)
AND
- Le rapport de couverture est genere et accessible
- Aucun test n'est marque "skip" sauf justification documentee
4. Scenarios de test — Cas d'erreur
TEST-ID: TC-ERR-01
Reference spec: ERR-52-01, INV-52-07
GIVEN
- Le provider primaire RPC est indisponible (timeout ou erreur reseau)
- Le provider secondaire est operationnel
WHEN
- Un appel RPC est effectue par le service
THEN
- L'erreur sur le primaire est detectee
- La bascule vers le secondaire est automatique
- L'appel est servi par le secondaire sans erreur remontee a l'appelant
AND
- L'erreur du primaire est journalisee (code, message, timestamp)
- Le journal NE contient PAS de secret (token, cle API provider en clair)
- La metrique "provider actif" est mise a jour vers le secondaire
TEST-ID: TC-ERR-02
Reference spec: ERR-52-02
GIVEN
- Le provider primaire RPC est indisponible
- Le provider secondaire RPC est egalement indisponible
WHEN
- Un appel RPC est effectue par le service
THEN
- Le systeme retourne l'erreur `RPC_UNAVAILABLE`
- L'appel est marque en echec
- Aucune tentative de transaction n'est effectuee
AND
- L'erreur est journalisee avec le code `RPC_UNAVAILABLE`, le reseau concerne et l'horodatage
- Les deux providers en echec sont mentionnes dans le journal
- Le systeme reste dans un etat stable (pas de crash, pas de retry infini)
TEST-ID: TC-ERR-03
Reference spec: ERR-52-03, INV-52-04, INV-52-05
GIVEN
- Aucun custody mode (S1, S2, S3) n'est defini dans la configuration
- (Variante : le champ de configuration est vide ou absent)
WHEN
- Le systeme tente d'initier une signature ou emission de transaction
THEN
- Le systeme retourne l'erreur `CUSTODY_MODE_MISSING`
- Aucune tentative de signature n'est effectuee
- Aucune transaction n'est emise
AND
- L'erreur est journalisee avec le code `CUSTODY_MODE_MISSING`
- Le systeme ne bascule pas implicitement sur un mode par defaut
TEST-ID: TC-ERR-04
Reference spec: ERR-52-04, INV-52-04, INV-52-05
GIVEN
- Un custody mode est configure (ex: S1)
- La capacite secp256k1 pour ce mode est non fonctionnelle
(ex: CloudHSM inaccessible, KMS sans permission, cle corrompue)
WHEN
- Le systeme execute le test de capacite de signature
THEN
- Le systeme retourne l'erreur `CUSTODY_MODE_INVALID`
- Le mode est marque "invalide"
- L'emission de transaction est interdite
AND
- L'erreur est journalisee avec le code `CUSTODY_MODE_INVALID` et le mode concerne
- Le systeme ne bascule pas vers un autre mode de custody
- Aucune signature degradee n'est produite
TEST-ID: TC-ERR-05
Reference spec: ERR-52-05
GIVEN
- Un custody mode est configure et marque "valide"
- La signature produite ne correspond PAS a l'adresse wallet attendue
(ex: cle incorrecte, desynchronisation adresse/cle)
WHEN
- Le systeme verifie la signature apres signature du message canonique
THEN
- Le systeme retourne l'erreur `SIGNATURE_VERIFICATION_FAILED`
- Le mode est marque "non conforme"
- Aucune transaction n'est emise avec cette signature
AND
- L'erreur est journalisee avec l'adresse attendue, l'adresse recuperee, et le hash du message
- Ni la cle privee ni la signature brute ne figurent dans les logs
TEST-ID: TC-ERR-06
Reference spec: ERR-52-06
GIVEN
- Le wallet de service a un solde insuffisant pour couvrir le gas estime
- Le gas estime pour la transaction type est connu
WHEN
- Le systeme tente d'emettre une transaction
THEN
- Le systeme retourne l'erreur `INSUFFICIENT_FUNDS`
- La transaction n'est pas emise
AND
- L'erreur est journalisee avec le solde actuel, le gas estime, et le deficit
- Le solde wallet est mis a jour dans les metriques
- Aucune transaction partielle n'est soumise au reseau
TEST-ID: TC-ERR-07
Reference spec: ERR-52-07
GIVEN
- Un plafond gas est configure (ex: 100 Gwei)
- Le gas price actuel du reseau depasse ce plafond
WHEN
- Le systeme tente d'emettre une transaction
THEN
- Le systeme retourne l'erreur `GAS_PRICE_CEILING_EXCEEDED`
- La transaction est rejetee ou mise en attente selon la politique configuree
AND
- L'erreur est journalisee avec le gas price actuel et le plafond configure
- La metrique gas price est mise a jour
- La politique appliquee (rejet strict / mise en queue) est tracee dans le journal
TEST-ID: TC-ERR-08
Reference spec: ERR-52-08, CA-52-11, INV-52-09
GIVEN
- Une transaction est incluse dans un bloc mais n'a pas atteint le seuil de confirmations
- Une reorganisation de chaine (reorg) survient
(simulation : le bloc contenant la transaction est invalide)
WHEN
- Le systeme detecte que le bloc de la transaction n'est plus dans la chaine canonique
THEN
- L'etat de la transaction repasse a "non finalisee"
- Le suivi de la transaction continue jusqu'a nouvelle inclusion et finalite
- Si la transaction ne reapparait pas apres un delai configurable, elle est marquee "echouee"
AND
- Le changement d'etat est journalise (finalisee → non finalisee → suivi repris)
- Aucune confirmation prematuree n'est emise a l'appelant
TEST-ID: TC-ERR-09
Reference spec: ERR-52-09, INV-52-03
GIVEN
- Une campagne de tests est en cours d'execution
- Un mecanisme de detection de fuite de secrets est actif (scanner de logs)
WHEN
- Le scanner detecte un pattern de cle privee ou secret exploitable dans les logs
THEN
- La campagne d'acceptation est immediatement interrompue
- Un statut "non-conformite securite" est emis
- Le test global est marque en echec
AND
- Le fichier et la ligne contenant la fuite sont identifies dans le rapport
- L'interruption est automatique (pas de validation manuelle requise)
- Le rapport de non-conformite est genere pour audit
5. Tests d'invariants (non negociables)
| Invariant | Test(s) dedies | Observable | Commentaire |
| INV-52-01 | TC-NOM-01, TC-NOM-02 | 10/10 succes sur chaque reseau | Polygon ET Arbitrum obligatoires |
| INV-52-02 | TC-INV-02 | Chain ID testnet verifie | Voir scenario ci-dessous |
| INV-52-03 | TC-NOM-06, TC-NOM-11, TC-INV-03a, TC-INV-03b, TC-INV-03c | Zero secret en clair detecte | Couverture multi-couche |
| INV-52-04 | TC-NOM-03, TC-NOM-04, TC-NOM-05, TC-INV-04 | Journal de selection unique | Un et un seul mode |
| INV-52-05 | TC-ERR-03, TC-ERR-04 | Refus explicite avec code d'erreur | Aucune signature degradee |
| INV-52-06 | TC-NOM-09, TC-INV-06 | Deux providers configures par reseau | Minimum contractuel |
| INV-52-07 | TC-NOM-09, TC-ERR-01 | Bascule < 5s, transparente | Automatique sans intervention |
| INV-52-08 | TC-NOM-12, TC-INV-08 | Payload inspecte = hash uniquement | Aucune donnee identifiante |
| INV-52-09 | TC-NOM-08, TC-ERR-08 | Seuil de confirmations respecte | Protection reorg |
| INV-52-10 | TC-NOM-10 | 4 metriques presentes et horodatees | Latence, gas, solde, provider |
| INV-52-11 | TC-INV-11a, TC-INV-11b | Code d'erreur deterministe, sans secret | Diagnostic fiable |
| INV-52-12 | TC-NOM-13, TC-INV-12 | Pipeline CI vert, couverture >= 80% | Refus automatique sinon |
Scenarios d'invariants dedies
TEST-ID: TC-INV-02
Reference spec: INV-52-02
GIVEN
- Le service est configure pour operer sur testnet
WHEN
- Une transaction est construite et signee
THEN
- Le chain ID de la transaction correspond a un testnet connu :
* Polygon Amoy : 80002
* Arbitrum Sepolia : 421614
- Aucun chain ID mainnet n'est utilise (137 pour Polygon, 42161 pour Arbitrum)
AND
- La verification du chain ID est effectuee AVANT emission
- Toute tentative avec un chain ID mainnet est bloquee avec erreur explicite
TEST-ID: TC-INV-03a
Reference spec: INV-52-03
GIVEN
- Le code source est accessible
WHEN
- Une analyse statique (grep, scanner de secrets type gitleaks/trufflehog) est executee
THEN
- Aucune cle privee hexadecimale (64 caracteres) n'est detectee
- Aucun mnemonic (12/24 mots BIP-39) n'est detecte
- Aucun seed n'est detecte
AND
- Le scan couvre tous les fichiers du repository (y compris historique git)
TEST-ID: TC-INV-03b
Reference spec: INV-52-03
GIVEN
- Le service est en execution et a traite des transactions
WHEN
- Les logs applicatifs sont inspectes (grep de patterns cryptographiques)
THEN
- Aucune cle privee en clair n'apparait dans les logs
- Aucun materiel secret (seed, mnemonic, cle brute) n'est journalise
AND
- Les logs contiennent uniquement des adresses publiques et hash de transactions
TEST-ID: TC-INV-03c
Reference spec: INV-52-03
GIVEN
- Les variables d'environnement runtime sont inspectables
WHEN
- La liste des variables d'environnement est auditee
THEN
- Aucune variable ne contient une cle privee en clair
- Les references aux secrets sont des chemins Vault ou des identifiants KMS (jamais des valeurs brutes)
AND
- L'audit couvre les environnements de test et de CI
TEST-ID: TC-INV-04
Reference spec: INV-52-04
GIVEN
- Le systeme est configure avec deux modes de custody simultanement (ex: S1 et S2)
WHEN
- Le systeme demarre et tente de selectionner un mode
THEN
- Le systeme refuse de demarrer ou retourne une erreur `CUSTODY_MODE_AMBIGUOUS`
- Aucune signature n'est possible tant que la configuration est ambigue
AND
- L'erreur est journalisee avec les modes en conflit
TEST-ID: TC-INV-06
Reference spec: INV-52-06
GIVEN
- La configuration reseau est chargee
WHEN
- La liste des providers par reseau est inspectee
THEN
- Chaque reseau (Polygon, Arbitrum) a au minimum 2 providers configures (primaire + secondaire)
- Les endpoints sont distincts (pas de duplication)
AND
- La configuration est validee au demarrage du service
- Si un reseau n'a qu'un seul provider, le demarrage echoue avec erreur explicite
TEST-ID: TC-INV-08
Reference spec: INV-52-08
GIVEN
- Toutes les transactions emises pendant la campagne de test sont collectees
WHEN
- Chaque payload est decode et analyse
THEN
- Les donnees emises sont exclusivement :
* Hash de documents (SHA-256 ou equivalent)
* Metadonnees techniques (timestamp, version, type d'operation)
- Aucun champ ne contient : nom, email, adresse, numero de document, ni toute donnee a caractere personnel
AND
- L'analyse couvre 100% des transactions emises pendant la campagne
TEST-ID: TC-INV-11a
Reference spec: INV-52-11
GIVEN
- Une erreur RPC survient (timeout, erreur reseau, reponse malformee)
WHEN
- Le systeme traite l'erreur
THEN
- Un code d'erreur deterministe est retourne (ex: `RPC_TIMEOUT`, `RPC_UNAVAILABLE`, `RPC_MALFORMED_RESPONSE`)
- Le code d'erreur est le meme pour des conditions d'erreur identiques (determinisme)
AND
- L'erreur est journalisee avec : code, reseau, provider, horodatage
- Le message d'erreur ne contient ni token d'API provider ni secret
TEST-ID: TC-INV-11b
Reference spec: INV-52-11
GIVEN
- Une erreur de signature survient (HSM timeout, KMS erreur, cle invalide)
WHEN
- Le systeme traite l'erreur
THEN
- Un code d'erreur deterministe est retourne (ex: `SIGNATURE_FAILED`, `HSM_UNAVAILABLE`)
- Le message d'erreur ne contient aucun materiel cryptographique
AND
- L'erreur est journalisee avec : code, mode custody, horodatage
- Aucune partie de la cle privee ou du processus de derivation n'est exposee
TEST-ID: TC-INV-12
Reference spec: INV-52-12
GIVEN
- Le pipeline CI est configure avec les stages de test
WHEN
- Un commit est pousse sur la branche de la story
THEN
- Les tests contractuels PD-52 sont automatiquement executes
- Si un test echoue, le pipeline est en echec (pas de passage en force)
- La couverture unitaire est calculee et rapportee (>= 80%)
AND
- Le rapport de tests et de couverture est publie comme artefact CI
- Aucun test ne peut etre desactive sans justification dans le code (commentaire + ticket)
6. Tests de non-regression
| Test ID | Objet | Observable | Commentaire |
| TC-NR-01 | Reconnexion apres interruption reseau temporaire | Le service reprend les appels RPC sans redemarrage apres retour du reseau | Stabilite long terme |
| TC-NR-02 | Re-selection du mode custody apres redemarrage du service | Le mode configure avant arret est re-selectionne et re-valide au redemarrage | Pas de perte de configuration |
| TC-NR-03 | Stabilite du failover apres bascule repetee | Apres 5 bascules primaire↔secondaire, le systeme reste stable et fonctionnel | Pas de fuite memoire ou d'etat corrompu |
| TC-NR-04 | Coherence des metriques apres failover | Les metriques refletent le provider actif reel apres une ou plusieurs bascules | Metriques fiables post-incident |
| TC-NR-05 | Transaction apres failover | Une transaction emise apres failover est correctement signee et confirmee | Chaine signature → emission intacte apres bascule |
| TC-NR-06 | Pas de regression sur chain ID apres changement de configuration | La modification d'un endpoint RPC ne permet pas d'emettre sur mainnet | Protection INV-52-02 persistante |
| TC-NR-07 | Learning PD-7 : tests en CI apres chaque modification | Toute modification du code PD-52 declenche l'execution des tests en CI | Refus automatique si CI non verte |
7. Tests negatifs et adversariaux
| Test ID | Entree invalide / abus | Resultat attendu | Observable |
| TC-NEG-01 | Configuration avec un custody mode inexistant (ex: "S4") | Rejet au demarrage avec erreur CUSTODY_MODE_UNKNOWN | Log d'erreur avec le mode invalide |
| TC-NEG-02 | Appel RPC avec endpoint URL malformee | Erreur RPC_INVALID_ENDPOINT au demarrage, pas de tentative de connexion | Validation de configuration precoce |
| TC-NEG-03 | Injection dans le payload de transaction (donnees personnelles en hex dans le champ data) | La couche de validation rejette le payload non conforme ou le transforme en hash | Aucune donnee identifiante emise on-chain |
| TC-NEG-04 | Tentative d'emission sur mainnet chain ID (137 ou 42161) | Transaction bloquee avec erreur MAINNET_FORBIDDEN | Protection INV-52-02 |
| TC-NEG-05 | Envoi massif de transactions (100 en 10 secondes) pour epuiser le solde | Le systeme detecte le solde insuffisant et refuse apres seuil, pas de dette gas | Erreur INSUFFICIENT_FUNDS avant epuisement total |
| TC-NEG-06 | Modification de la configuration custody mode pendant une signature en cours | La signature en cours utilise le mode initial, pas de corruption mid-flight | Coherence transactionnelle |
| TC-NEG-07 | Provider primaire retourne des reponses JSON-RPC valides mais avec des donnees incoherentes (bloc = 0, gas = -1) | Le systeme detecte l'incoherence et declenche le failover ou retourne une erreur | Protection contre provider compromis |
| TC-NEG-08 | Tentative de lecture de la cle privee via l'API d'observabilite | L'endpoint ne retourne aucun secret, uniquement les metriques contractuelles | Separation stricte metriques / secrets |
| TC-NEG-09 | Timeout extreme sur provider primaire (> 30 secondes de latence) | Failover declenche dans le delai contractuel (< 5s), pas d'attente des 30s | Timeout de detection << timeout provider |
| TC-NEG-10 | Deux instances du service tentent d'utiliser le meme wallet simultanement | Pas de double-spend, nonce manage correctement ou erreur explicite | Protection contre race condition |
8. Observabilite requise pour les tests
Pour que les scenarios ci-dessus soient executables et verifiables, les observables suivants doivent etre disponibles :
Etat systeme
- Custody mode actif (S1/S2/S3 ou aucun)
- Provider actif par reseau (primaire/secondaire)
- Etat de connexion par reseau (connecte/deconnecte)
- Nombre de failovers depuis le demarrage
Reponse API / Service
- Code de retour structure pour chaque operation (succes ou erreur deterministe)
- Hash de transaction retourne apres emission
- Etat de finalisation par transaction (pending/confirmed/finalized/failed)
- Estimation de gas avant emission
Journal d'audit
- Evenements de selection du custody mode (horodatage, mode, resultat)
- Evenements de signature (horodatage, adresse, hash message, succes/echec — JAMAIS de cle)
- Evenements de failover (horodatage, provider source, provider cible, duree)
- Evenements de transaction (horodatage, hash, reseau, chain ID, statut)
- Erreurs RPC (horodatage, code, reseau, provider — JAMAIS de token API)
Metriques operationnelles
- Latence RPC (derniere mesure, par reseau et provider)
- Gas price (derniere mesure, par reseau)
- Solde wallet (derniere mesure, par reseau)
- Provider actif (identifiant, par reseau)
- Horodatage de chaque metrique
Export probatoire
- Rapport d'audit de secrets (resultat du scan, nombre de findings)
- Rapport de couverture de tests (pourcentage, fichiers couverts)
- Rapport d'inspection des payloads on-chain (hash des transactions, contenu decode)
- Historique de confirmations par transaction (bloc, nombre de confirmations, horodatage)
9. Regles non testables
| Regle | Raison | Impact |
| "Perception utilisateur de la confiance induite par la blockchain" (hors perimetre spec) | Subjectif, non mesurable, hors perimetre contractuel PD-52 | Mineur — correctement exclu par la specification |
| "Interpretation juridique definitive de la valeur probatoire" (hors perimetre spec) | Depend de la juridiction et de l'evolution legale, non deterministe | Mineur — correctement exclu par la specification |
| Comportement exact en cas de reorg prolongee (> N blocs) | Le seuil de confirmations n'est pas encore defini (point a clarifier #1). Le test TC-ERR-08 couvre le cas nominal mais le comportement apres un delai prolonge sans re-inclusion est indetermine | Majeur — necessite clarification du seuil et du timeout d'abandon |
| Politique exacte GAS_PRICE_CEILING_EXCEEDED (rejet vs queue vs TTL) | Point a clarifier #3 de la specification. TC-ERR-07 couvre le cas generique mais la politique precise est non testable tant que non definie | Majeur — necessite decision architecturale |
| Critere de conformite S3 "secret chiffre au repos" | Point a clarifier #5 de la specification. La methode de preuve que le materiel derive reste chiffre n'est pas definie | Majeur — bloque la validation complete de TC-NOM-05 sur le volet chiffrement au repos |
| Seuil de solde wallet "critique" pour alerting | Point a clarifier #7 de la specification. Le seuil d'alerte n'est pas defini | Mineur — n'impacte pas les tests fonctionnels, uniquement l'alerting operationnel |
10. Verdict QA
⚠️ Testable partiellement (avec reserves listees)
Couverture atteinte
- 12/12 invariants couverts par au moins un scenario de test
- 12/12 criteres d'acceptation couverts par au moins un scenario de test
- 9/9 cas d'erreur couverts par un scenario dedie
- 7 flux nominaux couverts integralement
- 7 tests de non-regression definis
- 10 tests negatifs/adversariaux definis
- Total : 43 scenarios de test
Reserves
Les reserves suivantes doivent etre levees avant acceptation :
| # | Reserve | Points a clarifier references | Impact |
| R1 | Seuil de confirmations non defini par reseau | Point #1 | TC-NOM-08 et TC-ERR-08 executables mais seuil = parametre a fournir |
| R2 | Politique GAS_PRICE_CEILING_EXCEEDED non tranchee | Point #3 | TC-ERR-07 couvre le cas generique, verification de la politique exacte impossible |
| R3 | Methode de preuve S3 "chiffre au repos" non specifiee | Point #5 | TC-NOM-05 partiellement verifiable sur le volet chiffrement |
| R4 | Endpoint d'observabilite non defini (format/source de verite) | Point #6 | TC-NOM-10 verifiable sur le contenu, format exact non validable |
| R5 | Definition normative "transaction type d'ancrage" pendante | Point #2 | TC-NOM-07, TC-NOM-08, TC-NOM-12 utilisent un payload "representatif" non canonique |
Recommandation
Les 5 reserves sont liees aux points a clarifier identifies dans la specification. Aucune ne bloque la redaction des tests mais elles devront etre resolues pour que la campagne d'acceptation soit pleinement executable. Le cadre de test est complet et pret pour implementation des qu'une decision sera prise sur ces points.