Files
khadhroony-solana-project/crates/ksp-app-backfill-desk/unit_tests/transport_runtime.rs
2026-09-02 15:05:18 +02:00

134 lines
5.9 KiB
Rust

// file: crates/ksp-app-backfill-desk/unit_tests/transport_runtime.rs
// version: 2
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 http_routes_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_http_routes(&runtime_pool, &snapshot);
assert!(roles.is_ok());
if let std::result::Result::Ok(roles) = roles {
assert_eq!(roles.len(), 1);
if let std::option::Option::Some(route) = roles.first() {
assert_eq!(route.role, "complete");
assert_eq!(route.providers, vec!["fixture".to_owned()]);
assert!(!route.pooled);
}
}
}
#[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()]);
}
}
#[test]
fn coherent_network_requires_exactly_one_enabled_http_cluster() {
let one = endpoint("one", "devnet", "default", vec![ksp_onchain_transport_lib::HttpRequestKind::wildcard()]);
let one = match one {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return,
};
let one_pool = pool(vec![one]);
assert!(one_pool.is_ok());
if let std::result::Result::Ok(one_pool) = one_pool {
let runtime = crate::TransportRuntime { pool: one_pool, profile_id: "fixture".to_owned() };
assert_eq!(runtime.coherent_network(), std::option::Option::Some("devnet".to_owned()));
}
let two = endpoint("two", "devnet", "default", vec![ksp_onchain_transport_lib::HttpRequestKind::wildcard()]);
let three = endpoint("three", "testnet", "default", vec![ksp_onchain_transport_lib::HttpRequestKind::wildcard()]);
let (two, three) = match (two, three) {
(std::result::Result::Ok(two), std::result::Result::Ok(three)) => (two, three),
_ => return,
};
let multi_pool = pool(vec![two, three]);
assert!(multi_pool.is_ok());
if let std::result::Result::Ok(multi_pool) = multi_pool {
let runtime = crate::TransportRuntime { pool: multi_pool, profile_id: "fixture".to_owned() };
assert_eq!(runtime.coherent_network(), std::option::Option::None);
}
}