102 lines
3.2 KiB
Rust
102 lines
3.2 KiB
Rust
use rpki::storage::{PackFile, PackTime, VerifiedPublicationPointPack};
|
|
|
|
fn base_pack() -> VerifiedPublicationPointPack {
|
|
let this_update =
|
|
PackTime::from_utc_offset_datetime(time::OffsetDateTime::from_unix_timestamp(0).unwrap());
|
|
let next_update = PackTime::from_utc_offset_datetime(
|
|
time::OffsetDateTime::from_unix_timestamp(3600).unwrap(),
|
|
);
|
|
let verified_at =
|
|
PackTime::from_utc_offset_datetime(time::OffsetDateTime::from_unix_timestamp(10).unwrap());
|
|
|
|
let file =
|
|
PackFile::from_bytes_compute_sha256("rsync://example.net/repo/obj.cer", b"x".to_vec());
|
|
|
|
VerifiedPublicationPointPack {
|
|
format_version: VerifiedPublicationPointPack::FORMAT_VERSION_V1,
|
|
manifest_rsync_uri: "rsync://example.net/repo/manifest.mft".to_string(),
|
|
publication_point_rsync_uri: "rsync://example.net/repo/".to_string(),
|
|
this_update,
|
|
next_update,
|
|
verified_at,
|
|
manifest_bytes: b"manifest".to_vec(),
|
|
files: vec![file],
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn pack_rejects_unsupported_format_version() {
|
|
let mut pack = base_pack();
|
|
pack.format_version = 999;
|
|
let bytes = pack.encode().expect("encode");
|
|
assert!(
|
|
VerifiedPublicationPointPack::decode(&bytes)
|
|
.unwrap_err()
|
|
.to_string()
|
|
.contains("unsupported pack format_version")
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn pack_rejects_missing_manifest_rsync_uri() {
|
|
let mut pack = base_pack();
|
|
pack.manifest_rsync_uri.clear();
|
|
let bytes = pack.encode().expect("encode");
|
|
assert!(VerifiedPublicationPointPack::decode(&bytes).is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn pack_rejects_missing_publication_point_rsync_uri() {
|
|
let mut pack = base_pack();
|
|
pack.publication_point_rsync_uri.clear();
|
|
let bytes = pack.encode().expect("encode");
|
|
assert!(VerifiedPublicationPointPack::decode(&bytes).is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn pack_rejects_invalid_time_fields() {
|
|
let mut pack = base_pack();
|
|
pack.this_update = PackTime {
|
|
rfc3339_utc: "not-a-time".to_string(),
|
|
};
|
|
let bytes = pack.encode().expect("encode");
|
|
assert!(VerifiedPublicationPointPack::decode(&bytes).is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn pack_rejects_empty_file_bytes() {
|
|
let mut pack = base_pack();
|
|
let mut sha = [0u8; 32];
|
|
sha[0] = 1;
|
|
pack.files = vec![PackFile::new(
|
|
"rsync://example.net/repo/empty.cer",
|
|
Vec::new(),
|
|
sha,
|
|
)];
|
|
let bytes = pack.encode().expect("encode");
|
|
assert!(VerifiedPublicationPointPack::decode(&bytes).is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn pack_rejects_file_hash_mismatch() {
|
|
let mut pack = base_pack();
|
|
pack.files = vec![PackFile::new(
|
|
"rsync://example.net/repo/bad.cer",
|
|
b"abc".to_vec(),
|
|
[0u8; 32],
|
|
)];
|
|
let bytes = pack.encode().expect("encode");
|
|
let err = VerifiedPublicationPointPack::decode(&bytes).unwrap_err();
|
|
assert!(err.to_string().contains("file hash mismatch"));
|
|
}
|
|
|
|
#[test]
|
|
fn pack_rejects_missing_file_rsync_uri() {
|
|
let mut pack = base_pack();
|
|
let file = PackFile::from_bytes_compute_sha256("", b"x".to_vec());
|
|
pack.files = vec![file];
|
|
let bytes = pack.encode().expect("encode");
|
|
let err = VerifiedPublicationPointPack::decode(&bytes).unwrap_err();
|
|
assert!(err.to_string().contains("missing required field"));
|
|
}
|