Files
telemt/src/config/hot_reload/carrier_method_tests.rs
T
2026-10-01 23:40:08 +03:00

51 lines
2.1 KiB
Rust

use super::*;
use crate::config::WebCarrierMethod;
#[test]
fn carrier_method_reload_is_hot_and_preserves_process_limits() {
let mut active = ProxyConfig::default();
for method in [WebCarrierMethod::Put, WebCarrierMethod::Post] {
let mut desired = active.clone();
desired.web.carrier_method = method;
assert_eq!(classify_config_changes(&active, &desired).changed, ["web"]);
assert!(!classify_config_changes(&active, &desired).restart_required);
desired.web.limits.max_http_connections += 1;
let applied = overlay_hot_fields(&active, &desired);
assert_eq!(applied.web.carrier_method, method);
assert_eq!(
applied.web.limits.max_http_connections,
active.web.limits.max_http_connections
);
active = applied;
}
}
#[test]
fn carrier_method_reload_publishes_both_directions_and_keeps_last_good_value() {
let directory = tempfile::tempdir().unwrap();
let path = directory.path().join("config.toml");
let source = |method| format!("[web]\ncarrier_method = \"{method}\"\n");
std::fs::write(&path, source("post")).unwrap();
let initial = Arc::new(ProxyConfig::load(&path).unwrap());
let initial_hash = ProxyConfig::load_with_metadata(&path)
.unwrap()
.rendered_hash;
let (config_tx, _config_rx) = watch::channel(Arc::clone(&initial));
let (log_tx, _log_rx) = watch::channel(initial.general.log_level.clone());
let mut reload_state = ReloadState::new(Some(initial_hash));
for (token, method) in [
("put", WebCarrierMethod::Put),
("post", WebCarrierMethod::Post),
] {
std::fs::write(&path, source(token)).unwrap();
reload_config(&path, &config_tx, &log_tx, None, None, &mut reload_state).unwrap();
let applied = config_tx.borrow().clone();
assert_eq!(applied.web.carrier_method, method);
std::fs::write(&path, source("PATCH")).unwrap();
reload_config(&path, &config_tx, &log_tx, None, None, &mut reload_state);
let unchanged = config_tx.borrow().clone();
assert!(Arc::ptr_eq(&unchanged, &applied));
}
}