Création d'un script de test automatique pour le test n°3 + Amélioration du readme.md d'explication

This commit is contained in:
Yanis HAMOUDI 2025-03-01 21:28:01 +01:00
parent c7d0b78e03
commit 85d2cef358
2 changed files with 224 additions and 12 deletions
tests/C/test-03-circular

@ -1,15 +1,114 @@
# Test 3 : Gestion des dépendances circulaires
# Test 03 - Gestion des dépendances circulaires
## Description
Ce test vérifie que le système de compilation peut détecter et gérer correctement les dépendances circulaires. Il simule un projet où plusieurs fichiers `.c` et `.h` s'incluent mutuellement, créant ainsi une boucle dans les dépendances.
Ce test vérifie le comportement de `bake` comparé à `make` lorsqu'il existe des dépendances circulaires entre les fichiers du projet.
## Fichiers utilisés
- `a.c` : Implémente functionA qui appelle functionB.
- `b.c` : Implémente functionB qui appelle functionC.
- `c.c` : Implémente functionC et inclut a.h, créant une boucle indirecte.
- `a.h`, `b.h`, `c.h` : Fichiers d'en-tête correspondant.
- `Bakefile` : Contient les règles de compilation et les dépendances.
- `bakefile.jar` : Version compilée de notre système de build.
## Sommaire
- [Structure du test](#structure-du-test)
- [Contenu des fichiers de règles](#contenu-des-fichiers-de-règles)
- [Description des dépendances circulaires](#description-des-dépendances-circulaires)
- [Objectif du test](#objectif-du-test)
- [Comment exécuter le test](#comment-exécuter-le-test)
- [Test automatique](#test-automatique)
- [Test manuel](#test-manuel)
- [Résultats attendus](#résultats-attendus)
## Résultat attendu
Si le système de build détecte une dépendance circulaire, il doit la gérer automatiquement en évitant la boucle infinie et en compilant correctement les fichiers.
## Structure du test
```
test-03-circular-dependencies/
├── README.md # Ce fichier
├── bake/
│ ├── Bakefile # Fichier de règles pour bake
│ ├── bakefile.jar # Exécutable de bake (JAR)
│ ├── a.c # Fichier source C
│ ├── a.h # Fichier d'en-tête C
│ ├── b.c # Fichier source C
│ ├── b.h # Fichier d'en-tête C
│ ├── c.c # Fichier source C
│ └── c.h # Fichier d'en-tête C
├── make/
│ ├── Makefile # Fichier de règles pour make
│ ├── a.c # Fichier source C
│ ├── a.h # Fichier d'en-tête C
│ ├── b.c # Fichier source C
│ ├── b.h # Fichier d'en-tête C
│ ├── c.c # Fichier source C
│ └── c.h # Fichier d'en-tête C
└── run_test03.sh # Programme de test automatique
```
## Contenu des fichiers de règles
Les fichiers `Makefile` et `Bakefile` contiennent les mêmes règles :
```makefile
main: a b c
gcc a b c -o main
a: a.c a.h b.h
gcc -Wall -Werror -Wextra -ansi -pedantic -c a.c -o a
b: b.c b.h c.h
gcc -Wall -Werror -Wextra -ansi -pedantic -c b.c -o b
c: c.c c.h a.h
gcc -Wall -Werror -Wextra -ansi -pedantic -c c.c -o c
```
## Description des dépendances circulaires
Ce test comporte des dépendances circulaires entre les fichiers :
- `a` dépend de `b.h`
- `b` dépend de `c.h`
- `c` dépend de `a.h`
Ce qui forme une boucle : a → b → c → a
## Objectif du test
Ce test vérifie que `bake` se comporte comme `make` face à des dépendances circulaires :
1. Vérifier que les deux outils détectent correctement les dépendances entre les fichiers
2. Vérifier que les deux outils construisent correctement les cibles dans un ordre permettant de résoudre les dépendances circulaires
3. Vérifier que tous les fichiers objets et l'exécutable final sont correctement générés
4. Comparer les messages de sortie et les résultats des deux outils
## Comment exécuter le test
### Test automatique
1. Rendez le script de test exécutable :
```
chmod +x run_test03.sh
```
2. Lancez le script de test :
```
./run_test03.sh
```
3. Consultez les résultats affichés dans le terminal et dans le fichier de log généré dans le répertoire `logs/`.
### Test manuel
1. Pour Make :
```
cd make
make
```
2. Pour Bake :
```
cd bake
java -cp bakefile.jar fr.monlouyan.bakefile.Main
```
3. Comparez les deux résultats.
## Résultats attendus
- Les deux outils devraient détecter les dépendances entre les fichiers
- Les deux outils devraient générer correctement tous les fichiers objets (`a`, `b`, `c`) malgré les dépendances circulaires
- Les deux outils devraient générer l'exécutable final `main`
- Les messages de sortie devraient être similaires, indiquant l'ordre dans lequel les cibles sont construites
Ce test vérifie la capacité de bake à gérer les dépendances circulaires.

@ -0,0 +1,113 @@
#!/bin/bash
# Script de test pour comparer bake et make
# Test 03 - Gestion des dépendances circulaires
# Création du répertoire de logs s'il n'existe pas
mkdir -p logs
# Fichier de log avec timestamp pour éviter les écrasements
LOG_FILE="logs/test03_$(date +%Y%m%d_%H%M%S).log"
echo "=================================" | tee -a "$LOG_FILE"
echo "Test 03 - Gestion des dépendances circulaires" | tee -a "$LOG_FILE"
echo "=================================" | tee -a "$LOG_FILE"
echo "" | tee -a "$LOG_FILE"
# Nettoyage préalable pour s'assurer qu'on part de zéro
echo "Nettoyage préalable..." | tee -a "$LOG_FILE"
# Pour make, supprimer tous les fichiers objets et l'exécutable
cd make
rm -f main a b c 2>/dev/null
cd ..
# Pour bake, supprimer tous les fichiers objets et l'exécutable
cd bake
rm -f main a b c 2>/dev/null
cd ..
echo "Nettoyage terminé." | tee -a "$LOG_FILE"
echo "" | tee -a "$LOG_FILE"
# Test avec make
echo "=================================" | tee -a "$LOG_FILE"
echo "Exécution de MAKE avec dépendances circulaires:" | tee -a "$LOG_FILE"
echo "=================================" | tee -a "$LOG_FILE"
cd make
echo "$ make" | tee -a "../$LOG_FILE"
make 2>&1 | tee -a "../$LOG_FILE"
MAKE_EXIT_CODE=$?
echo "" | tee -a "../$LOG_FILE"
echo "Code de sortie: $MAKE_EXIT_CODE" | tee -a "../$LOG_FILE"
# Vérifier si les fichiers objets et l'exécutable ont été créés
if [ -f "main" ] && [ -f "a" ] && [ -f "b" ] && [ -f "c" ]; then
echo "✅ make: Tous les fichiers ont été générés avec succès" | tee -a "../$LOG_FILE"
# Exécuter le programme pour vérifier qu'il fonctionne
if [ -x "main" ]; then
echo "$ ./main" | tee -a "../$LOG_FILE"
./main 2>&1 | tee -a "../$LOG_FILE"
fi
else
echo "❌ make: Certains fichiers n'ont pas été générés" | tee -a "../$LOG_FILE"
echo " - main: $([ -f "main" ] && echo '✅' || echo '❌')" | tee -a "../$LOG_FILE"
echo " - a: $([ -f "a" ] && echo '✅' || echo '❌')" | tee -a "../$LOG_FILE"
echo " - b: $([ -f "b" ] && echo '✅' || echo '❌')" | tee -a "../$LOG_FILE"
echo " - c: $([ -f "c" ] && echo '✅' || echo '❌')" | tee -a "../$LOG_FILE"
fi
cd ..
echo "" | tee -a "$LOG_FILE"
# Test avec bake
echo "=================================" | tee -a "$LOG_FILE"
echo "Exécution de BAKE avec dépendances circulaires:" | tee -a "$LOG_FILE"
echo "=================================" | tee -a "$LOG_FILE"
cd bake
echo "$ java -cp bakefile.jar fr.monlouyan.bakefile.Main" | tee -a "../$LOG_FILE"
java -cp bakefile.jar fr.monlouyan.bakefile.Main 2>&1 | tee -a "../$LOG_FILE"
BAKE_EXIT_CODE=$?
echo "" | tee -a "../$LOG_FILE"
echo "Code de sortie: $BAKE_EXIT_CODE" | tee -a "../$LOG_FILE"
# Vérifier si les fichiers objets et l'exécutable ont été créés
if [ -f "main" ] && [ -f "a" ] && [ -f "b" ] && [ -f "c" ]; then
echo "✅ bake: Tous les fichiers ont été générés avec succès" | tee -a "../$LOG_FILE"
# Exécuter le programme pour vérifier qu'il fonctionne
if [ -x "main" ]; then
echo "$ ./main" | tee -a "../$LOG_FILE"
./main 2>&1 | tee -a "../$LOG_FILE"
fi
else
echo "❌ bake: Certains fichiers n'ont pas été générés" | tee -a "../$LOG_FILE"
echo " - main: $([ -f "main" ] && echo '✅' || echo '❌')" | tee -a "../$LOG_FILE"
echo " - a: $([ -f "a" ] && echo '✅' || echo '❌')" | tee -a "../$LOG_FILE"
echo " - b: $([ -f "b" ] && echo '✅' || echo '❌')" | tee -a "../$LOG_FILE"
echo " - c: $([ -f "c" ] && echo '✅' || echo '❌')" | tee -a "../$LOG_FILE"
fi
cd ..
# Résumé des résultats
echo "" | tee -a "$LOG_FILE"
echo "=================================" | tee -a "$LOG_FILE"
echo "RÉSUMÉ:" | tee -a "$LOG_FILE"
echo "=================================" | tee -a "$LOG_FILE"
# Vérifier si make et bake ont réussi à gérer les dépendances circulaires
cd make
MAKE_SUCCESS=$([ -f "main" ] && [ -f "a" ] && [ -f "b" ] && [ -f "c" ] && echo "true" || echo "false")
cd ../bake
BAKE_SUCCESS=$([ -f "main" ] && [ -f "a" ] && [ -f "b" ] && [ -f "c" ] && echo "true" || echo "false")
cd ..
if [ "$MAKE_SUCCESS" = "true" ] && [ "$BAKE_SUCCESS" = "true" ]; then
echo "✅ Les deux outils ont géré correctement les dépendances circulaires" | tee -a "$LOG_FILE"
elif [ "$MAKE_SUCCESS" = "false" ] && [ "$BAKE_SUCCESS" = "false" ]; then
echo "❌ Les deux outils ont échoué à gérer les dépendances circulaires" | tee -a "$LOG_FILE"
else
echo "⚠️ Comportement différent entre make et bake:" | tee -a "$LOG_FILE"
echo " - make: $([ "$MAKE_SUCCESS" = "true" ] && echo '✅ A réussi' || echo '❌ A échoué')" | tee -a "$LOG_FILE"
echo " - bake: $([ "$BAKE_SUCCESS" = "true" ] && echo '✅ A réussi' || echo '❌ A échoué')" | tee -a "$LOG_FILE"
fi
echo "" | tee -a "$LOG_FILE"
echo "Test terminé. Résultats enregistrés dans: $LOG_FILE" | tee -a "$LOG_FILE"