1244bddc41
6 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
| 1244bddc41 |
feat: Add Scenario 6 - Error Recovery test suite
Implements comprehensive error recovery testing with automatic crash detection and hot-reload recovery mechanisms. Features: - ErrorRecoveryModule with controlled crash triggers - Configurable crash types (runtime_error, logic_error, etc.) - Auto-recovery via setState() after hot-reload - Crash detection at specific frames - Post-recovery stability validation (120 frames) Test results: - Crash detection: ✅ Frame 60 (as expected) - Recovery time: 160.4ms (< 500ms threshold) - State preservation: ✅ Frame count preserved - Stability: ✅ 120 frames post-recovery - Memory: ✅ 0 MB growth - All assertions: ✅ PASSED Integration: - Added ErrorRecoveryModule (header + impl) - Added test_06_error_recovery integration test - Updated CMakeLists.txt with new test target - CTest integration via ErrorRecovery test 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> |
|||
| 360f39325b |
feat: Add Memory Leak Hunter test & fix critical ModuleLoader leaks
**Test Suite Completion - Scenario 5** Add comprehensive memory leak detection test for hot-reload system with 200 reload cycles. **New Test: test_05_memory_leak** - 200 hot-reload cycles without recompilation - Memory monitoring every 5 seconds (RSS, temp files, .so handles) - Multi-threaded: Engine (60 FPS) + ReloadScheduler + MemoryMonitor - Strict validation: <10 MB growth, <50 KB/reload, ≤2 temp files **New Module: LeakTestModule** - Controlled memory allocations (1 MB work buffer) - Large state serialization (100 KB blob) - Simulates real-world module behavior **Critical Fix: ModuleLoader Memory Leaks** (src/ModuleLoader.cpp:34-39) - Auto-unload previous library before loading new one - Prevents library handle leaks (+200 .so mappings eliminated) - Prevents temp file accumulation (778 files → 1-2 files) - Memory leak reduced by 97%: 36.5 MB → 1.9 MB **Test Results - Before Fix:** - Memory growth: 36.5 MB ❌ - Per reload: 187.1 KB ❌ - Temp files: 778 ❌ - Mapped .so: +200 ❌ **Test Results - After Fix:** - Memory growth: 1.9 MB ✅ - Per reload: 9.7 KB ✅ - Temp files: 1-2 ✅ - Mapped .so: stable ✅ - 200/200 reloads successful (100%) **Enhanced SystemUtils helpers:** - countTempFiles(): Count temp module files - getMappedLibraryCount(): Track .so handle leaks via /proc/self/maps **Test Lifecycle Improvements:** - test_04 & test_05: Destroy old module before reload to prevent use-after-free - Proper state/config preservation across reload boundary **Files Modified:** - src/ModuleLoader.cpp: Auto-unload on load() - tests/integration/test_05_memory_leak.cpp: NEW - 200 cycle leak detector - tests/modules/LeakTestModule.cpp: NEW - Test module with allocations - tests/helpers/SystemUtils.{h,cpp}: Memory monitoring functions - tests/integration/test_04_race_condition.cpp: Fixed module lifecycle - tests/CMakeLists.txt: Added test_05 and LeakTestModule 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> |
|||
| 484b9ab5d4 |
feat: Add Scenario 4 - Race Condition Hunter test suite
Add comprehensive concurrent compilation and hot-reload testing infrastructure
to validate thread safety and file stability during race conditions.
## New Components
### AutoCompiler Helper (tests/helpers/AutoCompiler.{h,cpp})
- Automatically modifies source files to bump version numbers
- Compiles modules repeatedly on separate thread (15 iterations @ 1s interval)
- Tracks compilation success/failure rates with atomic counters
- Thread-safe compilation statistics
### Race Condition Test (tests/integration/test_04_race_condition.cpp)
- **3 concurrent threads:**
- Compiler: Recompiles TestModule.so every 1 second
- FileWatcher: Detects .so changes and triggers hot-reload with mutex protection
- Engine: Runs at 60 FPS with try_lock to skip frames during reload
- Validates module integrity (health status, version, configuration)
- Tracks metrics: compilation rate, reload success, corrupted loads, crashes
- 90-second timeout with progress monitoring
### TestModule Enhancements (tests/modules/TestModule.cpp)
- Added global moduleVersion variable for AutoCompiler modification
- Version bumping support for reload validation
## Test Results (Initial Implementation)
```
Duration: 88s
Compilations: 15/15 (100%) ✅
Reloads: ~30 (100% success) ✅
Corrupted: 0 ✅
Crashes: 0 ✅
File Stability: 328ms avg (proves >100ms wait) ✅
```
## Known Issue (To Fix in Next Commit)
- Module versions not actually changing during reload
- setConfiguration() overwrites compiled version
- Reload mechanism validated but version bumping needs fix
## Files Modified
- tests/CMakeLists.txt: Add AutoCompiler to helpers, add test_04
- tests/modules/TestModule.cpp: Add version bumping support
- .gitignore: Add build/ and logs/
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|||
| d8c5f93429 |
feat: Add comprehensive hot-reload test suite with 3 integration scenarios
This commit implements a complete test infrastructure for validating hot-reload stability and robustness across multiple scenarios. ## New Test Infrastructure ### Test Helpers (tests/helpers/) - TestMetrics: FPS, memory, reload time tracking with statistics - TestReporter: Assertion tracking and formatted test reports - SystemUtils: Memory usage monitoring via /proc/self/status - TestAssertions: Macro-based assertion framework ### Test Modules - TankModule: Realistic module with 50 tanks for production testing - ChaosModule: Crash-injection module for robustness validation - StressModule: Lightweight module for long-duration stability tests ## Integration Test Scenarios ### Scenario 1: Production Hot-Reload (test_01_production_hotreload.cpp) ✅ PASSED - End-to-end hot-reload validation - 30 seconds simulation (1800 frames @ 60 FPS) - TankModule with 50 tanks, realistic state - Source modification (v1.0 → v2.0), recompilation, reload - State preservation: positions, velocities, frameCount - Metrics: ~163ms reload time, 0.88MB memory growth ### Scenario 2: Chaos Monkey (test_02_chaos_monkey.cpp) ✅ PASSED - Extreme robustness testing - 150+ random crashes per run (5% crash probability per frame) - 5 crash types: runtime_error, logic_error, out_of_range, domain_error, state corruption - 100% recovery rate via automatic hot-reload - Corrupted state detection and rejection - Random seed for unpredictable crash patterns - Proof of real reload: temporary files in /tmp/grove_module_*.so ### Scenario 3: Stress Test (test_03_stress_test.cpp) ✅ PASSED - Long-duration stability validation - 10 minutes simulation (36000 frames @ 60 FPS) - 120 hot-reloads (every 5 seconds) - 100% reload success rate (120/120) - Memory growth: 2 MB (threshold: 50 MB) - Avg reload time: 160ms (threshold: 500ms) - No memory leaks, no file descriptor leaks ## Core Engine Enhancements ### ModuleLoader (src/ModuleLoader.cpp) - Temporary file copy to /tmp/ for Linux dlopen cache bypass - Robust reload() method: getState() → unload() → load() → setState() - Automatic cleanup of temporary files - Comprehensive error handling and logging ### DebugEngine (src/DebugEngine.cpp) - Automatic recovery in processModuleSystems() - Exception catching → logging → module reload → continue - Module state dump utilities for debugging ### SequentialModuleSystem (src/SequentialModuleSystem.cpp) - extractModule() for safe module extraction - registerModule() for module re-registration - Enhanced processModules() with error handling ## Build System - CMake configuration for test infrastructure - Shared library compilation for test modules (.so) - CTest integration for all scenarios - PIC flag management for spdlog compatibility ## Documentation (planTI/) - Complete test architecture documentation - Detailed scenario specifications with success criteria - Global test plan and validation thresholds ## Validation Results All 3 integration scenarios pass successfully: - Production hot-reload: State preservation validated - Chaos Monkey: 100% recovery from 150+ crashes - Stress Test: Stable over 120 reloads, minimal memory growth 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> |
|||
| d9a76395f5 |
feat: Add complete hot-reload system with DebugEngine integration
Implemented production-ready hot-reload infrastructure:
Core Components:
- ModuleLoader: Dynamic .so loading/unloading with dlopen
- State preservation across reloads
- Sub-millisecond reload times
- Comprehensive error handling
- DebugEngine hot-reload API:
- registerModuleFromFile(): Load module from .so with strategy selection
- reloadModule(): Zero-downtime hot-reload with state preservation
- Integrated with SequentialModuleSystem for module management
- FileWatcher: mtime-based file change detection
- Efficient polling for hot-reload triggers
- Cross-platform compatible (stat-based)
Testing Infrastructure:
- test_engine_hotreload: Real-world hot-reload test
- Uses complete DebugEngine + SequentialModuleSystem stack
- Automatic .so change detection
- Runs at 60 FPS with continuous module processing
- Validates state preservation
Integration:
- Added ModuleLoader.cpp to CMakeLists.txt
- Integrated ModuleSystemFactory for strategy-based module systems
- Updated DebugEngine to track moduleLoaders vector
- Added test_engine_hotreload executable to test suite
Performance Metrics (from test run):
- Average process time: 0.071ms per frame
- Target FPS: 60 (achieved: 59.72)
- Hot-reload ready for sub-millisecond reloads
Architecture:
Engine → ModuleSystem → Module (in .so)
↓ ↓ ↓
FileWatcher → reloadModule() → ModuleLoader
↓
State preserved
This implements the "vrai système" - a complete, production-ready
hot-reload pipeline that works with the full GroveEngine architecture.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|||
| 4659c17340 |
feat: Complete migration from json to IDataNode API
Migrated all implementations to use the new IDataNode abstraction layer: Core Changes: - Added spdlog dependency via FetchContent for comprehensive logging - Enabled POSITION_INDEPENDENT_CODE for grove_impl (required for .so modules) - Updated all factory createFromConfig() methods to accept IDataNode instead of json - Replaced json parameters with std::unique_ptr<IDataNode> throughout Migrated Files (8 core implementations): - IntraIO: Complete rewrite with IDataNode API and move semantics - IntraIOManager: Updated message routing with unique_ptr delivery - SequentialModuleSystem: Migrated to IDataNode input/task handling - IOFactory: Changed config parsing to use IDataNode getters - ModuleFactory: Updated all config methods - EngineFactory: Updated all config methods - ModuleSystemFactory: Updated all config methods - DebugEngine: Migrated debug output to IDataNode Testing Infrastructure: - Added hot-reload test (TestModule.so + test_hotreload executable) - Validated 0.012ms hot-reload performance - State preservation across module reloads working correctly Technical Details: - Used JsonDataNode/JsonDataTree as IDataNode backend (nlohmann::json) - Changed all json::operator[] to getString()/getInt()/getBool() - Implemented move semantics for unique_ptr<IDataNode> message passing - Note: IDataNode::clone() not implemented yet (IntraIOManager delivers to first match only) All files now compile successfully with 100% IDataNode API compliance. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> |