Полный production-рефакторинг билдера, drift-reconcile и документации по up5
This commit is contained in:
@@ -95,6 +95,34 @@ fn parse_fallback_wg_show(raw: &str, peer_cidr: &str) -> anyhow::Result<Vec<Peer
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use std::collections::BTreeMap;
|
||||
use std::sync::Mutex;
|
||||
|
||||
struct TestTransport {
|
||||
replies: Mutex<BTreeMap<String, anyhow::Result<String>>>,
|
||||
}
|
||||
|
||||
impl TestTransport {
|
||||
fn new(entries: Vec<(&str, anyhow::Result<&str>)>) -> Self {
|
||||
let mut replies = BTreeMap::new();
|
||||
for (cmd, out) in entries {
|
||||
let mapped = out.map(|s| s.to_string());
|
||||
replies.insert(cmd.to_string(), mapped);
|
||||
}
|
||||
Self {
|
||||
replies: Mutex::new(replies),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl crate::netns::NsTransport for TestTransport {
|
||||
fn run(&self, args: &[&str]) -> anyhow::Result<String> {
|
||||
let key = args.join(" ");
|
||||
let mut lock = self.replies.lock().expect("lock");
|
||||
lock.remove(&key)
|
||||
.unwrap_or_else(|| Err(anyhow::anyhow!("missing stub for: {key}")))
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parse_primary() {
|
||||
@@ -126,4 +154,30 @@ mod tests {
|
||||
assert_eq!(peers[0].ipv4.to_string(), "10.8.1.10");
|
||||
assert_eq!(peers[1].ipv4.to_string(), "10.8.1.2");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn command_failure_is_propagated() {
|
||||
let transport = TestTransport::new(vec![(
|
||||
"wg show all allowed-ips",
|
||||
Err(anyhow::anyhow!("wg broken")),
|
||||
)]);
|
||||
|
||||
let err = discover_peers_with_transport(&transport, "10.8.1.0/24").err();
|
||||
assert!(err.is_some());
|
||||
let msg = err.expect("err").to_string();
|
||||
assert!(msg.contains("wg show all allowed-ips failed"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_primary_output_falls_back_to_wg_show() {
|
||||
let transport = TestTransport::new(vec![
|
||||
("wg show all allowed-ips", Ok("")),
|
||||
("wg show", Ok("allowed ips: 10.8.1.4/32, 10.8.1.5/32")),
|
||||
]);
|
||||
|
||||
let peers = discover_peers_with_transport(&transport, "10.8.1.0/24").expect("peers");
|
||||
assert_eq!(peers.len(), 2);
|
||||
assert_eq!(peers[0].ipv4.to_string(), "10.8.1.4");
|
||||
assert_eq!(peers[1].ipv4.to_string(), "10.8.1.5");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user