tests(rpc): Add fixed test vectors for `z_getsubtreesbyindex` from zcashd to zebra (#7515)
* add fixed test vectors for `z_getsubtreesbyindex` * change to snapshots * add test to docker * remove assert lines from snapshots * add more tests * change test description * change test name * run both tests together * wait for state version update in test * Run one test at a time to avoid state locking issues --------- Co-authored-by: teor <teor@riseup.net>
This commit is contained in:
parent
a6063443a8
commit
80da28b3e3
|
|
@ -5839,6 +5839,7 @@ dependencies = [
|
||||||
"indexmap 2.0.0",
|
"indexmap 2.0.0",
|
||||||
"indicatif",
|
"indicatif",
|
||||||
"inferno",
|
"inferno",
|
||||||
|
"insta",
|
||||||
"jsonrpc-core",
|
"jsonrpc-core",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"log",
|
"log",
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,9 @@ case "$1" in
|
||||||
elif [[ "$TEST_LWD_RPC_CALL" -eq "1" ]]; then
|
elif [[ "$TEST_LWD_RPC_CALL" -eq "1" ]]; then
|
||||||
# Starting at a cached Zebra tip, test a JSON-RPC call to Zebra.
|
# Starting at a cached Zebra tip, test a JSON-RPC call to Zebra.
|
||||||
ls -lh "$ZEBRA_CACHED_STATE_DIR"/*/* || (echo "No $ZEBRA_CACHED_STATE_DIR/*/*"; ls -lhR "$ZEBRA_CACHED_STATE_DIR" | head -50 || echo "No $ZEBRA_CACHED_STATE_DIR directory")
|
ls -lh "$ZEBRA_CACHED_STATE_DIR"/*/* || (echo "No $ZEBRA_CACHED_STATE_DIR/*/*"; ls -lhR "$ZEBRA_CACHED_STATE_DIR" | head -50 || echo "No $ZEBRA_CACHED_STATE_DIR directory")
|
||||||
cargo test --locked --release --features "$ENTRYPOINT_FEATURES" --package zebrad --test acceptance -- --nocapture --include-ignored fully_synced_rpc_test
|
# Run both the fully synced RPC test and the subtree snapshot test, one test at a time.
|
||||||
|
# Since these tests use the same cached state, a state problem in the first test can fail the second test.
|
||||||
|
cargo test --locked --release --features "$ENTRYPOINT_FEATURES" --package zebrad --test acceptance -- --nocapture --include-ignored --test-threads 1 fully_synced_rpc_
|
||||||
elif [[ "$TEST_LWD_FULL_SYNC" -eq "1" ]]; then
|
elif [[ "$TEST_LWD_FULL_SYNC" -eq "1" ]]; then
|
||||||
# Starting at a cached Zebra tip, run a lightwalletd sync to tip.
|
# Starting at a cached Zebra tip, run a lightwalletd sync to tip.
|
||||||
ls -lh "$ZEBRA_CACHED_STATE_DIR"/*/* || (echo "No $ZEBRA_CACHED_STATE_DIR/*/*"; ls -lhR "$ZEBRA_CACHED_STATE_DIR" | head -50 || echo "No $ZEBRA_CACHED_STATE_DIR directory")
|
ls -lh "$ZEBRA_CACHED_STATE_DIR"/*/* || (echo "No $ZEBRA_CACHED_STATE_DIR/*/*"; ls -lhR "$ZEBRA_CACHED_STATE_DIR" | head -50 || echo "No $ZEBRA_CACHED_STATE_DIR directory")
|
||||||
|
|
|
||||||
|
|
@ -235,6 +235,7 @@ hex-literal = "0.4.1"
|
||||||
jsonrpc-core = "18.0.0"
|
jsonrpc-core = "18.0.0"
|
||||||
once_cell = "1.18.0"
|
once_cell = "1.18.0"
|
||||||
regex = "1.9.5"
|
regex = "1.9.5"
|
||||||
|
insta = { version = "1.31.0", features = ["json"] }
|
||||||
|
|
||||||
# zebra-rpc needs the preserve_order feature, it also makes test results more stable
|
# zebra-rpc needs the preserve_order feature, it also makes test results more stable
|
||||||
serde_json = { version = "1.0.107", features = ["preserve_order"] }
|
serde_json = { version = "1.0.107", features = ["preserve_order"] }
|
||||||
|
|
|
||||||
|
|
@ -151,6 +151,7 @@ use color_eyre::{
|
||||||
Help,
|
Help,
|
||||||
};
|
};
|
||||||
use semver::Version;
|
use semver::Version;
|
||||||
|
use serde_json::Value;
|
||||||
|
|
||||||
use zebra_chain::{
|
use zebra_chain::{
|
||||||
block::{self, Height},
|
block::{self, Height},
|
||||||
|
|
@ -1420,8 +1421,6 @@ async fn rpc_endpoint_parallel_threads() -> Result<()> {
|
||||||
/// Set `parallel_cpu_threads` to true to auto-configure based on the number of CPU cores.
|
/// Set `parallel_cpu_threads` to true to auto-configure based on the number of CPU cores.
|
||||||
#[tracing::instrument]
|
#[tracing::instrument]
|
||||||
async fn rpc_endpoint(parallel_cpu_threads: bool) -> Result<()> {
|
async fn rpc_endpoint(parallel_cpu_threads: bool) -> Result<()> {
|
||||||
use serde_json::Value;
|
|
||||||
|
|
||||||
let _init_guard = zebra_test::init();
|
let _init_guard = zebra_test::init();
|
||||||
if zebra_test::net::zebra_skip_network_tests() {
|
if zebra_test::net::zebra_skip_network_tests() {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
|
|
@ -2636,3 +2635,103 @@ async fn state_format_test(
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Snapshot the `z_getsubtreesbyindex` method in a synchronized chain.
|
||||||
|
///
|
||||||
|
/// This test name must have the same prefix as the `fully_synced_rpc_test`, so they can be run in the same test job.
|
||||||
|
#[tokio::test]
|
||||||
|
#[ignore]
|
||||||
|
async fn fully_synced_rpc_z_getsubtreesbyindex_snapshot_test() -> Result<()> {
|
||||||
|
let _init_guard = zebra_test::init();
|
||||||
|
|
||||||
|
// We're only using cached Zebra state here, so this test type is the most similar
|
||||||
|
let test_type = TestType::UpdateZebraCachedStateWithRpc;
|
||||||
|
let network = Network::Mainnet;
|
||||||
|
|
||||||
|
let (mut zebrad, zebra_rpc_address) = if let Some(zebrad_and_address) = spawn_zebrad_for_rpc(
|
||||||
|
network,
|
||||||
|
"rpc_z_getsubtreesbyindex_sync_snapshots",
|
||||||
|
test_type,
|
||||||
|
true,
|
||||||
|
)? {
|
||||||
|
tracing::info!("running fully synced zebrad z_getsubtreesbyindex RPC test");
|
||||||
|
|
||||||
|
zebrad_and_address
|
||||||
|
} else {
|
||||||
|
// Skip the test, we don't have the required cached state
|
||||||
|
return Ok(());
|
||||||
|
};
|
||||||
|
|
||||||
|
// Store the state version message so we can wait for the upgrade later if needed.
|
||||||
|
let state_version_message = wait_for_state_version_message(&mut zebrad)?;
|
||||||
|
|
||||||
|
// Wait for zebrad to load the full cached blockchain.
|
||||||
|
zebrad.expect_stdout_line_matches(SYNC_FINISHED_REGEX)?;
|
||||||
|
|
||||||
|
// Create an http client
|
||||||
|
let client =
|
||||||
|
RpcRequestClient::new(zebra_rpc_address.expect("already checked that address is valid"));
|
||||||
|
|
||||||
|
// Create test vector matrix
|
||||||
|
let zcashd_test_vectors = vec![
|
||||||
|
(
|
||||||
|
"z_getsubtreesbyindex_mainnet_sapling_0_1".to_string(),
|
||||||
|
r#"["sapling", 0, 1]"#.to_string(),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"z_getsubtreesbyindex_mainnet_sapling_0_11".to_string(),
|
||||||
|
r#"["sapling", 0, 11]"#.to_string(),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"z_getsubtreesbyindex_mainnet_sapling_17_1".to_string(),
|
||||||
|
r#"["sapling", 17, 1]"#.to_string(),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"z_getsubtreesbyindex_mainnet_sapling_1090_6".to_string(),
|
||||||
|
r#"["sapling", 1090, 6]"#.to_string(),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"z_getsubtreesbyindex_mainnet_orchard_0_1".to_string(),
|
||||||
|
r#"["orchard", 0, 1]"#.to_string(),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"z_getsubtreesbyindex_mainnet_orchard_338_1".to_string(),
|
||||||
|
r#"["orchard", 338, 1]"#.to_string(),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"z_getsubtreesbyindex_mainnet_orchard_585_1".to_string(),
|
||||||
|
r#"["orchard", 585, 1]"#.to_string(),
|
||||||
|
),
|
||||||
|
];
|
||||||
|
|
||||||
|
// Before we write a cached state image, wait for a database upgrade.
|
||||||
|
//
|
||||||
|
// TODO: this line will hang if the state upgrade finishes before zebra is synced.
|
||||||
|
// But that is unlikely with the 25.2 upgrade, because it takes 20+ minutes.
|
||||||
|
// If it happens for a later upgrade, this code can be moved earlier in the test,
|
||||||
|
// as long as all the cached states are version 25.2.2 or later.
|
||||||
|
wait_for_state_version_upgrade(
|
||||||
|
&mut zebrad,
|
||||||
|
&state_version_message,
|
||||||
|
database_format_version_in_code(),
|
||||||
|
)?;
|
||||||
|
|
||||||
|
for i in zcashd_test_vectors {
|
||||||
|
let res = client.call("z_getsubtreesbyindex", i.1).await?;
|
||||||
|
let body = res.bytes().await;
|
||||||
|
let parsed: Value = serde_json::from_slice(&body.expect("Response is valid json"))?;
|
||||||
|
insta::assert_json_snapshot!(i.0, parsed);
|
||||||
|
}
|
||||||
|
|
||||||
|
zebrad.kill(false)?;
|
||||||
|
|
||||||
|
let output = zebrad.wait_with_output()?;
|
||||||
|
let output = output.assert_failure()?;
|
||||||
|
|
||||||
|
// [Note on port conflict](#Note on port conflict)
|
||||||
|
output
|
||||||
|
.assert_was_killed()
|
||||||
|
.wrap_err("Possible port conflict. Are there other acceptance tests running?")?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
---
|
||||||
|
source: zebrad/tests/acceptance.rs
|
||||||
|
expression: parsed
|
||||||
|
---
|
||||||
|
{
|
||||||
|
"jsonrpc": "2.0",
|
||||||
|
"result": {
|
||||||
|
"pool": "orchard",
|
||||||
|
"start_index": 0,
|
||||||
|
"subtrees": [
|
||||||
|
{
|
||||||
|
"root": "d4e323b3ae0cabfb6be4087fec8c66d9a9bbfc354bf1d9588b6620448182063b",
|
||||||
|
"end_height": 1707429
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"id": 123
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
---
|
||||||
|
source: zebrad/tests/acceptance.rs
|
||||||
|
expression: parsed
|
||||||
|
---
|
||||||
|
{
|
||||||
|
"jsonrpc": "2.0",
|
||||||
|
"result": {
|
||||||
|
"pool": "orchard",
|
||||||
|
"start_index": 338,
|
||||||
|
"subtrees": [
|
||||||
|
{
|
||||||
|
"root": "52c8d1ea6ef49c6e0d6bb6fef4520e1e3851895a04b52bfac1b1cc0fbbb3f709",
|
||||||
|
"end_height": 1888929
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"id": 123
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
---
|
||||||
|
source: zebrad/tests/acceptance.rs
|
||||||
|
expression: parsed
|
||||||
|
---
|
||||||
|
{
|
||||||
|
"jsonrpc": "2.0",
|
||||||
|
"result": {
|
||||||
|
"pool": "orchard",
|
||||||
|
"start_index": 585,
|
||||||
|
"subtrees": [
|
||||||
|
{
|
||||||
|
"root": "43c86869520ada7a2cd0deeecf3650f337f90bd4328b16144b0a278ad9fdaa08",
|
||||||
|
"end_height": 2000126
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"id": 123
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
---
|
||||||
|
source: zebrad/tests/acceptance.rs
|
||||||
|
expression: parsed
|
||||||
|
---
|
||||||
|
{
|
||||||
|
"jsonrpc": "2.0",
|
||||||
|
"result": {
|
||||||
|
"pool": "sapling",
|
||||||
|
"start_index": 0,
|
||||||
|
"subtrees": [
|
||||||
|
{
|
||||||
|
"root": "754bb593ea42d231a7ddf367640f09bbf59dc00f2c1d2003cc340e0c016b5b13",
|
||||||
|
"end_height": 558822
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"id": 123
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
---
|
||||||
|
source: zebrad/tests/acceptance.rs
|
||||||
|
expression: parsed
|
||||||
|
---
|
||||||
|
{
|
||||||
|
"jsonrpc": "2.0",
|
||||||
|
"result": {
|
||||||
|
"pool": "sapling",
|
||||||
|
"start_index": 0,
|
||||||
|
"subtrees": [
|
||||||
|
{
|
||||||
|
"root": "754bb593ea42d231a7ddf367640f09bbf59dc00f2c1d2003cc340e0c016b5b13",
|
||||||
|
"end_height": 558822
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"root": "03654c3eacbb9b93e122cf6d77b606eae29610f4f38a477985368197fd68e02d",
|
||||||
|
"end_height": 670209
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"root": "e2bf698f5ac10b44da560d11a5e1d5c191a82a968a2be0a6948aa8748b545160",
|
||||||
|
"end_height": 780364
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"root": "e71be1fd3963a2d700ed374d01fdd4a70d8dda8189a8f6602e5fe66c2c66a11d",
|
||||||
|
"end_height": 839994
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"root": "f1c57245fff8dbc2d3efe5a0953eafdedeb06e18a3ad4f1e4042ee76623f8032",
|
||||||
|
"end_height": 916404
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"root": "ea8a275c49b47f4658fa4947bbac027bb1981e3009f292916cb1f7a93ac82c08",
|
||||||
|
"end_height": 985993
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"root": "891b1e6bfec42e97c79ec505c7ae1b584cf47d4ed8f6cdfcad815b02a5496f67",
|
||||||
|
"end_height": 1056197
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"root": "163838d11a0525898f410397ae6ec627fa18b3184a021e088806947b3c5ca718",
|
||||||
|
"end_height": 1109360
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"root": "089a1f9d50a037cc66aba4400b1703bcbb66f5f2993fd0dd3bb726e359409167",
|
||||||
|
"end_height": 1169471
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"root": "0fc8a6ad74e65764d9bc2fcd13866b994731dfda821e6618a1a308bb1eccf51a",
|
||||||
|
"end_height": 1256932
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"root": "cdd92a1e884cf1914dae8345423203832ec7bbf9d95ae50b82e4327b39d6d912",
|
||||||
|
"end_height": 1363036
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"id": 123
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
---
|
||||||
|
source: zebrad/tests/acceptance.rs
|
||||||
|
expression: parsed
|
||||||
|
---
|
||||||
|
{
|
||||||
|
"jsonrpc": "2.0",
|
||||||
|
"result": {
|
||||||
|
"pool": "sapling",
|
||||||
|
"start_index": 1090,
|
||||||
|
"subtrees": [
|
||||||
|
{
|
||||||
|
"root": "507ebccc63e2ca45bd254975ca2b75f2a221a0167d514077472dc7ef1e04a638",
|
||||||
|
"end_height": 1857525
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"root": "0240b333e243a38583b692b9ce5b2fbdfde41cfdd3f3067b5c7d94fda5387666",
|
||||||
|
"end_height": 1860908
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"root": "bf299f8446bea806854e9b363ed890f83423cececd53293c81df92ff112aa43f",
|
||||||
|
"end_height": 1866377
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"root": "4a4778e6242b3e708f040b4a373c8cdedd14c5c415ab20f32e46430507b1a346",
|
||||||
|
"end_height": 1889548
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"root": "c1cffa22d637cb194102a1b02a57d2b47c67f54094f6773a38b2e53d3becb45f",
|
||||||
|
"end_height": 1997495
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"root": "0ee7328354ad588ee9581b25a3e2b94dbb03db647b79538c8805d793c61b822d",
|
||||||
|
"end_height": 2056616
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"id": 123
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
---
|
||||||
|
source: zebrad/tests/acceptance.rs
|
||||||
|
expression: parsed
|
||||||
|
---
|
||||||
|
{
|
||||||
|
"jsonrpc": "2.0",
|
||||||
|
"result": {
|
||||||
|
"pool": "sapling",
|
||||||
|
"start_index": 17,
|
||||||
|
"subtrees": [
|
||||||
|
{
|
||||||
|
"root": "89ac51fcf846eacb2e7bca32d9bf3793792d2d952c1fec11e52b56d7674c1c36",
|
||||||
|
"end_height": 1703171
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"id": 123
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue