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