use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KeyRotationConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_rotation_period")]
pub rotation_period_secs: u64,
#[serde(default = "default_drain_grace_period")]
pub drain_grace_period_secs: u64,
#[serde(default = "default_check_interval")]
pub check_interval_secs: u64,
#[serde(default = "default_retention_days")]
pub retention_days: u32,
#[serde(default)]
pub bootstrap_key_path: Option<PathBuf>,
}
impl Default for KeyRotationConfig {
fn default() -> Self {
Self {
enabled: false,
rotation_period_secs: default_rotation_period(),
drain_grace_period_secs: default_drain_grace_period(),
check_interval_secs: default_check_interval(),
retention_days: default_retention_days(),
bootstrap_key_path: None,
}
}
}
fn default_rotation_period() -> u64 {
86400 }
fn default_drain_grace_period() -> u64 {
300 }
fn default_check_interval() -> u64 {
60 }
fn default_retention_days() -> u32 {
90
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_values() {
let config = KeyRotationConfig::default();
assert!(!config.enabled);
assert_eq!(config.rotation_period_secs, 86400);
assert_eq!(config.drain_grace_period_secs, 300);
assert_eq!(config.check_interval_secs, 60);
assert_eq!(config.retention_days, 90);
assert!(config.bootstrap_key_path.is_none());
}
#[test]
fn test_serde_roundtrip() {
let config = KeyRotationConfig {
enabled: true,
rotation_period_secs: 3600,
drain_grace_period_secs: 120,
check_interval_secs: 30,
retention_days: 180,
bootstrap_key_path: Some(PathBuf::from("/etc/keys/initial.key")),
};
let json = serde_json::to_string(&config).expect("serialize");
let deserialized: KeyRotationConfig = serde_json::from_str(&json).expect("deserialize");
assert!(deserialized.enabled);
assert_eq!(deserialized.rotation_period_secs, 3600);
assert_eq!(deserialized.drain_grace_period_secs, 120);
assert_eq!(deserialized.check_interval_secs, 30);
assert_eq!(deserialized.retention_days, 180);
assert_eq!(
deserialized.bootstrap_key_path,
Some(PathBuf::from("/etc/keys/initial.key"))
);
}
#[test]
fn test_serde_defaults_from_partial_json() {
let json = r#"{"enabled": true}"#;
let config: KeyRotationConfig = serde_json::from_str(json).expect("deserialize");
assert!(config.enabled);
assert_eq!(config.rotation_period_secs, 86400);
assert_eq!(config.drain_grace_period_secs, 300);
assert_eq!(config.check_interval_secs, 60);
assert_eq!(config.retention_days, 90);
assert!(config.bootstrap_key_path.is_none());
}
#[test]
fn test_serde_empty_json_uses_defaults() {
let json = "{}";
let config: KeyRotationConfig = serde_json::from_str(json).expect("deserialize");
assert!(!config.enabled);
assert_eq!(config.rotation_period_secs, 86400);
}
}