use super::*;
use std::collections::BTreeMap;
use std::os::linux::net::SocketAddrExt;
use std::os::unix::net::{SocketAddr, UnixDatagram};
fn parsed(bytes: &[u8]) -> BTreeMap<String, String> {
return std::str::from_utf8(bytes)
.expect("an entry is text")
.lines()
.map(|line: &str| {
let (name, value) = line.split_once('=').expect("every line of an entry is a field");
return (name.to_string(), value.to_string());
})
.collect();
}
fn receiver(name: &str) -> (UnixDatagram, Target) {
let abstract_name: String = format!("cli-git-test-client-journal-{}-{name}", std::process::id());
let address: SocketAddr = SocketAddr::from_abstract_name(abstract_name.as_bytes()).expect("an abstract address");
return (UnixDatagram::bind_addr(&address).expect("bind the receiving socket"), Target::Abstract(abstract_name));
}
#[test]
fn an_entry_reaches_the_receiver_as_the_client() {
let (socket, target) = receiver("reach");
let fields: [(&str, String); 1] = [("CLI_GIT_SLOW_CAUSE", String::from("uncommitted-changes"))];
assert!(send_entry(&target, Priority::Warning, "the worktree was slow", &fields));
let mut buffer: Vec<u8> = vec![0; 4096];
socket.set_read_timeout(Some(std::time::Duration::from_secs(5))).expect("a read timeout");
let length: usize = socket.recv(buffer.as_mut_slice()).expect("an entry");
let found = parsed(&buffer[..length]);
assert_eq!(found["SYSLOG_IDENTIFIER"], CLIENT_IDENTIFIER);
assert_ne!(found["SYSLOG_IDENTIFIER"], crate::journald_native::IDENTIFIER, "the service keeps its own name");
assert_eq!(found["PRIORITY"], Priority::Warning.number().to_string());
assert_eq!(found["MESSAGE"], "the worktree was slow");
assert_eq!(found["CLI_GIT_SLOW_CAUSE"], "uncommitted-changes");
}
#[test]
fn an_address_nobody_listens_at_takes_no_entry() {
let nobody: Target = Target::Abstract(format!("cli-git-test-client-journal-nobody-{}", std::process::id()));
assert!(!send_entry(&nobody, Priority::Warning, "x", &[]));
}
#[test]
fn a_name_too_long_for_a_socket_is_refused() {
let long: Target = Target::Path("x".repeat(4096));
assert!(!send_entry(&long, Priority::Info, "x", &[]));
}
#[test]
fn a_unit_test_without_a_stand_in_reaches_nothing() {
if std::env::var_os(TEST_SOCKET_VARIABLE).is_none() {
assert!(!record_entry(Priority::Warning, "never sent", &[]));
}
}