@@ -17,7 +17,12 @@ use tokio::time::{sleep, timeout};
1717use crate :: batcher:: MockBatcherStorageReader ;
1818use crate :: commitment_manager:: commitment_manager_impl:: CommitmentManager ;
1919use 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
2227type 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+ }
0 commit comments