@@ -138,3 +138,54 @@ func TestAPISyncMonitor_ContinuesWhenNoRows(t *testing.T) {
138
138
case <- time .After (1 * time .Second ):
139
139
}
140
140
}
141
+
142
+ func TestAPISyncMonitor_HandlesReorg (t * testing.T ) {
143
+ ctx , cancel := context .WithCancel (context .Background ())
144
+ defer cancel ()
145
+
146
+ dbpool , closeDB := testsetup .NewTestDBPool (ctx , t , database .Definition )
147
+ defer closeDB ()
148
+ db := database .New (dbpool )
149
+
150
+ // Set up initial block at a higher number
151
+ initialBlockNumber := int64 (100 )
152
+ setupTestData (ctx , t , dbpool , initialBlockNumber )
153
+
154
+ monitor := & shutterservice.SyncMonitor {
155
+ DBPool : dbpool ,
156
+ CheckInterval : 5 * time .Second ,
157
+ }
158
+
159
+ monitorCtx , cancelMonitor := context .WithCancel (ctx )
160
+ defer cancelMonitor ()
161
+
162
+ errCh := make (chan error , 1 )
163
+ go func () {
164
+ err := service .RunWithSighandler (monitorCtx , monitor )
165
+ if err != nil {
166
+ errCh <- err
167
+ }
168
+ }()
169
+
170
+ // Decrease the block number
171
+ decreasedBlockNumber := int64 (50 )
172
+ err := db .SetIdentityRegisteredEventSyncedUntil (ctx , database.SetIdentityRegisteredEventSyncedUntilParams {
173
+ BlockHash : []byte {0x01 , 0x02 , 0x03 },
174
+ BlockNumber : decreasedBlockNumber ,
175
+ })
176
+ assert .NilError (t , err )
177
+
178
+ time .Sleep (4 * time .Second )
179
+ cancelMonitor ()
180
+
181
+ select {
182
+ case err := <- errCh :
183
+ t .Fatalf ("expected monitor to continue without error, but got: %v" , err )
184
+ case <- time .After (1 * time .Second ):
185
+ }
186
+
187
+ // Verify the block number was updated to the latest value
188
+ syncedData , err := db .GetIdentityRegisteredEventsSyncedUntil (ctx )
189
+ assert .NilError (t , err )
190
+ assert .Equal (t , decreasedBlockNumber , syncedData .BlockNumber , "block number should be updated to the decreased value" )
191
+ }
0 commit comments