Make checkpoint restart test automatically use extra blocks

Also use block 10. (The previous version only really used blocks 0-9.)
This commit is contained in:
teor 2021-03-03 16:01:39 +10:00
parent e1002ce2ce
commit 2e64409d78
1 changed files with 28 additions and 17 deletions

View File

@ -7,7 +7,7 @@ use super::types::TargetHeight::*;
use color_eyre::eyre::{eyre, Report}; use color_eyre::eyre::{eyre, Report};
use futures::{future::TryFutureExt, stream::FuturesUnordered}; use futures::{future::TryFutureExt, stream::FuturesUnordered};
use std::{cmp::min, mem::drop, time::Duration}; use std::{cmp::min, convert::TryInto, mem::drop, time::Duration};
use tokio::{stream::StreamExt, time::timeout}; use tokio::{stream::StreamExt, time::timeout};
use tower::{Service, ServiceBuilder, ServiceExt}; use tower::{Service, ServiceBuilder, ServiceExt};
use tracing_futures::Instrument; use tracing_futures::Instrument;
@ -222,11 +222,11 @@ async fn continuous_blockchain_no_restart() -> Result<(), Report> {
#[tokio::test] #[tokio::test]
async fn continuous_blockchain_restart() -> Result<(), Report> { async fn continuous_blockchain_restart() -> Result<(), Report> {
for height in 0..=10 { for height in 0..zebra_test::vectors::CONTINUOUS_MAINNET_BLOCKS.len() {
continuous_blockchain(Some(block::Height(height)), Mainnet).await?; continuous_blockchain(Some(block::Height(height.try_into().unwrap())), Mainnet).await?;
} }
for height in 0..=10 { for height in 0..zebra_test::vectors::CONTINUOUS_TESTNET_BLOCKS.len() {
continuous_blockchain(Some(block::Height(height)), Testnet).await?; continuous_blockchain(Some(block::Height(height.try_into().unwrap())), Testnet).await?;
} }
Ok(()) Ok(())
} }
@ -256,7 +256,17 @@ async fn continuous_blockchain(
let blockchain_len = blockchain.len(); let blockchain_len = blockchain.len();
// Use some of the blocks as checkpoints // Use some of the blocks as checkpoints
let checkpoint_list = vec![&blockchain[0], &blockchain[5], &blockchain[9]]; // We use these indexes so that we test:
// - checkpoints don't have to be the same length
// - checkpoints start at genesis
// - checkpoints end at the end of the range (there's no point in having extra blocks)
let expected_max_height = block::Height((blockchain_len - 1).try_into().unwrap());
let checkpoint_list = vec![
&blockchain[0],
&blockchain[blockchain_len / 3],
&blockchain[blockchain_len / 2],
&blockchain[blockchain_len - 1],
];
let checkpoint_list: BTreeMap<block::Height, block::Hash> = checkpoint_list let checkpoint_list: BTreeMap<block::Height, block::Hash> = checkpoint_list
.iter() .iter()
.map(|(_block, height, hash)| (*height, *hash)) .map(|(_block, height, hash)| (*height, *hash))
@ -275,8 +285,14 @@ async fn continuous_blockchain(
.map_err(|e| eyre!(e))?; .map_err(|e| eyre!(e))?;
// Setup checks // Setup checks
if restart_height.is_some() {
assert!(
restart_height <= Some(checkpoint_verifier.checkpoint_list.max_height()),
"restart heights after the final checkpoint are not supported by this test"
);
}
if restart_height if restart_height
.map(|h| h >= checkpoint_verifier.checkpoint_list.max_height()) .map(|h| h == checkpoint_verifier.checkpoint_list.max_height())
.unwrap_or(false) .unwrap_or(false)
{ {
assert_eq!( assert_eq!(
@ -299,7 +315,7 @@ async fn continuous_blockchain(
} }
assert_eq!( assert_eq!(
checkpoint_verifier.checkpoint_list.max_height(), checkpoint_verifier.checkpoint_list.max_height(),
block::Height(9) expected_max_height
); );
let mut handles = FuturesUnordered::new(); let mut handles = FuturesUnordered::new();
@ -327,11 +343,6 @@ async fn continuous_blockchain(
} }
} }
// Stop verifying after the final checkpoint is reached
if height > checkpoint_verifier.checkpoint_list.max_height() {
break;
}
/// SPANDOC: Make sure the verifier service is ready for block {?height} /// SPANDOC: Make sure the verifier service is ready for block {?height}
let ready_verifier_service = checkpoint_verifier let ready_verifier_service = checkpoint_verifier
.ready_and() .ready_and()
@ -369,7 +380,7 @@ async fn continuous_blockchain(
// Check that we have the correct number of verify tasks // Check that we have the correct number of verify tasks
if let Some(block::Height(restart_height)) = restart_height { if let Some(block::Height(restart_height)) = restart_height {
let restart_height = restart_height as usize; let restart_height = restart_height as usize;
if restart_height >= blockchain_len - 1 { if restart_height == blockchain_len - 1 {
assert_eq!( assert_eq!(
handles.len(), handles.len(),
0, 0,
@ -379,7 +390,7 @@ async fn continuous_blockchain(
} else { } else {
assert_eq!( assert_eq!(
handles.len(), handles.len(),
blockchain_len - restart_height - 2, blockchain_len - restart_height - 1,
"unexpected number of verify tasks for restart height: {:?}", "unexpected number of verify tasks for restart height: {:?}",
restart_height, restart_height,
); );
@ -387,7 +398,7 @@ async fn continuous_blockchain(
} else { } else {
assert_eq!( assert_eq!(
handles.len(), handles.len(),
blockchain_len - 1, blockchain_len,
"unexpected number of verify tasks with no restart height", "unexpected number of verify tasks with no restart height",
); );
} }
@ -412,7 +423,7 @@ async fn continuous_blockchain(
); );
assert_eq!( assert_eq!(
checkpoint_verifier.checkpoint_list.max_height(), checkpoint_verifier.checkpoint_list.max_height(),
block::Height(9), expected_max_height,
"unexpected max checkpoint height for restart height: {:?}", "unexpected max checkpoint height for restart height: {:?}",
restart_height, restart_height,
); );