v0.3.8-pre.009
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-store-postgres-lib/tests/hardening_completeness.rs
|
||||
// version: 21
|
||||
// version: 22
|
||||
|
||||
#![warn(missing_docs)]
|
||||
#![deny(unreachable_pub)]
|
||||
@@ -302,15 +302,17 @@ fn pre_009_live_raw_transaction_proof_is_opt_in_isolated_and_secret_safe() {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn v0_3_8_pre_005_raw_capability_implementation_inventory_is_exactly_twelve() {
|
||||
fn v0_3_8_pre_009_raw_capability_implementation_inventory_is_exactly_fourteen() {
|
||||
let runtime = include_str!("../src/runtime.rs");
|
||||
let capability_impls = [
|
||||
"impl ksp_store_api::RawAccountObservationInspectionRead for PostgresBackend",
|
||||
"impl ksp_store_api::RawAccountObservationRead for PostgresBackend",
|
||||
"impl ksp_store_api::RawAccountObservationWrite for PostgresBackend",
|
||||
"impl ksp_store_api::RawAccountStateInspectionRead for PostgresBackend",
|
||||
"impl ksp_store_api::RawAccountStateRead for PostgresBackend",
|
||||
"impl ksp_store_api::RawAccountStateWrite for PostgresBackend",
|
||||
"impl ksp_store_api::RawTransactionInspectionRead for PostgresBackend",
|
||||
"impl ksp_store_api::RawTransactionObservationInspectionRead for PostgresBackend",
|
||||
"impl ksp_store_api::RawTransactionObservationRead for PostgresBackend",
|
||||
"impl ksp_store_api::RawTransactionObservationWrite for PostgresBackend",
|
||||
"impl ksp_store_api::RawTransactionRead for PostgresBackend",
|
||||
@@ -321,7 +323,7 @@ fn v0_3_8_pre_005_raw_capability_implementation_inventory_is_exactly_twelve() {
|
||||
for implementation in capability_impls {
|
||||
assert_eq!(runtime.matches(implementation).count(), 1, "unexpected PostgreSQL capability implementation inventory: {implementation}");
|
||||
}
|
||||
assert_eq!(runtime.matches("impl ksp_store_api::Raw").count(), 12);
|
||||
assert_eq!(runtime.matches("impl ksp_store_api::Raw").count(), 14);
|
||||
let migration = include_str!("../src/migration.rs");
|
||||
assert!(migration.contains("raw_account_state"));
|
||||
assert!(migration.contains("crate::V002_RESOURCES"));
|
||||
@@ -394,13 +396,77 @@ fn v0_3_8_pre_004_transaction_inspection_sql_is_single_statement_payload_free_co
|
||||
}
|
||||
assert!(ascending.contains("ORDER BY transaction_row.slot ASC, transaction_row.signature ASC"));
|
||||
assert!(descending.contains("ORDER BY transaction_row.slot DESC, transaction_row.signature DESC"));
|
||||
assert_eq!(source.matches(" OFFSET ").count(), 2);
|
||||
assert!(source.contains("raw_transaction_inspection_sql_window(query.page())"));
|
||||
assert!(source.contains("raw_transaction_inspection_offset"));
|
||||
assert!(source.contains("raw_transaction_inspection_limit"));
|
||||
return;
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn v0_3_8_pre_009_observation_inspection_sql_is_counted_random_access_safe_and_family_local() {
|
||||
let transaction = include_str!("../src/raw_transaction.rs");
|
||||
let account = include_str!("../src/raw_account.rs");
|
||||
let transaction_ascending = transaction.lines().find(|line| return line.starts_with("const INSPECT_OBSERVATIONS_ASC_SQL"));
|
||||
let transaction_ascending = match transaction_ascending {
|
||||
std::option::Option::Some(value) => value,
|
||||
std::option::Option::None => panic!("missing ascending transaction-observation inspection SQL"),
|
||||
};
|
||||
let transaction_descending = transaction.lines().find(|line| return line.starts_with("const INSPECT_OBSERVATIONS_DESC_SQL"));
|
||||
let transaction_descending = match transaction_descending {
|
||||
std::option::Option::Some(value) => value,
|
||||
std::option::Option::None => panic!("missing descending transaction-observation inspection SQL"),
|
||||
};
|
||||
for statement in [transaction_ascending, transaction_descending] {
|
||||
for required in [
|
||||
"COUNT(*)::TEXT AS filtered_count_text",
|
||||
"COUNT(*)::TEXT FROM ksp_raw_transaction_observations",
|
||||
"LEFT JOIN LATERAL",
|
||||
"transaction_signature = $1",
|
||||
"LIMIT $2 OFFSET $3",
|
||||
"received_at_unix_millis",
|
||||
"observation_key",
|
||||
] {
|
||||
assert!(statement.contains(required), "missing transaction-observation inspection SQL contract: {required}");
|
||||
}
|
||||
for forbidden in ["ksp_raw_transactions AS", "payload", "archive_payload", "SELECT *"] {
|
||||
assert!(!statement.contains(forbidden), "transaction-observation inspection leaked unrelated/raw material: {forbidden}");
|
||||
}
|
||||
}
|
||||
assert!(transaction_ascending.contains("ORDER BY received_at_unix_millis ASC, observation_key ASC"));
|
||||
assert!(transaction_descending.contains("ORDER BY received_at_unix_millis DESC, observation_key DESC"));
|
||||
let account_ascending = account.lines().find(|line| return line.starts_with("const INSPECT_ACCOUNT_OBSERVATIONS_ASC_SQL"));
|
||||
let account_ascending = match account_ascending {
|
||||
std::option::Option::Some(value) => value,
|
||||
std::option::Option::None => panic!("missing ascending account-observation inspection SQL"),
|
||||
};
|
||||
let account_descending = account.lines().find(|line| return line.starts_with("const INSPECT_ACCOUNT_OBSERVATIONS_DESC_SQL"));
|
||||
let account_descending = match account_descending {
|
||||
std::option::Option::Some(value) => value,
|
||||
std::option::Option::None => panic!("missing descending account-observation inspection SQL"),
|
||||
};
|
||||
for statement in [account_ascending, account_descending] {
|
||||
for required in [
|
||||
"COUNT(*)::TEXT AS filtered_count_text",
|
||||
"COUNT(*)::TEXT FROM ksp_raw_account_observations",
|
||||
"LEFT JOIN LATERAL",
|
||||
"account_pubkey = $1",
|
||||
"account_slot = $2::TEXT::NUMERIC",
|
||||
"account_state_hash = $3",
|
||||
"LIMIT $4 OFFSET $5",
|
||||
"received_at_unix_millis",
|
||||
"observation_key",
|
||||
] {
|
||||
assert!(statement.contains(required), "missing account-observation inspection SQL contract: {required}");
|
||||
}
|
||||
for forbidden in ["ksp_raw_account_states AS", "account_row.data", "SELECT *"] {
|
||||
assert!(!statement.contains(forbidden), "account-observation inspection leaked unrelated/raw material: {forbidden}");
|
||||
}
|
||||
}
|
||||
assert!(account_ascending.contains("ORDER BY received_at_unix_millis ASC, observation_key ASC"));
|
||||
assert!(account_descending.contains("ORDER BY received_at_unix_millis DESC, observation_key DESC"));
|
||||
return;
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pre_010_raw_account_private_sql_is_non_destructive_keyset_and_family_local() {
|
||||
let source = include_str!("../src/raw_account.rs");
|
||||
@@ -493,6 +559,5 @@ fn v0_3_8_pre_005_raw_account_keyset_sql_remains_offset_free_while_inspection_is
|
||||
assert!(statement.contains("account_row.pubkey"));
|
||||
assert!(statement.contains("account_row.state_hash"));
|
||||
}
|
||||
assert_eq!(source.matches(" OFFSET ").count(), 2);
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user