dir-odt-to-pdf/tests/test_log_level_changes.rs
Jesús Pérex 13c65980ac refactor(logging): Improve thread safety and test configuration
This commit enhances the logging system with better thread safety and proper test configuration:

- Replace RefCell with RwLock in SimpleLogger for thread-safe logging
- Add proper feature flag configuration for test-sync
- Organize logging modules with clear separation between prod and test
- Update test files with proper feature flag annotations
- Fix module structure in lib.rs to avoid duplicate definitions

Technical changes:
- Use RwLock for thread-safe log writer access
- Add #![cfg(feature = "test-sync")] to all test files
- Configure .cargo/config.toml for test-sync feature
- Update Cargo.toml with proper test configurations
- Clean up logging module exports

This change ensures thread-safe logging in production while maintaining
separate test-specific synchronization primitives, improving overall
reliability and maintainability.
2025-05-27 09:57:16 +01:00

64 lines
1.9 KiB
Rust

#![cfg(feature = "test-sync")]
use dir_odt_to_pdf::error::{LogError, ProcessError, Result};
use dir_odt_to_pdf::logging::{LogConfig, init_logging};
use log::{LevelFilter, debug, info};
use std::fs;
#[test]
fn test_log_level_changes() -> Result<()> {
// Create a temporary file for logging
let temp_dir = tempfile::TempDir::new().unwrap();
let log_path = temp_dir.path().join("test.log");
// Initialize logging with Info level first
let config = LogConfig {
log_file: Some(log_path.clone()),
log_level: LevelFilter::Info,
append_log: false,
};
// Initialize logging
init_logging(config)?;
// Write some messages at different levels
debug!("First debug message"); // Should not appear (we're at Info level)
info!("First info message"); // Should appear
// Read the log file
let content = fs::read_to_string(&log_path).map_err(ProcessError::Io)?;
println!("=== Initial Log Contents ===");
println!("{}", content);
println!("=======================");
// Verify initial messages
assert!(
!content.contains("First debug message"),
"Debug message should not appear at Info level"
);
assert!(
content.contains("First info message"),
"Info message should appear"
);
// Try to change log level - this should fail with AlreadyInitialized
let config = LogConfig {
log_file: Some(log_path.clone()),
log_level: LevelFilter::Debug,
append_log: true,
};
// Try to initialize again - this should fail
match init_logging(config) {
Err(ProcessError::Log(LogError::AlreadyInitialized)) => {
info!("Got expected AlreadyInitialized error");
Ok(())
}
Ok(_) => {
panic!("Expected AlreadyInitialized error")
}
Err(e) => {
panic!("Unexpected error: {:?}", e)
}
}
}