diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/sys/test_ptrace.rs | 2 | ||||
-rw-r--r-- | test/test.rs | 51 | ||||
-rw-r--r-- | test/test_fcntl.rs | 20 | ||||
-rw-r--r-- | test/test_unistd.rs | 2 |
4 files changed, 39 insertions, 36 deletions
diff --git a/test/sys/test_ptrace.rs b/test/sys/test_ptrace.rs index 05f407cc..46ea3d6a 100644 --- a/test/sys/test_ptrace.rs +++ b/test/sys/test_ptrace.rs @@ -128,6 +128,8 @@ fn test_ptrace_syscall() { use nix::unistd::getpid; use nix::unistd::ForkResult::*; + require_capability!(CAP_SYS_PTRACE); + let _m = crate::FORK_MTX.lock().expect("Mutex got poisoned by another test"); match fork().expect("Error: Fork Failed") { diff --git a/test/test.rs b/test/test.rs index ac842b11..2d43196c 100644 --- a/test/test.rs +++ b/test/test.rs @@ -5,22 +5,27 @@ extern crate nix; #[macro_use] extern crate lazy_static; +macro_rules! skip { + ($($reason: expr),+) => { + use ::std::io::{self, Write}; + + let stderr = io::stderr(); + let mut handle = stderr.lock(); + writeln!(handle, $($reason),+).unwrap(); + return; + } +} + cfg_if! { if #[cfg(any(target_os = "android", target_os = "linux"))] { macro_rules! require_capability { ($capname:ident) => { use ::caps::{Capability, CapSet, has_cap}; - use ::std::io::{self, Write}; if !has_cap(None, CapSet::Effective, Capability::$capname) .unwrap() { - let stderr = io::stderr(); - let mut handle = stderr.lock(); - writeln!(handle, - "Insufficient capabilities. Skipping test.") - .unwrap(); - return; + skip!("Insufficient capabilities. Skipping test."); } } } @@ -39,12 +44,7 @@ macro_rules! skip_if_jailed { 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; + skip!("{} cannot run in a jail. Skipping test.", $name); } } } @@ -55,11 +55,7 @@ macro_rules! skip_if_not_root { use nix::unistd::Uid; if !Uid::current().is_root() { - use ::std::io::Write; - let stderr = ::std::io::stderr(); - let mut handle = stderr.lock(); - writeln!(handle, "{} requires root privileges. Skipping test.", $name).unwrap(); - return; + skip!("{} requires root privileges. Skipping test.", $name); } }; } @@ -74,13 +70,8 @@ cfg_if! { if fields.next() == Some("Seccomp:") && fields.next() != Some("0") { - use ::std::io::Write; - let stderr = ::std::io::stderr(); - let mut handle = stderr.lock(); - writeln!(handle, - "{} cannot be run in Seccomp mode. Skipping test.", - stringify!($name)).unwrap(); - return; + skip!("{} cannot be run in Seccomp mode. Skipping test.", + stringify!($name)); } } } @@ -97,7 +88,6 @@ cfg_if! { if #[cfg(target_os = "linux")] { macro_rules! require_kernel_version { ($name:expr, $version_requirement:expr) => { - use ::std::io::Write; use semver::{Version, VersionReq}; let version_requirement = VersionReq::parse($version_requirement) @@ -112,13 +102,8 @@ cfg_if! { version.build.clear(); if !version_requirement.matches(&version) { - let stderr = ::std::io::stderr(); - let mut handle = stderr.lock(); - - writeln!(handle, - "Skip {} because kernel version `{}` doesn't match the requirement `{}`", - stringify!($name), version, version_requirement).unwrap(); - return; + skip!("Skip {} because kernel version `{}` doesn't match the requirement `{}`", + stringify!($name), version, version_requirement); } } } diff --git a/test/test_fcntl.rs b/test/test_fcntl.rs index c9f382bc..29719072 100644 --- a/test/test_fcntl.rs +++ b/test/test_fcntl.rs @@ -228,11 +228,19 @@ mod linux_android { target_arch = "mips64", target_arch = "mips64el", target_arch = "powerpc64", - target_arch = "powerpc64le")))] + target_arch = "powerpc64le", + target_env = "musl")))] fn test_ofd_write_lock() { let tmp = NamedTempFile::new().unwrap(); let fd = tmp.as_raw_fd(); + let statfs = nix::sys::statfs::fstatfs(&tmp).unwrap(); + if statfs.filesystem_type() == nix::sys::statfs::OVERLAYFS_SUPER_MAGIC { + // OverlayFS is a union file system. It returns one inode value in + // stat(2), but a different one shows up in /proc/locks. So we must + // skip the test. + skip!("/proc/locks does not work on overlayfs"); + } let inode = fstat(fd).expect("fstat failed").st_ino as usize; let mut flock = libc::flock { @@ -262,11 +270,19 @@ mod linux_android { target_arch = "mips64", target_arch = "mips64el", target_arch = "powerpc64", - target_arch = "powerpc64le")))] + target_arch = "powerpc64le", + target_env = "musl")))] fn test_ofd_read_lock() { let tmp = NamedTempFile::new().unwrap(); let fd = tmp.as_raw_fd(); + let statfs = nix::sys::statfs::fstatfs(&tmp).unwrap(); + if statfs.filesystem_type() == nix::sys::statfs::OVERLAYFS_SUPER_MAGIC { + // OverlayFS is a union file system. It returns one inode value in + // stat(2), but a different one shows up in /proc/locks. So we must + // skip the test. + skip!("/proc/locks does not work on overlayfs"); + } let inode = fstat(fd).expect("fstat failed").st_ino as usize; let mut flock = libc::flock { diff --git a/test/test_unistd.rs b/test/test_unistd.rs index da677287..8fe1d432 100644 --- a/test/test_unistd.rs +++ b/test/test_unistd.rs @@ -936,7 +936,7 @@ fn test_access_file_exists() { #[test] fn test_setfsuid() { use std::os::unix::fs::PermissionsExt; - use std::{fs, thread}; + use std::{fs, io, thread}; require_capability!(CAP_SETUID); // get the UID of the "nobody" user |