Skip to content

Commit 3094874

Browse files
committed
add tests for pool staments rollbacks
1 parent 22f9f48 commit 3094874

File tree

2 files changed

+58
-11
lines changed
  • cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway
  • cardano-db/src/Cardano/Db/Statement

2 files changed

+58
-11
lines changed

cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway/Rollback.hs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ import Cardano.Mock.Forging.Types (PoolIndex (..), StakeIndex (..), UTxOIndex (.
3434
import Cardano.Prelude
3535
import Data.Maybe.Strict (StrictMaybe (..))
3636
import Ouroboros.Network.Block (blockPoint)
37-
import Test.Cardano.Db.Mock.Config
38-
import Test.Cardano.Db.Mock.Examples (mockBlock0, mockBlock1, mockBlock2)
39-
import Test.Cardano.Db.Mock.UnifiedApi
40-
import Test.Cardano.Db.Mock.Validate (assertBlockNoBackoff, assertEqQuery, assertTxCount)
4137
import Test.Tasty.HUnit (Assertion (), assertBool, assertEqual)
4238
import Prelude (error, head, last)
39+
import Test.Cardano.Db.Mock.Config (claFullMode, withFullConfigDropDB, conwayConfigDir, startDBSync, stopDBSync, withCustomConfigDropDB, configPoolStats, queryDBSync, initCommandLineArgs)
40+
import Test.Cardano.Db.Mock.Examples
41+
import Test.Cardano.Db.Mock.Validate (assertBlockNoBackoff, assertTxCount, assertEqQuery)
42+
import Test.Cardano.Db.Mock.UnifiedApi
4343

4444
simpleRollback :: IOManager -> [(Text, Text)] -> Assertion
4545
simpleRollback =
@@ -391,10 +391,10 @@ poolStatBasicTest =
391391
void $ forgeAndSubmitBlocks interpreter mockServer 200
392392
assertBlockNoBackoff dbSync 201
393393

394-
poolStatCount <- queryDBSync dbSync Db.queryPoolStatCount
394+
poolStatCount <- queryDBSync dbSync DB.queryPoolStatCount
395395

396396
-- Verify pool stats are created and no duplicates exist
397-
duplicateCount <- queryDBSync dbSync Db.queryPoolStatDuplicates
397+
duplicateCount <- queryDBSync dbSync DB.queryPoolStatDuplicates
398398
assertEqual "Should have no duplicate pool stats" 0 duplicateCount
399399
assertBool "Should have some pool stats" (poolStatCount > 0)
400400
where
@@ -429,7 +429,7 @@ poolStatRollbackNoDuplicates =
429429
assertBlockNoBackoff dbSync 351 -- Should stay same due to rollbackExpand commentComment on line R349ResolvedCode has comments. Press enter to view.
430430

431431
-- The main test: no duplicates after rollback + re-sync
432-
duplicateCount <- queryDBSync dbSync Db.queryPoolStatDuplicates
432+
duplicateCount <- queryDBSync dbSync DB.queryPoolStatDuplicates
433433
assertEqual "Should have no duplicate pool stats after rollback" 0 duplicateCount
434434
where
435435
args = initCommandLineArgs {claFullMode = False}
@@ -451,15 +451,15 @@ poolStatRollbackGeneral =
451451
assertBlockNoBackoff dbSync totalBeforeRollback
452452

453453
-- Check initial pool stat count
454-
initialCount <- queryDBSync dbSync Db.queryPoolStatCount
454+
initialCount <- queryDBSync dbSync DB.queryPoolStatCount
455455

456456
-- Forge more blocks to create additional pool stats
457457
epochBlks2 <- fillEpochs interpreter mockServer 1
458458
let totalAfterEpoch = totalBeforeRollback + length epochBlks2
459459
assertBlockNoBackoff dbSync totalAfterEpoch
460460

461461
-- Verify pool stats increased
462-
afterCount <- queryDBSync dbSync Db.queryPoolStatCount
462+
afterCount <- queryDBSync dbSync DB.queryPoolStatCount
463463
assertBool "Pool stats should have increased" (afterCount > initialCount)
464464

465465
-- Rollback to previous point
@@ -470,13 +470,13 @@ poolStatRollbackGeneral =
470470
epochBlks3 <- fillEpochs interpreter mockServer 1
471471
let finalTotal = totalBeforeRollback + length epochBlks3 + 1
472472
assertBlockNoBackoff dbSync finalTotal
473-
finalCount <- queryDBSync dbSync Db.queryPoolStatCount
473+
finalCount <- queryDBSync dbSync DB.queryPoolStatCount
474474

475475
-- Verify count matches and no constraint violations occurred
476476
assertEqual "Pool stat count should match after rollback" afterCount finalCount
477477

478478
-- Also verify no duplicates
479-
duplicateCount <- queryDBSync dbSync Db.queryPoolStatDuplicates
479+
duplicateCount <- queryDBSync dbSync DB.queryPoolStatDuplicates
480480
assertEqual "Should have no duplicate pool stats" 0 duplicateCount
481481
where
482482
args = initCommandLineArgs {claFullMode = False}

cardano-db/src/Cardano/Db/Statement/Pool.hs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,53 @@ insertBulkPoolStat :: [SCP.PoolStat] -> DbM ()
208208
insertBulkPoolStat poolStats =
209209
runSession mkDbCallStack $ HsqlSes.statement poolStats insertBulkPoolStatStmt
210210

211+
--------------------------------------------------------------------------------
212+
queryPoolStatCountStmt :: HsqlStmt.Statement () Int64
213+
queryPoolStatCountStmt =
214+
HsqlStmt.Statement sql encoder decoder True
215+
where
216+
poolStatTable = tableName (Proxy @SCP.PoolStat)
217+
218+
sql =
219+
TextEnc.encodeUtf8 $
220+
Text.concat
221+
[ "SELECT COUNT(*)::bigint FROM "
222+
, poolStatTable
223+
]
224+
225+
encoder = mempty
226+
decoder = HsqlD.singleRow (HsqlD.column $ HsqlD.nonNullable HsqlD.int8)
227+
228+
queryPoolStatCount :: DbM Int64
229+
queryPoolStatCount =
230+
runSession mkDbCallStack $ HsqlSes.statement () queryPoolStatCountStmt
231+
232+
--------------------------------------------------------------------------------
233+
queryPoolStatDuplicatesStmt :: HsqlStmt.Statement () Int64
234+
queryPoolStatDuplicatesStmt =
235+
HsqlStmt.Statement sql encoder decoder True
236+
where
237+
poolStatTable = tableName (Proxy @SCP.PoolStat)
238+
239+
sql =
240+
TextEnc.encodeUtf8 $
241+
Text.concat
242+
[ "SELECT COUNT(*)::bigint FROM ("
243+
, " SELECT pool_hash_id, epoch_no"
244+
, " FROM "
245+
, poolStatTable
246+
, " GROUP BY pool_hash_id, epoch_no"
247+
, " HAVING COUNT(*) > 1"
248+
, ") AS duplicates"
249+
]
250+
251+
encoder = mempty
252+
decoder = HsqlD.singleRow (HsqlD.column $ HsqlD.nonNullable HsqlD.int8)
253+
254+
queryPoolStatDuplicates :: DbM Int64
255+
queryPoolStatDuplicates =
256+
runSession mkDbCallStack $ HsqlSes.statement () queryPoolStatDuplicatesStmt
257+
211258
--------------------------------------------------------------------------------
212259
-- PoolOwner
213260
--------------------------------------------------------------------------------

0 commit comments

Comments
 (0)