Skip to content

Commit 3737057

Browse files
committed
apollo_batcher: test fetch revert result
1 parent 2d834f1 commit 3737057

File tree

2 files changed

+93
-21
lines changed

2 files changed

+93
-21
lines changed

crates/apollo_batcher/src/commitment_manager/commitment_manager_test.rs

Lines changed: 72 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,13 @@ fn get_number_of_tasks_in_receiver<T>(receiver: &Receiver<T>) -> usize {
5959

6060
async fn create_mock_commitment_manager(
6161
mock_dependencies: MockDependencies,
62+
commitment_manager_config: Option<CommitmentManagerConfig>,
6263
) -> MockCommitmentManager {
63-
let commitment_manager_config = CommitmentManagerConfig {
64+
let commitment_manager_config = commitment_manager_config.unwrap_or(CommitmentManagerConfig {
6465
tasks_channel_size: 1,
6566
results_channel_size: 1,
6667
wait_for_tasks_channel: false,
67-
};
68+
});
6869
CommitmentManager::create_commitment_manager(
6970
&mock_dependencies.batcher_config,
7071
// TODO(Amos): Use commitment manager config in batcher config, once it's added.
@@ -75,7 +76,7 @@ async fn create_mock_commitment_manager(
7576
.await
7677
}
7778

78-
async fn await_results<T>(receiver: &mut Receiver<T>, expected_n_results: usize) -> Vec<T> {
79+
async fn wait_for_filling_channel<T>(receiver: &mut Receiver<T>, expected_n_results: usize) {
7980
let max_n_retries = 3;
8081
let mut n_retries = 0;
8182
while get_number_of_tasks_in_receiver(receiver) < expected_n_results {
@@ -88,6 +89,10 @@ async fn await_results<T>(receiver: &mut Receiver<T>, expected_n_results: usize)
8889
);
8990
}
9091
}
92+
}
93+
94+
async fn await_results<T>(receiver: &mut Receiver<T>, expected_n_results: usize) -> Vec<T> {
95+
wait_for_filling_channel(receiver, expected_n_results).await;
9196
let mut results = Vec::new();
9297
while let Ok(result) = receiver.try_recv() {
9398
results.push(result);
@@ -104,7 +109,7 @@ async fn await_results<T>(receiver: &mut Receiver<T>, expected_n_results: usize)
104109
#[tokio::test]
105110
async fn test_create_commitment_manager(mut mock_dependencies: MockDependencies) {
106111
add_initial_heights(&mut mock_dependencies);
107-
let commitment_manager = create_mock_commitment_manager(mock_dependencies).await;
112+
let commitment_manager = create_mock_commitment_manager(mock_dependencies, None).await;
108113

109114
assert_eq!(
110115
commitment_manager.get_commitment_task_offset(),
@@ -140,7 +145,7 @@ async fn test_create_commitment_manager_with_missing_tasks(
140145
.with(eq(global_root_height))
141146
.returning(|_| Ok(Some(test_state_diff())));
142147

143-
let mut commitment_manager = create_mock_commitment_manager(mock_dependencies).await;
148+
let mut commitment_manager = create_mock_commitment_manager(mock_dependencies, None).await;
144149

145150
assert_eq!(commitment_manager.get_commitment_task_offset(), INITIAL_HEIGHT,);
146151
assert_eq!(get_number_of_tasks_in_sender(&commitment_manager.tasks_sender), 1,);
@@ -157,7 +162,7 @@ async fn test_add_commitment_task(mut mock_dependencies: MockDependencies) {
157162
let state_diff = test_state_diff();
158163
let state_diff_commitment = Some(StateDiffCommitment::default());
159164

160-
let mut commitment_manager = create_mock_commitment_manager(mock_dependencies).await;
165+
let mut commitment_manager = create_mock_commitment_manager(mock_dependencies, None).await;
161166

162167
// Verify incorrect height results in error.
163168
let incorrect_height = INITIAL_HEIGHT.next().unwrap();
@@ -217,7 +222,7 @@ async fn test_add_commitment_task_full(mut mock_dependencies: MockDependencies)
217222
let state_diff = test_state_diff();
218223
let state_diff_commitment = Some(StateDiffCommitment::default());
219224

220-
let mut commitment_manager = create_mock_commitment_manager(mock_dependencies).await;
225+
let mut commitment_manager = create_mock_commitment_manager(mock_dependencies, None).await;
221226

222227
assert_eq!(
223228
commitment_manager.config.tasks_channel_size, 1,
@@ -251,14 +256,8 @@ async fn test_get_commitment_results(mut mock_dependencies: MockDependencies) {
251256
results_channel_size: 2,
252257
wait_for_tasks_channel: false,
253258
};
254-
let mut commitment_manager = MockCommitmentManager::create_commitment_manager(
255-
&mock_dependencies.batcher_config,
256-
// TODO(Amos): Use commitment manager config in batcher config, once it's added.
257-
&commitment_manager_config,
258-
&mock_dependencies.storage_reader,
259-
Arc::new(mock_dependencies.committer_client),
260-
)
261-
.await;
259+
let mut commitment_manager =
260+
create_mock_commitment_manager(mock_dependencies, Some(commitment_manager_config)).await;
262261

263262
// Verify the commitment manager doesn't wait if there are no results.
264263
let results = commitment_manager.get_commitment_results().await;
@@ -286,3 +285,61 @@ async fn test_get_commitment_results(mut mock_dependencies: MockDependencies) {
286285
assert_eq!(first_result.height, INITIAL_HEIGHT,);
287286
assert_eq!(second_result.height, INITIAL_HEIGHT.next().unwrap(),);
288287
}
288+
289+
/// Adds two commitments and a revert task to the last commit and inserts the results into the
290+
/// channel. Returns the resulted height.
291+
async fn add_commitments_and_revert_tasks(
292+
commitment_manager: &mut MockCommitmentManager,
293+
mut height: BlockNumber,
294+
) -> BlockNumber {
295+
for _ in 0..2 {
296+
commitment_manager
297+
.add_commitment_task(height, test_state_diff(), Some(StateDiffCommitment::default()))
298+
.await
299+
.unwrap();
300+
height = height.next().unwrap();
301+
}
302+
height = height.prev().unwrap();
303+
commitment_manager.add_revert_task(height, test_state_diff()).await.unwrap();
304+
305+
for _ in 0..3 {
306+
commitment_manager.state_committer.pop_task_and_insert_result().await;
307+
}
308+
height
309+
}
310+
311+
#[rstest]
312+
#[tokio::test]
313+
async fn test_wait_for_revert(mut mock_dependencies: MockDependencies) {
314+
add_initial_heights(&mut mock_dependencies);
315+
let commitment_manager_config = CommitmentManagerConfig {
316+
tasks_channel_size: 5,
317+
results_channel_size: 5,
318+
wait_for_tasks_channel: false,
319+
};
320+
let mut commitment_manager =
321+
create_mock_commitment_manager(mock_dependencies, Some(commitment_manager_config)).await;
322+
323+
let height = add_commitments_and_revert_tasks(&mut commitment_manager, INITIAL_HEIGHT).await;
324+
let (commitment_results, revert_result) = commitment_manager.wait_for_revert_result().await;
325+
assert_eq!(commitment_results.len(), 2);
326+
assert_eq!(revert_result.height, height);
327+
}
328+
329+
#[rstest]
330+
#[tokio::test]
331+
#[should_panic(expected = "Got revert output")]
332+
async fn test_revert_result_at_getting_commitments(mut mock_dependencies: MockDependencies) {
333+
add_initial_heights(&mut mock_dependencies);
334+
let commitment_manager_config = CommitmentManagerConfig {
335+
tasks_channel_size: 5,
336+
results_channel_size: 5,
337+
wait_for_tasks_channel: false,
338+
};
339+
let mut commitment_manager =
340+
create_mock_commitment_manager(mock_dependencies, Some(commitment_manager_config)).await;
341+
342+
add_commitments_and_revert_tasks(&mut commitment_manager, INITIAL_HEIGHT).await;
343+
wait_for_filling_channel(&mut commitment_manager.results_receiver, 3).await;
344+
commitment_manager.get_commitment_results().await;
345+
}

crates/apollo_batcher/src/test_utils.rs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,12 @@ 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;
9-
use apollo_committer_types::communication::{MockCommitterClient, SharedCommitterClient};
8+
use apollo_committer_types::committer_types::{CommitBlockResponse, RevertBlockResponse};
9+
use apollo_committer_types::communication::{
10+
CommitterRequest,
11+
MockCommitterClient,
12+
SharedCommitterClient,
13+
};
1014
use apollo_l1_provider_types::MockL1ProviderClient;
1115
use apollo_mempool_types::communication::MockMempoolClient;
1216
use apollo_mempool_types::mempool_types::CommitBlockArgs;
@@ -46,6 +50,7 @@ use crate::commitment_manager::types::{
4650
CommitmentTaskOutput,
4751
CommitterTaskInput,
4852
CommitterTaskOutput,
53+
RevertTaskOutput,
4954
};
5055
use crate::pre_confirmed_block_writer::{
5156
MockPreconfirmedBlockWriterFactoryTrait,
@@ -345,10 +350,20 @@ impl MockStateCommitter {
345350
) {
346351
while mock_task_receiver.recv().await.is_some() {
347352
let task = tasks_receiver.try_recv().unwrap();
348-
let result = CommitterTaskOutput::Commit(CommitmentTaskOutput {
349-
response: CommitBlockResponse { state_root: GlobalRoot::default() },
350-
height: task.0.height(),
351-
});
353+
let result = match task.0 {
354+
CommitterRequest::CommitBlock(commit_request) => {
355+
CommitterTaskOutput::Commit(CommitmentTaskOutput {
356+
response: CommitBlockResponse { state_root: GlobalRoot::default() },
357+
height: commit_request.height,
358+
})
359+
}
360+
CommitterRequest::RevertBlock(revert_request) => {
361+
CommitterTaskOutput::Revert(RevertTaskOutput {
362+
response: RevertBlockResponse::RevertedTo(GlobalRoot::default()),
363+
height: revert_request.height,
364+
})
365+
}
366+
};
352367
results_sender.try_send(result).unwrap();
353368
}
354369
}

0 commit comments

Comments
 (0)