59 lines
1.7 KiB
Rust
59 lines
1.7 KiB
Rust
//! Tests for the [unregister_signal] function.
|
|
//!
|
|
//! As a separate integration level test, so it doesn't clash with other tests on the signals.
|
|
|
|
// The unregister_signal itself is deprecated. But we still want to test it, so it's not deprecated
|
|
// and broken at the same time.
|
|
#![allow(deprecated)]
|
|
|
|
extern crate libc;
|
|
extern crate signal_hook_registry;
|
|
|
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
|
use std::sync::Arc;
|
|
|
|
use libc::{SIGINT, SIGTERM}; // We'll use these here because SIGUSR1 is not available on Windows.
|
|
use signal_hook_registry::{register, unregister_signal};
|
|
|
|
#[test]
|
|
fn register_unregister() {
|
|
let called = Arc::new(AtomicUsize::new(0));
|
|
|
|
let hook = {
|
|
let called = Arc::clone(&called);
|
|
move || {
|
|
called.fetch_add(1, Ordering::Relaxed);
|
|
}
|
|
};
|
|
|
|
unsafe {
|
|
register(SIGTERM, hook.clone()).unwrap();
|
|
register(SIGTERM, hook.clone()).unwrap();
|
|
register(SIGINT, hook.clone()).unwrap();
|
|
|
|
libc::raise(SIGTERM);
|
|
}
|
|
|
|
// The closure is run twice.
|
|
assert_eq!(2, called.load(Ordering::Relaxed));
|
|
|
|
assert!(unregister_signal(SIGTERM));
|
|
|
|
unsafe { libc::raise(SIGTERM) };
|
|
// Second one unregisters nothing.
|
|
assert!(!unregister_signal(SIGTERM));
|
|
|
|
// After unregistering (both), it is no longer run at all.
|
|
assert_eq!(2, called.load(Ordering::Relaxed));
|
|
|
|
// The SIGINT one is not disturbed.
|
|
unsafe { libc::raise(SIGINT) };
|
|
assert_eq!(3, called.load(Ordering::Relaxed));
|
|
|
|
// But it's possible to register it again just fine.
|
|
unsafe {
|
|
register(SIGTERM, hook).unwrap();
|
|
libc::raise(SIGTERM);
|
|
}
|
|
assert_eq!(4, called.load(Ordering::Relaxed));
|
|
}
|