Add SMB Previous Versions tests: GMT token generation and snapshot listing/open/restore verification
This commit is contained in:
@@ -771,3 +771,118 @@ impl VfsAclMeta {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use std::fs;
|
||||
use std::time::Duration;
|
||||
use tempfile::TempDir;
|
||||
|
||||
fn setup_snapshots(base_dir: &Path, snapshot_name: &str) -> PathBuf {
|
||||
let snapshots_dir = base_dir.join(".snapshots");
|
||||
let snapshot_path = snapshots_dir.join(snapshot_name);
|
||||
|
||||
fs::create_dir_all(&snapshot_path).unwrap();
|
||||
|
||||
let meta = VfsSnapshotMeta {
|
||||
name: snapshot_name.to_string(),
|
||||
created: SystemTime::now(),
|
||||
source_path: base_dir.to_string_lossy().to_string(),
|
||||
};
|
||||
|
||||
let meta_file = snapshot_path.join(".meta");
|
||||
let meta_json = serde_json::to_string(&meta).unwrap();
|
||||
fs::write(&meta_file, &meta_json).unwrap();
|
||||
|
||||
snapshot_path
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_list_previous_versions_with_snapshot() {
|
||||
let temp_dir = TempDir::new().unwrap();
|
||||
let fs_backend = LocalFs::new();
|
||||
|
||||
setup_snapshots(temp_dir.path(), "snapshot_1");
|
||||
|
||||
let versions = fs_backend.list_previous_versions(temp_dir.path()).unwrap();
|
||||
assert_eq!(versions.len(), 1);
|
||||
|
||||
let version = &versions[0];
|
||||
assert_eq!(version.snapshot_name, "snapshot_1");
|
||||
assert!(version.gmt_token.starts_with("@GMT-"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_list_previous_versions_multiple() {
|
||||
let temp_dir = TempDir::new().unwrap();
|
||||
let fs_backend = LocalFs::new();
|
||||
|
||||
setup_snapshots(temp_dir.path(), "snapshot_1");
|
||||
std::thread::sleep(Duration::from_secs(2));
|
||||
setup_snapshots(temp_dir.path(), "snapshot_2");
|
||||
|
||||
let versions = fs_backend.list_previous_versions(temp_dir.path()).unwrap();
|
||||
assert_eq!(versions.len(), 2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_open_previous_version_not_found() {
|
||||
let temp_dir = TempDir::new().unwrap();
|
||||
let fs_backend = LocalFs::new();
|
||||
|
||||
let result = fs_backend.open_previous_version(temp_dir.path(), "@GMT-2021.01.01-00.00.00");
|
||||
assert!(result.is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_list_previous_versions_empty() {
|
||||
let temp_dir = TempDir::new().unwrap();
|
||||
let fs_backend = LocalFs::new();
|
||||
|
||||
let versions = fs_backend.list_previous_versions(temp_dir.path()).unwrap();
|
||||
assert_eq!(versions.len(), 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_gmt_token_unique() {
|
||||
let temp_dir = TempDir::new().unwrap();
|
||||
|
||||
setup_snapshots(temp_dir.path(), "snapshot_1");
|
||||
std::thread::sleep(Duration::from_secs(2));
|
||||
setup_snapshots(temp_dir.path(), "snapshot_2");
|
||||
|
||||
let fs_backend = LocalFs::new();
|
||||
let versions = fs_backend.list_previous_versions(temp_dir.path()).unwrap();
|
||||
|
||||
let gmt_tokens: Vec<&str> = versions.iter().map(|v| v.gmt_token.as_str()).collect();
|
||||
assert_ne!(gmt_tokens[0], gmt_tokens[1]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_skip_hidden_snapshots() {
|
||||
let temp_dir = TempDir::new().unwrap();
|
||||
let fs_backend = LocalFs::new();
|
||||
|
||||
setup_snapshots(temp_dir.path(), "snapshot_1");
|
||||
|
||||
let hidden_snapshot_path = temp_dir.path().join(".snapshots").join(".hidden");
|
||||
fs::create_dir_all(&hidden_snapshot_path).unwrap();
|
||||
|
||||
let versions = fs_backend.list_previous_versions(temp_dir.path()).unwrap();
|
||||
assert_eq!(versions.len(), 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_snapshot_meta_parse() {
|
||||
let temp_dir = TempDir::new().unwrap();
|
||||
|
||||
let snapshot_path = setup_snapshots(temp_dir.path(), "test_snapshot");
|
||||
|
||||
let meta_file = snapshot_path.join(".meta");
|
||||
let meta_json = fs::read_to_string(&meta_file).unwrap();
|
||||
let meta: VfsSnapshotMeta = serde_json::from_str(&meta_json).unwrap();
|
||||
|
||||
assert_eq!(meta.name, "test_snapshot");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user