summaryrefslogtreecommitdiff
path: root/test/test.rs
diff options
context:
space:
mode:
authorAlan Somers <asomers@gmail.com>2019-05-26 18:20:04 -0600
committerAlan Somers <asomers@gmail.com>2019-06-06 08:54:18 -0600
commit129485cfa3455b7eda3217e36ee89d4ca75d38b2 (patch)
treedc0595bc5fc596539f21a0f3ab6528d2da3d003f /test/test.rs
parentd39bdbdd9cbe6bb5c782c8ea14932ec62c272764 (diff)
downloadnix-129485cfa3455b7eda3217e36ee89d4ca75d38b2.zip
Fix multiple problems with the test_acct test
* On Linux, it requires the CAP_SYS_PACCT capability. * Reenable the test on FreeBSD, because our FreeBSD CI environment is no longer jailed (since we switched from BuildBot to CirrusCI), but check at runtime whether the process is jailed. * test_acct needs the FORK_MTX because it uses Command::new . * Fix a race condition. acct(2) isn't synchronous. It starts a kernel thread but does not wait for it to become ready. Fix it by running the test command within the polling loop.
Diffstat (limited to 'test/test.rs')
-rw-r--r--test/test.rs25
1 files changed, 22 insertions, 3 deletions
diff --git a/test/test.rs b/test/test.rs
index 0a3d3b74..c8b8717f 100644
--- a/test/test.rs
+++ b/test/test.rs
@@ -9,6 +9,8 @@ extern crate nix;
extern crate lazy_static;
extern crate libc;
extern crate rand;
+#[cfg(target_os = "freebsd")]
+extern crate sysctl;
extern crate tempfile;
#[cfg(any(target_os = "android", target_os = "linux"))]
@@ -27,14 +29,31 @@ macro_rules! require_capability {
}
}
+#[cfg(target_os = "freebsd")]
+macro_rules! skip_if_jailed {
+ ($name:expr) => {
+ use ::sysctl::CtlValue;
+
+ if let CtlValue::Int(1) = ::sysctl::value("security.jail.jailed")
+ .unwrap()
+ {
+ use ::std::io::Write;
+ let stderr = ::std::io::stderr();
+ let mut handle = stderr.lock();
+ writeln!(handle, "{} cannot run in a jail. Skipping test.", $name)
+ .unwrap();
+ return;
+ }
+ }
+}
+
macro_rules! skip_if_not_root {
($name:expr) => {
use nix::unistd::Uid;
- use std;
- use std::io::Write;
if !Uid::current().is_root() {
- let stderr = std::io::stderr();
+ use ::std::io::Write;
+ let stderr = ::std::io::stderr();
let mut handle = stderr.lock();
writeln!(handle, "{} requires root privileges. Skipping test.", $name).unwrap();
return;