Standalone Unit Testing & Mocking Strategy 🧪¶
Cette documentation décrit la technique de tests "standalone" et de mocking utilisée dans le projet suckless-ogl, en particulier pour valider la logique métier complexe (comme le parsing de shaders) sans dépendances GPU.
1. Philosophie¶
L'objectif est de pouvoir tester une unité de code (un fichier .c) en isolation totale. Cela permet :
- Une exécution instantanée (< 10ms).
- Aucun besoin d'un contexte OpenGL valide ou de drivers GPU.
- Une compatibilité parfaite avec les environnements CI restreints.
2. Technique de Mocking par "Shadowing"¶
Contrairement aux frameworks de mocking lourds qui utilisent l'injection de dépendances au runtime, nous utilisons une approche au moment de la compilation :
A. Redéfinition des Symboles¶
Dans le fichier de test (ex: tests/test_shader_path_security_standalone.c), nous redéfinissons les fonctions des bibliothèques externes (GLAD, Log) dont dépend le code testé.
/* Mock OpenGL Definition */
GLuint glCreateShader(GLenum type) {
(void)type;
return 1; // Retourne un faux ID
}
B. Inclusion Directe de l'Implémentation¶
Pour tester les fonctions privées (static) sans les exposer dans le header public .h, le fichier de test inclut directement le fichier .c après avoir défini les mocks.
/* 1. Mocks */
void log_message(...) { /* no-op */ }
/* 2. Target Implementation */
#include "shader.c"
/* 3. Tests */
void test_logic() {
// Appel d'une fonction static définie dans shader.c
ASSERT_TRUE(get_dir_from_path(...));
}
3. Avantages et Limites¶
| Avantage | Description |
|---|---|
| Accès Static | Permet de tester 100% de la logique interne sans pollution d'API. |
| Vitesse | Pas de lien dynamique lourd ou d'initialisation matérielle. |
| Zéro Dépendance | Le binaire de test est "pure C". |
| Limite | Précaution |
|---|---|
| Collision de Symboles | Ne peut pas être lié avec la vraie bibliothèque en même temps. |
| Maintenance | Si l'API réelle change, le mock doit être synchronisé manuellement. |
4. Exemple Concret : Security Standalone¶
Le test tests/test_shader_path_security_standalone.c démontre parfaitement cette approche :
- Il définit des stubs pour ~20 fonctions OpenGL.
- Il inclut
src/shader.c. - Il valide les algorithmes de
is_safe_pathet de gestion des buffers de chemins.
[!TIP] Utilisez cette approche pour toute logique de parsing, de calcul mathématique ou de gestion de ressources (RAII) qui ne nécessite pas de lecture effective sur le matériel.