#![allow(
clippy::unwrap_used,
clippy::expect_used,
clippy::panic,
clippy::panic_in_result_fn,
clippy::indexing_slicing
)]
use choreo_daemon::run_server;
use choreo_proto::{ClientMessage, DaemonMessage, read_message, write_message};
use std::io::{BufReader, BufWriter, Write};
use std::os::unix::net::UnixStream;
use std::thread;
use std::time::Duration;
mod common;
#[test]
#[ignore]
fn remove_stale_socket_refuses_live_listener() {
let dir = tempfile::tempdir().expect("tempdir for socket");
let path = dir.path().join("live.sock");
let listener = std::os::unix::net::UnixListener::bind(&path).expect("bind listener");
let state = common::test_daemon_state();
let transport_sk = choreo_transport::key::TransportSecretKey::new([0u8; 32]);
let acl = choreo_daemon::server::acl::SharedAcl::load(std::path::Path::new("/nonexistent"));
let socket_str = path.to_str().expect("valid socket path").to_string();
let err = run_server(&socket_str, state, None, None, transport_sk, acl, false)
.expect_err("run_server over a live socket must fail");
let msg = err.to_string();
assert!(
msg.contains("already listening") && msg.contains("live.sock"),
"error must name the path and the conflict: {msg}"
);
assert!(path.exists(), "a live daemon's socket must not be removed");
assert!(std::os::unix::net::UnixStream::connect(&path).is_ok());
drop(listener);
}
#[test]
#[ignore]
fn server_accepts_ping_and_shuts_down_on_signal() {
let dir = tempfile::tempdir().expect("tempdir for socket");
let socket_path = dir.path().join("test.sock");
let socket_str = socket_path.to_str().expect("valid socket path").to_string();
let state = common::test_daemon_state();
let transport_sk = choreo_transport::key::TransportSecretKey::new([0u8; 32]);
let acl = choreo_daemon::server::acl::SharedAcl::load(std::path::Path::new("/nonexistent"));
let handle = thread::spawn(move || {
run_server(&socket_str, state, None, None, transport_sk, acl, false).expect("run_server");
});
while !socket_path.exists() {
thread::sleep(Duration::from_millis(10));
}
thread::sleep(Duration::from_millis(50));
let client = UnixStream::connect(&socket_path).expect("connect");
let mut reader = BufReader::new(client.try_clone().expect("clone for reader"));
let mut writer = BufWriter::new(client);
write_message(&mut writer, &ClientMessage::Ping).expect("write Ping");
writer.flush().expect("flush Ping");
let response: DaemonMessage = read_message(&mut reader).expect("read response");
assert_eq!(response, DaemonMessage::Pong);
let _ = rustix::process::kill_process(rustix::process::getpid(), rustix::process::Signal::INT);
handle.join().expect("server thread panicked");
}