121 lines
5.9 KiB
Rust
121 lines
5.9 KiB
Rust
// file: crates/ksp-onchain-transport-lib/tests/transport_devnet_smoke.rs
|
|
// version: 4
|
|
|
|
//! Opt-in live Devnet smoke for representative pure Transport Accounts/Tokens/Cluster/Transactions reads.
|
|
|
|
fn devnet_pool() -> ksp_core_lib::Result<ksp_onchain_transport_lib::HttpTransportPool> {
|
|
let role = ksp_onchain_transport_lib::HttpRoleName::new("default");
|
|
let role_settings = ksp_onchain_transport_lib::HttpEndpointRoleSettings::new(
|
|
role,
|
|
true,
|
|
std::vec![ksp_onchain_transport_lib::HttpRequestKind::wildcard()],
|
|
0,
|
|
ksp_onchain_transport_lib::HttpRoleLimits::new(
|
|
std::option::Option::None,
|
|
std::option::Option::None,
|
|
std::option::Option::None,
|
|
std::option::Option::None,
|
|
),
|
|
);
|
|
let endpoint_url_result = ksp_onchain_transport_lib::HttpEndpointUrl::parse("https://api.devnet.solana.com");
|
|
let endpoint_url = match endpoint_url_result {
|
|
std::result::Result::Ok(endpoint_url) => endpoint_url,
|
|
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
|
};
|
|
let endpoint = ksp_onchain_transport_lib::HttpEndpointSettings::new(
|
|
"solana_devnet_public",
|
|
true,
|
|
ksp_onchain_transport_lib::HttpProviderName::new("solana-public"),
|
|
ksp_onchain_transport_lib::HttpClusterName::new("devnet"),
|
|
endpoint_url,
|
|
std::time::Duration::from_secs(5),
|
|
std::time::Duration::from_secs(20),
|
|
std::option::Option::Some(4),
|
|
std::vec![role_settings],
|
|
);
|
|
let settings = ksp_onchain_transport_lib::HttpTransportSettings::new(
|
|
std::vec![endpoint],
|
|
ksp_onchain_transport_lib::HttpRetrySettings::new(1, std::time::Duration::from_millis(250), std::time::Duration::from_secs(2)),
|
|
);
|
|
return ksp_onchain_transport_lib::HttpTransportPool::new(settings);
|
|
}
|
|
|
|
#[tokio::test(flavor = "current_thread")]
|
|
#[ignore = "opt-in live Solana Devnet smoke; performs external network requests"]
|
|
async fn programmatic_devnet_transport_reaches_accounts_tokens_cluster_and_transaction_read_wrappers() {
|
|
let pool = devnet_pool().expect("programmatic Devnet Transport settings must construct a pool");
|
|
let role = ksp_onchain_transport_lib::HttpRoleName::new("default");
|
|
|
|
let account_config = ksp_onchain_transport_lib::SolanaAccountInfoConfig::new(
|
|
std::option::Option::Some(ksp_onchain_transport_lib::SolanaAccountEncoding::Base64),
|
|
std::option::Option::None,
|
|
std::option::Option::Some(ksp_onchain_transport_lib::SolanaCommitment::Finalized),
|
|
std::option::Option::None,
|
|
);
|
|
let account = pool
|
|
.get_account_info(&role, &ksp_core_lib::PRGIDPK_SOLANA_SYSTEM, std::option::Option::Some(&account_config))
|
|
.await
|
|
.expect("Devnet getAccountInfo smoke must succeed");
|
|
assert!(account.context().slot() > 0);
|
|
assert!(account.value().is_some());
|
|
|
|
// Follow the current official Devnet example shape with an ordinary owner, the canonical SPL Token program selector,
|
|
// and an explicit finalized/jsonParsed config. The owner need not retain any token account; an empty list remains valid.
|
|
let token_owner = "A1TMhSGzQxMr1TboBKtgixKz1sS6REASMxPo1qsyTSJd"
|
|
.parse::<ksp_core_lib::Pubkey>()
|
|
.expect("official Devnet token-owner example must remain a valid Pubkey literal");
|
|
let token_program = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
|
|
.parse::<ksp_core_lib::Pubkey>()
|
|
.expect("canonical SPL Token program id must remain a valid Pubkey literal");
|
|
let token_selector = ksp_onchain_transport_lib::SolanaTokenAccountSelector::ProgramId(token_program);
|
|
let token_config = ksp_onchain_transport_lib::SolanaAccountInfoConfig::new(
|
|
std::option::Option::Some(ksp_onchain_transport_lib::SolanaAccountEncoding::JsonParsed),
|
|
std::option::Option::None,
|
|
std::option::Option::Some(ksp_onchain_transport_lib::SolanaCommitment::Finalized),
|
|
std::option::Option::None,
|
|
);
|
|
let token_accounts = pool
|
|
.get_token_accounts_by_owner(&role, &token_owner, &token_selector, std::option::Option::Some(&token_config))
|
|
.await
|
|
.expect("Devnet getTokenAccountsByOwner smoke must succeed with the documented finalized/jsonParsed request shape");
|
|
assert!(token_accounts.context().slot() > 0);
|
|
|
|
let epoch = pool
|
|
.get_epoch_info(
|
|
&role,
|
|
std::option::Option::Some(&ksp_onchain_transport_lib::SolanaContextConfig::new(
|
|
std::option::Option::Some(ksp_onchain_transport_lib::SolanaCommitment::Finalized),
|
|
std::option::Option::None,
|
|
)),
|
|
)
|
|
.await
|
|
.expect("Devnet getEpochInfo smoke must succeed");
|
|
assert!(epoch.absolute_slot() > 0);
|
|
|
|
let vote_accounts = pool.get_vote_accounts(&role, std::option::Option::None).await.expect("Devnet getVoteAccounts smoke must succeed");
|
|
assert!(!vote_accounts.current().is_empty() || !vote_accounts.delinquent().is_empty());
|
|
|
|
let transaction_context = ksp_onchain_transport_lib::SolanaContextConfig::new(
|
|
std::option::Option::Some(ksp_onchain_transport_lib::SolanaCommitment::Finalized),
|
|
std::option::Option::None,
|
|
);
|
|
let latest_blockhash = pool
|
|
.get_latest_blockhash(&role, std::option::Option::Some(&transaction_context))
|
|
.await
|
|
.expect("Devnet getLatestBlockhash smoke must succeed");
|
|
assert!(!latest_blockhash.value().blockhash().is_empty());
|
|
assert!(latest_blockhash.value().last_valid_block_height() > 0);
|
|
|
|
let blockhash_valid = pool
|
|
.is_blockhash_valid(&role, latest_blockhash.value().blockhash(), std::option::Option::Some(&transaction_context))
|
|
.await
|
|
.expect("Devnet isBlockhashValid smoke must succeed");
|
|
assert_eq!(blockhash_valid.value(), &true);
|
|
|
|
let transaction_count = pool
|
|
.get_transaction_count(&role, std::option::Option::Some(&transaction_context))
|
|
.await
|
|
.expect("Devnet getTransactionCount smoke must succeed");
|
|
assert!(transaction_count > 0);
|
|
}
|