use std::time::Duration;
use ohttp_gateway::{key_manager::KeyManager, key_manager::KeyManagerConfig};
mod common;
use common::*;
#[tokio::test]
async fn test_end_to_end_encryption_decryption() {
let config = KeyManagerConfig::default();
let manager = KeyManager::new(config).await.unwrap();
let _ = manager.get_current_server().await.unwrap();
let encoded_config = manager.get_encoded_config().await.unwrap();
let stats = manager.get_stats().await;
let _ = manager.get_server_by_id(stats.active_key_id).await.unwrap();
let test_message = create_test_binary_http_message();
assert!(!encoded_config.is_empty());
assert!(!test_message.is_empty());
}
#[tokio::test]
async fn test_key_rotation_during_requests() {
let config = KeyManagerConfig {
rotation_interval: Duration::from_millis(100),
key_retention_period: Duration::from_millis(200),
auto_rotation_enabled: false, ..Default::default()
};
let manager = KeyManager::new(config).await.unwrap();
let initial_stats = manager.get_stats().await;
let old_server = manager.get_server_by_id(initial_stats.active_key_id).await;
assert!(old_server.is_some());
manager.rotate_keys().await.unwrap();
let new_stats = manager.get_stats().await;
let old_server_after_rotation = manager.get_server_by_id(initial_stats.active_key_id).await;
assert!(old_server_after_rotation.is_some());
let new_server = manager.get_server_by_id(new_stats.active_key_id).await;
assert!(new_server.is_some());
assert_ne!(initial_stats.active_key_id, new_stats.active_key_id);
assert_eq!(new_stats.total_keys, 2);
}
#[tokio::test]
async fn test_invalid_key_id_handling() {
let config = KeyManagerConfig::default();
let manager = KeyManager::new(config).await.unwrap();
let stats = manager.get_stats().await;
let invalid_key_id = stats.active_key_id.wrapping_add(100);
let server = manager.get_server_by_id(invalid_key_id).await;
assert!(server.is_none());
}
#[tokio::test]
async fn test_concurrent_key_operations() {
let config = KeyManagerConfig::default();
let manager = std::sync::Arc::new(KeyManager::new(config).await.unwrap());
let mut handles = vec![];
for i in 0..10 {
let manager_clone = manager.clone();
let handle = tokio::spawn(async move {
if i % 2 == 0 {
let _server = manager_clone.get_current_server().await.unwrap();
} else {
let _stats = manager_clone.get_stats().await;
}
});
handles.push(handle);
}
for handle in handles {
handle.await.unwrap();
}
let final_stats = manager.get_stats().await;
assert_eq!(final_stats.total_keys, 1);
}
#[tokio::test]
async fn test_automatic_rotation_scheduler() {
let config = KeyManagerConfig {
rotation_interval: Duration::from_millis(100),
key_retention_period: Duration::from_millis(200),
auto_rotation_enabled: true,
..Default::default()
};
let manager = std::sync::Arc::new(KeyManager::new(config).await.unwrap());
let initial_stats = manager.get_stats().await;
let manager_clone = manager.clone();
manager_clone.start_rotation_scheduler().await;
tokio::time::sleep(Duration::from_millis(300)).await;
let final_stats = manager.get_stats().await;
assert!(final_stats.active_key_id != initial_stats.active_key_id || final_stats.total_keys > 1);
}
#[tokio::test]
async fn test_metrics_tracking() {
let factory = MockMetricsFactory::new();
let metrics = factory.create("test_event".to_string()).await;
metrics.fire("operation_success").await;
metrics.response_status("test", 200).await;
assert!(metrics.contains_result("operation_success").await);
assert!(metrics.contains_result("test_response_status_200").await);
assert_metrics_contains_result(&factory, "test_event", "operation_success")
.await
.unwrap();
}
#[tokio::test]
async fn test_config_serialization_format() {
let config = KeyManagerConfig::default();
let manager = KeyManager::new(config).await.unwrap();
let encoded_config = manager.get_encoded_config().await.unwrap();
assert!(!encoded_config.is_empty());
assert!(encoded_config.len() > 12);
let length_prefix = u16::from_be_bytes([encoded_config[0], encoded_config[1]]);
assert_eq!(length_prefix as usize, encoded_config.len() - 2);
assert!(encoded_config.len() < 1000);
let config_data = &encoded_config[2..]; assert!(!config_data.is_empty());
}
#[tokio::test]
async fn test_error_conditions() {
let config = KeyManagerConfig::default();
let short_seed = vec![0u8; 16];
let result = KeyManager::new_with_seed(config.clone(), short_seed).await;
assert!(result.is_err());
let invalid_config = KeyManagerConfig {
cipher_suites: vec![], ..Default::default()
};
let result = KeyManager::new(invalid_config).await;
assert!(
result.is_err(),
"KeyManager should reject empty cipher suites"
);
}