fix(rpc): Use populated state in more RPC snapshot tests (#6700)
* fix panic in height * Update security comments and turn literals into constants * Add a test-only assertion that the maximum output index can't ever be reached * Fix a MISSING_BLOCK_ERROR_CODE that was mistakenly 0 * Add production RPC tests with excessive heights * Add and update snapshots for production RPCs * Add excessive height tests for most getblocktemplate RPCs * Use correct snapshot names by running `cargo insta review` * Fix some RPC tests so they use a populated state * Use correct snapshot file names by running `cargo insta review` --------- Co-authored-by: Alfredo Garcia <oxarbitrage@gmail.com>
This commit is contained in:
parent
b1ce0e0894
commit
cb6667059a
|
|
@ -259,7 +259,7 @@ pub async fn test_responses<State, ReadState>(
|
||||||
mock_chain_tip_sender.send_best_tip_hash(fake_tip_hash);
|
mock_chain_tip_sender.send_best_tip_hash(fake_tip_hash);
|
||||||
|
|
||||||
// create a new rpc instance with new state and mock
|
// create a new rpc instance with new state and mock
|
||||||
let get_block_template_rpc = GetBlockTemplateRpcImpl::new(
|
let get_block_template_rpc_mock_state = GetBlockTemplateRpcImpl::new(
|
||||||
network,
|
network,
|
||||||
mining_config.clone(),
|
mining_config.clone(),
|
||||||
Buffer::new(mempool.clone(), 1),
|
Buffer::new(mempool.clone(), 1),
|
||||||
|
|
@ -276,7 +276,7 @@ pub async fn test_responses<State, ReadState>(
|
||||||
let mock_read_state_request_handler = make_mock_read_state_request_handler();
|
let mock_read_state_request_handler = make_mock_read_state_request_handler();
|
||||||
let mock_mempool_request_handler = make_mock_mempool_request_handler();
|
let mock_mempool_request_handler = make_mock_mempool_request_handler();
|
||||||
|
|
||||||
let get_block_template_fut = get_block_template_rpc.get_block_template(None);
|
let get_block_template_fut = get_block_template_rpc_mock_state.get_block_template(None);
|
||||||
|
|
||||||
let (get_block_template, ..) = tokio::join!(
|
let (get_block_template, ..) = tokio::join!(
|
||||||
get_block_template_fut,
|
get_block_template_fut,
|
||||||
|
|
@ -314,7 +314,7 @@ pub async fn test_responses<State, ReadState>(
|
||||||
let mock_read_state_request_handler = make_mock_read_state_request_handler();
|
let mock_read_state_request_handler = make_mock_read_state_request_handler();
|
||||||
let mock_mempool_request_handler = make_mock_mempool_request_handler();
|
let mock_mempool_request_handler = make_mock_mempool_request_handler();
|
||||||
|
|
||||||
let get_block_template_fut = get_block_template_rpc.get_block_template(
|
let get_block_template_fut = get_block_template_rpc_mock_state.get_block_template(
|
||||||
get_block_template::JsonParameters {
|
get_block_template::JsonParameters {
|
||||||
long_poll_id: long_poll_id.into(),
|
long_poll_id: long_poll_id.into(),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
|
|
@ -349,12 +349,13 @@ pub async fn test_responses<State, ReadState>(
|
||||||
|
|
||||||
// `getblocktemplate` proposal mode variant
|
// `getblocktemplate` proposal mode variant
|
||||||
|
|
||||||
let get_block_template =
|
let get_block_template = get_block_template_rpc_mock_state.get_block_template(Some(
|
||||||
get_block_template_rpc.get_block_template(Some(get_block_template::JsonParameters {
|
get_block_template::JsonParameters {
|
||||||
mode: GetBlockTemplateRequestMode::Proposal,
|
mode: GetBlockTemplateRequestMode::Proposal,
|
||||||
data: Some(HexData("".into())),
|
data: Some(HexData("".into())),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
}));
|
},
|
||||||
|
));
|
||||||
|
|
||||||
let get_block_template = get_block_template
|
let get_block_template = get_block_template
|
||||||
.await
|
.await
|
||||||
|
|
@ -365,7 +366,7 @@ pub async fn test_responses<State, ReadState>(
|
||||||
// the following snapshots use a mock read_state and chain_verifier
|
// the following snapshots use a mock read_state and chain_verifier
|
||||||
|
|
||||||
let mut mock_chain_verifier = MockService::build().for_unit_tests();
|
let mut mock_chain_verifier = MockService::build().for_unit_tests();
|
||||||
let get_block_template_rpc = GetBlockTemplateRpcImpl::new(
|
let get_block_template_rpc_mock_state_verifier = GetBlockTemplateRpcImpl::new(
|
||||||
network,
|
network,
|
||||||
mining_config,
|
mining_config,
|
||||||
Buffer::new(mempool.clone(), 1),
|
Buffer::new(mempool.clone(), 1),
|
||||||
|
|
@ -376,12 +377,13 @@ pub async fn test_responses<State, ReadState>(
|
||||||
MockAddressBookPeers::default(),
|
MockAddressBookPeers::default(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let get_block_template_fut =
|
let get_block_template_fut = get_block_template_rpc_mock_state_verifier.get_block_template(
|
||||||
get_block_template_rpc.get_block_template(Some(get_block_template::JsonParameters {
|
Some(get_block_template::JsonParameters {
|
||||||
mode: GetBlockTemplateRequestMode::Proposal,
|
mode: GetBlockTemplateRequestMode::Proposal,
|
||||||
data: Some(HexData(BLOCK_MAINNET_1_BYTES.to_vec())),
|
data: Some(HexData(BLOCK_MAINNET_1_BYTES.to_vec())),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
}));
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
let mock_chain_verifier_request_handler = async move {
|
let mock_chain_verifier_request_handler = async move {
|
||||||
mock_chain_verifier
|
mock_chain_verifier
|
||||||
|
|
@ -398,6 +400,8 @@ pub async fn test_responses<State, ReadState>(
|
||||||
|
|
||||||
snapshot_rpc_getblocktemplate("proposal", get_block_template, None, &settings);
|
snapshot_rpc_getblocktemplate("proposal", get_block_template, None, &settings);
|
||||||
|
|
||||||
|
// These RPC snapshots use the populated state
|
||||||
|
|
||||||
// `submitblock`
|
// `submitblock`
|
||||||
|
|
||||||
let submit_block = get_block_template_rpc
|
let submit_block = get_block_template_rpc
|
||||||
|
|
@ -443,18 +447,26 @@ pub async fn test_responses<State, ReadState>(
|
||||||
.expect("We should have a z_validate_address::Response");
|
.expect("We should have a z_validate_address::Response");
|
||||||
snapshot_rpc_z_validateaddress("invalid", z_validate_address, &settings);
|
snapshot_rpc_z_validateaddress("invalid", z_validate_address, &settings);
|
||||||
|
|
||||||
// getdifficulty
|
// `getdifficulty`
|
||||||
|
// This RPC snapshot uses both the mock and populated states
|
||||||
|
|
||||||
// Fake the ChainInfo response
|
// Fake the ChainInfo response using the mock state
|
||||||
let mock_read_state_request_handler = make_mock_read_state_request_handler();
|
let mock_read_state_request_handler = make_mock_read_state_request_handler();
|
||||||
|
|
||||||
let get_difficulty_fut = get_block_template_rpc.get_difficulty();
|
let get_difficulty_fut = get_block_template_rpc_mock_state.get_difficulty();
|
||||||
|
|
||||||
let (get_difficulty, ..) = tokio::join!(get_difficulty_fut, mock_read_state_request_handler,);
|
let (get_difficulty, ..) = tokio::join!(get_difficulty_fut, mock_read_state_request_handler,);
|
||||||
|
|
||||||
let get_difficulty = get_difficulty.expect("unexpected error in getdifficulty RPC call");
|
let mock_get_difficulty = get_difficulty.expect("unexpected error in getdifficulty RPC call");
|
||||||
|
|
||||||
snapshot_rpc_getdifficulty(get_difficulty, &settings);
|
snapshot_rpc_getdifficulty_valid("mock", mock_get_difficulty, &settings);
|
||||||
|
|
||||||
|
// Now use the populated state
|
||||||
|
|
||||||
|
let populated_get_difficulty = get_block_template_rpc.get_difficulty().await;
|
||||||
|
snapshot_rpc_getdifficulty_invalid("populated", populated_get_difficulty, &settings);
|
||||||
|
|
||||||
|
// `z_listunifiedreceivers`
|
||||||
|
|
||||||
let ua1 = String::from("u1l8xunezsvhq8fgzfl7404m450nwnd76zshscn6nfys7vyz2ywyh4cc5daaq0c7q2su5lqfh23sp7fkf3kt27ve5948mzpfdvckzaect2jtte308mkwlycj2u0eac077wu70vqcetkxf");
|
let ua1 = String::from("u1l8xunezsvhq8fgzfl7404m450nwnd76zshscn6nfys7vyz2ywyh4cc5daaq0c7q2su5lqfh23sp7fkf3kt27ve5948mzpfdvckzaect2jtte308mkwlycj2u0eac077wu70vqcetkxf");
|
||||||
let z_list_unified_receivers =
|
let z_list_unified_receivers =
|
||||||
|
|
@ -578,9 +590,26 @@ fn snapshot_rpc_z_validateaddress(
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Snapshot `getdifficulty` response, using `cargo insta` and JSON serialization.
|
/// Snapshot valid `getdifficulty` response, using `cargo insta` and JSON serialization.
|
||||||
fn snapshot_rpc_getdifficulty(difficulty: f64, settings: &insta::Settings) {
|
fn snapshot_rpc_getdifficulty_valid(
|
||||||
settings.bind(|| insta::assert_json_snapshot!("get_difficulty", difficulty));
|
variant: &'static str,
|
||||||
|
difficulty: f64,
|
||||||
|
settings: &insta::Settings,
|
||||||
|
) {
|
||||||
|
settings.bind(|| {
|
||||||
|
insta::assert_json_snapshot!(format!("get_difficulty_valid_{variant}"), difficulty)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Snapshot invalid `getdifficulty` response, using `cargo insta` and JSON serialization.
|
||||||
|
fn snapshot_rpc_getdifficulty_invalid(
|
||||||
|
variant: &'static str,
|
||||||
|
difficulty: Result<f64>,
|
||||||
|
settings: &insta::Settings,
|
||||||
|
) {
|
||||||
|
settings.bind(|| {
|
||||||
|
insta::assert_json_snapshot!(format!("get_difficulty_invalid_{variant}"), difficulty)
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Snapshot `snapshot_rpc_z_listunifiedreceivers` response, using `cargo insta` and JSON serialization.
|
/// Snapshot `snapshot_rpc_z_listunifiedreceivers` response, using `cargo insta` and JSON serialization.
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
---
|
||||||
|
source: zebra-rpc/src/methods/tests/snapshot/get_block_template_rpcs.rs
|
||||||
|
expression: difficulty
|
||||||
|
---
|
||||||
|
{
|
||||||
|
"Err": {
|
||||||
|
"code": 0,
|
||||||
|
"message": "Zebra's state only has a few blocks, wait until it syncs to the chain tip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
---
|
||||||
|
source: zebra-rpc/src/methods/tests/snapshot/get_block_template_rpcs.rs
|
||||||
|
expression: difficulty
|
||||||
|
---
|
||||||
|
{
|
||||||
|
"Err": {
|
||||||
|
"code": 0,
|
||||||
|
"message": "Zebra's state only has a few blocks, wait until it syncs to the chain tip"
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue