v0.3.7-pre.004

This commit is contained in:
2026-09-02 11:00:20 +02:00
parent 03a94f4fb6
commit 46a4ad7487
17 changed files with 630 additions and 60 deletions

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-backfill-desk/unit_tests/dto_common.rs
// version: 1
// version: 2
#[test]
fn command_error_projection_excludes_arbitrary_context_and_source_values() {
@@ -12,3 +12,23 @@ fn command_error_projection_excludes_arbitrary_context_and_source_values() {
assert_eq!(dto.code, "failed");
assert_eq!(dto.message, "safe message");
}
#[test]
fn transport_options_projection_contains_only_safe_transport_metadata() {
let dto = crate::BackfillDeskOptionsDto {
compatible_roles: vec!["default".to_owned()],
configured_networks: vec!["devnet".to_owned()],
transport_diagnostic: std::option::Option::None,
transport_ready: true,
};
let value = serde_json::to_value(dto);
assert!(value.is_ok());
if let std::result::Result::Ok(value) = value {
let serialized = value.to_string();
assert!(serialized.contains("default"));
assert!(serialized.contains("devnet"));
assert!(!serialized.contains("provider"));
assert!(!serialized.contains("url"));
assert!(!serialized.contains("endpoint"));
}
}

View File

@@ -0,0 +1,101 @@
// file: crates/ksp-app-backfill-desk/unit_tests/transport_runtime.rs
// version: 1
fn endpoint(
name: &str,
cluster: &str,
role_name: &str,
request_kinds: std::vec::Vec<ksp_onchain_transport_lib::HttpRequestKind>,
) -> ksp_core_lib::Result<ksp_onchain_transport_lib::HttpEndpointSettings> {
let url = ksp_onchain_transport_lib::HttpEndpointUrl::parse(format!("https://{name}.example.invalid"));
let url = match url {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => return std::result::Result::Err(error),
};
let role = ksp_onchain_transport_lib::HttpEndpointRoleSettings::new(
ksp_onchain_transport_lib::HttpRoleName::new(role_name),
true,
request_kinds,
0,
ksp_onchain_transport_lib::HttpRoleLimits::new(
std::option::Option::None,
std::option::Option::None,
std::option::Option::None,
std::option::Option::None,
),
);
return std::result::Result::Ok(ksp_onchain_transport_lib::HttpEndpointSettings::new(
name,
true,
ksp_onchain_transport_lib::HttpProviderName::new("fixture"),
ksp_onchain_transport_lib::HttpClusterName::new(cluster),
url,
std::time::Duration::from_secs(1),
std::time::Duration::from_secs(2),
std::option::Option::Some(1),
vec![role],
));
}
fn pool(endpoints: std::vec::Vec<ksp_onchain_transport_lib::HttpEndpointSettings>) -> ksp_core_lib::Result<ksp_onchain_transport_lib::HttpTransportPool> {
let settings = ksp_onchain_transport_lib::HttpTransportSettings::new(
endpoints,
ksp_onchain_transport_lib::HttpRetrySettings::new(0, std::time::Duration::from_millis(10), std::time::Duration::from_millis(10)),
);
return ksp_onchain_transport_lib::HttpTransportPool::new(settings);
}
#[test]
fn compatible_roles_require_both_backfill_rpc_methods() {
let signatures = ksp_onchain_transport_lib::find_http_rpc_method("getSignaturesForAddress");
let transaction = ksp_onchain_transport_lib::find_http_rpc_method("getTransaction");
assert!(signatures.is_some());
assert!(transaction.is_some());
let signatures = match signatures {
std::option::Option::Some(value) => ksp_onchain_transport_lib::HttpRequestKind::new(value.request_kind()),
std::option::Option::None => return,
};
let transaction = match transaction {
std::option::Option::Some(value) => ksp_onchain_transport_lib::HttpRequestKind::new(value.request_kind()),
std::option::Option::None => return,
};
let complete = endpoint("complete", "devnet", "complete", vec![signatures.clone(), transaction]);
let complete = match complete {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return,
};
let partial = endpoint("partial", "devnet", "partial", vec![signatures]);
let partial = match partial {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return,
};
let runtime_pool = pool(vec![complete, partial]);
assert!(runtime_pool.is_ok());
let runtime_pool = match runtime_pool {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return,
};
let snapshot = runtime_pool.snapshot();
let roles = super::compatible_backfill_roles(&runtime_pool, &snapshot);
assert!(roles.is_ok());
if let std::result::Result::Ok(roles) = roles {
assert_eq!(roles, vec!["complete".to_owned()]);
}
}
#[test]
fn configured_networks_are_safe_sorted_and_deduplicated() {
let one = endpoint("one", "testnet", "default", vec![ksp_onchain_transport_lib::HttpRequestKind::wildcard()]);
let two = endpoint("two", "devnet", "default", vec![ksp_onchain_transport_lib::HttpRequestKind::wildcard()]);
let three = endpoint("three", "devnet", "default", vec![ksp_onchain_transport_lib::HttpRequestKind::wildcard()]);
let (one, two, three) = match (one, two, three) {
(std::result::Result::Ok(one), std::result::Result::Ok(two), std::result::Result::Ok(three)) => (one, two, three),
_ => return,
};
let runtime_pool = pool(vec![one, two, three]);
assert!(runtime_pool.is_ok());
if let std::result::Result::Ok(runtime_pool) = runtime_pool {
let values = super::configured_networks(&runtime_pool.snapshot());
assert_eq!(values, vec!["devnet".to_owned(), "testnet".to_owned()]);
}
}