Skip to content

Commit 50f3ee0

Browse files
authored
apollo_batcher: test fetch revert result (#11516)
1 parent 6ba224c commit 50f3ee0

File tree

3 files changed

+97
-8
lines changed

3 files changed

+97
-8
lines changed

crates/apollo_batcher/src/commitment_manager/commitment_manager_impl.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ impl<S: StateCommitterTrait> CommitmentManager<S> {
112112
/// `wait_for_tasks_channel` is true, it will wait until there is space in the channel;
113113
/// otherwise, it will panic. Any other error when sending the task will also cause a panic.
114114
async fn add_task(&self, task_input: CommitterTaskInput) -> CommitmentManagerResult<()> {
115-
let error_message = format!("Failed to send task to state committer: {task_input}.",);
115+
let error_message = format!("Failed to send task to state committer: {task_input}",);
116116

117117
if self.config.wait_for_tasks_channel {
118118
info!("Waiting to send task for {task_input} to state committer.");

crates/apollo_batcher/src/commitment_manager/commitment_manager_test.rs

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@ use tokio::time::{sleep, timeout};
1717
use crate::batcher::MockBatcherStorageReader;
1818
use crate::commitment_manager::commitment_manager_impl::CommitmentManager;
1919
use crate::commitment_manager::errors::CommitmentManagerError;
20-
use crate::test_utils::{test_state_diff, MockStateCommitter, INITIAL_HEIGHT};
20+
use crate::test_utils::{
21+
test_state_diff,
22+
MockStateCommitter,
23+
INITIAL_HEIGHT,
24+
LATEST_BLOCK_IN_STORAGE,
25+
};
2126

2227
type MockCommitmentManager = CommitmentManager<MockStateCommitter>;
2328

@@ -76,7 +81,7 @@ async fn create_mock_commitment_manager(
7681
.await
7782
}
7883

79-
async fn await_results<T>(receiver: &mut Receiver<T>, expected_n_results: usize) -> Vec<T> {
84+
async fn wait_for_n_results<T>(receiver: &mut Receiver<T>, expected_n_results: usize) {
8085
let max_n_retries = 3;
8186
let mut n_retries = 0;
8287
while get_number_of_tasks_in_receiver(receiver) < expected_n_results {
@@ -89,6 +94,10 @@ async fn await_results<T>(receiver: &mut Receiver<T>, expected_n_results: usize)
8994
);
9095
}
9196
}
97+
}
98+
99+
async fn await_results<T>(receiver: &mut Receiver<T>, expected_n_results: usize) -> Vec<T> {
100+
wait_for_n_results(receiver, expected_n_results).await;
92101
let mut results = Vec::new();
93102
while let Ok(result) = receiver.try_recv() {
94103
results.push(result);
@@ -210,6 +219,19 @@ async fn test_add_commitment_task(mut mock_dependencies: MockDependencies) {
210219
assert_eq!(get_number_of_tasks_in_sender(&commitment_manager.tasks_sender), 1,);
211220
}
212221

222+
#[rstest]
223+
#[tokio::test]
224+
async fn test_add_revert_task_wrong_height(mut mock_dependencies: MockDependencies) {
225+
add_initial_heights(&mut mock_dependencies);
226+
227+
let mut commitment_manager = create_mock_commitment_manager(mock_dependencies).await;
228+
229+
// Verify adding a revert task at the wrong height results in an error.
230+
let err =
231+
commitment_manager.add_revert_task(INITIAL_HEIGHT, test_state_diff()).await.unwrap_err();
232+
assert_matches!(err, CommitmentManagerError::WrongRevertTaskHeight { expected, actual, .. } if expected == LATEST_BLOCK_IN_STORAGE && actual == INITIAL_HEIGHT);
233+
}
234+
213235
#[rstest]
214236
#[tokio::test]
215237
#[should_panic(expected = "The channel is full. channel size: 1.")]
@@ -280,3 +302,59 @@ async fn test_get_commitment_results(mut mock_dependencies: MockDependencies) {
280302
assert_eq!(first_result.height, INITIAL_HEIGHT,);
281303
assert_eq!(second_result.height, INITIAL_HEIGHT.next().unwrap(),);
282304
}
305+
306+
/// Adds two commitments and a revert task to the last commit and inserts the results into the
307+
/// channel. Returns the resulted height.
308+
async fn add_commitments_and_revert_tasks(
309+
commitment_manager: &mut MockCommitmentManager,
310+
mut height: BlockNumber,
311+
) -> BlockNumber {
312+
for _ in 0..2 {
313+
commitment_manager
314+
.add_commitment_task(height, test_state_diff(), Some(StateDiffCommitment::default()))
315+
.await
316+
.unwrap();
317+
height = height.next().unwrap();
318+
}
319+
height = height.prev().unwrap();
320+
commitment_manager.add_revert_task(height, test_state_diff()).await.unwrap();
321+
322+
for _ in 0..3 {
323+
commitment_manager.state_committer.pop_task_and_insert_result().await;
324+
}
325+
height
326+
}
327+
328+
#[rstest]
329+
#[tokio::test]
330+
async fn test_wait_for_revert(mut mock_dependencies: MockDependencies) {
331+
add_initial_heights(&mut mock_dependencies);
332+
mock_dependencies.batcher_config.commitment_manager_config = CommitmentManagerConfig {
333+
tasks_channel_size: 5,
334+
results_channel_size: 5,
335+
wait_for_tasks_channel: false,
336+
};
337+
let mut commitment_manager = create_mock_commitment_manager(mock_dependencies).await;
338+
339+
let height = add_commitments_and_revert_tasks(&mut commitment_manager, INITIAL_HEIGHT).await;
340+
let (commitment_results, revert_result) = commitment_manager.wait_for_revert_result().await;
341+
assert_eq!(commitment_results.len(), 2);
342+
assert_eq!(revert_result.height, height);
343+
}
344+
345+
#[rstest]
346+
#[tokio::test]
347+
#[should_panic(expected = "Got revert output")]
348+
async fn test_revert_result_at_getting_commitments(mut mock_dependencies: MockDependencies) {
349+
add_initial_heights(&mut mock_dependencies);
350+
mock_dependencies.batcher_config.commitment_manager_config = CommitmentManagerConfig {
351+
tasks_channel_size: 5,
352+
results_channel_size: 5,
353+
wait_for_tasks_channel: false,
354+
};
355+
let mut commitment_manager = create_mock_commitment_manager(mock_dependencies).await;
356+
357+
add_commitments_and_revert_tasks(&mut commitment_manager, INITIAL_HEIGHT).await;
358+
wait_for_n_results(&mut commitment_manager.results_receiver, 3).await;
359+
commitment_manager.get_commitment_results().await;
360+
}

crates/apollo_batcher/src/test_utils.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::sync::Arc;
55
use apollo_batcher_config::config::{BatcherConfig, FirstBlockWithPartialBlockHash};
66
use apollo_batcher_types::batcher_types::{ProposalId, ProposeBlockInput};
77
use apollo_class_manager_types::{EmptyClassManagerClient, SharedClassManagerClient};
8-
use apollo_committer_types::committer_types::CommitBlockResponse;
8+
use apollo_committer_types::committer_types::{CommitBlockResponse, RevertBlockResponse};
99
use apollo_committer_types::communication::{MockCommitterClient, SharedCommitterClient};
1010
use apollo_l1_provider_types::MockL1ProviderClient;
1111
use apollo_mempool_types::communication::MockMempoolClient;
@@ -46,6 +46,7 @@ use crate::commitment_manager::types::{
4646
CommitmentTaskOutput,
4747
CommitterTaskInput,
4848
CommitterTaskOutput,
49+
RevertTaskOutput,
4950
};
5051
use crate::pre_confirmed_block_writer::{
5152
MockPreconfirmedBlockWriterFactoryTrait,
@@ -345,10 +346,20 @@ impl MockStateCommitter {
345346
) {
346347
while mock_task_receiver.recv().await.is_some() {
347348
let task = tasks_receiver.try_recv().unwrap();
348-
let result = CommitterTaskOutput::Commit(CommitmentTaskOutput {
349-
response: CommitBlockResponse { state_root: GlobalRoot::default() },
350-
height: task.height(),
351-
});
349+
let result = match task {
350+
CommitterTaskInput::Commit(commit_request) => {
351+
CommitterTaskOutput::Commit(CommitmentTaskOutput {
352+
response: CommitBlockResponse { state_root: GlobalRoot::default() },
353+
height: commit_request.height,
354+
})
355+
}
356+
CommitterTaskInput::Revert(revert_request) => {
357+
CommitterTaskOutput::Revert(RevertTaskOutput {
358+
response: RevertBlockResponse::RevertedTo(GlobalRoot::default()),
359+
height: revert_request.height,
360+
})
361+
}
362+
};
352363
results_sender.try_send(result).unwrap();
353364
}
354365
}

0 commit comments

Comments
 (0)