use tokio::signal;
pub async fn shutdown_signal() {
#[cfg(unix)]
{
let mut sigint = signal::unix::signal(signal::unix::SignalKind::interrupt())
.expect("install SIGINT handler");
let mut sigterm = signal::unix::signal(signal::unix::SignalKind::terminate())
.expect("install SIGTERM handler");
tokio::select! {
_ = sigint.recv() => {},
_ = sigterm.recv() => {},
}
}
#[cfg(not(unix))]
{
let _ = signal::ctrl_c().await;
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::time::Duration;
use tokio::time::timeout;
#[tokio::test]
#[cfg(unix)]
async fn test_shutdown_signal_with_timeout() {
let result = timeout(Duration::from_millis(100), shutdown_signal()).await;
assert!(result.is_err(), "Should timeout waiting for signal");
}
#[test]
fn test_shutdown_signal_signature() {
let _future = shutdown_signal();
}
}