2626from cardano_node_tests .utils import configuration
2727from cardano_node_tests .utils import dbsync_queries
2828from cardano_node_tests .utils import helpers
29+ from cardano_node_tests .utils import logfiles
2930from cardano_node_tests .utils .versions import VERSIONS
3031
3132LOGGER = logging .getLogger (__name__ )
@@ -35,7 +36,7 @@ class TestLeadershipSchedule:
3536 """Tests for cardano-cli leadership-schedule."""
3637
3738 @allure .link (helpers .get_vcs_link ())
38- @pytest .mark .needs_dbsync
39+ @pytest .mark .dbsync
3940 @pytest .mark .parametrize ("for_epoch" , ("current" , "next" ))
4041 def test_pool_blocks (
4142 self ,
@@ -47,9 +48,12 @@ def test_pool_blocks(
4748
4849 * query leadership schedule for selected pool for current epoch or next epoch
4950 * wait for epoch that comes after the queried epoch
50- * get info about minted blocks in queried epoch for the selected pool
51- * compare leadership schedule with blocks that were actually minted
52- * compare db-sync records with ledger state dump
51+ * check in log files that the blocks were minted in expected slots
52+ * if db-sync is available:
53+
54+ - get info about minted blocks in queried epoch for the selected pool
55+ - compare leadership schedule with blocks that were actually minted
56+ - compare db-sync records with ledger state dump
5357 """
5458 # pylint: disable=unused-argument
5559 cluster , pool_name = cluster_use_pool
@@ -58,12 +62,18 @@ def test_pool_blocks(
5862 pool_rec = cluster_manager .cache .addrs_data [pool_name ]
5963 pool_id = cluster .g_stake_pool .get_stake_pool_id (pool_rec ["cold_key_pair" ].vkey_file )
6064
65+ state_dir = cluster_nodes .get_cluster_env ().state_dir
66+ pool_log_fname = f"{ pool_name .replace ('node-' , '' )} .stdout"
67+ pool_log = state_dir / pool_log_fname
68+ seek_offsets = {str (pool_log ): helpers .get_eof_offset (pool_log )}
69+ timestamp = time .time ()
70+
6171 if for_epoch == "current" :
62- # wait for beginning of an epoch
72+ # Wait for beginning of an epoch
6373 queried_epoch = cluster .wait_for_new_epoch (padding_seconds = 5 )
6474 else :
65- # wait for stable stake distribution for next epoch, that is last 300 slots of
66- # current epoch
75+ # Wait for stable stake distribution for next epoch, that is last 300 slots of
76+ # current epoch.
6777 clusterlib_utils .wait_for_epoch_interval (
6878 cluster_obj = cluster ,
6979 start = - int (300 * cluster .slot_length ),
@@ -72,55 +82,70 @@ def test_pool_blocks(
7282 )
7383 queried_epoch = cluster .g_query .get_epoch () + 1
7484
75- # query leadership schedule for selected pool
85+ # Query leadership schedule for selected pool
7686 leadership_schedule = cluster .g_query .get_leadership_schedule (
7787 vrf_skey_file = pool_rec ["vrf_key_pair" ].skey_file ,
7888 cold_vkey_file = pool_rec ["cold_key_pair" ].vkey_file ,
7989 for_next = for_epoch != "current" ,
8090 )
91+ slots_when_scheduled = {r .slot_no for r in leadership_schedule }
8192
82- # wait for epoch that comes after the queried epoch
83- cluster .wait_for_epoch (epoch_no = queried_epoch + 1 )
93+ expected_msgs = [
94+ (pool_log_fname , rf'TraceForgedBlock"\),\("slot",Number { s } ' )
95+ for s in slots_when_scheduled
96+ ]
8497
85- # get info about minted blocks in queried epoch for the selected pool
86- minted_blocks = list (
87- dbsync_queries .query_blocks (
88- pool_id_bech32 = pool_id , epoch_from = queried_epoch , epoch_to = queried_epoch
89- )
90- )
91- slots_when_minted = {r .slot_no for r in minted_blocks }
98+ # Wait for epoch that comes after the queried epoch
99+ cluster .wait_for_epoch (epoch_no = queried_epoch + 1 )
92100
93101 errors : tp .List [str ] = []
94102
95- # compare leadership schedule with blocks that were actually minted
96- slots_when_scheduled = {r .slot_no for r in leadership_schedule }
97-
98- difference_scheduled = slots_when_minted .difference (slots_when_scheduled )
99- if difference_scheduled :
100- errors .append (
101- f"Some blocks were minted in other slots than scheduled: { difference_scheduled } "
103+ log_msgs_errors = logfiles .check_msgs_presence_in_logs (
104+ regex_pairs = expected_msgs ,
105+ seek_offsets = seek_offsets ,
106+ state_dir = state_dir ,
107+ timestamp = timestamp ,
108+ )
109+ if len (log_msgs_errors ) > len (leadership_schedule ) // 2 :
110+ log_msgs_errors_joined = "\n " .join (log_msgs_errors )
111+ errors .append (f"Lot of slots missed: \n { log_msgs_errors_joined } " )
112+
113+ if configuration .HAS_DBSYNC :
114+ # Get info about minted blocks in queried epoch for the selected pool
115+ minted_blocks = list (
116+ dbsync_queries .query_blocks (
117+ pool_id_bech32 = pool_id , epoch_from = queried_epoch , epoch_to = queried_epoch
118+ )
102119 )
120+ slots_when_minted = {r .slot_no for r in minted_blocks }
103121
104- difference_minted = slots_when_scheduled .difference (slots_when_minted )
105- if len (difference_minted ) > len (leadership_schedule ) // 2 :
106- errors .append (f"Lot of slots missed: { difference_minted } " )
122+ # Compare leadership schedule with blocks that were actually minted
123+ difference_scheduled = slots_when_minted .difference (slots_when_scheduled )
124+ if difference_scheduled :
125+ errors .append (
126+ f"Some blocks were minted in other slots than scheduled: { difference_scheduled } "
127+ )
107128
108- # compare db-sync records with ledger state dump
109- ledger_state = clusterlib_utils .get_ledger_state (cluster_obj = cluster )
110- clusterlib_utils .save_ledger_state (
111- cluster_obj = cluster ,
112- state_name = temp_template ,
113- ledger_state = ledger_state ,
114- )
115- blocks_before : tp .Dict [str , int ] = ledger_state ["blocksBefore" ]
116- pool_id_dec = helpers .decode_bech32 (pool_id )
117- minted_blocks_ledger = blocks_before .get (pool_id_dec ) or 0
118- minted_blocks_db = len (slots_when_minted )
119- if minted_blocks_ledger != minted_blocks_db :
120- errors .append (
121- "Numbers of minted blocks reported by ledger state and db-sync don't match: "
122- f"{ minted_blocks_ledger } vs { minted_blocks_db } "
129+ difference_minted = slots_when_scheduled .difference (slots_when_minted )
130+ if len (difference_minted ) > len (leadership_schedule ) // 2 :
131+ errors .append (f"Lot of slots missed: { difference_minted } " )
132+
133+ # Compare db-sync records with ledger state dump
134+ ledger_state = clusterlib_utils .get_ledger_state (cluster_obj = cluster )
135+ clusterlib_utils .save_ledger_state (
136+ cluster_obj = cluster ,
137+ state_name = temp_template ,
138+ ledger_state = ledger_state ,
123139 )
140+ blocks_before : tp .Dict [str , int ] = ledger_state ["blocksBefore" ]
141+ pool_id_dec = helpers .decode_bech32 (pool_id )
142+ minted_blocks_ledger = blocks_before .get (pool_id_dec ) or 0
143+ minted_blocks_db = len (slots_when_minted )
144+ if minted_blocks_ledger != minted_blocks_db :
145+ errors .append (
146+ "Numbers of minted blocks reported by ledger state and db-sync don't match: "
147+ f"{ minted_blocks_ledger } vs { minted_blocks_db } "
148+ )
124149
125150 if errors :
126151 # Xfail if cardano-api GH-269 is still open
0 commit comments