mirror of
https://github.com/uutils/coreutils
synced 2024-12-30 06:53:23 +00:00
399 lines
13 KiB
Rust
399 lines
13 KiB
Rust
use crate::common::util::*;
|
|
#[cfg(target_os = "linux")]
|
|
use rust_users::get_effective_uid;
|
|
|
|
extern crate chown;
|
|
|
|
#[cfg(test)]
|
|
mod test_passgrp {
|
|
use super::chown::entries::{gid2grp, grp2gid, uid2usr, usr2uid};
|
|
|
|
#[test]
|
|
fn test_usr2uid() {
|
|
assert_eq!(0, usr2uid("root").unwrap());
|
|
assert!(usr2uid("88888888").is_err());
|
|
assert!(usr2uid("auserthatdoesntexist").is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn test_grp2gid() {
|
|
if cfg!(target_os = "linux") || cfg!(target_os = "android") || cfg!(target_os = "windows") {
|
|
assert_eq!(0, grp2gid("root").unwrap())
|
|
} else {
|
|
assert_eq!(0, grp2gid("wheel").unwrap());
|
|
}
|
|
assert!(grp2gid("88888888").is_err());
|
|
assert!(grp2gid("agroupthatdoesntexist").is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn test_uid2usr() {
|
|
assert_eq!("root", uid2usr(0).unwrap());
|
|
assert!(uid2usr(88888888).is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn test_gid2grp() {
|
|
if cfg!(target_os = "linux") || cfg!(target_os = "android") || cfg!(target_os = "windows") {
|
|
assert_eq!("root", gid2grp(0).unwrap());
|
|
} else {
|
|
assert_eq!("wheel", gid2grp(0).unwrap());
|
|
}
|
|
assert!(gid2grp(88888888).is_err());
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn test_invalid_option() {
|
|
new_ucmd!().arg("-w").arg("-q").arg("/").fails();
|
|
}
|
|
|
|
#[test]
|
|
fn test_chown_myself() {
|
|
// test chown username file.txt
|
|
let scene = TestScenario::new(util_name!());
|
|
let result = scene.cmd("whoami").run();
|
|
if is_ci() && result.stderr.contains("No such user/group") {
|
|
// In the CI, some server are failing to return whoami.
|
|
// As seems to be a configuration issue, ignoring it
|
|
return;
|
|
}
|
|
println!("results {}", result.stdout);
|
|
let username = result.stdout.trim_end();
|
|
|
|
let (at, mut ucmd) = at_and_ucmd!();
|
|
let file1 = "test_install_target_dir_file_a1";
|
|
|
|
at.touch(file1);
|
|
let result = ucmd.arg(username).arg(file1).run();
|
|
println!("results stdout {}", result.stdout);
|
|
println!("results stderr {}", result.stderr);
|
|
if is_ci() && result.stderr.contains("invalid user") {
|
|
// In the CI, some server are failing to return id.
|
|
// As seems to be a configuration issue, ignoring it
|
|
return;
|
|
}
|
|
assert!(result.success);
|
|
}
|
|
|
|
#[test]
|
|
fn test_chown_myself_second() {
|
|
// test chown username: file.txt
|
|
let scene = TestScenario::new(util_name!());
|
|
let result = scene.cmd("whoami").run();
|
|
if is_ci() && result.stderr.contains("No such user/group") {
|
|
// In the CI, some server are failing to return whoami.
|
|
// As seems to be a configuration issue, ignoring it
|
|
return;
|
|
}
|
|
println!("results {}", result.stdout);
|
|
|
|
let (at, mut ucmd) = at_and_ucmd!();
|
|
let file1 = "test_install_target_dir_file_a1";
|
|
|
|
at.touch(file1);
|
|
let result = ucmd
|
|
.arg(result.stdout.trim_end().to_owned() + ":")
|
|
.arg(file1)
|
|
.run();
|
|
|
|
println!("result.stdout = {}", result.stdout);
|
|
println!("result.stderr = {}", result.stderr);
|
|
assert!(result.success);
|
|
}
|
|
|
|
#[test]
|
|
fn test_chown_myself_group() {
|
|
// test chown username:group file.txt
|
|
let scene = TestScenario::new(util_name!());
|
|
let result = scene.cmd("whoami").run();
|
|
if is_ci() && result.stderr.contains("No such user/group") {
|
|
// In the CI, some server are failing to return whoami.
|
|
// As seems to be a configuration issue, ignoring it
|
|
return;
|
|
}
|
|
println!("user name = {}", result.stdout);
|
|
let username = result.stdout.trim_end();
|
|
|
|
let result = scene.cmd("id").arg("-gn").run();
|
|
if is_ci() && result.stderr.contains("No such user/group") {
|
|
// In the CI, some server are failing to return whoami.
|
|
// As seems to be a configuration issue, ignoring it
|
|
return;
|
|
}
|
|
println!("group name = {}", result.stdout);
|
|
let group = result.stdout.trim_end();
|
|
|
|
let (at, mut ucmd) = at_and_ucmd!();
|
|
let file1 = "test_install_target_dir_file_a1";
|
|
let perm = username.to_owned() + ":" + group;
|
|
at.touch(file1);
|
|
let result = ucmd.arg(perm).arg(file1).run();
|
|
println!("result.stdout = {}", result.stdout);
|
|
println!("result.stderr = {}", result.stderr);
|
|
if is_ci() && result.stderr.contains("chown: invalid group:") {
|
|
// With some Ubuntu into the CI, we can get this answer
|
|
return;
|
|
}
|
|
assert!(result.success);
|
|
}
|
|
|
|
#[test]
|
|
fn test_chown_only_group() {
|
|
// test chown :group file.txt
|
|
let scene = TestScenario::new(util_name!());
|
|
let result = scene.cmd("whoami").run();
|
|
if is_ci() && result.stderr.contains("No such user/group") {
|
|
// In the CI, some server are failing to return whoami.
|
|
// As seems to be a configuration issue, ignoring it
|
|
return;
|
|
}
|
|
println!("results {}", result.stdout);
|
|
|
|
let (at, mut ucmd) = at_and_ucmd!();
|
|
let file1 = "test_install_target_dir_file_a1";
|
|
let perm = ":".to_owned() + result.stdout.trim_end();
|
|
at.touch(file1);
|
|
let result = ucmd.arg(perm).arg(file1).run();
|
|
|
|
println!("result.stdout = {}", result.stdout);
|
|
println!("result.stderr = {}", result.stderr);
|
|
|
|
if is_ci() && result.stderr.contains("Operation not permitted") {
|
|
// With ubuntu with old Rust in the CI, we can get an error
|
|
return;
|
|
}
|
|
if is_ci() && result.stderr.contains("chown: invalid group:") {
|
|
// With mac into the CI, we can get this answer
|
|
return;
|
|
}
|
|
assert!(result.success);
|
|
}
|
|
|
|
#[test]
|
|
fn test_chown_only_id() {
|
|
// test chown 1111 file.txt
|
|
let result = TestScenario::new("id").ucmd_keepenv().arg("-u").run();
|
|
if is_ci() && result.stderr.contains("No such user/group") {
|
|
// In the CI, some server are failing to return whoami.
|
|
// As seems to be a configuration issue, ignoring it
|
|
return;
|
|
}
|
|
println!("result.stdout = {}", result.stdout);
|
|
println!("result.stderr = {}", result.stderr);
|
|
let id = String::from(result.stdout.trim());
|
|
|
|
let (at, mut ucmd) = at_and_ucmd!();
|
|
let file1 = "test_install_target_dir_file_a1";
|
|
|
|
at.touch(file1);
|
|
let result = ucmd.arg(id).arg(file1).run();
|
|
|
|
println!("result.stdout = {}", result.stdout);
|
|
println!("result.stderr = {}", result.stderr);
|
|
if is_ci() && result.stderr.contains("chown: invalid user:") {
|
|
// With some Ubuntu into the CI, we can get this answer
|
|
return;
|
|
}
|
|
assert!(result.success);
|
|
}
|
|
|
|
#[test]
|
|
fn test_chown_only_group_id() {
|
|
// test chown :1111 file.txt
|
|
let result = TestScenario::new("id").ucmd_keepenv().arg("-g").run();
|
|
if is_ci() && result.stderr.contains("No such user/group") {
|
|
// In the CI, some server are failing to return whoami.
|
|
// As seems to be a configuration issue, ignoring it
|
|
return;
|
|
}
|
|
println!("result.stdout {}", result.stdout);
|
|
println!("result.stderr = {}", result.stderr);
|
|
let id = String::from(result.stdout.trim());
|
|
|
|
let (at, mut ucmd) = at_and_ucmd!();
|
|
let file1 = "test_install_target_dir_file_a1";
|
|
|
|
at.touch(file1);
|
|
let perm = ":".to_owned() + &id;
|
|
|
|
let result = ucmd.arg(perm).arg(file1).run();
|
|
|
|
println!("result.stdout = {}", result.stdout);
|
|
println!("result.stderr = {}", result.stderr);
|
|
if is_ci() && result.stderr.contains("chown: invalid group:") {
|
|
// With mac into the CI, we can get this answer
|
|
return;
|
|
}
|
|
assert!(result.success);
|
|
}
|
|
|
|
#[test]
|
|
fn test_chown_both_id() {
|
|
// test chown 1111:1111 file.txt
|
|
let result = TestScenario::new("id").ucmd_keepenv().arg("-u").run();
|
|
if is_ci() && result.stderr.contains("No such user/group") {
|
|
// In the CI, some server are failing to return whoami.
|
|
// As seems to be a configuration issue, ignoring it
|
|
return;
|
|
}
|
|
println!("result.stdout {}", result.stdout);
|
|
println!("result.stderr = {}", result.stderr);
|
|
let id_user = String::from(result.stdout.trim());
|
|
|
|
let result = TestScenario::new("id").ucmd_keepenv().arg("-g").run();
|
|
if is_ci() && result.stderr.contains("No such user/group") {
|
|
// In the CI, some server are failing to return whoami.
|
|
// As seems to be a configuration issue, ignoring it
|
|
return;
|
|
}
|
|
println!("result.stdout {}", result.stdout);
|
|
println!("result.stderr = {}", result.stderr);
|
|
let id_group = String::from(result.stdout.trim());
|
|
|
|
let (at, mut ucmd) = at_and_ucmd!();
|
|
let file1 = "test_install_target_dir_file_a1";
|
|
|
|
at.touch(file1);
|
|
let perm = id_user + &":".to_owned() + &id_group;
|
|
|
|
let result = ucmd.arg(perm).arg(file1).run();
|
|
println!("result.stdout {}", result.stdout);
|
|
println!("result.stderr = {}", result.stderr);
|
|
|
|
if is_ci() && result.stderr.contains("invalid user") {
|
|
// In the CI, some server are failing to return id.
|
|
// As seems to be a configuration issue, ignoring it
|
|
return;
|
|
}
|
|
|
|
assert!(result.success);
|
|
}
|
|
|
|
#[test]
|
|
fn test_chown_both_mix() {
|
|
// test chown 1111:1111 file.txt
|
|
let result = TestScenario::new("id").ucmd_keepenv().arg("-u").run();
|
|
if is_ci() && result.stderr.contains("No such user/group") {
|
|
// In the CI, some server are failing to return whoami.
|
|
// As seems to be a configuration issue, ignoring it
|
|
return;
|
|
}
|
|
println!("result.stdout {}", result.stdout);
|
|
println!("result.stderr = {}", result.stderr);
|
|
let id_user = String::from(result.stdout.trim());
|
|
|
|
let result = TestScenario::new("id").ucmd_keepenv().arg("-gn").run();
|
|
if is_ci() && result.stderr.contains("No such user/group") {
|
|
// In the CI, some server are failing to return whoami.
|
|
// As seems to be a configuration issue, ignoring it
|
|
return;
|
|
}
|
|
println!("result.stdout {}", result.stdout);
|
|
println!("result.stderr = {}", result.stderr);
|
|
let group_name = String::from(result.stdout.trim());
|
|
|
|
let (at, mut ucmd) = at_and_ucmd!();
|
|
let file1 = "test_install_target_dir_file_a1";
|
|
|
|
at.touch(file1);
|
|
let perm = id_user + &":".to_owned() + &group_name;
|
|
|
|
let result = ucmd.arg(perm).arg(file1).run();
|
|
|
|
if is_ci() && result.stderr.contains("invalid user") {
|
|
// In the CI, some server are failing to return id.
|
|
// As seems to be a configuration issue, ignoring it
|
|
return;
|
|
}
|
|
assert!(result.success);
|
|
}
|
|
|
|
#[test]
|
|
fn test_chown_recursive() {
|
|
let scene = TestScenario::new(util_name!());
|
|
let result = scene.cmd("whoami").run();
|
|
if is_ci() && result.stderr.contains("No such user/group") {
|
|
// In the CI, some server are failing to return whoami.
|
|
// As seems to be a configuration issue, ignoring it
|
|
return;
|
|
}
|
|
println!("result.stdout {}", result.stdout);
|
|
println!("result.stderr = {}", result.stderr);
|
|
let username = result.stdout.trim_end();
|
|
|
|
let (at, mut ucmd) = at_and_ucmd!();
|
|
at.mkdir("a");
|
|
at.mkdir("a/b");
|
|
at.mkdir("a/b/c");
|
|
at.mkdir("z");
|
|
at.touch(&at.plus_as_string("a/a"));
|
|
at.touch(&at.plus_as_string("a/b/b"));
|
|
at.touch(&at.plus_as_string("a/b/c/c"));
|
|
at.touch(&at.plus_as_string("z/y"));
|
|
|
|
let result = ucmd
|
|
.arg("-R")
|
|
.arg("--verbose")
|
|
.arg(username)
|
|
.arg("a")
|
|
.arg("z")
|
|
.run();
|
|
println!("result.stdout {}", result.stdout);
|
|
println!("result.stderr = {}", result.stderr);
|
|
if is_ci() && result.stderr.contains("invalid user") {
|
|
// In the CI, some server are failing to return id.
|
|
// As seems to be a configuration issue, ignoring it
|
|
return;
|
|
}
|
|
|
|
assert!(result.stderr.contains("ownership of 'a/a' retained as"));
|
|
assert!(result.stderr.contains("ownership of 'z/y' retained as"));
|
|
assert!(result.success);
|
|
}
|
|
|
|
#[test]
|
|
fn test_root_preserve() {
|
|
let scene = TestScenario::new(util_name!());
|
|
let result = scene.cmd("whoami").run();
|
|
if is_ci() && result.stderr.contains("No such user/group") {
|
|
// In the CI, some server are failing to return whoami.
|
|
// As seems to be a configuration issue, ignoring it
|
|
return;
|
|
}
|
|
println!("result.stdout {}", result.stdout);
|
|
println!("result.stderr = {}", result.stderr);
|
|
let username = result.stdout.trim_end();
|
|
|
|
let result = new_ucmd!()
|
|
.arg("--preserve-root")
|
|
.arg("-R")
|
|
.arg(username)
|
|
.arg("/")
|
|
.fails();
|
|
println!("result.stdout {}", result.stdout);
|
|
println!("result.stderr = {}", result.stderr);
|
|
if is_ci() && result.stderr.contains("invalid user") {
|
|
// In the CI, some server are failing to return id.
|
|
// As seems to be a configuration issue, ignoring it
|
|
return;
|
|
}
|
|
assert!(result
|
|
.stderr
|
|
.contains("chown: it is dangerous to operate recursively"));
|
|
}
|
|
|
|
#[cfg(target_os = "linux")]
|
|
#[test]
|
|
fn test_big_p() {
|
|
if get_effective_uid() != 0 {
|
|
new_ucmd!()
|
|
.arg("-RP")
|
|
.arg("bin")
|
|
.arg("/proc/self/cwd")
|
|
.fails()
|
|
.stderr_is(
|
|
"chown: changing ownership of '/proc/self/cwd': Operation not permitted (os error 1)\n",
|
|
);
|
|
}
|
|
}
|