v0.3.8-pre.004

This commit is contained in:
2026-09-03 12:32:53 +02:00
parent 009b957523
commit c4198ac656
17 changed files with 902 additions and 46 deletions

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-store-postgres-lib/unit_tests/raw_transaction.rs
// version: 4
// version: 5
fn network() -> ksp_store_api::RawNetworkId {
return match ksp_store_api::RawNetworkId::new("devnet") {
@@ -169,6 +169,105 @@ fn pre_004_retention_and_tombstone_decoding_is_exact() {
return;
}
fn inspection_row(
retention_state: &str,
hot_payload_present: bool,
archive_payload_present: bool,
payload_size_bytes: std::option::Option<i64>,
block_time_unix_millis: std::option::Option<i64>,
) -> super::RawInspectionDbRow {
return super::RawInspectionDbRow {
archive_payload_present: std::option::Option::Some(archive_payload_present),
block_time_unix_millis,
content_hash: std::option::Option::Some(vec![7; 32]),
filtered_count_text: "3".to_owned(),
format_id: std::option::Option::Some("ksp.raw.transaction".to_owned()),
format_version: std::option::Option::Some(1),
hot_payload_present: std::option::Option::Some(hot_payload_present),
page_present: true,
payload_size_bytes,
retention_state: std::option::Option::Some(retention_state.to_owned()),
signature: std::option::Option::Some(vec![9; 64]),
slot_text: std::option::Option::Some(u64::MAX.to_string()),
total_count_text: "4".to_owned(),
};
}
#[test]
fn v0_3_8_pre_004_inspection_window_rejects_unrepresentable_limit_and_offset_before_io() {
let normal_limit = match ksp_store_api::RawPageLimit::new(100) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("valid inspection page limit rejected: {error:?}"),
};
let normal = super::raw_transaction_inspection_sql_window(ksp_store_api::RawInspectionPageRequest::new(25, normal_limit));
assert_eq!(normal, std::result::Result::Ok((100, 25)));
let huge_limit = match ksp_store_api::RawPageLimit::new(u64::MAX) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("API unexpectedly rejected backend-physical limit fixture: {error:?}"),
};
let limit_error = super::raw_transaction_inspection_sql_window(ksp_store_api::RawInspectionPageRequest::new(0, huge_limit));
assert_eq!(
limit_error.err().map(|value| return (value.kind(), value.phase())),
std::option::Option::Some((crate::PostgresBackendErrorKind::PageLimitUnsupported, "raw_transaction_inspection_limit")),
);
let offset_error = super::raw_transaction_inspection_sql_window(ksp_store_api::RawInspectionPageRequest::new(u64::MAX, normal_limit));
assert_eq!(
offset_error.err().map(|value| return (value.kind(), value.phase())),
std::option::Option::Some((crate::PostgresBackendErrorKind::QueryInvalid, "raw_transaction_inspection_offset")),
);
return;
}
#[test]
fn v0_3_8_pre_004_inspection_summary_decoding_handles_full_archived_and_purged_without_payload_bytes() {
let network = network();
let full = super::decode_raw_inspection_summary(
&network,
inspection_row("full", true, false, std::option::Option::Some(4), std::option::Option::Some(1_700_000_000_000)),
);
let full = match full {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("valid full inspection summary rejected: {error:?}"),
};
assert_eq!(full.slot(), u64::MAX);
assert_eq!(full.payload_size_bytes(), std::option::Option::Some(4));
assert_eq!(full.retention_state(), ksp_store_api::RawRetentionState::Full);
let archived = super::decode_raw_inspection_summary(
&network,
inspection_row("archived", false, true, std::option::Option::Some(5), std::option::Option::Some(1_700_000_000_000)),
);
let archived = match archived {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("valid archived inspection summary rejected: {error:?}"),
};
assert_eq!(archived.payload_size_bytes(), std::option::Option::Some(5));
assert_eq!(archived.retention_state(), ksp_store_api::RawRetentionState::Archived);
let purged = super::decode_raw_inspection_summary(&network, inspection_row("purged", false, false, std::option::Option::None, std::option::Option::None));
let purged = match purged {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("valid purged inspection summary rejected: {error:?}"),
};
assert_eq!(purged.payload_size_bytes(), std::option::Option::None);
assert_eq!(purged.block_time(), std::option::Option::None);
assert_eq!(purged.retention_state(), ksp_store_api::RawRetentionState::Purged);
return;
}
#[test]
fn v0_3_8_pre_004_inspection_summary_rejects_physical_retention_shape_residue() {
let network = network();
for malformed in [
inspection_row("full", true, true, std::option::Option::Some(4), std::option::Option::Some(1)),
inspection_row("archived", true, true, std::option::Option::Some(4), std::option::Option::Some(1)),
inspection_row("purged", false, true, std::option::Option::None, std::option::Option::None),
inspection_row("purged", false, false, std::option::Option::None, std::option::Option::Some(1)),
] {
let result = super::decode_raw_inspection_summary(&network, malformed);
assert_eq!(result.err().map(|value| return value.kind()), std::option::Option::Some(crate::PostgresBackendErrorKind::DataInvalid));
}
return;
}
#[test]
fn pre_004_wrong_network_is_rejected_by_the_private_pre_io_guard() {
let backend_network = network();