v0.2.1-pre.004

This commit is contained in:
2026-08-17 19:26:26 +02:00
parent ed978179d8
commit c1cea6e813
15 changed files with 1713 additions and 93 deletions

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-onchain-transport-lib/tests/dependency_boundary.rs
// version: 2
// version: 3
//! Integration canary for the direct dependency firewall of `ksp-onchain-transport-lib`.
@@ -13,4 +13,5 @@ fn transport_manifest_preserves_ksp_dependency_firewall() {
assert!(manifest.contains("ksp-core-lib"));
assert!(manifest.contains("ksp-logging-lib"));
assert!(manifest.contains("reqwest.workspace = true"));
assert!(manifest.contains("tokio = { workspace = true, features = [\"sync\"] }"));
}

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-onchain-transport-lib/tests/public_api.rs
// version: 3
// version: 4
//! Integration tests for the public `ksp-onchain-transport-lib` consumer contract.
@@ -101,3 +101,62 @@ fn public_pool_contract_selects_a_standard_method_without_exposing_url() {
assert!(!rendered.contains("SECRET-CANARY"));
assert!(!rendered.contains("provider.invalid"));
}
#[test]
fn public_retry_policy_preserves_no_resend_after_ambiguous_write_dispatch() {
let method = ksp_onchain_transport_lib::find_http_rpc_method("sendTransaction").expect("sendTransaction must be audited");
let settings = ksp_onchain_transport_lib::HttpRetrySettings::new(2, std::time::Duration::from_millis(100), std::time::Duration::from_secs(1));
let decision = ksp_onchain_transport_lib::evaluate_transport_retry(
method,
&settings,
ksp_onchain_transport_lib::HttpRetryCause::Timeout,
ksp_onchain_transport_lib::HttpDispatchState::DispatchedAmbiguous,
0,
std::option::Option::None,
);
assert_eq!(decision, ksp_onchain_transport_lib::HttpRetryDecision::Stop);
}
#[tokio::test]
async fn public_async_admission_exposes_bounded_permit_without_endpoint_url() {
let url = ksp_onchain_transport_lib::HttpEndpointUrl::parse("https://provider.invalid/rpc?token=ASYNC-SECRET-CANARY")
.expect("public URL parser must accept HTTPS endpoint");
let role = ksp_onchain_transport_lib::HttpEndpointRoleSettings::new(
ksp_onchain_transport_lib::HttpRoleName::new("default"),
true,
std::vec![ksp_onchain_transport_lib::HttpRequestKind::new("get_balance")],
10,
ksp_onchain_transport_lib::HttpRoleLimits::new(
std::option::Option::None,
std::option::Option::None,
std::num::NonZeroU32::new(1),
std::option::Option::None,
),
);
let endpoint = ksp_onchain_transport_lib::HttpEndpointSettings::new(
"primary",
true,
ksp_onchain_transport_lib::HttpProviderName::new("provider"),
ksp_onchain_transport_lib::HttpClusterName::new("devnet"),
url,
std::time::Duration::from_secs(2),
std::time::Duration::from_secs(10),
std::option::Option::Some(8),
std::vec![role],
);
let settings = ksp_onchain_transport_lib::HttpTransportSettings::new(
std::vec![endpoint],
ksp_onchain_transport_lib::HttpRetrySettings::new(1, std::time::Duration::from_millis(10), std::time::Duration::from_millis(50)),
);
let pool = ksp_onchain_transport_lib::HttpTransportPool::new(settings).expect("public pool constructor must succeed");
let method = ksp_onchain_transport_lib::find_http_rpc_method("getBalance").expect("audited method must exist");
let permit = pool
.acquire_for_method(&ksp_onchain_transport_lib::HttpRoleName::new("default"), method)
.await
.expect("public async admission must acquire capacity");
assert_eq!(permit.selection().endpoint_name(), "primary");
assert!(permit.remaining_timeout() > std::time::Duration::ZERO);
let rendered = format!("{permit:?}");
assert!(!rendered.contains("ASYNC-SECRET-CANARY"));
assert!(!rendered.contains("provider.invalid"));
}