1
+ {-# LANGUAGE NumericUnderscores #-}
1
2
module Test.Cardano.Db.Mock.Unit.Alonzo.Stake (
2
3
-- stake addresses
3
4
registrationTx ,
@@ -24,7 +25,7 @@ import qualified Cardano.Mock.Forging.Tx.Alonzo as Alonzo
24
25
import Cardano.Mock.Forging.Tx.Alonzo.Scenarios (delegateAndSendBlocks )
25
26
import Cardano.Mock.Forging.Types (StakeIndex (.. ), UTxOIndex (.. ))
26
27
import Control.Concurrent.Class.MonadSTM.Strict (MonadSTM (atomically ))
27
- import Control.Monad (forM_ , replicateM_ , void )
28
+ import Control.Monad (forM_ , void )
28
29
import Data.Text (Text )
29
30
import Ouroboros.Network.Block (blockSlot )
30
31
import Test.Cardano.Db.Mock.Config (alonzoConfigDir , startDBSync , withFullConfig , withFullConfigAndDropDB )
@@ -33,7 +34,6 @@ import Test.Cardano.Db.Mock.UnifiedApi (
33
34
fillUntilNextEpoch ,
34
35
forgeAndSubmitBlocks ,
35
36
forgeNextFindLeaderAndSubmit ,
36
- forgeNextSkipSlotsFindLeaderAndSubmit ,
37
37
getAlonzoLedgerState ,
38
38
withAlonzoFindLeaderAndSubmit ,
39
39
withAlonzoFindLeaderAndSubmitTx ,
@@ -215,126 +215,130 @@ stakeDistGenesis :: IOManager -> [(Text, Text)] -> Assertion
215
215
stakeDistGenesis =
216
216
withFullConfigAndDropDB alonzoConfigDir testLabel $ \ interpreter mockServer dbSync -> do
217
217
startDBSync dbSync
218
- a <- fillUntilNextEpoch interpreter mockServer
219
- assertBlockNoBackoff dbSync (fromIntegral $ length a)
220
- -- There are 5 delegations in genesis
221
- assertEpochStake dbSync 5
218
+ blks <- fillUntilNextEpoch interpreter mockServer
219
+ assertBlockNoBackoff dbSync (fromIntegral $ length blks)
220
+ -- There are 10 delegations in genesis
221
+ assertEpochStakeEpoch dbSync 1 5
222
+ assertEpochStakeEpoch dbSync 2 5
223
+
222
224
where
223
225
testLabel = " stakeDistGenesis-alonzo"
224
226
225
227
delegations2000 :: IOManager -> [(Text , Text )] -> Assertion
226
228
delegations2000 =
227
- withFullConfig alonzoConfigDir testLabel $ \ interpreter mockServer dbSync -> do
229
+ withFullConfigAndDropDB alonzoConfigDir testLabel $ \ interpreter mockServer dbSync -> do
228
230
startDBSync dbSync
229
- a <- delegateAndSendBlocks 1995 interpreter
230
- forM_ a $ atomically . addBlock mockServer
231
- b <- fillUntilNextEpoch interpreter mockServer
232
- c <- forgeAndSubmitBlocks interpreter mockServer 10
233
-
234
- assertBlockNoBackoff dbSync (fromIntegral $ length a + length b + length c)
235
- -- There are exactly 2000 entries on the second epoch, 5 from genesis and 1995 manually added
231
+ blks <- delegateAndSendBlocks 1995 interpreter
232
+ forM_ blks (atomically . addBlock mockServer)
233
+ -- Fill the rest of the epoch
234
+ epoch <- fillUntilNextEpoch interpreter mockServer
235
+ -- Wait for them to sync
236
+ assertBlockNoBackoff dbSync (length blks + length epoch)
237
+ assertEpochStakeEpoch dbSync 1 5
238
+ -- Add some more blocks
239
+ blks' <- forgeAndSubmitBlocks interpreter mockServer 10
240
+ -- Wait for it to sync
241
+ assertBlockNoBackoff dbSync (length blks + length epoch + length blks')
236
242
assertEpochStakeEpoch dbSync 2 2000
237
-
243
+ -- Forge another block
238
244
void $ forgeNextFindLeaderAndSubmit interpreter mockServer []
239
- assertBlockNoBackoff dbSync (fromIntegral $ length a + length b + length c + 1 )
245
+ -- Wait for it to sync
246
+ assertBlockNoBackoff dbSync (length blks + length epoch + length blks' + 1 )
247
+ -- There are still 2000 entries
240
248
assertEpochStakeEpoch dbSync 2 2000
241
249
where
242
250
testLabel = " delegations2000-alonzo"
243
251
244
252
delegations2001 :: IOManager -> [(Text , Text )] -> Assertion
245
253
delegations2001 =
246
- withFullConfig alonzoConfigDir testLabel $ \ interpreter mockServer dbSync -> do
254
+ withFullConfigAndDropDB alonzoConfigDir testLabel $ \ interpreter mockServer dbSync -> do
247
255
startDBSync dbSync
248
- a <- delegateAndSendBlocks 1996 interpreter
249
- forM_ a $ atomically . addBlock mockServer
250
- b <- fillUntilNextEpoch interpreter mockServer
251
- c <- forgeAndSubmitBlocks interpreter mockServer 9
252
-
253
- assertBlockNoBackoff dbSync (fromIntegral $ length a + length b + length c)
254
- assertEpochStakeEpoch dbSync 2 0
256
+ -- We want exactly 2001 delegations, 5 from genesis and 1996 manually added
257
+ blks <- delegateAndSendBlocks 1996 interpreter
258
+ forM_ blks (atomically . addBlock mockServer)
259
+ -- Fill the rest of the epoch
260
+ epoch <- fillUntilNextEpoch interpreter mockServer
261
+ -- Add some more blocks
262
+ blks' <- forgeAndSubmitBlocks interpreter mockServer 9
263
+ -- Wait for it to sync
264
+ assertBlockNoBackoff dbSync (length blks + length epoch + length blks')
265
+ assertEpochStakeEpoch dbSync 1 5
266
+ -- The next 2000 entries is inserted on the next block
255
267
void $ forgeNextFindLeaderAndSubmit interpreter mockServer []
256
- assertBlockNoBackoff dbSync (fromIntegral $ length a + length b + length c + 1 )
257
- assertEpochStakeEpoch dbSync 2 2000
258
- -- The remaining entry is inserted on the next block.
268
+ assertBlockNoBackoff dbSync (length blks + length epoch + length blks' + 1 )
269
+ assertEpochStakeEpoch dbSync 2 2001
270
+ -- The remaining entry is inserted on the next block
259
271
void $ forgeNextFindLeaderAndSubmit interpreter mockServer []
260
- assertBlockNoBackoff dbSync (fromIntegral $ length a + length b + length c + 2 )
272
+ assertBlockNoBackoff dbSync (length blks + length epoch + length blks' + 2 )
261
273
assertEpochStakeEpoch dbSync 2 2001
274
+
262
275
where
263
276
testLabel = " delegations2001-alonzo"
264
277
265
278
delegations8000 :: IOManager -> [(Text , Text )] -> Assertion
266
279
delegations8000 =
267
- withFullConfig alonzoConfigDir testLabel $ \ interpreter mockServer dbSync -> do
280
+ withFullConfigAndDropDB alonzoConfigDir testLabel $ \ interpreter mockServer dbSync -> do
268
281
startDBSync dbSync
269
- a <- delegateAndSendBlocks 7995 interpreter
270
- forM_ a $ atomically . addBlock mockServer
271
- b <- fillEpochs interpreter mockServer 2
272
- c <- forgeAndSubmitBlocks interpreter mockServer 10
273
-
274
- assertBlockNoBackoff dbSync (fromIntegral $ length a + length b + length c)
275
- assertEpochStakeEpoch dbSync 3 2000
276
-
277
- void $ forgeNextFindLeaderAndSubmit interpreter mockServer []
278
- assertEpochStakeEpoch dbSync 3 4000
279
-
280
- void $ forgeNextFindLeaderAndSubmit interpreter mockServer []
281
- assertEpochStakeEpoch dbSync 3 6000
282
-
283
- void $ forgeNextFindLeaderAndSubmit interpreter mockServer []
284
- assertEpochStakeEpoch dbSync 3 8000
285
-
286
- void $ forgeNextFindLeaderAndSubmit interpreter mockServer []
287
- assertEpochStakeEpoch dbSync 3 8000
282
+ -- We want exactly 8000 delegations, 5 from genesis and 7995 manually added
283
+ blks <- delegateAndSendBlocks 7995 interpreter
284
+ forM_ blks (atomically . addBlock mockServer)
285
+ -- Fill the rest of the epoch
286
+ epoch <- fillEpochs interpreter mockServer 2
287
+ -- Add some more blocks
288
+ blks' <- forgeAndSubmitBlocks interpreter mockServer 10
289
+ -- Wait for it to sync
290
+ assertBlockNoBackoff dbSync (length blks + length epoch + length blks')
291
+ assertEpochStakeEpoch dbSync 1 5
292
+ assertEpochStakeEpoch dbSync 2 8000
288
293
where
289
294
testLabel = " delegations8000-alonzo"
290
295
291
296
delegationsMany :: IOManager -> [(Text , Text )] -> Assertion
292
297
delegationsMany =
293
- withFullConfig alonzoConfigDir testLabel $ \ interpreter mockServer dbSync -> do
298
+ withFullConfigAndDropDB alonzoConfigDir testLabel $ \ interpreter mockServer dbSync -> do
294
299
startDBSync dbSync
295
- a <- delegateAndSendBlocks 40000 interpreter
296
- forM_ a $ atomically . addBlock mockServer
297
- b <- fillEpochs interpreter mockServer 4
298
- c <- forgeAndSubmitBlocks interpreter mockServer 10
299
-
300
- -- too long. We cannot use default delays
301
- assertBlockNoBackoffTimes (repeat 10 ) dbSync (fromIntegral $ length a + length b + length c)
302
- -- The slice size here is
303
- -- 1 + div (delegationsLen * 5) expectedBlocks = 2001
304
- -- instead of 2000, because there are many delegations
305
- assertEpochStakeEpoch dbSync 7 2001
306
-
307
- void $ forgeNextFindLeaderAndSubmit interpreter mockServer []
308
- assertEpochStakeEpoch dbSync 7 4002
309
-
310
- void $ forgeNextFindLeaderAndSubmit interpreter mockServer []
311
- assertEpochStakeEpoch dbSync 7 6003
300
+ -- Forge many delegations
301
+ blks <- delegateAndSendBlocks 40_000 interpreter
302
+ forM_ blks (atomically . addBlock mockServer)
303
+ -- Fill some epochs
304
+ epochs <- fillEpochs interpreter mockServer 4
305
+ -- Add some more blocks
306
+ blks' <- forgeAndSubmitBlocks interpreter mockServer 10
307
+ -- We can't use default delays because this takes too long
308
+ assertBlockNoBackoffTimes
309
+ (repeat 10 )
310
+ dbSync
311
+ (length blks + length epochs + length blks')
312
+ assertEpochStakeEpoch dbSync 6 40_005
313
+ assertEpochStakeEpoch dbSync 7 40_005
312
314
where
313
315
testLabel = " delegationsMany-alonzo"
314
316
315
317
delegationsManyNotDense :: IOManager -> [(Text , Text )] -> Assertion
316
318
delegationsManyNotDense =
317
- withFullConfig alonzoConfigDir testLabel $ \ interpreter mockServer dbSync -> do
319
+ withFullConfigAndDropDB alonzoConfigDir testLabel $ \ interpreter mockServer dbSync -> do
318
320
startDBSync dbSync
319
- a <- delegateAndSendBlocks 40000 interpreter
320
- forM_ a $ atomically . addBlock mockServer
321
- b <- fillEpochs interpreter mockServer 4
322
- c <- forgeAndSubmitBlocks interpreter mockServer 10
323
-
324
- -- too long. We cannot use default delays
325
- assertBlockNoBackoffTimes (repeat 10 ) dbSync (fromIntegral $ length a + length b + length c)
326
- -- The slice size here is
327
- -- 1 + div (delegationsLen * 5) expectedBlocks = 2001
328
- -- instead of 2000, because there are many delegations
329
- assertEpochStakeEpoch dbSync 7 2001
330
-
331
- -- Blocks come on average every 5 slots. If we skip 15 slots before each block,
332
- -- we are expected to get only 1/4 of the expected blocks. The adjusted slices
333
- -- should still be long enough to cover everything.
334
- replicateM_ 40 $
335
- forgeNextSkipSlotsFindLeaderAndSubmit interpreter mockServer 15 []
336
-
337
- -- Even if the chain is sparse, all distributions are inserted.
338
- assertEpochStakeEpoch dbSync 7 40005
321
+ -- Forge many delegations
322
+ blks <- delegateAndSendBlocks 40_000 interpreter
323
+ forM_ blks (atomically . addBlock mockServer)
324
+ -- Fill some epochs
325
+ epochs <- fillEpochs interpreter mockServer 4
326
+ -- Add some more blocks
327
+ blks' <- forgeAndSubmitBlocks interpreter mockServer 10
328
+ -- We can't use default delays because this takes too long
329
+ assertBlockNoBackoffTimes
330
+ (repeat 10 )
331
+ dbSync
332
+ (length blks + length epochs + length blks')
333
+ -- check the stake distribution for each epoch
334
+ assertEpochStakeEpoch dbSync 1 5
335
+ assertEpochStakeEpoch dbSync 2 12_505
336
+ assertEpochStakeEpoch dbSync 3 40_005
337
+ assertEpochStakeEpoch dbSync 4 40_005
338
+ assertEpochStakeEpoch dbSync 5 40_005
339
+ assertEpochStakeEpoch dbSync 6 40_005
340
+ assertEpochStakeEpoch dbSync 7 40_005
341
+ -- check the sum of stake distribution for all epochs
342
+ assertEpochStake dbSync 212_535
339
343
where
340
344
testLabel = " delegationsManyNotDense-alonzo"
0 commit comments