Le problème
Développer un driver testable avant d’avoir le matériel
Les couches d’intégration matérielle sont souvent difficiles à tester : le périphérique n’est pas toujours disponible et les erreurs sont irrégulières. Le projet isole le transport derrière `ITransport` et fournit deux implémentations : une socket UNIX pour le chemin complet et un mock déterministe pour les tests.
L’API métier reste identique : ping, lecture/écriture de registres, lecture de capteurs, statut et reset.
Architecture
Une dépendance inversée autour du driver
métier
retry policy
socket ou mock
Python simulé
`DeviceDriver` construit une requête avec numéro de séquence, délègue l’échange au transport puis contrôle la réponse. Les détails de socket, de poll et de délai ne contaminent pas le protocole ni l’API publique.
Décisions d’ingénierie
Reproduire les pannes, pas seulement le chemin heureux
Transport substituable
Une future liaison série ou SPI peut implémenter `ITransport` sans modifier le driver et ses tests.
Numéro de séquence
Chaque réponse est associée à sa requête ; une réponse retardée ou étrangère est rejetée.
Retry borné et observable
Timeouts et CRC invalides déclenchent une tentative contrôlée et alimentent les compteurs de diagnostic.
Encodage big-endian explicite
Le format ne dépend ni de l’alignement des structures C++ ni de l’endianness de l’hôte.
Démonstration réelle
Timeout et corruption injectés dans les tests
La vidéo est issue de la suite C++ exécutée avec `MockTransport`. Elle montre le round-trip du protocole, les accès registres et les récupérations après timeout ou CRC incorrect.
python3 simulator/device_simulator.py --socket /tmp/lhbd_device.sock
./lhbd_cli --socket /tmp/lhbd_device.sock --demoPreuves techniques
Ce que le dépôt permet de vérifier
- Codec de trames, CRC standard, longueur bornée et validation structurelle.
- Mock injectant réponse correcte, timeout et corruption sans dépendre du simulateur.
- Intégration Linux par socket UNIX avec cycle de vie géré en RAII.
- Test d’intégration Python lançant le simulateur puis la CLI C++.