1 #[cfg(target_os = "linux")]
2 #[cfg(feature = "process")]
3 mod test_prctl {
4     use std::ffi::CStr;
5 
6     use nix::sys::prctl;
7 
8     #[cfg_attr(qemu, ignore)]
9     #[test]
test_get_set_subreaper()10     fn test_get_set_subreaper() {
11         let original = prctl::get_child_subreaper().unwrap();
12 
13         prctl::set_child_subreaper(true).unwrap();
14         let subreaper = prctl::get_child_subreaper().unwrap();
15         assert!(subreaper);
16 
17         prctl::set_child_subreaper(original).unwrap();
18     }
19 
20     #[test]
test_get_set_dumpable()21     fn test_get_set_dumpable() {
22         let original = prctl::get_dumpable().unwrap();
23 
24         prctl::set_dumpable(false).unwrap();
25         let dumpable = prctl::get_dumpable().unwrap();
26         assert!(!dumpable);
27 
28         prctl::set_dumpable(original).unwrap();
29     }
30 
31     #[test]
test_get_set_keepcaps()32     fn test_get_set_keepcaps() {
33         let original = prctl::get_keepcaps().unwrap();
34 
35         prctl::set_keepcaps(true).unwrap();
36         let keepcaps = prctl::get_keepcaps().unwrap();
37         assert!(keepcaps);
38 
39         prctl::set_keepcaps(original).unwrap();
40     }
41 
42     #[test]
test_get_set_clear_mce_kill()43     fn test_get_set_clear_mce_kill() {
44         use prctl::PrctlMCEKillPolicy::*;
45 
46         prctl::set_mce_kill(PR_MCE_KILL_LATE).unwrap();
47         let mce = prctl::get_mce_kill().unwrap();
48         assert_eq!(mce, PR_MCE_KILL_LATE);
49 
50         prctl::clear_mce_kill().unwrap();
51         let mce = prctl::get_mce_kill().unwrap();
52         assert_eq!(mce, PR_MCE_KILL_DEFAULT);
53     }
54 
55     #[cfg_attr(qemu, ignore)]
56     #[test]
test_get_set_pdeathsig()57     fn test_get_set_pdeathsig() {
58         use nix::sys::signal::Signal;
59 
60         let original = prctl::get_pdeathsig().unwrap();
61 
62         prctl::set_pdeathsig(Signal::SIGUSR1).unwrap();
63         let sig = prctl::get_pdeathsig().unwrap();
64         assert_eq!(sig, Some(Signal::SIGUSR1));
65 
66         prctl::set_pdeathsig(original).unwrap();
67     }
68 
69     #[test]
test_get_set_name()70     fn test_get_set_name() {
71         let original = prctl::get_name().unwrap();
72 
73         let long_name =
74             CStr::from_bytes_with_nul(b"0123456789abcdefghijklmn\0").unwrap();
75         prctl::set_name(long_name).unwrap();
76         let res = prctl::get_name().unwrap();
77 
78         // name truncated by kernel to TASK_COMM_LEN
79         assert_eq!(&long_name.to_str().unwrap()[..15], res.to_str().unwrap());
80 
81         let short_name = CStr::from_bytes_with_nul(b"01234567\0").unwrap();
82         prctl::set_name(short_name).unwrap();
83         let res = prctl::get_name().unwrap();
84         assert_eq!(short_name.to_str().unwrap(), res.to_str().unwrap());
85 
86         prctl::set_name(&original).unwrap();
87     }
88 
89     #[cfg_attr(qemu, ignore)]
90     #[test]
test_get_set_timerslack()91     fn test_get_set_timerslack() {
92         let original = prctl::get_timerslack().unwrap();
93 
94         let slack = 60_000;
95         prctl::set_timerslack(slack).unwrap();
96         let res = prctl::get_timerslack().unwrap();
97         assert_eq!(slack, res as u64);
98 
99         prctl::set_timerslack(original as u64).unwrap();
100     }
101 
102     #[test]
test_disable_enable_perf_events()103     fn test_disable_enable_perf_events() {
104         prctl::task_perf_events_disable().unwrap();
105         prctl::task_perf_events_enable().unwrap();
106     }
107 
108     #[test]
test_get_set_no_new_privs()109     fn test_get_set_no_new_privs() {
110         prctl::set_no_new_privs().unwrap();
111         let no_new_privs = prctl::get_no_new_privs().unwrap();
112         assert!(no_new_privs);
113     }
114 
115     #[test]
test_get_set_thp_disable()116     fn test_get_set_thp_disable() {
117         let original = prctl::get_thp_disable().unwrap();
118 
119         prctl::set_thp_disable(true).unwrap();
120         let thp_disable = prctl::get_thp_disable().unwrap();
121         assert!(thp_disable);
122 
123         prctl::set_thp_disable(original).unwrap();
124     }
125 }
126