Files
Notes/notes-service/vendor/symlink/tests/test.rs
T
2026-08-01 16:11:49 +03:00

105 lines
3.8 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
use std::env::temp_dir;
use std::fs::{self, File};
use std::io;
use std::io::prelude::*;
use std::path::Path;
extern crate symlink;
use symlink::{symlink_auto, symlink_file, symlink_dir, remove_symlink_file, remove_symlink_dir};
const TEST_FILE_CONTENTS: &'static [u8] =
b"This file was created for the purpose of testing the symlink crate.";
#[test]
fn test_symlink_file() {
let temp = temp_dir();
let file_path = temp.join("symlink-crate-test-file");
let symlink_path = temp.join("symlink-crate-test-file-symlink");
test_file_symlink(&file_path, &symlink_path, |src, dst| symlink_file(src, dst));
}
#[test]
fn test_symlink_auto_file() {
let temp = temp_dir();
let file_path = temp.join("symlink-crate-test-auto-file");
let symlink_path = temp.join("symlink-crate-test-auto-file-symlink");
test_file_symlink(&file_path, &symlink_path, |src, dst| symlink_auto(src, dst));
}
#[test]
fn test_symlink_dir() {
let temp = temp_dir();
let dir_path = temp.join("symlink-crate-test-dir");
let symlink_path = temp.join("symlink-crate-test-dir-symlink");
test_dir_symlink(&dir_path, &symlink_path, |src, dst| symlink_dir(src, dst));
}
#[test]
fn test_symlink_auto_dir() {
let temp = temp_dir();
let dir_path = temp.join("symlink-crate-test-auto-dir");
let symlink_path = temp.join("symlink-crate-test-auto-dir-symlink");
test_dir_symlink(&dir_path, &symlink_path, |src, dst| symlink_auto(src, dst));
}
fn test_file_symlink<F>(file_path: &Path, symlink_path: &Path, create_symlink: F)
where F: for<'a> FnOnce(&'a Path, &'a Path) -> io::Result<()> {
let mut file = File::create(file_path).unwrap();
file.write_all(TEST_FILE_CONTENTS).unwrap();
// Ensure its all written to disk properly.
drop(file);
// Note: the destination is *deliberately* a relative path. TODO: this would probably be a bad
// idea. On Windows, the paths are relative to the working directory (including treating X:foo
// as foo in the X: working directory); on Linux, I dont know? If its anything like ln, its
// a path relative to the symlink.
//create_symlink("symlink-crate-test-file", symlink_path).unwrap();
create_symlink(file_path, symlink_path).unwrap();
assert!(symlink_path.symlink_metadata().unwrap().file_type().is_symlink());
file = File::open(symlink_path).unwrap();
let mut contents = vec![];
file.read_to_end(&mut contents).unwrap();
assert_eq!(contents, TEST_FILE_CONTENTS);
drop(file);
// TODO: use some kind of temp file wrapper which makes sure that the files gets deleted if
// they get created.
remove_symlink_file(symlink_path).unwrap();
fs::remove_file(file_path).unwrap();
assert!(!symlink_path.exists());
assert!(!file_path.exists());
}
fn test_dir_symlink<F>(dir_path: &Path, symlink_path: &Path, create_symlink: F)
where F: for<'a> FnOnce(&'a Path, &'a Path) -> io::Result<()> {
fs::create_dir(dir_path).unwrap();
let file_path = dir_path.join("test-file");
let mut file = File::create(&file_path).unwrap();
file.write_all(TEST_FILE_CONTENTS).unwrap();
drop(file);
create_symlink(dir_path, symlink_path).unwrap();
assert!(symlink_path.symlink_metadata().unwrap().file_type().is_symlink());
file = File::open(symlink_path.join("test-file")).unwrap();
let mut contents = vec![];
file.read_to_end(&mut contents).unwrap();
assert_eq!(contents, TEST_FILE_CONTENTS);
drop(file);
// TODO: use some kind of temp file wrapper which makes sure that the files gets deleted if
// they get created.
remove_symlink_dir(symlink_path).unwrap();
fs::remove_file(&file_path).unwrap();
fs::remove_dir(dir_path).unwrap();
assert!(!symlink_path.exists());
assert!(!file_path.exists());
assert!(!dir_path.exists());
}