diff --git a/agent/src/config.rs b/agent/src/config.rs index 67fff4d..e3bb079 100644 --- a/agent/src/config.rs +++ b/agent/src/config.rs @@ -1,4 +1,3 @@ -// stub — implémenté dans la Task 2 use serde::Deserialize; use std::path::Path; @@ -30,24 +29,51 @@ pub struct UdpConfig { pub enabled: bool, } -#[derive(Deserialize, Debug, Clone, Default)] +#[derive(Deserialize, Debug, Clone)] pub struct MqttConfig { #[serde(default)] pub enabled: bool, - #[serde(default)] + #[serde(default = "default_mqtt_host")] pub host: String, - #[serde(default)] + #[serde(default = "default_mqtt_port")] pub port: u16, - #[serde(default)] + #[serde(default = "default_topic_base")] pub topic_base: String, - #[serde(default)] + #[serde(default = "default_true")] pub auto_discovery: bool, - #[serde(default)] + #[serde(default = "default_true")] pub birth_message: bool, - #[serde(default)] + #[serde(default = "default_true")] pub last_will: bool, } +impl Default for MqttConfig { + fn default() -> Self { + MqttConfig { + enabled: false, + host: default_mqtt_host(), + port: default_mqtt_port(), + topic_base: default_topic_base(), + auto_discovery: true, + birth_message: true, + last_will: true, + } + } +} + +fn default_mqtt_host() -> String { + "10.0.0.3".to_string() +} +fn default_mqtt_port() -> u16 { + 1883 +} +fn default_topic_base() -> String { + "nanometrics/agents".to_string() +} +fn default_true() -> bool { + true +} + #[derive(Deserialize, Debug, Clone, Default)] pub struct MetricsConfig { #[serde(default)] diff --git a/agent/tests/config_test.rs b/agent/tests/config_test.rs new file mode 100644 index 0000000..d279850 --- /dev/null +++ b/agent/tests/config_test.rs @@ -0,0 +1,78 @@ +use std::io::Write; +use tempfile::NamedTempFile; + +#[test] +fn test_config_parse_complet() { + let mut f = NamedTempFile::new().unwrap(); + write!(f, r#" +[server] +ip = "10.0.0.50" +port = 9999 + +[protocols.udp] +enabled = true + +[protocols.mqtt] +enabled = true +host = "10.0.0.3" +port = 1883 +topic_base = "nanometrics/agents" +auto_discovery = true +birth_message = true +last_will = true + +[metrics.cpu] +udp = true +mqtt = false +"#).unwrap(); + let cfg = nanometrics_agent::config::load(f.path()).unwrap(); + assert_eq!(cfg.server.ip, "10.0.0.50"); + assert_eq!(cfg.server.port, 9999); + assert!(cfg.protocols.udp.enabled); + assert!(cfg.protocols.mqtt.enabled); + assert_eq!(cfg.protocols.mqtt.host, "10.0.0.3"); + assert!(cfg.metrics.cpu.udp); + assert!(!cfg.metrics.cpu.mqtt); +} + +#[test] +fn test_config_mqtt_absent() { + let mut f = NamedTempFile::new().unwrap(); + write!(f, r#" +[server] +ip = "10.0.0.50" +port = 9999 + +[protocols.udp] +enabled = true + +[protocols.mqtt] +enabled = false +"#).unwrap(); + let cfg = nanometrics_agent::config::load(f.path()).unwrap(); + assert!(!cfg.protocols.mqtt.enabled); + // Les valeurs par défaut MQTT doivent être définies + assert_eq!(cfg.protocols.mqtt.host, "10.0.0.3"); + assert_eq!(cfg.protocols.mqtt.port, 1883); + assert_eq!(cfg.protocols.mqtt.topic_base, "nanometrics/agents"); +} + +#[test] +fn test_config_metrics_par_defaut() { + let mut f = NamedTempFile::new().unwrap(); + write!(f, r#" +[server] +ip = "10.0.0.1" +port = 9999 + +[protocols.udp] +enabled = true + +[protocols.mqtt] +enabled = false +"#).unwrap(); + let cfg = nanometrics_agent::config::load(f.path()).unwrap(); + // Metrics absentes => false par défaut + assert!(!cfg.metrics.cpu.udp); + assert!(!cfg.metrics.disk.mqtt); +}