From 91c5f15d4c5f78c8562016b98127efa790a126b2 Mon Sep 17 00:00:00 2001 From: Gilles Soulier Date: Fri, 22 May 2026 11:30:46 +0200 Subject: [PATCH] =?UTF-8?q?feat(agent):=20config=20struct=20avec=20valeurs?= =?UTF-8?q?=20par=20d=C3=A9faut=20MQTT=20+=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TDD : 3 tests d'intégration écrits en premier (config_test.rs), puis implémentation MqttConfig avec default_mqtt_host/port/topic_base pour garantir des valeurs par défaut même si la section [protocols.mqtt] est minimale dans le TOML. Co-Authored-By: Claude Sonnet 4.6 --- agent/src/config.rs | 42 ++++++++++++++++---- agent/tests/config_test.rs | 78 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 8 deletions(-) create mode 100644 agent/tests/config_test.rs 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); +}