rpki/tests/test_manifest_decode.rs
2026-02-04 17:02:17 +08:00

65 lines
2.4 KiB
Rust

use rpki::data_model::manifest::{
ManifestDecodeError, ManifestEContent, ManifestObject, ManifestProfileError,
};
use rpki::data_model::signed_object::RpkiSignedObject;
#[test]
fn decode_manifest_fixture_smoke() {
let der = std::fs::read(
"tests/fixtures/repository/rpki.cernet.net/repo/cernet/0/05FC9C5B88506F7C0D3F862C8895BED67E9F8EBA.mft",
)
.expect("read MFT fixture");
let mft = ManifestObject::decode_der(&der).expect("decode manifest object");
mft.validate_profile().expect("validate manifest profile");
assert_eq!(mft.manifest.version, 0);
assert_eq!(
mft.manifest.file_hash_alg,
rpki::data_model::oid::OID_SHA256
);
assert!(mft.manifest.next_update > mft.manifest.this_update);
assert!(!mft.manifest.files.is_empty());
// The manifest file MUST NOT be listed in its own fileList.
assert!(
mft.manifest
.files
.iter()
.all(|f| !f.file_name.to_ascii_lowercase().ends_with(".mft"))
);
}
#[test]
fn decode_rejects_non_manifest_econtent_type() {
let der = std::fs::read("tests/fixtures/repository/rpki.cernet.net/repo/cernet/0/AS4538.roa")
.expect("read ROA fixture");
let err = ManifestObject::decode_der(&der).unwrap_err();
assert!(matches!(
err,
ManifestDecodeError::Validate(ManifestProfileError::InvalidEContentType(_))
));
}
#[test]
fn from_signed_object_accepts_manifest_fixture() {
let so_der = std::fs::read(
"tests/fixtures/repository/rpki.cernet.net/repo/cernet/0/05FC9C5B88506F7C0D3F862C8895BED67E9F8EBA.mft",
)
.expect("read MFT fixture");
let so = RpkiSignedObject::decode_der(&so_der).expect("decode signed object");
let mft = ManifestObject::from_signed_object(so).expect("from_signed_object");
mft.validate_profile().expect("validate manifest profile");
}
#[test]
fn decode_manifest_econtent_from_fixture_signed_object() {
let so_der = std::fs::read(
"tests/fixtures/repository/rpki.cernet.net/repo/cernet/0/05FC9C5B88506F7C0D3F862C8895BED67E9F8EBA.mft",
)
.expect("read MFT fixture");
let so = rpki::data_model::signed_object::RpkiSignedObject::decode_der(&so_der)
.expect("decode signed object");
let e = ManifestEContent::decode_der(&so.signed_data.encap_content_info.econtent)
.expect("decode manifest eContent");
assert_eq!(e.version, 0);
}