@@ -20,6 +20,9 @@ async fn test_processing_included_txs() {
2020 const TXS_TO_PROCESS : usize = 3 ;
2121
2222 let mut mock_adapter = MockAdapter :: new ( ) ;
23+ mock_adapter
24+ . expect_reprocess_txs_poll_rate ( )
25+ . returning ( || None ) ;
2326 mock_adapter
2427 . expect_estimated_block_time ( )
2528 . return_const ( Duration :: from_millis ( 400 ) ) ;
@@ -88,6 +91,9 @@ async fn test_failed_simulation() {
8891 const TXS_TO_PROCESS : usize = 3 ;
8992
9093 let mut mock_adapter = MockAdapter :: new ( ) ;
94+ mock_adapter
95+ . expect_reprocess_txs_poll_rate ( )
96+ . returning ( || None ) ;
9197 mock_adapter
9298 . expect_estimated_block_time ( )
9399 . return_const ( Duration :: from_millis ( 400 ) ) ;
@@ -125,6 +131,9 @@ async fn test_failed_estimation() {
125131 const TXS_TO_PROCESS : usize = 3 ;
126132
127133 let mut mock_adapter = MockAdapter :: new ( ) ;
134+ mock_adapter
135+ . expect_reprocess_txs_poll_rate ( )
136+ . returning ( || None ) ;
128137 mock_adapter
129138 . expect_estimated_block_time ( )
130139 . return_const ( Duration :: from_millis ( 400 ) ) ;
@@ -198,6 +207,9 @@ async fn test_channel_closed_before_any_tx() {
198207#[ tokio:: test]
199208async fn test_transaction_status_dropped ( ) {
200209 let mut mock_adapter = MockAdapter :: new ( ) ;
210+ mock_adapter
211+ . expect_reprocess_txs_poll_rate ( )
212+ . returning ( || None ) ;
201213 mock_adapter
202214 . expect_estimated_block_time ( )
203215 . return_const ( Duration :: from_millis ( 400 ) ) ;
@@ -249,6 +261,9 @@ async fn test_transaction_not_ready_for_resubmission() {
249261#[ tokio:: test]
250262async fn test_failed_submission_after_simulation_and_estimation ( ) {
251263 let mut mock_adapter = MockAdapter :: new ( ) ;
264+ mock_adapter
265+ . expect_reprocess_txs_poll_rate ( )
266+ . returning ( || None ) ;
252267 mock_adapter
253268 . expect_estimated_block_time ( )
254269 . return_const ( Duration :: from_millis ( 400 ) ) ;
@@ -283,6 +298,9 @@ async fn test_failed_submission_after_simulation_and_estimation() {
283298#[ tokio:: test]
284299async fn test_transaction_included_immediately ( ) {
285300 let mut mock_adapter = MockAdapter :: new ( ) ;
301+ mock_adapter
302+ . expect_reprocess_txs_poll_rate ( )
303+ . returning ( || None ) ;
286304 mock_adapter
287305 . expect_estimated_block_time ( )
288306 . return_const ( Duration :: from_millis ( 400 ) ) ;
@@ -307,6 +325,9 @@ async fn test_transaction_included_immediately() {
307325#[ tokio:: test]
308326async fn test_transaction_pending_then_included ( ) {
309327 let mut mock_adapter = MockAdapter :: new ( ) ;
328+ mock_adapter
329+ . expect_reprocess_txs_poll_rate ( )
330+ . returning ( || None ) ;
310331 mock_adapter
311332 . expect_estimated_block_time ( )
312333 . return_const ( Duration :: from_millis ( 400 ) ) ;
@@ -558,3 +579,68 @@ async fn test_reasonable_receipt_query_frequency() {
558579 queries_per_second_per_tx
559580 ) ;
560581}
582+
583+ #[ tokio:: test]
584+ async fn test_processing_reprocess_txs ( ) {
585+ let txs_to_process = 4 ;
586+ let ( payload_db, tx_db, _) = tmp_dbs ( ) ;
587+ let ( _sender, building_stage_receiver) = mpsc:: channel ( txs_to_process) ;
588+ let ( finality_stage_sender, _receiver) = mpsc:: channel ( txs_to_process) ;
589+ let txs_created = create_random_txs_and_store_them (
590+ txs_to_process,
591+ & payload_db,
592+ & tx_db,
593+ TransactionStatus :: PendingInclusion ,
594+ )
595+ . await ;
596+
597+ let mut mock_adapter = MockAdapter :: new ( ) ;
598+ mock_adapter
599+ . expect_estimated_block_time ( )
600+ . return_const ( Duration :: from_millis ( 400 ) ) ;
601+ mock_adapter
602+ . expect_tx_status ( )
603+ . returning ( |_| Ok ( TransactionStatus :: PendingInclusion ) ) ;
604+ mock_adapter
605+ . expect_tx_ready_for_resubmission ( )
606+ . returning ( |_| false ) ;
607+
608+ mock_adapter
609+ . expect_reprocess_txs_poll_rate ( )
610+ . return_const ( Some ( Duration :: from_millis ( 50 ) ) ) ;
611+ let mut txs_created_option = Some ( txs_created. clone ( ) ) ;
612+ mock_adapter. expect_get_reprocess_txs ( ) . returning ( move || {
613+ if let Some ( txs) = txs_created_option. take ( ) {
614+ Ok ( txs)
615+ } else {
616+ Ok ( Vec :: new ( ) )
617+ }
618+ } ) ;
619+
620+ let state = DispatcherState :: new (
621+ payload_db. clone ( ) ,
622+ tx_db. clone ( ) ,
623+ Arc :: new ( mock_adapter) ,
624+ DispatcherMetrics :: dummy_instance ( ) ,
625+ "test" . to_string ( ) ,
626+ ) ;
627+ let inclusion_stage = InclusionStage :: new (
628+ building_stage_receiver,
629+ finality_stage_sender,
630+ state,
631+ "test" . to_string ( ) ,
632+ ) ;
633+ let pool = inclusion_stage. pool . clone ( ) ;
634+
635+ let stage = tokio:: spawn ( async move { inclusion_stage. run ( ) . await } ) ;
636+ let _ = tokio:: select! {
637+ // this arm runs indefinitely
638+ _ = stage => {
639+ } ,
640+ // this arm is the timeout - increased to accommodate adaptive polling
641+ _ = sleep( Duration :: from_millis( 500 ) ) => {
642+ }
643+ } ;
644+
645+ assert ! ( are_all_txs_in_pool( txs_created. clone( ) , & pool) . await ) ;
646+ }
0 commit comments