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()); }