110 lines
3.4 KiB
Rust
110 lines
3.4 KiB
Rust
use std::fs;
|
|
|
|
use rpki::slurm::admin::SlurmAdmin;
|
|
|
|
fn valid_slurm() -> &'static str {
|
|
r#"{
|
|
"slurmVersion": 1,
|
|
"validationOutputFilters": {
|
|
"prefixFilters": [],
|
|
"bgpsecFilters": []
|
|
},
|
|
"locallyAddedAssertions": {
|
|
"prefixAssertions": [],
|
|
"bgpsecAssertions": []
|
|
}
|
|
}"#
|
|
}
|
|
|
|
#[test]
|
|
fn slurm_admin_rejects_unsafe_file_names() {
|
|
let temp = tempfile::tempdir().unwrap();
|
|
let admin = SlurmAdmin::new(temp.path());
|
|
|
|
for name in ["", "../x.slurm", "a/b.slurm", "a\\b.slurm", "a.json"] {
|
|
assert!(
|
|
admin
|
|
.put_file(name, valid_slurm(), "create_or_update")
|
|
.is_err(),
|
|
"{name}"
|
|
);
|
|
}
|
|
assert!(
|
|
admin
|
|
.put_file("policy.slurm", valid_slurm(), "create_or_update")
|
|
.is_ok()
|
|
);
|
|
assert!(
|
|
admin
|
|
.put_file("policy.slurm.disabled", valid_slurm(), "create_or_update")
|
|
.is_ok()
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn writes_backs_up_toggles_deletes_and_rolls_back() {
|
|
let temp = tempfile::tempdir().unwrap();
|
|
let admin = SlurmAdmin::new(temp.path());
|
|
|
|
let create = admin
|
|
.put_file("policy.slurm", valid_slurm(), "create_or_update")
|
|
.unwrap();
|
|
assert!(temp.path().join("policy.slurm").is_file());
|
|
assert!(create.result.backup.is_none());
|
|
|
|
let update = admin
|
|
.put_file("policy.slurm", valid_slurm(), "create_or_update")
|
|
.unwrap();
|
|
assert!(update.result.backup.is_some());
|
|
|
|
let disable = admin.disable_file("policy.slurm").unwrap();
|
|
assert!(!temp.path().join("policy.slurm").exists());
|
|
assert!(temp.path().join("policy.slurm.disabled").is_file());
|
|
|
|
disable.rollback().unwrap();
|
|
assert!(temp.path().join("policy.slurm").is_file());
|
|
assert!(!temp.path().join("policy.slurm.disabled").exists());
|
|
|
|
admin.disable_file("policy.slurm").unwrap();
|
|
let enable = admin.enable_file("policy.slurm.disabled").unwrap();
|
|
assert!(temp.path().join("policy.slurm").is_file());
|
|
assert!(!temp.path().join("policy.slurm.disabled").exists());
|
|
enable.rollback().unwrap();
|
|
assert!(!temp.path().join("policy.slurm").exists());
|
|
assert!(temp.path().join("policy.slurm.disabled").is_file());
|
|
|
|
admin.enable_file("policy.slurm.disabled").unwrap();
|
|
let delete = admin.delete_file("policy.slurm").unwrap();
|
|
assert!(!temp.path().join("policy.slurm").exists());
|
|
assert!(delete.result.backup.is_some());
|
|
delete.rollback().unwrap();
|
|
assert!(temp.path().join("policy.slurm").is_file());
|
|
}
|
|
|
|
#[test]
|
|
fn lists_and_reads_slurm_files() {
|
|
let temp = tempfile::tempdir().unwrap();
|
|
let admin = SlurmAdmin::new(temp.path());
|
|
|
|
admin
|
|
.put_file("enabled.slurm", valid_slurm(), "create_or_update")
|
|
.unwrap();
|
|
admin
|
|
.put_file("disabled.slurm.disabled", valid_slurm(), "create_or_update")
|
|
.unwrap();
|
|
fs::write(temp.path().join("ignore.txt"), "not slurm").unwrap();
|
|
|
|
let files = admin.list_files().unwrap();
|
|
assert_eq!(files.len(), 2);
|
|
assert_eq!(files[0].name, "disabled.slurm.disabled");
|
|
assert!(!files[0].enabled);
|
|
assert_eq!(files[1].name, "enabled.slurm");
|
|
assert!(files[1].enabled);
|
|
|
|
let file = admin.read_file("enabled.slurm").unwrap();
|
|
assert_eq!(file.name, "enabled.slurm");
|
|
assert!(file.enabled);
|
|
assert!(file.content.contains("\"slurmVersion\""));
|
|
assert!(admin.read_file("missing.slurm").is_err());
|
|
}
|