mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-06-08 00:58:46 +00:00
tests: streamline TrezorFailure exception usage
This commit is contained in:
parent
a40f1e00ed
commit
1b50877545
@ -22,8 +22,9 @@ class TrezorException(Exception):
|
|||||||
class TrezorFailure(TrezorException):
|
class TrezorFailure(TrezorException):
|
||||||
def __init__(self, failure):
|
def __init__(self, failure):
|
||||||
self.failure = failure
|
self.failure = failure
|
||||||
# TODO: this is backwards compatibility with tests. it should be changed
|
self.code = failure.code
|
||||||
super().__init__(self.failure.code, self.failure.message)
|
self.message = failure.message
|
||||||
|
super().__init__(self.code, self.message, self.failure)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
from .messages import FailureType
|
from .messages import FailureType
|
||||||
@ -33,8 +34,8 @@ class TrezorFailure(TrezorException):
|
|||||||
for name in dir(FailureType)
|
for name in dir(FailureType)
|
||||||
if not name.startswith("_")
|
if not name.startswith("_")
|
||||||
}
|
}
|
||||||
if self.failure.message is not None:
|
if self.message is not None:
|
||||||
return "{}: {}".format(types[self.failure.code], self.failure.message)
|
return "{}: {}".format(types[self.code], self.message)
|
||||||
else:
|
else:
|
||||||
return types[self.failure.code]
|
return types[self.failure.code]
|
||||||
|
|
||||||
|
@ -227,7 +227,5 @@ def test_cardano_sign_tx_validation(
|
|||||||
with client:
|
with client:
|
||||||
client.set_expected_responses(expected_responses)
|
client.set_expected_responses(expected_responses)
|
||||||
|
|
||||||
with pytest.raises(TrezorFailure) as exc:
|
with pytest.raises(TrezorFailure, match=expected_error_message):
|
||||||
cardano.sign_tx(client, inputs, outputs, transactions, protocol_magic)
|
cardano.sign_tx(client, inputs, outputs, transactions, protocol_magic)
|
||||||
|
|
||||||
assert exc.value.args[1] == expected_error_message
|
|
||||||
|
@ -98,16 +98,16 @@ def test_dry_run(client):
|
|||||||
|
|
||||||
@pytest.mark.setup_client(mnemonic=MNEMONIC12)
|
@pytest.mark.setup_client(mnemonic=MNEMONIC12)
|
||||||
def test_seed_mismatch(client):
|
def test_seed_mismatch(client):
|
||||||
with pytest.raises(exceptions.TrezorFailure) as exc:
|
with pytest.raises(
|
||||||
|
exceptions.TrezorFailure, match="does not match the one in the device"
|
||||||
|
):
|
||||||
do_recover(client, ["all"] * 12)
|
do_recover(client, ["all"] * 12)
|
||||||
assert "does not match the one in the device" in exc.value.failure.message
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skip_t2
|
@pytest.mark.skip_t2
|
||||||
def test_invalid_seed_t1(client):
|
def test_invalid_seed_t1(client):
|
||||||
with pytest.raises(exceptions.TrezorFailure) as exc:
|
with pytest.raises(exceptions.TrezorFailure, match="Invalid seed"):
|
||||||
do_recover(client, ["stick"] * 12)
|
do_recover(client, ["stick"] * 12)
|
||||||
assert "Invalid seed" in exc.value.failure.message
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skip_t1
|
@pytest.mark.skip_t1
|
||||||
@ -163,9 +163,8 @@ def test_invalid_seed_core(client):
|
|||||||
|
|
||||||
@pytest.mark.setup_client(uninitialized=True)
|
@pytest.mark.setup_client(uninitialized=True)
|
||||||
def test_uninitialized(client):
|
def test_uninitialized(client):
|
||||||
with pytest.raises(exceptions.TrezorFailure) as exc:
|
with pytest.raises(exceptions.TrezorFailure, match="not initialized"):
|
||||||
do_recover(client, ["all"] * 12)
|
do_recover(client, ["all"] * 12)
|
||||||
assert "not initialized" in exc.value.failure.message
|
|
||||||
|
|
||||||
|
|
||||||
DRY_RUN_ALLOWED_FIELDS = ("dry_run", "word_count", "enforce_wordlist", "type")
|
DRY_RUN_ALLOWED_FIELDS = ("dry_run", "word_count", "enforce_wordlist", "type")
|
||||||
@ -200,6 +199,7 @@ def test_bad_parameters(client, field_name, field_value):
|
|||||||
type=messages.RecoveryDeviceType.ScrambledWords,
|
type=messages.RecoveryDeviceType.ScrambledWords,
|
||||||
)
|
)
|
||||||
setattr(msg, field_name, field_value)
|
setattr(msg, field_name, field_value)
|
||||||
with pytest.raises(exceptions.TrezorFailure) as exc:
|
with pytest.raises(
|
||||||
|
exceptions.TrezorFailure, match="Forbidden field set in dry-run"
|
||||||
|
):
|
||||||
client.call(msg)
|
client.call(msg)
|
||||||
assert "Forbidden field set in dry-run" in exc.value.failure.message
|
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from trezorlib import messages, ripple
|
from trezorlib import ripple
|
||||||
from trezorlib.exceptions import TrezorFailure
|
from trezorlib.exceptions import TrezorFailure
|
||||||
from trezorlib.tools import parse_path
|
from trezorlib.tools import parse_path
|
||||||
|
|
||||||
@ -106,9 +106,8 @@ class TestMsgRippleSignTx:
|
|||||||
"Sequence": 1,
|
"Sequence": 1,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
with pytest.raises(TrezorFailure) as exc:
|
with pytest.raises(
|
||||||
|
TrezorFailure,
|
||||||
|
match="ProcessError: Fee must be in the range of 10 to 10,000 drops",
|
||||||
|
):
|
||||||
ripple.sign_tx(client, parse_path("m/44'/144'/0'/0/2"), msg)
|
ripple.sign_tx(client, parse_path("m/44'/144'/0'/0/2"), msg)
|
||||||
assert exc.value.args[0] == messages.FailureType.ProcessError
|
|
||||||
assert exc.value.args[1].endswith(
|
|
||||||
"Fee must be in the range of 10 to 10,000 drops"
|
|
||||||
)
|
|
||||||
|
@ -491,7 +491,7 @@ class TestMsgSigntx:
|
|||||||
script_type=proto.OutputScriptType.PAYTOADDRESS,
|
script_type=proto.OutputScriptType.PAYTOADDRESS,
|
||||||
)
|
)
|
||||||
|
|
||||||
with pytest.raises(TrezorFailure) as exc:
|
with pytest.raises(TrezorFailure, match="NotEnoughFunds"):
|
||||||
check_sign_tx(
|
check_sign_tx(
|
||||||
client,
|
client,
|
||||||
"Bitcoin",
|
"Bitcoin",
|
||||||
@ -500,7 +500,6 @@ class TestMsgSigntx:
|
|||||||
failure=proto.FailureType.NotEnoughFunds,
|
failure=proto.FailureType.NotEnoughFunds,
|
||||||
unknown_path=True,
|
unknown_path=True,
|
||||||
)
|
)
|
||||||
assert exc.value.args[0] == proto.FailureType.NotEnoughFunds
|
|
||||||
|
|
||||||
@pytest.mark.setup_client(mnemonic=MNEMONIC12)
|
@pytest.mark.setup_client(mnemonic=MNEMONIC12)
|
||||||
def test_p2sh(self, client):
|
def test_p2sh(self, client):
|
||||||
@ -606,7 +605,9 @@ class TestMsgSigntx:
|
|||||||
# Set up attack processors
|
# Set up attack processors
|
||||||
client.set_filter(proto.TxAck, attack_processor)
|
client.set_filter(proto.TxAck, attack_processor)
|
||||||
|
|
||||||
with pytest.raises(TrezorFailure) as exc:
|
with pytest.raises(
|
||||||
|
TrezorFailure, match="Transaction has changed during signing"
|
||||||
|
):
|
||||||
btc.sign_tx(
|
btc.sign_tx(
|
||||||
client,
|
client,
|
||||||
"Bitcoin",
|
"Bitcoin",
|
||||||
@ -614,11 +615,6 @@ class TestMsgSigntx:
|
|||||||
[out1, out2],
|
[out1, out2],
|
||||||
prev_txes=TxCache("Bitcoin"),
|
prev_txes=TxCache("Bitcoin"),
|
||||||
)
|
)
|
||||||
assert exc.value.args[0] in (
|
|
||||||
proto.FailureType.ProcessError,
|
|
||||||
proto.FailureType.DataError,
|
|
||||||
)
|
|
||||||
assert exc.value.args[1].endswith("Transaction has changed during signing")
|
|
||||||
|
|
||||||
# Ensure that if the change output is modified after the user confirms the
|
# Ensure that if the change output is modified after the user confirms the
|
||||||
# transaction, then signing fails.
|
# transaction, then signing fails.
|
||||||
@ -662,17 +658,13 @@ class TestMsgSigntx:
|
|||||||
# Set up attack processors
|
# Set up attack processors
|
||||||
client.set_filter(proto.TxAck, attack_processor)
|
client.set_filter(proto.TxAck, attack_processor)
|
||||||
|
|
||||||
with pytest.raises(TrezorFailure) as exc:
|
with pytest.raises(
|
||||||
|
TrezorFailure, match="Transaction has changed during signing"
|
||||||
|
):
|
||||||
btc.sign_tx(
|
btc.sign_tx(
|
||||||
client, "Testnet", [inp1], [out1, out2], prev_txes=TxCache("Testnet")
|
client, "Testnet", [inp1], [out1, out2], prev_txes=TxCache("Testnet")
|
||||||
)
|
)
|
||||||
|
|
||||||
assert exc.value.args[0] in (
|
|
||||||
proto.FailureType.ProcessError,
|
|
||||||
proto.FailureType.DataError,
|
|
||||||
)
|
|
||||||
assert exc.value.args[1].endswith("Transaction has changed during signing")
|
|
||||||
|
|
||||||
def test_attack_change_input_address(self, client):
|
def test_attack_change_input_address(self, client):
|
||||||
inp1 = proto.TxInputType(
|
inp1 = proto.TxInputType(
|
||||||
address_n=parse_path("44'/1'/4'/0/0"),
|
address_n=parse_path("44'/1'/4'/0/0"),
|
||||||
|
@ -330,15 +330,11 @@ class TestMsgSigntxBch:
|
|||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
with pytest.raises(TrezorFailure) as exc:
|
with pytest.raises(
|
||||||
|
TrezorFailure, match="Transaction has changed during signing"
|
||||||
|
):
|
||||||
btc.sign_tx(client, "Bcash", [inp1, inp2], [out1], prev_txes=TX_API)
|
btc.sign_tx(client, "Bcash", [inp1, inp2], [out1], prev_txes=TX_API)
|
||||||
|
|
||||||
assert exc.value.args[0] in (
|
|
||||||
proto.FailureType.ProcessError,
|
|
||||||
proto.FailureType.DataError,
|
|
||||||
)
|
|
||||||
assert exc.value.args[1].endswith("Transaction has changed during signing")
|
|
||||||
|
|
||||||
def test_attack_change_input(self, client):
|
def test_attack_change_input(self, client):
|
||||||
inp1 = proto.TxInputType(
|
inp1 = proto.TxInputType(
|
||||||
address_n=parse_path("44'/145'/10'/0/0"),
|
address_n=parse_path("44'/145'/10'/0/0"),
|
||||||
|
@ -49,8 +49,8 @@ class TestMsgStellarGetAddress:
|
|||||||
stellar.get_address(client, parse_path("m/0/1"))
|
stellar.get_address(client, parse_path("m/0/1"))
|
||||||
|
|
||||||
if client.features.model == "1":
|
if client.features.model == "1":
|
||||||
assert exc.value.args[0] == proto.FailureType.ProcessError
|
assert exc.value.code == proto.FailureType.ProcessError
|
||||||
assert exc.value.args[1].endswith("Failed to derive private key")
|
assert exc.value.message.endswith("Failed to derive private key")
|
||||||
else:
|
else:
|
||||||
assert exc.value.args[0] == proto.FailureType.DataError
|
assert exc.value.code == proto.FailureType.DataError
|
||||||
assert exc.value.args[1].endswith("Forbidden key path")
|
assert exc.value.message.endswith("Forbidden key path")
|
||||||
|
@ -298,8 +298,5 @@ class TestMultisig:
|
|||||||
script_type=proto.OutputScriptType.PAYTOADDRESS,
|
script_type=proto.OutputScriptType.PAYTOADDRESS,
|
||||||
)
|
)
|
||||||
|
|
||||||
with pytest.raises(TrezorFailure) as exc:
|
with pytest.raises(TrezorFailure, match="Pubkey not found in multisig script"):
|
||||||
btc.sign_tx(client, "Bitcoin", [inp1], [out1], prev_txes=TX_API)
|
btc.sign_tx(client, "Bitcoin", [inp1], [out1], prev_txes=TX_API)
|
||||||
|
|
||||||
assert exc.value.args[0] == proto.FailureType.DataError
|
|
||||||
assert exc.value.args[1].endswith("Pubkey not found in multisig script")
|
|
||||||
|
@ -173,10 +173,10 @@ class TestOpReturn:
|
|||||||
btc.sign_tx(client, "Bitcoin", [inp1], [out1], prev_txes=TX_API)
|
btc.sign_tx(client, "Bitcoin", [inp1], [out1], prev_txes=TX_API)
|
||||||
|
|
||||||
if client.features.model == "1":
|
if client.features.model == "1":
|
||||||
assert exc.value.args[0] == proto.FailureType.ProcessError
|
assert exc.value.code == proto.FailureType.ProcessError
|
||||||
assert exc.value.args[1].endswith("Failed to compile output")
|
assert exc.value.message.endswith("Failed to compile output")
|
||||||
else:
|
else:
|
||||||
assert exc.value.args[0] == proto.FailureType.DataError
|
assert exc.value.code == proto.FailureType.DataError
|
||||||
assert exc.value.args[1].endswith(
|
assert exc.value.message.endswith(
|
||||||
"OP_RETURN output with non-zero amount"
|
"OP_RETURN output with non-zero amount"
|
||||||
)
|
)
|
||||||
|
@ -42,7 +42,7 @@ def test_sd_no_format(client):
|
|||||||
client.set_input_flow(input_flow)
|
client.set_input_flow(input_flow)
|
||||||
device.sd_protect(client, Op.ENABLE)
|
device.sd_protect(client, Op.ENABLE)
|
||||||
|
|
||||||
assert e.value.failure.code == messages.FailureType.ProcessError
|
assert e.value.code == messages.FailureType.ProcessError
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.sd_card
|
@pytest.mark.sd_card
|
||||||
@ -109,4 +109,4 @@ def test_sd_protect_unlock(client):
|
|||||||
client.set_input_flow(input_flow_change_pin_format)
|
client.set_input_flow(input_flow_change_pin_format)
|
||||||
device.change_pin(client)
|
device.change_pin(client)
|
||||||
|
|
||||||
assert e.value.failure.code == messages.FailureType.ProcessError
|
assert e.value.code == messages.FailureType.ProcessError
|
||||||
|
Loading…
Reference in New Issue
Block a user