v0.2.4-pre.004
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-onchain-transport-lib/unit_tests/rpc_blocks.rs
|
||||
// version: 2
|
||||
// version: 3
|
||||
|
||||
#[test]
|
||||
fn transaction_details_and_get_block_config_preserve_all_modern_options() {
|
||||
@@ -311,3 +311,145 @@ async fn typed_minimum_ledger_slot_has_no_params() {
|
||||
assert_eq!(body["method"], serde_json::json!("minimumLedgerSlot"));
|
||||
assert_eq!(body["params"], serde_json::json!([]));
|
||||
}
|
||||
|
||||
#[tokio::test(flavor = "current_thread")]
|
||||
async fn typed_get_blocks_covers_all_four_overloads_and_preserves_server_order() {
|
||||
let role = crate::HttpRoleName::new("default");
|
||||
let config = crate::SolanaContextConfig::new(std::option::Option::Some(crate::SolanaCommitment::Confirmed), std::option::Option::Some(429_999_999));
|
||||
let empty_config = crate::SolanaContextConfig::default();
|
||||
let cases = [
|
||||
(std::option::Option::None, std::option::Option::None, serde_json::json!([430000100])),
|
||||
(std::option::Option::Some(430_000_109), std::option::Option::None, serde_json::json!([430000100, 430000109])),
|
||||
(
|
||||
std::option::Option::None,
|
||||
std::option::Option::Some(&config),
|
||||
serde_json::json!([430000100,{"commitment":"confirmed","minContextSlot":429999999}]),
|
||||
),
|
||||
(
|
||||
std::option::Option::Some(430_000_109),
|
||||
std::option::Option::Some(&config),
|
||||
serde_json::json!([430000100,430000109,{"commitment":"confirmed","minContextSlot":429999999}]),
|
||||
),
|
||||
(std::option::Option::None, std::option::Option::Some(&empty_config), serde_json::json!([430000100, {}])),
|
||||
];
|
||||
for (end_slot, config, expected_params) in cases {
|
||||
let (url, handle) = serve_once(include_str!("../fixtures/http/get_blocks.success.json"));
|
||||
let pool = pool_for_url(url.as_str());
|
||||
let blocks = pool.get_blocks(&role, 430_000_100, end_slot, config).await.expect("getBlocks overload fixture must succeed");
|
||||
assert_eq!(blocks, std::vec![430_000_100, 430_000_103, 430_000_109]);
|
||||
let request = handle.join().expect("fixture server must join");
|
||||
let body = request_body(request.as_str());
|
||||
assert_eq!(body["method"], serde_json::json!("getBlocks"));
|
||||
assert_eq!(body["params"], expected_params);
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::test(flavor = "current_thread")]
|
||||
async fn typed_get_blocks_allows_reversed_and_boundary_ranges_but_rejects_oversized_before_io() {
|
||||
let role = crate::HttpRoleName::new("default");
|
||||
let (url, handle) = serve_once(include_str!("../fixtures/http/get_blocks.empty.json"));
|
||||
let pool = pool_for_url(url.as_str());
|
||||
let blocks = pool
|
||||
.get_blocks(&role, 430_000_100, std::option::Option::Some(430_000_099), std::option::Option::None)
|
||||
.await
|
||||
.expect("reversed getBlocks range must remain a valid RPC request");
|
||||
assert!(blocks.is_empty());
|
||||
let request = handle.join().expect("fixture server must join");
|
||||
assert_eq!(request_body(request.as_str())["params"], serde_json::json!([430000100, 430000099]));
|
||||
|
||||
let (url, handle) = serve_once(include_str!("../fixtures/http/get_blocks.success.json"));
|
||||
let pool = pool_for_url(url.as_str());
|
||||
let blocks = pool
|
||||
.get_blocks(&role, 10, std::option::Option::Some(500_010), std::option::Option::None)
|
||||
.await
|
||||
.expect("500000-slot getBlocks range must remain valid");
|
||||
assert_eq!(blocks, std::vec![430_000_100, 430_000_103, 430_000_109]);
|
||||
let request = handle.join().expect("fixture server must join");
|
||||
assert_eq!(request_body(request.as_str())["params"], serde_json::json!([10, 500010]));
|
||||
|
||||
let pool = pool_for_url("http://127.0.0.1:9");
|
||||
let result = pool.get_blocks(&role, 10, std::option::Option::Some(500_011), std::option::Option::None).await;
|
||||
let error = result.expect_err("range above 500000 must reject before I/O");
|
||||
assert_eq!(error.code(), crate::ERROR_CODE_INVALID_RPC_PARAMETERS);
|
||||
assert_eq!(error.context()[1].key(), "start_slot");
|
||||
assert_eq!(error.context()[1].value(), "10");
|
||||
assert_eq!(error.context()[2].key(), "end_slot");
|
||||
assert_eq!(error.context()[2].value(), "500011");
|
||||
}
|
||||
|
||||
#[tokio::test(flavor = "current_thread")]
|
||||
async fn typed_block_range_wrappers_reject_processed_commitment_before_io() {
|
||||
let role = crate::HttpRoleName::new("default");
|
||||
let pool = pool_for_url("http://127.0.0.1:9");
|
||||
let config = crate::SolanaContextConfig::new(std::option::Option::Some(crate::SolanaCommitment::Processed), std::option::Option::None);
|
||||
let get_blocks = pool.get_blocks(&role, 1, std::option::Option::None, std::option::Option::Some(&config)).await;
|
||||
let error = get_blocks.expect_err("getBlocks processed commitment must reject before I/O");
|
||||
assert_eq!(error.code(), crate::ERROR_CODE_INVALID_RPC_PARAMETERS);
|
||||
assert_eq!(error.context()[1].key(), "commitment");
|
||||
assert_eq!(error.context()[1].value(), "processed");
|
||||
|
||||
let get_blocks_with_limit = pool.get_blocks_with_limit(&role, 1, 1, std::option::Option::Some(&config)).await;
|
||||
let error = get_blocks_with_limit.expect_err("getBlocksWithLimit processed commitment must reject before I/O");
|
||||
assert_eq!(error.code(), crate::ERROR_CODE_INVALID_RPC_PARAMETERS);
|
||||
assert_eq!(error.context()[1].key(), "commitment");
|
||||
assert_eq!(error.context()[1].value(), "processed");
|
||||
}
|
||||
|
||||
#[tokio::test(flavor = "current_thread")]
|
||||
async fn typed_get_blocks_with_limit_accepts_zero_and_maximum_and_rejects_above_maximum() {
|
||||
let role = crate::HttpRoleName::new("default");
|
||||
let (url, handle) = serve_once(include_str!("../fixtures/http/get_blocks_with_limit.empty.json"));
|
||||
let pool = pool_for_url(url.as_str());
|
||||
let blocks = pool.get_blocks_with_limit(&role, 430_000_200, 0, std::option::Option::None).await.expect("zero getBlocksWithLimit limit must remain valid");
|
||||
assert!(blocks.is_empty());
|
||||
let request = handle.join().expect("fixture server must join");
|
||||
assert_eq!(request_body(request.as_str())["params"], serde_json::json!([430000200, 0]));
|
||||
|
||||
let config = crate::SolanaContextConfig::new(std::option::Option::Some(crate::SolanaCommitment::Finalized), std::option::Option::Some(430_000_000));
|
||||
let (url, handle) = serve_once(include_str!("../fixtures/http/get_blocks_with_limit.success.json"));
|
||||
let pool = pool_for_url(url.as_str());
|
||||
let blocks = pool
|
||||
.get_blocks_with_limit(&role, 430_000_200, 500_000, std::option::Option::Some(&config))
|
||||
.await
|
||||
.expect("maximum getBlocksWithLimit limit must remain valid");
|
||||
assert_eq!(blocks, std::vec![430_000_200, 430_000_201, 430_000_205]);
|
||||
let request = handle.join().expect("fixture server must join");
|
||||
assert_eq!(request_body(request.as_str())["params"], serde_json::json!([430000200,500000,{"commitment":"finalized","minContextSlot":430000000}]));
|
||||
|
||||
let pool = pool_for_url("http://127.0.0.1:9");
|
||||
let result = pool.get_blocks_with_limit(&role, 1, 500_001, std::option::Option::None).await;
|
||||
let error = result.expect_err("getBlocksWithLimit above 500000 must reject before I/O");
|
||||
assert_eq!(error.code(), crate::ERROR_CODE_INVALID_RPC_PARAMETERS);
|
||||
assert_eq!(error.context()[1].key(), "limit");
|
||||
assert_eq!(error.context()[1].value(), "500001");
|
||||
}
|
||||
|
||||
#[tokio::test(flavor = "current_thread")]
|
||||
async fn typed_get_recent_performance_samples_preserves_default_explicit_limit_order_and_older_shape() {
|
||||
let role = crate::HttpRoleName::new("default");
|
||||
for (limit, expected_params) in [(std::option::Option::None, serde_json::json!([])), (std::option::Option::Some(720), serde_json::json!([720]))] {
|
||||
let (url, handle) = serve_once(include_str!("../fixtures/http/get_recent_performance_samples.success.json"));
|
||||
let pool = pool_for_url(url.as_str());
|
||||
let samples = pool.get_recent_performance_samples(&role, limit).await.expect("performance sample fixture must succeed");
|
||||
assert_eq!(samples.len(), 2);
|
||||
assert_eq!(samples[0].slot(), 430_000_123);
|
||||
assert_eq!(samples[0].num_transactions(), 250_000);
|
||||
assert_eq!(samples[0].num_non_vote_transactions(), std::option::Option::Some(175_000));
|
||||
assert_eq!(samples[1].slot(), 430_000_000);
|
||||
assert_eq!(samples[1].num_non_vote_transactions(), std::option::Option::None);
|
||||
let request = handle.join().expect("fixture server must join");
|
||||
let body = request_body(request.as_str());
|
||||
assert_eq!(body["method"], serde_json::json!("getRecentPerformanceSamples"));
|
||||
assert_eq!(body["params"], expected_params);
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::test(flavor = "current_thread")]
|
||||
async fn typed_get_recent_performance_samples_rejects_above_720_before_io() {
|
||||
let pool = pool_for_url("http://127.0.0.1:9");
|
||||
let result = pool.get_recent_performance_samples(&crate::HttpRoleName::new("default"), std::option::Option::Some(721)).await;
|
||||
let error = result.expect_err("performance sample limit above 720 must reject before I/O");
|
||||
assert_eq!(error.code(), crate::ERROR_CODE_INVALID_RPC_PARAMETERS);
|
||||
assert_eq!(error.context()[1].key(), "limit");
|
||||
assert_eq!(error.context()[1].value(), "721");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user