Aller au contenu

PD-86-TESTS

1. Matrice de couverture

1.1 Couverture des invariants

Invariant Scénario(s)
INV-86-01 TC-86-04, TC-86-18, TC-86-19, TC-86-20
INV-86-02 TC-86-17
INV-86-03 TC-86-05
INV-86-04 TC-86-14
INV-86-05 TC-86-01, TC-86-02, TC-86-03
INV-86-06 TC-86-13, TC-86-27
INV-86-07 TC-86-06
INV-86-08 TC-86-06
INV-86-09 TC-86-08, TC-86-09, TC-86-18, TC-86-19, TC-86-20, TC-86-26
INV-86-10 TC-86-16
INV-86-11 TC-86-07, TC-86-25
INV-86-12 TC-86-15
INV-86-13 TC-86-12
INV-86-14 TC-86-10
INV-86-15 TC-86-11
INV-86-16 TC-86-27
INV-86-17 TC-86-28, TC-86-30
INV-86-18 TC-86-29
INV-86-19 TC-86-31, TC-86-32
INV-86-20 TC-86-30

1.2 Couverture des critères d'acceptation

Critère d'acceptation Scénario(s)
CA-86-01 TC-86-01
CA-86-02 TC-86-02
CA-86-03 TC-86-03
CA-86-04 TC-86-04
CA-86-05 TC-86-05
CA-86-06 TC-86-06
CA-86-07 TC-86-07
CA-86-08 TC-86-08
CA-86-09 TC-86-09
CA-86-10 TC-86-10
CA-86-11 TC-86-11
CA-86-12 TC-86-12
CA-86-13 TC-86-16
CA-86-14 TC-86-27
CA-86-15 TC-86-28
CA-86-16 TC-86-30
CA-86-17 TC-86-31, TC-86-32
CA-86-18 TC-86-03, TC-86-25, TC-86-26
CA-86-19 TC-86-29

2. Scénarios de test (TC-86-XX)

TC-86-01 — Image sensible: modal avant rendu

  • Description : Vérifier qu'une image détectée sensible n'est jamais rendue avant consentement.
  • Prérequis : Détection globale activée; document image de référence classé sensible; préférence document = WARN.
  • Étapes :
  • Ouvrir le document image dans le viewer.
  • Observer la première sortie UI.
  • Résultat attendu : Modal de consentement affiché avant tout pixel du média; rendu autorisé seulement après action explicite.
  • Couvre : INV-86-05, CA-86-01.

TC-86-02 — Vidéo sensible: agrégation max + modal

  • Description : Vérifier l'agrégation max(score_categorie) sur 12 frames et le gate modal.
  • Prérequis : Détection activée; vidéo de référence dont une frame dépasse un seuil.
  • Étapes :
  • Ouvrir la vidéo.
  • Vérifier que l'analyse porte sur 12 frames max (incluant les 2 premières secondes).
  • Observer le comportement d'affichage.
  • Résultat attendu : isSensitive=true si au moins une frame dépasse un seuil; modal avant tout rendu vidéo.
  • Couvre : INV-86-05, CA-86-02.

TC-86-03 — PDF sensible: modal avant toute page

  • Description : Vérifier le gate de consentement pour PDF sensible.
  • Prérequis : Détection activée; PDF de référence classé sensible; préférence = WARN.
  • Étapes :
  • Ouvrir le PDF.
  • Observer l'écran initial.
  • Résultat attendu : Modal affiché avant toute page rendue.
  • Couvre : INV-86-05, CA-86-03.

TC-86-04 — Zéro transmission réseau de contenu/scores

  • Description : Vérifier l'absence d'émission réseau liée à l'analyse.
  • Prérequis : Instrumentation réseau active; jeu de documents image/vidéo/PDF.
  • Étapes :
  • Ouvrir successivement les documents.
  • Capturer l'ensemble des flux réseau pendant analyse et affichage.
  • Résultat attendu : Aucun flux sortant contenant pixels, dérivés visuels, scores, catégories, statut d'analyse.
  • Couvre : INV-86-01, CA-86-04.

TC-86-05 — Intégrité probatoire (hash inchangé)

  • Description : Vérifier que l'analyse ne modifie jamais le fichier original.
  • Prérequis : Hash probatoire calculé avant ouverture.
  • Étapes :
  • Ouvrir et analyser le document.
  • Recalculer le hash après fermeture.
  • Résultat attendu : Hash strictement identique avant/après.
  • Couvre : INV-86-03, CA-86-05.

TC-86-06 — Cache minimal autorisé + chiffrement

  • Description : Vérifier contenu et sécurité du cache de verdict.
  • Prérequis : Au moins un document analysé en SUCCESS.
  • Étapes :
  • Inspecter l'entrée de cache associée au document.
  • Contrôler les champs présents.
  • Vérifier le chiffrement au repos.
  • Résultat attendu : Présence uniquement des champs autorisés (documentId, isSensitive, catégories, rawScores, roundedScores, modelVersion, analyzedAt, analysisStatus, thresholdsVersionAtDecision); aucune donnée visuelle/embedding/OCR/texte; cache chiffré.
  • Couvre : INV-86-07, INV-86-08, CA-86-06.

TC-86-07 — Absence de fichiers temporaires média

  • Description : Vérifier qu'aucun fichier temporaire média clair n'est laissé.
  • Prérequis : Inventaire initial du système de fichiers applicatif.
  • Étapes :
  • Exécuter une analyse SUCCESS.
  • Exécuter une analyse en échec (ex: format invalide).
  • Refaire l'inventaire.
  • Résultat attendu : Aucun fichier image/frame/thumbnail/preview temporaire en clair après succès et échec.
  • Couvre : INV-86-11, CA-86-07.

TC-86-08 — TIMEOUT: modal prudent

  • Description : Vérifier le comportement prudent sur timeout.
  • Prérequis : Condition de timeout reproductible (durationMs > 5000).
  • Étapes :
  • Ouvrir un document provoquant TIMEOUT.
  • Observer UI et statut persistant.
  • Résultat attendu : Modal "non analysé / potentiellement sensible" affiché; pas de crash; statut horodaté.
  • Couvre : INV-86-09, CA-86-08.

TC-86-09 — MODEL_UNAVAILABLE: dégradation contrôlée

  • Description : Vérifier le flux utilisateur quand le modèle est indisponible.
  • Prérequis : Modèle absent/inaccessible.
  • Étapes :
  • Ouvrir un document supporté.
  • Observer UI et persistance.
  • Résultat attendu : Modal prudent affiché; possibilité utilisateur conservée; pas de crash; statut MODEL_UNAVAILABLE horodaté.
  • Couvre : INV-86-09, CA-86-09.

TC-86-10 — Désactivation globale

  • Description : Vérifier que enabled=false bloque toute nouvelle classification.
  • Prérequis : Paramètre global désactivé.
  • Étapes :
  • Ouvrir un document non encore classifié.
  • Contrôler absence de nouveau verdict.
  • Réactiver puis rouvrir.
  • Résultat attendu : Aucune classification quand désactivé; reprise immédiate à réactivation; aucun impact sur fichier/preuves.
  • Couvre : INV-86-14, CA-86-10.

TC-86-11 — Préférence document réversible

  • Description : Vérifier "ne plus me prévenir" par document et sa réversibilité.
  • Prérequis : Deux documents sensibles A et B; préférence initiale WARN.
  • Étapes :
  • Mettre A en SUPPRESSED.
  • Ouvrir A puis B.
  • Revenir A en WARN et rouvrir A.
  • Résultat attendu : Suppression du modal uniquement sur A en SUPPRESSED (hors règles mineur/prudence); B inchangé; retour immédiat du modal sur A après réactivation WARN.
  • Couvre : INV-86-15, CA-86-11.

TC-86-12 — Changement modelVersion: invalidation + reclassification

  • Description : Vérifier invalidation d'un verdict cache quand modelVersion change.
  • Prérequis : Document déjà classifié en version V1.
  • Étapes :
  • Simuler disponibilité version V2.
  • Ouvrir le même document.
  • Résultat attendu : Verdict V1 invalidé; nouvelle classification exécutée; verdict persisté avec V2.
  • Couvre : INV-86-13, CA-86-12.

TC-86-13 — Mineur: confirmation explicite additionnelle

  • Description : Vérifier l'étape de confirmation supplémentaire pour mineur.
  • Prérequis : context.isMinor=true; document sensible; préférence WARN.
  • Étapes :
  • Ouvrir le document.
  • Choisir "Afficher quand même".
  • Résultat attendu : Confirmation additionnelle obligatoire avant rendu effectif.
  • Couvre : INV-86-06.

TC-86-14 — Whitelist stricte des catégories

  • Description : Vérifier qu'aucune catégorie hors whitelist ne peut déclencher sensible.
  • Prérequis : Jeu de sortie de classification de référence contenant catégories whitelist + hors whitelist.
  • Étapes :
  • Évaluer les verdicts.
  • Contrôler la décision isSensitive.
  • Résultat attendu : Seules VIOLENCE, NUDITE, SEXUEL, CHOQUANT influencent le flag sensible.
  • Couvre : INV-86-04.

TC-86-15 — Hygiène des logs (whitelist/blacklist)

  • Description : Vérifier la politique explicite de champs loggables.
  • Prérequis : Capture complète des logs applicatifs pendant analyses variées.
  • Étapes :
  • Exécuter analyses SUCCESS et erreurs.
  • Scanner les logs contre la whitelist autorisée.
  • Vérifier l'absence des champs blacklistés.
  • Résultat attendu : Uniquement champs autorisés; aucun pixel data, miniature, chemin de fichier média, EXIF, dump handle, métadonnée reconstructible.
  • Couvre : INV-86-12.

TC-86-16 — Zeroization best-effort des buffers

  • Description : Vérifier la libération/effacement best-effort en fin de flux via try/finally.
  • Prérequis : Instrumentation mémoire activée; scénarios succès, timeout, annulation.
  • Étapes :
  • Exécuter chaque scénario.
  • Observer les appels de cleanup sur tous chemins d'exécution.
  • Vérifier non-réutilisabilité des buffers post-traitement.
  • Résultat attendu : Buffers de rendu/analyse nettoyés/libérés sur succès/erreur/annulation.
  • Couvre : INV-86-10, CA-86-13.

TC-86-17 — Détection uniquement au viewer

  • Description : Vérifier absence d'analyse à l'import/upload.
  • Prérequis : Journal d'événements d'application; document non consulté.
  • Étapes :
  • Importer/ajouter le document sans l'ouvrir.
  • Contrôler les événements d'analyse.
  • Ouvrir ensuite le document.
  • Résultat attendu : Aucune classification avant ouverture viewer; classification possible à l'ouverture uniquement.
  • Couvre : INV-86-02.

TC-86-18 — UNSUPPORTED_FORMAT: modal prudent + zéro réseau

  • Description : Vérifier comportement sur format non pris en charge.
  • Prérequis : Fichier de format hors contrat; instrumentation réseau active.
  • Étapes :
  • Ouvrir le fichier.
  • Observer UI.
  • Capturer trafic réseau.
  • Résultat attendu : Message clair format non supporté + modal prudent; pas de crash; statut UNSUPPORTED_FORMAT horodaté; aucun envoi réseau de contenu/scores.
  • Couvre : INV-86-09, INV-86-01.

TC-86-19 — CORRUPTED_INPUT: modal prudent + zéro réseau

  • Description : Vérifier dégradation contrôlée sur entrée corrompue.
  • Prérequis : Média volontairement corrompu; instrumentation réseau active.
  • Étapes :
  • Ouvrir le média.
  • Observer UI et statut.
  • Capturer trafic réseau.
  • Résultat attendu : Message non culpabilisant + modal prudent; pas de crash; statut CORRUPTED_INPUT horodaté; pas d'envoi réseau.
  • Couvre : INV-86-09, INV-86-01.

TC-86-20 — INTERNAL_ERROR: dégradation + zéro réseau

  • Description : Vérifier dégradation contrôlée en erreur interne inattendue.
  • Prérequis : Injection d'erreur interne déterministe; instrumentation réseau active.
  • Étapes :
  • Ouvrir un document supporté.
  • Observer UI et statut.
  • Capturer trafic réseau.
  • Résultat attendu : Contenu masqué par défaut; contrôle utilisateur conservé; pas de crash; statut INTERNAL_ERROR horodaté; pas d'envoi réseau.
  • Couvre : INV-86-09, INV-86-01.

TC-86-21 — KEEP_HIDDEN / CANCEL

  • Description : Vérifier les décisions de gate sans rendu non autorisé.
  • Prérequis : Document sensible; modal affiché.
  • Étapes :
  • Choisir KEEP_HIDDEN.
  • Refaire puis choisir CANCEL.
  • Résultat attendu : Aucun rendu du contenu dans les deux cas; retour à l'état masqué.
  • Couvre : Contrat gate viewer.

TC-86-22 — Warm-up à l'ouverture du coffre + lazy fallback

  • Description : Vérifier stratégie warm-up puis fallback lazy.
  • Prérequis : Session fraîche.
  • Étapes :
  • Ouvrir le coffre (sans ouvrir de document).
  • Ouvrir un premier document immédiatement.
  • Résultat attendu : Warm-up déclenché au coffre; si warm-up non prêt, fallback lazy appliqué au premier document sans rupture de flux.
  • Couvre : Exigences performance.

TC-86-23 — Budget temps P95 et non-blocage UI

  • Description : Vérifier budget d'analyse <=700 ms au P95 et absence de blocage UI prolongé.
  • Prérequis : iPhone 12 (A14, iOS 16.0+); jeu de documents représentatifs; N=30 exécutions.
  • Étapes :
  • Mesurer durationMs sur 30 ouvertures.
  • Calculer le P95.
  • Mesurer réactivité UI durant analyse.
  • Résultat attendu : P95(durationMs) <= 700 ms (hors décodage viewer incompressible); UI reste interactive.
  • Couvre : Exigences performance.

TC-86-24 — Vidéo: échantillonnage 12 frames max

  • Description : Vérifier absence de décodage intégral et plafond 12 frames.
  • Prérequis : Vidéo longue de référence.
  • Étapes :
  • Ouvrir la vidéo.
  • Relever le nombre de frames effectivement analysées.
  • Résultat attendu : Maximum 12 frames; stratégie uniforme avec inclusion des 2 premières secondes.
  • Couvre : Exigences performance.

TC-86-25 — PDF: rendu mémoire uniquement

  • Description : Vérifier l'absence de persistance disque des rendus de pages.
  • Prérequis : PDF multipage; surveillance I/O disque.
  • Étapes :
  • Ouvrir le PDF.
  • Exécuter analyse puis fermeture.
  • Contrôler traces disque.
  • Résultat attendu : Rendu de pages en mémoire uniquement; aucun artefact persistant.
  • Couvre : INV-86-11, CA-86-18.

TC-86-26 — PDF: stratégie d'échantillonnage déterministe

  • Description : Vérifier la stratégie contractuelle "première + dernière + 3 intérieures uniformes" avec plafond 5.
  • Prérequis : PDF de 20 pages avec instrumentation pdfPageIndexes.
  • Étapes :
  • Ouvrir le PDF.
  • Capturer pdfPagesAnalyzed et pdfPageIndexes.
  • Répéter l'ouverture.
  • Résultat attendu : pdfPagesAnalyzed <= 5; pages 1 et 20 présentes; 3 pages intérieures uniformément réparties; sélection stable/déterministe entre exécutions.
  • Couvre : CA-86-18.

TC-86-27 — Mineur + suppressWarning=true

  • Description : Vérifier que suppressWarning est ignoré pour mineur.
  • Prérequis : isMinor=true; document sensible; préférence suppressWarning=true.
  • Étapes :
  • Ouvrir le document.
  • Choisir "Afficher quand même".
  • Résultat attendu : Modal affiché malgré suppressWarning; confirmation additionnelle obligatoire.
  • Couvre : INV-86-06, INV-86-16, CA-86-14.

TC-86-28 — Mineur: garde-fou seuils (pas de relaxation)

  • Description : Vérifier que les seuils effectifs mineur sont plafonnés aux défauts.
  • Prérequis : isMinor=true; tentative de config seuils supérieurs aux défauts.
  • Étapes :
  • Tenter de sauvegarder des seuils plus permissifs.
  • Lire les seuils effectifs utilisés par le moteur.
  • Résultat attendu : Rejet de la config ou clamp automatique aux seuils par défaut; aucune relaxation effective.
  • Couvre : INV-86-17, CA-86-15.

TC-86-29 — Désactivation globale + document déjà sensible

  • Description : Vérifier le comportement viewer quand verdict sensible existe déjà en cache et enabled=false.
  • Prérequis : Document avec verdict cache isSensitive=true; bascule globale sur enabled=false.
  • Étapes :
  • Ouvrir le document.
  • Observer modal/rendu.
  • Résultat attendu : Aucun modal de détection affiché; contenu rendu directement; aucun nouveau run de classification.
  • Couvre : INV-86-18, CA-86-19.

TC-86-30 — Changement de seuils post-classification

  • Description : Vérifier réévaluation de isSensitive à partir des rawScores sans ré-inférence.
  • Prérequis : Verdict SUCCESS en cache avec rawScores et thresholdsVersionAtDecision=V1.
  • Étapes :
  • Modifier les seuils utilisateur vers version V2.
  • Rouvrir le même document.
  • Vérifier traces exécution moteur.
  • Résultat attendu : isSensitive recalculé localement depuis rawScores; pas de nouvelle inférence; thresholdsVersionAtDecision mis à jour.
  • Couvre : INV-86-20, INV-86-17, CA-86-16.

TC-86-31 — Concurrence: sérialisation des classifications

  • Description : Vérifier absence de race condition sur ouvertures concurrentes du même document.
  • Prérequis : Deux ouvertures simultanées du même (documentId, modelVersion).
  • Étapes :
  • Déclencher deux demandes en parallèle.
  • Capturer l'activité d'analyse et les écritures cache.
  • Résultat attendu : Une seule inférence effective; deuxième demande attend/réutilise le résultat; pas de doublon persistant.
  • Couvre : INV-86-19, CA-86-17.

TC-86-32 — Collision unicité (documentId, modelVersion)

  • Description : Vérifier que l'unicité persistance empêche doublons en cas d'écriture concurrente.
  • Prérequis : Injection de concurrence sur persistance du même couple clé.
  • Étapes :
  • Forcer deux tentatives d'insert simultanées.
  • Inspecter état final du store.
  • Résultat attendu : Une seule ligne finale pour (documentId, modelVersion); second chemin géré en update/idempotence.
  • Couvre : INV-86-19, CA-86-17.

TC-86-33 — Bornes de seuils [0.50, 0.95]

  • Description : Vérifier rejet hors bornes et acceptation aux bornes exactes.
  • Prérequis : UI/API de configuration des seuils disponible.
  • Étapes :
  • Tenter 0.49 puis 0.96.
  • Sauvegarder 0.50 puis 0.95.
  • Résultat attendu : Rejet de <0.50 et >0.95; acceptation stricte de 0.50 et 0.95.
  • Couvre : Règles de modèle de données.

TC-86-34 — Source isMinor non falsifiable localement

  • Description : Vérifier que isMinor provient du profil authentifié serveur et ne peut pas être overridé localement.
  • Prérequis : Session authentifiée B2C-MINEURS; outillage de tentative de patch local du contexte.
  • Étapes :
  • Tenter de forcer isMinor=false côté client.
  • Ouvrir un document sensible.
  • Résultat attendu : Valeur mineur issue du profil serveur conservée; garde-fous mineur appliqués.
  • Couvre : Exigence source isMinor.

3. Tests de sécurité (focus)

ID Contrôle sécurité Résultat attendu
SEC-86-01 Architecture zero-knowledge (capture réseau complète) Aucune transmission de contenu/scores/catégories/statuts vers endpoint distant
SEC-86-02 Chiffrement du cache local de verdict Données de cache illisibles hors contexte applicatif autorisé
SEC-86-03 Interdiction de médias dérivés persistants Aucun frame/thumbnail/preview/embedding/OCR/texte stocké
SEC-86-04 Zeroization best-effort (succès/timeout/annulation) Buffers visuels nettoyés/libérés en fin de flux
SEC-86-05 Hygiène des logs (whitelist/blacklist) Aucun élément reconstructible du contenu visuel; uniquement champs autorisés
SEC-86-06 Source isMinor authentifiée Aucun contournement local du flag mineur
SEC-86-07 Mécanismes iOS d'aperçu Aucun snapshot/indexation/preview non maîtrisé (App Switcher, Spotlight, QuickLook)

4. Tests de performance (focus)

ID Scénario Résultat attendu
PERF-86-01 Budget analyse par ouverture sur iPhone 12 (A14, iOS 16+) P95(durationMs) <= 700 ms (N=30, hors décodage viewer incompressible)
PERF-86-02 Warm-up + lazy fallback Warm-up au coffre; fallback au premier document si nécessaire
PERF-86-03 Non-blocage UI Aucune gel prolongé de l'interface pendant l'analyse
PERF-86-04 Vidéo échantillonnée 12 frames max, inclusion des 2 premières secondes, pas de décodage intégral
PERF-86-05 PDF en mémoire + stratégie déterministe <=5 pages, première+dernière+intérieures uniformes, sans persistance disque

5. Tests de gestion d'erreurs (codes contractuels)

ID Code Vérifications attendues
ERR-86-01 MODEL_UNAVAILABLE Modal prudent, pas de crash, statut horodaté, contrôle utilisateur conservé
ERR-86-02 CORRUPTED_INPUT Message non culpabilisant + modal prudent, pas de crash, statut horodaté
ERR-86-03 UNSUPPORTED_FORMAT Message clair + modal prudent, pas de crash, statut horodaté
ERR-86-04 TIMEOUT Modal "non analysé/potentiellement sensible", pas de crash, statut horodaté, timeout >5000 ms
ERR-86-05 INTERNAL_ERROR Dégradation contrôlée, contenu masqué par défaut, pas de crash, statut horodaté
ERR-86-06 OUT_OF_MEMORY Dégradation contrôlée + modal prudent, pas de crash, statut horodaté

Règles transverses à vérifier dans chaque test d'erreur : aucun envoi réseau de contenu, maintien du contrôle utilisateur (Afficher quand même / Garder masqué), priorité de la politique prudente sur suppressWarning.


6. Tests UX / consentement

ID Scénario UX Résultat attendu
UX-86-01 Modal de gate sur contenu sensible Modal visible avant tout rendu
UX-86-02 Confirmation additionnelle mineur Double confirmation requise pour "Afficher quand même"
UX-86-03 "Ne plus me prévenir" par document Effet strictement limité au document ciblé (hors règles mineur/prudence)
UX-86-04 Réversibilité préférence document Retour immédiat à WARN après réactivation
UX-86-05 Désactivation globale Aucune nouvelle classification tant que désactivé
UX-86-06 KEEP_HIDDEN / CANCEL Aucun rendu dans les deux cas
UX-86-07 Mineur + suppressWarning=true Modal maintenu et confirmation additionnelle obligatoire
UX-86-08 Désactivation globale + verdict sensible existant Rendu direct sans modal de détection

7. Signalement (non testable / ambigu)

  • ST-86-01 — INV-86-10 (zeroization best-effort) : preuve absolue d'effacement mémoire non démontrable en black-box stricte ; validation requiert instrumentation mémoire.
  • ST-86-02 — Performance dépendante hardware : comparabilité stricte hors device de référence limitée ; protocole figé sur iPhone 12 pour verdict contractuel.