fix(test): resolve a timing issue in fake_peer_set setup (#5398)

* waits for the chain tip update if setup adds mempool transactions and adds match arm for Response::Nil to MempoolTransactionIds request

* updates other match statements checking MempoolTransactionIds requests

* removes wait for chain tip update and waits for AdvertiseBlock earlier instead
This commit is contained in:
Arya 2022-10-13 09:34:40 -04:00 committed by GitHub
parent c8b95ed877
commit 1cfbe64039
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 43 additions and 30 deletions

View File

@ -78,8 +78,13 @@ async fn mempool_requests_for_transactions() {
.await;
match response {
Ok(Response::TransactionIds(response)) => assert_eq!(response, added_transaction_ids),
Ok(Response::Nil) => assert!(
added_transaction_ids.is_empty(),
"response to `MempoolTransactionIds` request should match added_transaction_ids {:?}",
added_transaction_ids
),
_ => unreachable!(
"`MempoolTransactionIds` requests should always respond `Ok(Vec<UnminedTxId>)`, got {:?}",
"`MempoolTransactionIds` requests should always respond `Ok(Vec<UnminedTxId> | Nil)`, got {:?}",
response
),
};
@ -188,7 +193,7 @@ async fn mempool_push_transaction() -> Result<(), crate::BoxError> {
assert_eq!(
mempool_response.expect("unexpected error response from mempool"),
Response::TransactionIds(vec![test_transaction_id]),
"`MempoolTransactionIds` requests should always respond `Ok(Vec<UnminedTxId>)`",
"`MempoolTransactionIds` requests should always respond `Ok(Vec<UnminedTxId> | Nil)`",
);
// Make sure there is an additional request broadcasting the
@ -291,7 +296,7 @@ async fn mempool_advertise_transaction_ids() -> Result<(), crate::BoxError> {
assert_eq!(
mempool_response.expect("unexpected error response from mempool"),
Response::TransactionIds(vec![test_transaction_id]),
"`MempoolTransactionIds` requests should always respond `Ok(Vec<UnminedTxId>)`",
"`MempoolTransactionIds` requests should always respond `Ok(Vec<UnminedTxId> | Nil)`",
);
// Make sure there is an additional request broadcasting the
@ -391,7 +396,7 @@ async fn mempool_transaction_expiration() -> Result<(), crate::BoxError> {
assert_eq!(
mempool_response.expect("unexpected error response from mempool"),
Response::TransactionIds(vec![tx1_id]),
"`MempoolTransactionIds` requests should always respond `Ok(Vec<UnminedTxId>)`",
"`MempoolTransactionIds` requests should always respond `Ok(Vec<UnminedTxId> | Nil)`",
);
// Add a new block to the state (make the chain tip advance)
@ -457,8 +462,12 @@ async fn mempool_transaction_expiration() -> Result<(), crate::BoxError> {
Ok(Response::TransactionIds(response)) => {
assert_eq!(response, vec![tx1_id])
}
Ok(Response::Nil) => panic!(
"response to `MempoolTransactionIds` request should match {:?}",
vec![tx1_id]
),
_ => unreachable!(
"`MempoolTransactionIds` requests should always respond `Ok(Vec<UnminedTxId>)`"
"`MempoolTransactionIds` requests should always respond `Ok(Vec<UnminedTxId> | Nil)`"
),
};
@ -521,7 +530,7 @@ async fn mempool_transaction_expiration() -> Result<(), crate::BoxError> {
assert_eq!(
mempool_response.expect("unexpected error response from mempool"),
Response::TransactionIds(vec![tx2_id]),
"`MempoolTransactionIds` requests should always respond `Ok(Vec<UnminedTxId>)`",
"`MempoolTransactionIds` requests should always respond `Ok(Vec<UnminedTxId> | Nil)`",
);
// Check if tx1 was added to the rejected list as well
@ -603,8 +612,12 @@ async fn mempool_transaction_expiration() -> Result<(), crate::BoxError> {
Ok(Response::TransactionIds(response)) => {
assert_eq!(response, vec![tx2_id])
}
Ok(Response::Nil) => panic!(
"response to `MempoolTransactionIds` request should match {:?}",
vec![tx2_id]
),
_ => unreachable!(
"`MempoolTransactionIds` requests should always respond `Ok(Vec<UnminedTxId>)`"
"`MempoolTransactionIds` requests should always respond `Ok(Vec<UnminedTxId> | Nil)`"
),
};
}
@ -838,7 +851,7 @@ async fn setup(
.unwrap();
committed_blocks.push(block_one);
// Don't wait for the chain tip update here, we wait for AdvertiseBlock below
// Don't wait for the chain tip update here, we wait for AdvertiseBlock below.
let (mut mempool_service, transaction_receiver) = Mempool::new(
&MempoolConfig::default(),
@ -853,6 +866,28 @@ async fn setup(
// Enable the mempool
mempool_service.enable(&mut recent_syncs).await;
let sync_gossip_task_handle = tokio::spawn(sync::gossip_best_tip_block_hashes(
sync_status.clone(),
chain_tip_change.clone(),
peer_set.clone(),
));
let tx_gossip_task_handle = tokio::spawn(gossip_mempool_transaction_id(
transaction_receiver,
peer_set.clone(),
));
// Make sure there is an additional request broadcasting the
// committed blocks to peers.
//
// (The genesis block gets skipped, because block 1 is committed before the task is spawned.)
for block in committed_blocks.iter().skip(1) {
peer_set
.expect_request(Request::AdvertiseBlock(block.hash()))
.await
.respond(Response::Nil);
}
// Add transactions to the mempool, skipping verification and broadcast
let mut added_transactions = Vec::new();
if add_transactions {
@ -882,28 +917,6 @@ async fn setup(
// We can't expect or unwrap because the returned Result does not implement Debug
assert!(r.is_ok(), "unexpected setup channel send failure");
let sync_gossip_task_handle = tokio::spawn(sync::gossip_best_tip_block_hashes(
sync_status.clone(),
chain_tip_change.clone(),
peer_set.clone(),
));
let tx_gossip_task_handle = tokio::spawn(gossip_mempool_transaction_id(
transaction_receiver,
peer_set.clone(),
));
// Make sure there is an additional request broadcasting the
// committed blocks to peers.
//
// (The genesis block gets skipped, because block 1 is committed before the task is spawned.)
for block in committed_blocks.iter().skip(1) {
peer_set
.expect_request(Request::AdvertiseBlock(block.hash()))
.await
.respond(Response::Nil);
}
(
inbound_service,
mempool_service,