@@ -59,12 +59,13 @@ fn get_number_of_tasks_in_receiver<T>(receiver: &Receiver<T>) -> usize {
5959
6060async 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]
105110async 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+ }
0 commit comments