Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mkdir: explicit umask and sequential tests #4896

Merged
merged 3 commits into from
May 25, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions tests/by-util/test_mkdir.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@
use crate::common::util::TestScenario;
#[cfg(not(windows))]
use libc::{mode_t, umask};
use once_cell::sync::Lazy;
#[cfg(not(windows))]
use std::os::unix::fs::PermissionsExt;
use std::sync::Mutex;

// tests in `test_mkdir.rs` cannot run in parallel since some tests alter the umask. This may cause
// other tests to run under a wrong set of permissions
//
// when writing a test case, acquire this mutex before proceeding with the main logic of the test
static TEST_MUTEX: Lazy<Mutex<()>> = Lazy::new(|| Mutex::new(()));
shinhs0506 marked this conversation as resolved.
Show resolved Hide resolved

static TEST_DIR1: &str = "mkdir_test1";
static TEST_DIR2: &str = "mkdir_test2";
Expand All @@ -20,16 +28,19 @@ static TEST_DIR12: &str = "mkdir_test12";

#[test]
fn test_invalid_arg() {
let _guard = TEST_MUTEX.lock();
new_ucmd!().arg("--definitely-invalid").fails().code_is(1);
}

#[test]
fn test_mkdir_mkdir() {
let _guard = TEST_MUTEX.lock();
new_ucmd!().arg(TEST_DIR1).succeeds();
}

#[test]
fn test_mkdir_verbose() {
let _guard = TEST_MUTEX.lock();
let expected = "mkdir: created directory 'mkdir_test1'\n";
new_ucmd!()
.arg(TEST_DIR1)
Expand All @@ -40,18 +51,21 @@ fn test_mkdir_verbose() {

#[test]
fn test_mkdir_dup_dir() {
let _guard = TEST_MUTEX.lock();
let scene = TestScenario::new(util_name!());
scene.ucmd().arg(TEST_DIR2).succeeds();
scene.ucmd().arg(TEST_DIR2).fails();
}

#[test]
fn test_mkdir_mode() {
let _guard = TEST_MUTEX.lock();
new_ucmd!().arg("-m").arg("755").arg(TEST_DIR3).succeeds();
}

#[test]
fn test_mkdir_parent() {
let _guard = TEST_MUTEX.lock();
let scene = TestScenario::new(util_name!());
scene.ucmd().arg("-p").arg(TEST_DIR4).succeeds();
scene.ucmd().arg("-p").arg(TEST_DIR4).succeeds();
Expand All @@ -61,11 +75,13 @@ fn test_mkdir_parent() {

#[test]
fn test_mkdir_no_parent() {
let _guard = TEST_MUTEX.lock();
new_ucmd!().arg(TEST_DIR5).fails();
}

#[test]
fn test_mkdir_dup_dir_parent() {
let _guard = TEST_MUTEX.lock();
let scene = TestScenario::new(util_name!());
scene.ucmd().arg(TEST_DIR6).succeeds();
scene.ucmd().arg("-p").arg(TEST_DIR6).succeeds();
Expand All @@ -74,6 +90,7 @@ fn test_mkdir_dup_dir_parent() {
#[cfg(not(windows))]
#[test]
fn test_mkdir_parent_mode() {
let _guard = TEST_MUTEX.lock();
let (at, mut ucmd) = at_and_ucmd!();

let default_umask: mode_t = 0o160;
Expand Down Expand Up @@ -102,6 +119,7 @@ fn test_mkdir_parent_mode() {
#[cfg(not(windows))]
#[test]
fn test_mkdir_parent_mode_check_existing_parent() {
let _guard = TEST_MUTEX.lock();
let (at, mut ucmd) = at_and_ucmd!();

at.mkdir("a");
Expand Down Expand Up @@ -139,6 +157,7 @@ fn test_mkdir_parent_mode_check_existing_parent() {

#[test]
fn test_mkdir_dup_file() {
let _guard = TEST_MUTEX.lock();
let scene = TestScenario::new(util_name!());
scene.fixtures.touch(TEST_FILE7);
scene.ucmd().arg(TEST_FILE7).fails();
Expand All @@ -150,6 +169,7 @@ fn test_mkdir_dup_file() {
#[test]
#[cfg(not(windows))]
fn test_symbolic_mode() {
let _guard = TEST_MUTEX.lock();
let (at, mut ucmd) = at_and_ucmd!();

ucmd.arg("-m").arg("a=rwx").arg(TEST_DIR1).succeeds();
Expand All @@ -160,16 +180,23 @@ fn test_symbolic_mode() {
#[test]
#[cfg(not(windows))]
fn test_symbolic_alteration() {
let _guard = TEST_MUTEX.lock();
let (at, mut ucmd) = at_and_ucmd!();

let default_umask = 0o022;
let original_umask = unsafe { umask(default_umask) };

ucmd.arg("-m").arg("-w").arg(TEST_DIR1).succeeds();
let perms = at.metadata(TEST_DIR1).permissions().mode();
assert_eq!(perms, 0o40577);

unsafe { umask(original_umask) };
}

#[test]
#[cfg(not(windows))]
fn test_multi_symbolic() {
let _guard = TEST_MUTEX.lock();
let (at, mut ucmd) = at_and_ucmd!();

ucmd.arg("-m")
Expand All @@ -182,6 +209,7 @@ fn test_multi_symbolic() {

#[test]
fn test_recursive_reporting() {
let _guard = TEST_MUTEX.lock();
new_ucmd!()
.arg("-p")
.arg("-v")
Expand All @@ -203,6 +231,7 @@ fn test_recursive_reporting() {

#[test]
fn test_mkdir_trailing_dot() {
let _guard = TEST_MUTEX.lock();
let scene2 = TestScenario::new("ls");
new_ucmd!()
.arg("-p")
Expand Down Expand Up @@ -231,6 +260,7 @@ fn test_mkdir_trailing_dot() {
#[cfg(not(windows))]
fn test_umask_compliance() {
fn test_single_case(umask_set: mode_t) {
let _guard = TEST_MUTEX.lock();
let (at, mut ucmd) = at_and_ucmd!();

let original_umask = unsafe { umask(umask_set) };
Expand Down