Skip to content

Commit 587e640

Browse files
committed
refactor(tests): centralize unstable error handling
Introduce `allow_unstable_error_messages` context manager in `common.py` to handle assertion errors for unstable error messages across different node/CLI versions. Refactor all test files to use this context manager, replacing direct assertions on error messages. This allows for temporarily ignoring specific error message checks when testing new features.
1 parent 8954656 commit 587e640

50 files changed

Lines changed: 1064 additions & 794 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

cardano_node_tests/tests/common.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import contextlib
12
import logging
23
import string
34
import time
@@ -603,3 +604,19 @@ def is_fee_in_interval(fee: float, expected_fee: float, frac: float = 0.1) -> bo
603604
if cluster_nodes.get_cluster_type().type == cluster_nodes.ClusterType.TESTNET:
604605
return True
605606
return helpers.is_in_interval(fee, expected_fee, frac=frac)
607+
608+
609+
@contextlib.contextmanager
610+
def allow_unstable_error_messages() -> tp.Iterator[None]:
611+
"""Catch AssertionError and either log it or raise it.
612+
613+
Used in tests where error messages can vary between node/CLI versions.
614+
"""
615+
if not configuration.ALLOW_UNSTABLE_ERROR_MESSAGES:
616+
yield
617+
return
618+
619+
try:
620+
yield
621+
except AssertionError:
622+
LOGGER.exception("AssertionError suppressed")

cardano_node_tests/tests/test_addr_registration.py

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -536,8 +536,9 @@ def test_registration_cert_with_wrong_key(
536536
deposit_amt=common.get_conway_address_deposit(cluster_obj=cluster),
537537
stake_vkey_file=pool_users[0].payment.vkey_file,
538538
)
539-
err_msg = str(excinfo.value)
540-
assert "Expected: StakeVerificationKeyShelley" in err_msg, err_msg
539+
exc_value = str(excinfo.value)
540+
with common.allow_unstable_error_messages():
541+
assert "Expected: StakeVerificationKeyShelley" in exc_value, exc_value
541542

542543
@allure.link(helpers.get_vcs_link())
543544
@pytest.mark.smoke
@@ -574,8 +575,9 @@ def test_register_addr_with_wrong_key(
574575
cluster.g_transaction.send_tx(
575576
src_address=user_payment.address, tx_name=temp_template, tx_files=tx_files
576577
)
577-
err_msg = str(excinfo.value)
578-
assert "MissingVKeyWitnessesUTXOW" in err_msg, err_msg
578+
exc_value = str(excinfo.value)
579+
with common.allow_unstable_error_messages():
580+
assert "MissingVKeyWitnessesUTXOW" in exc_value, exc_value
579581

580582
@allure.link(helpers.get_vcs_link())
581583
@common.PARAM_BUILD_METHOD_NO_EST
@@ -638,8 +640,9 @@ def _build_dereg() -> clusterlib.TxRawOutput:
638640
witness_count_add=len(tx_files.signing_key_files),
639641
)
640642

641-
err_msg = str(excinfo.value)
642-
assert "StakeKeyNotRegisteredDELEG" in err_msg, err_msg
643+
exc_value = str(excinfo.value)
644+
with common.allow_unstable_error_messages():
645+
assert "StakeKeyNotRegisteredDELEG" in exc_value, exc_value
643646

644647
@allure.link(helpers.get_vcs_link())
645648
@common.PARAM_BUILD_METHOD_NO_EST
@@ -768,8 +771,9 @@ def _submit_tx(
768771
tx_files=tx_files_script,
769772
signing_key_files=signing_key_files,
770773
)
771-
err_msg = str(excinfo.value)
772-
assert "MissingScriptWitnessesUTXOW" in err_msg, err_msg
774+
exc_value = str(excinfo.value)
775+
with common.allow_unstable_error_messages():
776+
assert "MissingScriptWitnessesUTXOW" in exc_value, exc_value
773777

774778
# Scenario2: One skey is missing when witnesing the Tx
775779
elif issue == "missing_skey":
@@ -783,8 +787,9 @@ def _submit_tx(
783787
complex_certs=[reg_cert_script],
784788
signing_key_files=signing_key_files[:-1],
785789
)
786-
err_msg = str(excinfo.value)
787-
assert "ScriptWitnessNotValidatingUTXOW" in err_msg, err_msg
790+
exc_value = str(excinfo.value)
791+
with common.allow_unstable_error_messages():
792+
assert "ScriptWitnessNotValidatingUTXOW" in exc_value, exc_value
788793

789794
else:
790795
err = f"Invalid issue: {issue}"

cardano_node_tests/tests/test_blocks.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -233,12 +233,13 @@ def test_unstable_stake_distribution(
233233
cold_vkey_file=pool_rec["cold_key_pair"].vkey_file,
234234
for_next=True,
235235
)
236-
err_str = str(excinfo.value)
236+
exc_value = str(excinfo.value)
237237

238-
if "PastHorizon" in err_str:
238+
if "PastHorizon" in exc_value:
239239
issues.node_4002.finish_test()
240240

241-
assert "current stake distribution is currently unstable" in err_str, err_str
241+
with common.allow_unstable_error_messages():
242+
assert "current stake distribution is currently unstable" in exc_value, exc_value
242243

243244

244245
@pytest.mark.skipif(

cardano_node_tests/tests/test_cli.py

Lines changed: 43 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -404,10 +404,9 @@ def test_address_info_with_invalid_address(self, cluster: clusterlib.ClusterLib,
404404

405405
with pytest.raises(clusterlib.CLIError) as excinfo:
406406
cluster.g_address.get_address_info(address=address)
407-
408-
err_str = str(excinfo.value)
409-
410-
assert "Invalid address" in err_str, err_str
407+
exc_value = str(excinfo.value)
408+
with common.allow_unstable_error_messages():
409+
assert "Invalid address" in exc_value, exc_value
411410

412411

413412
class TestAddressBuild:
@@ -535,10 +534,9 @@ def test_invalid_payment_info(
535534
payment_vkey_file=vkey_file,
536535
payment_script_file=script_file,
537536
)
538-
539-
err_str = str(excinfo.value)
540-
541-
assert "Invalid key" in err_str or "Syntax error in script" in err_str, err_str
537+
exc_value = str(excinfo.value)
538+
with common.allow_unstable_error_messages():
539+
assert "Invalid key" in exc_value or "Syntax error in script" in exc_value, exc_value
542540

543541
@allure.link(helpers.get_vcs_link())
544542
@pytest.mark.parametrize(
@@ -597,14 +595,13 @@ def test_invalid_stake_info(
597595
stake_script_file=script_file,
598596
stake_address=key if option == "address" else None,
599597
)
600-
601-
err_str = str(excinfo.value)
602-
603-
assert (
604-
"Invalid key" in err_str
605-
or "Syntax error in script" in err_str
606-
or "invalid address" in err_str
607-
), err_str
598+
exc_value = str(excinfo.value)
599+
with common.allow_unstable_error_messages():
600+
assert (
601+
"Invalid key" in exc_value
602+
or "Syntax error in script" in exc_value
603+
or "invalid address" in exc_value
604+
), exc_value
608605

609606

610607
class TestAddressKeyHash:
@@ -665,10 +662,9 @@ def test_invalid_verification_key(self, cluster: clusterlib.ClusterLib, option:
665662
payment_vkey=vkey if option == "vkey" else None,
666663
payment_vkey_file=vkey_file,
667664
)
668-
669-
err_str = str(excinfo.value)
670-
671-
assert "Invalid key" in err_str, err_str
665+
exc_value = str(excinfo.value)
666+
with common.allow_unstable_error_messages():
667+
assert "Invalid key" in exc_value, exc_value
672668

673669

674670
class TestKey:
@@ -737,12 +733,12 @@ def test_non_extended_key_error(self, cluster: clusterlib.ClusterLib):
737733
cluster.g_key.gen_non_extended_verification_key(
738734
key_name=temp_template, extended_verification_key_file=payment_keys.skey_file
739735
)
740-
741-
err_str = str(excinfo.value)
742-
assert (
743-
"Error: Invalid key." in err_str
744-
or "TextEnvelope type error: Expected one of:" in err_str
745-
), err_str
736+
exc_value = str(excinfo.value)
737+
with common.allow_unstable_error_messages():
738+
assert (
739+
"Error: Invalid key." in exc_value
740+
or "TextEnvelope type error: Expected one of:" in exc_value
741+
), exc_value
746742

747743

748744
class TestQueryUTxO:
@@ -873,16 +869,15 @@ def test_tx_in_invalid_data(
873869
*cluster.magic_args,
874870
]
875871
)
876-
877-
err_str = str(excinfo.value)
878-
879-
if invalid_param == "tx_hash":
880-
assert (
881-
"expecting hexadecimal digit" in err_str
882-
or "expecting transaction id (hexadecimal)" in err_str
883-
), err_str
884-
else:
885-
assert "expecting digit" in err_str, err_str
872+
exc_value = str(excinfo.value)
873+
with common.allow_unstable_error_messages():
874+
if invalid_param == "tx_hash":
875+
assert (
876+
"expecting hexadecimal digit" in exc_value
877+
or "expecting transaction id (hexadecimal)" in exc_value
878+
), exc_value
879+
else:
880+
assert "expecting digit" in exc_value, exc_value
886881

887882
@allure.link(helpers.get_vcs_link())
888883
@hypothesis.given(filter_str=st.text(alphabet=common.ADDR_ALPHABET, min_size=1))
@@ -905,9 +900,9 @@ def test_address_invalid_data(self, cluster: clusterlib.ClusterLib, filter_str:
905900
*cluster.magic_args,
906901
]
907902
)
908-
909-
err_str = str(excinfo.value)
910-
assert "invalid address" in err_str, err_str
903+
exc_value = str(excinfo.value)
904+
with common.allow_unstable_error_messages():
905+
assert "invalid address" in exc_value, exc_value
911906

912907

913908
class TestStakeAddressKeyHash:
@@ -968,10 +963,9 @@ def test_invalid_verification_key(self, cluster: clusterlib.ClusterLib, option:
968963
stake_vkey=vkey if option == "vkey" else None,
969964
stake_vkey_file=vkey_file,
970965
)
971-
972-
err_str = str(excinfo.value)
973-
974-
assert "Invalid key" in err_str, err_str
966+
exc_value = str(excinfo.value)
967+
with common.allow_unstable_error_messages():
968+
assert "Invalid key" in exc_value, exc_value
975969

976970

977971
class TestAdvancedQueries:
@@ -1427,9 +1421,9 @@ def test_slot_number_invalid_format(
14271421

14281422
with pytest.raises(clusterlib.CLIError) as excinfo:
14291423
cluster.g_query.query_cli(["slot-number", timestamp_str])
1430-
err_str = str(excinfo.value)
1431-
1432-
assert "parseTimeOrError" in err_str, err_str
1424+
exc_value = str(excinfo.value)
1425+
with common.allow_unstable_error_messages():
1426+
assert "parseTimeOrError" in exc_value, exc_value
14331427

14341428
@allure.link(helpers.get_vcs_link())
14351429
@pytest.mark.parametrize("time_val", ("above", "bellow"))
@@ -1451,6 +1445,6 @@ def test_slot_number_out_of_range(
14511445

14521446
with pytest.raises(clusterlib.CLIError) as excinfo:
14531447
cluster.g_query.get_slot_number(timestamp=timestamp)
1454-
err_str = str(excinfo.value)
1455-
1456-
assert "PastHorizon" in err_str, err_str
1448+
exc_value = str(excinfo.value)
1449+
with common.allow_unstable_error_messages():
1450+
assert "PastHorizon" in exc_value, exc_value

cardano_node_tests/tests/test_delegation.py

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -493,11 +493,12 @@ def test_deregister_delegated(
493493
tx_name=f"{temp_template}_dereg_fail",
494494
tx_files=tx_files_deregister,
495495
)
496-
err_msg = str(excinfo.value)
497-
assert (
498-
"StakeKeyNonZeroAccountBalanceDELEG" in err_msg
499-
or "StakeKeyHasNonZeroRewardAccountBalanceDELEG" in err_msg
500-
), err_msg
496+
exc_value = str(excinfo.value)
497+
with common.allow_unstable_error_messages():
498+
assert (
499+
"StakeKeyNonZeroAccountBalanceDELEG" in exc_value
500+
or "StakeKeyHasNonZeroRewardAccountBalanceDELEG" in exc_value
501+
), exc_value
501502

502503
src_payment_balance = cluster.g_query.get_address_balance(src_address)
503504
reward_balance = cluster.g_query.get_stake_addr_info(
@@ -664,11 +665,12 @@ def test_delegate_multisig(
664665
tx_files=tx_files_deregister,
665666
complex_certs=[dereg_cert_script],
666667
)
667-
err_msg = str(excinfo.value)
668-
assert (
669-
"StakeKeyNonZeroAccountBalanceDELEG" in err_msg
670-
or "StakeKeyHasNonZeroRewardAccountBalanceDELEG" in err_msg
671-
), err_msg
668+
exc_value = str(excinfo.value)
669+
with common.allow_unstable_error_messages():
670+
assert (
671+
"StakeKeyNonZeroAccountBalanceDELEG" in exc_value
672+
or "StakeKeyHasNonZeroRewardAccountBalanceDELEG" in exc_value
673+
), exc_value
672674

673675
src_payment_balance = cluster.g_query.get_address_balance(src_address)
674676
reward_balance = cluster.g_query.get_stake_addr_info(
@@ -1020,11 +1022,12 @@ def test_delegation_cert_with_wrong_key(
10201022
stake_pool_id=pool_id,
10211023
always_abstain=True,
10221024
)
1023-
err_msg = str(excinfo.value)
1024-
assert (
1025-
"Expected: StakeVerificationKeyShelley" in err_msg
1026-
or "MissingVKeyWitnessesUTXOW" in err_msg
1027-
), err_msg
1025+
exc_value = str(excinfo.value)
1026+
with common.allow_unstable_error_messages():
1027+
assert (
1028+
"Expected: StakeVerificationKeyShelley" in exc_value
1029+
or "MissingVKeyWitnessesUTXOW" in exc_value
1030+
), exc_value
10281031

10291032
@allure.link(helpers.get_vcs_link())
10301033
@pytest.mark.smoke
@@ -1073,8 +1076,9 @@ def test_delegate_addr_with_wrong_key(
10731076
tx_name=f"{temp_template}_deleg",
10741077
tx_files=tx_files,
10751078
)
1076-
err_msg = str(excinfo.value)
1077-
assert "MissingVKeyWitnessesUTXOW" in err_msg, err_msg
1079+
exc_value = str(excinfo.value)
1080+
with common.allow_unstable_error_messages():
1081+
assert "MissingVKeyWitnessesUTXOW" in exc_value, exc_value
10781082

10791083
@allure.link(helpers.get_vcs_link())
10801084
@common.PARAM_BUILD_METHOD_NO_EST
@@ -1121,10 +1125,12 @@ def test_delegate_unknown_addr(
11211125
witness_override=len(tx_files.signing_key_files),
11221126
)
11231127

1124-
err_msg = str(excinfo.value)
1125-
assert (
1126-
"StakeDelegationImpossibleDELEG" in err_msg or "StakeKeyNotRegisteredDELEG" in err_msg
1127-
), err_msg
1128+
exc_value = str(excinfo.value)
1129+
with common.allow_unstable_error_messages():
1130+
assert (
1131+
"StakeDelegationImpossibleDELEG" in exc_value
1132+
or "StakeKeyNotRegisteredDELEG" in exc_value
1133+
), exc_value
11281134

11291135
@allure.link(helpers.get_vcs_link())
11301136
@common.PARAM_BUILD_METHOD_NO_EST
@@ -1190,10 +1196,12 @@ def test_delegate_deregistered_addr(
11901196
witness_override=len(tx_files.signing_key_files),
11911197
)
11921198

1193-
err_msg = str(excinfo.value)
1194-
assert (
1195-
"StakeDelegationImpossibleDELEG" in err_msg or "StakeKeyNotRegisteredDELEG" in err_msg
1196-
), err_msg
1199+
exc_value = str(excinfo.value)
1200+
with common.allow_unstable_error_messages():
1201+
assert (
1202+
"StakeDelegationImpossibleDELEG" in exc_value
1203+
or "StakeKeyNotRegisteredDELEG" in exc_value
1204+
), exc_value
11971205

11981206
@allure.link(helpers.get_vcs_link())
11991207
@pytest.mark.smoke
@@ -1244,8 +1252,9 @@ def test_delegatee_not_registered(
12441252
tx_name=f"{temp_template}_deleg",
12451253
tx_files=tx_files,
12461254
)
1247-
err_msg = str(excinfo.value)
1248-
assert (
1249-
"DelegateeNotRegisteredDELEG" in err_msg # Before cardano-node 10.0.0
1250-
or "DelegateeStakePoolNotRegisteredDELEG" in err_msg
1251-
), err_msg
1255+
exc_value = str(excinfo.value)
1256+
with common.allow_unstable_error_messages():
1257+
assert (
1258+
"DelegateeNotRegisteredDELEG" in exc_value # Before cardano-node 10.0.0
1259+
or "DelegateeStakePoolNotRegisteredDELEG" in exc_value
1260+
), exc_value

cardano_node_tests/tests/test_kes.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -805,7 +805,10 @@ def test_no_kes_period_arg(
805805
str(out_file),
806806
]
807807
)
808-
assert "Missing: --kes-period NATURAL" in str(excinfo.value)
808+
exc_value = str(excinfo.value)
809+
with common.allow_unstable_error_messages():
810+
assert "Missing: --kes-period NATURAL" in exc_value, exc_value
811+
809812
assert not out_file.exists(), "New operational certificate was generated"
810813

811814
@allure.link(helpers.get_vcs_link())

cardano_node_tests/tests/test_mir_certs.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1071,5 +1071,6 @@ def test_exceed_pay_stake_addr_from(
10711071
tx_name=temp_template,
10721072
tx_files=tx_files,
10731073
)
1074-
err_str = str(excinfo.value)
1075-
assert "InsufficientForInstantaneousRewardsDELEG" in err_str, err_str
1074+
exc_value = str(excinfo.value)
1075+
with common.allow_unstable_error_messages():
1076+
assert "InsufficientForInstantaneousRewardsDELEG" in exc_value, exc_value

0 commit comments

Comments
 (0)