@@ -783,7 +783,7 @@ mod tests {
783783 transactions : Vec < Transaction > ,
784784 finalized : Header ,
785785 latest : Header ,
786- ) -> ( L1Watcher < MockProvider > , mpsc:: Receiver < Arc < L1Notification > > ) {
786+ ) -> ( L1Watcher < MockProvider > , mpsc:: Receiver < Arc < L1Notification > > , L1WatcherHandle ) {
787787 let provider_blocks =
788788 provider_blocks. into_iter ( ) . map ( |h| Block { header : h, ..Default :: default ( ) } ) ;
789789 let finalized = Block { header : finalized, ..Default :: default ( ) } ;
@@ -797,7 +797,9 @@ mod tests {
797797 ) ;
798798
799799 let ( tx, rx) = mpsc:: channel ( LOG_QUERY_BLOCK_RANGE as usize ) ;
800- let ( _command_tx, command_rx) = mpsc:: unbounded_channel ( ) ;
800+ let ( command_tx, command_rx) = mpsc:: unbounded_channel ( ) ;
801+ let handle = L1WatcherHandle :: new ( command_tx) ;
802+
801803 (
802804 L1Watcher {
803805 execution_provider : provider,
@@ -812,6 +814,7 @@ mod tests {
812814 log_query_block_range : LOG_QUERY_BLOCK_RANGE ,
813815 } ,
814816 rx,
817+ handle,
815818 )
816819 }
817820
@@ -821,7 +824,7 @@ mod tests {
821824 let ( finalized, latest, chain) = chain ( 21 ) ;
822825 let unfinalized_blocks = chain[ 1 ..11 ] . to_vec ( ) ;
823826
824- let ( watcher, _) = l1_watcher (
827+ let ( watcher, _, _ ) = l1_watcher (
825828 unfinalized_blocks,
826829 chain. clone ( ) ,
827830 vec ! [ ] ,
@@ -846,7 +849,7 @@ mod tests {
846849 let mut provider_blocks = chain_from ( & chain[ 10 ] , 10 ) ;
847850 let latest = provider_blocks[ 9 ] . clone ( ) ;
848851
849- let ( watcher, _) = l1_watcher (
852+ let ( watcher, _, _ ) = l1_watcher (
850853 unfinalized_blocks,
851854 provider_blocks. clone ( ) ,
852855 vec ! [ ] ,
@@ -869,7 +872,7 @@ mod tests {
869872 async fn test_should_handle_finalized_with_empty_state ( ) -> eyre:: Result < ( ) > {
870873 // Given
871874 let ( finalized, latest, _) = chain ( 2 ) ;
872- let ( mut watcher, _rx) = l1_watcher ( vec ! [ ] , vec ! [ ] , vec ! [ ] , finalized. clone ( ) , latest) ;
875+ let ( mut watcher, _rx, _ ) = l1_watcher ( vec ! [ ] , vec ! [ ] , vec ! [ ] , finalized. clone ( ) , latest) ;
873876
874877 // When
875878 watcher. handle_finalized_block ( & finalized) . await ?;
@@ -885,7 +888,7 @@ mod tests {
885888 // Given
886889 let ( _, latest, chain) = chain ( 10 ) ;
887890 let finalized = chain[ 5 ] . clone ( ) ;
888- let ( mut watcher, _rx) = l1_watcher ( chain, vec ! [ ] , vec ! [ ] , finalized. clone ( ) , latest) ;
891+ let ( mut watcher, _rx, _ ) = l1_watcher ( chain, vec ! [ ] , vec ! [ ] , finalized. clone ( ) , latest) ;
889892
890893 // When
891894 watcher. handle_finalized_block ( & finalized) . await ?;
@@ -901,7 +904,7 @@ mod tests {
901904 // Given
902905 let ( _, latest, chain) = chain ( 10 ) ;
903906 let finalized = latest. clone ( ) ;
904- let ( mut watcher, _rx) = l1_watcher ( chain, vec ! [ ] , vec ! [ ] , finalized. clone ( ) , latest) ;
907+ let ( mut watcher, _rx, _ ) = l1_watcher ( chain, vec ! [ ] , vec ! [ ] , finalized. clone ( ) , latest) ;
905908
906909 // When
907910 watcher. handle_finalized_block ( & finalized) . await ?;
@@ -916,7 +919,7 @@ mod tests {
916919 async fn test_should_match_unfinalized_tail ( ) -> eyre:: Result < ( ) > {
917920 // Given
918921 let ( finalized, latest, chain) = chain ( 10 ) ;
919- let ( mut watcher, _) = l1_watcher ( chain, vec ! [ ] , vec ! [ ] , finalized. clone ( ) , latest. clone ( ) ) ;
922+ let ( mut watcher, _, _ ) = l1_watcher ( chain, vec ! [ ] , vec ! [ ] , finalized. clone ( ) , latest. clone ( ) ) ;
920923
921924 // When
922925 watcher. handle_latest_block ( & finalized, & latest) . await ?;
@@ -933,7 +936,7 @@ mod tests {
933936 // Given
934937 let ( finalized, latest, chain) = chain ( 10 ) ;
935938 let unfinalized_chain = chain[ ..9 ] . to_vec ( ) ;
936- let ( mut watcher, _rx) =
939+ let ( mut watcher, _rx, _ ) =
937940 l1_watcher ( unfinalized_chain, vec ! [ ] , vec ! [ ] , finalized. clone ( ) , latest. clone ( ) ) ;
938941
939942 assert_eq ! ( watcher. unfinalized_blocks. len( ) , 9 ) ;
@@ -953,7 +956,7 @@ mod tests {
953956 // Given
954957 let ( finalized, latest, chain) = chain ( 10 ) ;
955958 let unfinalized_chain = chain[ ..5 ] . to_vec ( ) ;
956- let ( mut watcher, mut receiver) =
959+ let ( mut watcher, mut receiver, _ ) =
957960 l1_watcher ( unfinalized_chain, chain, vec ! [ ] , finalized. clone ( ) , latest. clone ( ) ) ;
958961
959962 // When
@@ -974,7 +977,7 @@ mod tests {
974977 let ( finalized, _, chain) = chain ( 10 ) ;
975978 let reorged = chain_from ( & chain[ 5 ] , 10 ) ;
976979 let latest = reorged[ 9 ] . clone ( ) ;
977- let ( mut watcher, mut receiver) =
980+ let ( mut watcher, mut receiver, _ ) =
978981 l1_watcher ( chain. clone ( ) , reorged, vec ! [ ] , finalized. clone ( ) , latest. clone ( ) ) ;
979982
980983 // When
@@ -997,7 +1000,7 @@ mod tests {
9971000 async fn test_should_handle_l1_messages ( ) -> eyre:: Result < ( ) > {
9981001 // Given
9991002 let ( finalized, latest, chain) = chain ( 10 ) ;
1000- let ( watcher, _) = l1_watcher ( chain, vec ! [ ] , vec ! [ ] , finalized. clone ( ) , latest. clone ( ) ) ;
1003+ let ( watcher, _, _ ) = l1_watcher ( chain, vec ! [ ] , vec ! [ ] , finalized. clone ( ) , latest. clone ( ) ) ;
10011004
10021005 // build test logs.
10031006 let mut logs = ( 0 ..10 ) . map ( |_| random ! ( Log ) ) . collect :: < Vec < _ > > ( ) ;
@@ -1035,7 +1038,7 @@ mod tests {
10351038 effective_gas_price : None ,
10361039 } ;
10371040
1038- let ( watcher, _) =
1041+ let ( watcher, _, _ ) =
10391042 l1_watcher ( chain, vec ! [ ] , vec ! [ tx. clone( ) ] , finalized. clone ( ) , latest. clone ( ) ) ;
10401043
10411044 // build test logs.
@@ -1064,7 +1067,7 @@ mod tests {
10641067 async fn test_should_handle_finalize_commits ( ) -> eyre:: Result < ( ) > {
10651068 // Given
10661069 let ( finalized, latest, chain) = chain ( 10 ) ;
1067- let ( watcher, _) = l1_watcher ( chain, vec ! [ ] , vec ! [ ] , finalized. clone ( ) , latest. clone ( ) ) ;
1070+ let ( watcher, _, _ ) = l1_watcher ( chain, vec ! [ ] , vec ! [ ] , finalized. clone ( ) , latest. clone ( ) ) ;
10681071
10691072 // build test logs.
10701073 let mut logs = ( 0 ..10 ) . map ( |_| random ! ( Log ) ) . collect :: < Vec < _ > > ( ) ;
@@ -1085,4 +1088,37 @@ mod tests {
10851088
10861089 Ok ( ( ) )
10871090 }
1088- }
1091+
1092+ #[ tokio:: test]
1093+ async fn test_handle_state_reset ( ) -> eyre:: Result < ( ) > {
1094+ // Given: A watcher with state
1095+ let ( finalized, latest, chain) = chain ( 10 ) ;
1096+ let unfinalized_blocks = chain[ 1 ..5 ] . to_vec ( ) ;
1097+ let ( mut watcher, _rx, handle) =
1098+ l1_watcher ( unfinalized_blocks. clone ( ) , chain, vec ! [ ] , finalized, latest) ;
1099+
1100+ watcher. current_block_number = unfinalized_blocks. last ( ) . unwrap ( ) . number ;
1101+ watcher. is_synced = true ;
1102+ assert_eq ! ( watcher. unfinalized_blocks. len( ) , 4 ) ;
1103+
1104+ let join = tokio:: spawn ( async move {
1105+ // When: Reset to block 2
1106+ let ( new_tx, _new_rx) = mpsc:: channel ( LOG_QUERY_BLOCK_RANGE as usize ) ;
1107+ handle. reset_to_block ( 2 , new_tx) . await . expect ( "reset to block" ) ;
1108+
1109+ // close channel to end watcher run loop
1110+ drop ( handle) ;
1111+ } ) ;
1112+
1113+ watcher. run ( ) . await ;
1114+
1115+ join. await ?;
1116+
1117+ // Then: State should be reset
1118+ assert_eq ! ( watcher. current_block_number, 2 ) ;
1119+ assert_eq ! ( watcher. unfinalized_blocks. len( ) , 0 , "unfinalized blocks should be cleared" ) ;
1120+ assert ! ( !watcher. is_synced, "is_synced should be reset to false" ) ;
1121+
1122+ Ok ( ( ) )
1123+ }
1124+ }
0 commit comments