feat(agent): config struct avec valeurs par défaut MQTT + tests

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 <noreply@anthropic.com>
This commit is contained in:
Gilles Soulier
2026-05-22 11:30:46 +02:00
parent 3f5c735507
commit 91c5f15d4c
2 changed files with 112 additions and 8 deletions
+34 -8
View File
@@ -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)]
+78
View File
@@ -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);
}