Skip to content

Commit 3423716

Browse files
committed
feat(tests): add log file checks for block minting
- Updated test_pool_blocks to check for log messages indicating block minting. - Made db-sync optional for the test.
1 parent c31fb22 commit 3423716

File tree

2 files changed

+68
-42
lines changed

2 files changed

+68
-42
lines changed

.reponotes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../reponotes/cardano-node-tests

cardano_node_tests/tests/test_blocks.py

Lines changed: 67 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from cardano_node_tests.utils import configuration
2727
from cardano_node_tests.utils import dbsync_queries
2828
from cardano_node_tests.utils import helpers
29+
from cardano_node_tests.utils import logfiles
2930
from cardano_node_tests.utils.versions import VERSIONS
3031

3132
LOGGER = 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

Comments
 (0)