linux 如何从std::env::current_dir()引发故障?

oyxsuwqo  于 2023-01-08  发布在  Linux
关注(0)|答案(1)|浏览(170)

我正在创建一个函数,它将在某个时候检查当前目录。从签名来看,current_dir()可能会返回一个错误,我想测试它的情况。但是我不知道如何做到这一点。
下面是我的代码(playground):

use std::env;
 
#[allow(unused)]
fn check_current_dir() -> Result<(), &'static str> {
    if let Ok(current_dir) = env::current_dir() {
        println!("Current dir is ok: {:?}", current_dir);
        return Ok(());
    } else {
        return Err("Currentdir failed");
    }
}

#[cfg(test)]
mod check_current_dir {
    use super::*;

    #[test]
    fn current_dir_fail() {
        assert!(check_current_dir().is_ok()) // want to make it fail
    }
}

我尝试创建一个目录,将当前目录移动到该目录,然后删除该目录,但失败了。我尝试使用一个符号链接目录,但current_dir()仍然返回Ok(_)。这是专为在Linux上运行而设计的。
有谁知道吗?

xesrikrc

xesrikrc1#

current_dir在Unix上使用的getcwd手册页中列出了可能的故障:

ERRORS
       EACCES Permission to read or search a component of the filename was denied.

       ENAMETOOLONG
              getwd(): The size of the null-terminated absolute pathname string exceeds PATH_MAX bytes.

       ENOENT The current working directory has been unlinked.

       ENOMEM Out of memory.

从其中我排除了EFAULTEINVALERANGE,因为Rusts std正在为您处理bufsize。因此,例如,这个删除当前目录的测试将失败:

use std::fs;

use super::*;

#[test]
fn current_dir_fail() {
    fs::create_dir("bogus").unwrap();
    std::env::set_current_dir("bogus").unwrap();
    fs::remove_dir("../bogus").unwrap();
    assert!(check_current_dir().is_ok()) //want to make it fail
}

但是对于您当前的check_current_dir实现,这实际上是在测试std,它已经经过了很好的测试,您不需要这样做。

相关问题