Le TCK officiel MicroProfile JWT 2.1 valide qu’une implémentation accepte, rejette et expose correctement un éventail de tokens forgés contre une application Arquillian de référence — clés inline, JWKS, JWE, claims standard, claims MP, transport Authorization et cookie, rotation de clés, signatures falsifiées, exp/nbf/iat aux bornes. Cervantes le passe à 206 / 206 sur la version 2.1 (mai 2026, jalon M6).
Statut
| Métrique | Valeur |
|---|---|
Tests exécutés |
206 |
Réussis |
206 ✅ |
Échoués |
0 |
Erreurs |
0 |
Ignorés |
0 |
Tout écart ultérieur doit être journalisé dans TCK.md du dépôt avec : nom de test, motif, plan de correction.
Prérequis
L’artefact org.eclipse.microprofile.jwt:microprofile-jwt-auth-tck:2.1 (et son classifier tests) est désormais disponible sur Maven Central — il se télécharge automatiquement. Le runner installe également cassini-tck dans le M2 local pour disposer du CassiniTestHarness.
sdk env # Java 25 + Maven 3.9.16
./mvnw -ntp install -DskipTests # installe cervantes-core, cervantes-jaxrs, cervantes-cdi-vauban, …
Exécution du runner
Le script run-official-tck-mp-jwt-2.1.sh à la racine du dépôt orchestre toutes les variantes.
# Smoke — un test rapide pour valider l'installation
./run-official-tck-mp-jwt-2.1.sh
# Suite complète — équivalent du TCK officiel à 206 tests
./run-official-tck-mp-jwt-2.1.sh all
# Test ciblé via -Dtest=
./run-official-tck-mp-jwt-2.1.sh -Dtest=PublicKeyAsPEMTest
Le runner exécute Arquillian. Le rapport Surefire atterrit dans cervantes-tck/target/surefire-reports/.
Architecture du runner
cervantes-tck est in-reactor derrière le profil Maven tck de cervantes-parent (harmonisation TCK, pattern vidocq-runtime-tck-*) : un mvn install classique ne le construit ni ne le télécharge. Invocation directe : ./mvnw -P"tck,smoke" -pl cervantes-tck test (smoke) ou ./mvnw -P"tck,tck-official" -pl cervantes-tck test (suite complète). Gabarit initialement calqué sur heisenberg-tck.
|
Le runner était historiquement détaché du reactor (POM |
Stack assemblée par le runner :
| Couche | Composant |
|---|---|
Spec |
|
Implémentation MP JWT |
|
Container CDI |
Vauban ( |
Container Arquillian |
|
Transport HTTP |
Chappe ( |
Cadre de test |
Arquillian + REST (le TCK MP JWT n’est pas TestNG-only contrairement au TCK MP FT) |
Exclusions documentées
Deux exclusions, non-applicables au profil Core + JWT visé par Cervantes :
| Exclusion | Justification |
|---|---|
Tests |
Tests destinés au profil container servlet Jakarta EE Full. Cervantes vise le profil Core (MicroProfile) — pas d’engagement Servlet 6.1. Le rôle Servlet est tenu par Foy, hors périmètre de cette implémentation MP JWT. |
Groupe TestNG |
Tests marqués optional par la spec pour l’intégration Jakarta EE Security 3.0. Non requis pour la conformité MP JWT 2.1. |
Les exclusions sont listées dans le fichier suite Arquillian/TestNG de cervantes-tck/src/test/resources/. Une exclusion ajoutée à l’avenir doit être tracée dans TCK.md avec sa justification.
Écarts résolus pendant la course au 100 %
Le TCK a révélé plusieurs écarts entre la spec et l’implémentation initiale ; tous ont été corrigés dans le moteur, pas masqués par des exclusions :
| Composant | Écart corrigé |
|---|---|
|
Charge HTTP paresseuse + auto-détection PEM vs JWKS sur la même URL + relecture de l’URL après démarrage du serveur (le port n’est connu qu’après bind). |
|
Ajout du header |
|
Parsing de clé privée JWK ( |
|
Contrôle explicite de l’algorithme requis + vérification |
|
|
|
Unwrap |
|
Extraction token via cookie (§9.2.3), distinction des cas d’erreur, comportement anonyme sur token absent. |
|
Principal anonyme → |
Prérequis livrés en amont
Deux fixes externes ont été nécessaires pour atteindre 206/206 :
-
cassini — patch
@Context SecurityContextinjecté dans une ressource pour refléter le JWT duJwtAuthenticationFilter. Mergé sur main de Cassini, REST TCK 4.0 (2535 tests) préservé. -
vauban — fix VAU-INJ-PRIM : le
TypeMapperexposait un point d’injection primitif (boolean) commeClassType[name=boolean]au lieu dePrimitiveType, ce qui faisait échouer silencieusement l’injection@Claim boolean. Fix + test de régressionPrimitiveQualifiedInjectionTest. Mergé sur main de Vauban.
Contrat qualité
Toute modification structurelle de cervantes-core, cervantes-cdi-vauban ou cervantes-jaxrs doit préserver le score 206 / 206 avant merge. Une régression TCK est bloquante au sens CI : la PR ne passe pas.
Pour aller plus loin
-
Fonctionnement interne — comprendre ce que le TCK valide.
-
Référence — annotations et clés couvertes par les tests.
-
BUG.md — bugs reproductibles tracés.
-
TCK.md — historique des scores.