From 53d6de688a485bd7439d6794eb6bd0f2f615945c Mon Sep 17 00:00:00 2001 From: Nils Andreas Svee Date: Fri, 25 Sep 2026 17:14:49 +0700 Subject: [PATCH] fix(settings): reject zero-floor minimum rates --- src/settings/validation.rs | 49 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/src/settings/validation.rs b/src/settings/validation.rs index 231c85d..f392b01 100644 --- a/src/settings/validation.rs +++ b/src/settings/validation.rs @@ -153,7 +153,12 @@ impl NetworkSettings { if download_base_valid && download_percent_valid { let minimum = self.download_min_kbits(); - if minimum < WARN_DOWNLOAD_MIN_KBITS { + if minimum < 1.0 { + report.error( + "network.download_min_percent", + "minimum download rate floors to zero", + ); + } else if minimum < WARN_DOWNLOAD_MIN_KBITS { report.warning( "network.download_min_percent", format!( @@ -168,7 +173,12 @@ impl NetworkSettings { if upload_base_valid && upload_percent_valid { let minimum = self.upload_min_kbits(); - if minimum < WARN_UPLOAD_MIN_KBITS { + if minimum < 1.0 { + report.error( + "network.upload_min_percent", + "minimum upload rate floors to zero", + ); + } else if minimum < WARN_UPLOAD_MIN_KBITS { report.warning( "network.upload_min_percent", format!( @@ -376,3 +386,38 @@ fn validate_percent(report: &mut ValidationReport, path: &'static str, value: f6 true } } + +#[cfg(test)] +mod tests { + use super::*; + + fn network(download_base_kbits: f64, upload_base_kbits: f64) -> NetworkSettings { + NetworkSettings { + download_interface: "ifb0".into(), + upload_interface: "eth0".into(), + download_base_kbits, + download_min_percent: 1.0, + upload_base_kbits, + upload_min_percent: 1.0, + } + } + + #[test] + fn minimum_rates_that_floor_to_zero_are_errors_for_both_directions() { + let mut report = ValidationReport::default(); + network(50.0, 50.0).validate(&mut report); + let error = report.finish().unwrap_err().to_string(); + + assert!(error.contains("network.download_min_percent")); + assert!(error.contains("network.upload_min_percent")); + assert!(error.contains("floors to zero")); + } + + #[test] + fn representable_low_minimum_rates_remain_warnings() { + let mut report = ValidationReport::default(); + network(10_000.0, 10_000.0).validate(&mut report); + + assert!(report.finish().is_ok()); + } +}