Improve ragger tests
- Use defined firmware instead of strings - Fix compatibility with Python 3.9 - Fix test navigation steps
This commit is contained in:
committed by
Alexandre Paillier
parent
fee187d90e
commit
cf3c5c3064
@@ -1,5 +1,6 @@
|
|||||||
import sys
|
import sys
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from os import path
|
||||||
import warnings
|
import warnings
|
||||||
import glob
|
import glob
|
||||||
|
|
||||||
@@ -17,8 +18,8 @@ def pytest_addoption(parser):
|
|||||||
parser.addoption("--with_lib_mode", action="store_true", help="Run the test with Library Mode")
|
parser.addoption("--with_lib_mode", action="store_true", help="Run the test with Library Mode")
|
||||||
|
|
||||||
|
|
||||||
parent: Path = Path(__file__).parent
|
pattern = f"{Path(__file__).parent}/test_*.py"
|
||||||
testFiles = glob.glob("test_*.py", root_dir=f"{parent}")
|
testFiles = [path.basename(x) for x in glob.glob(pattern)]
|
||||||
collect_ignore = []
|
collect_ignore = []
|
||||||
if "--with_lib_mode" in sys.argv:
|
if "--with_lib_mode" in sys.argv:
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,9 @@ disable = C0114, # missing-module-docstring
|
|||||||
C0103, # invalid-name
|
C0103, # invalid-name
|
||||||
R0801, # duplicate-code
|
R0801, # duplicate-code
|
||||||
R0903, # too-few-public-methods
|
R0903, # too-few-public-methods
|
||||||
|
R0904, # too-many-public-methods
|
||||||
|
R0911, # too-many-statements
|
||||||
|
R0912, # too-many-branches
|
||||||
R0913, # too-many-arguments
|
R0913, # too-many-arguments
|
||||||
R0914, # too-many-locals
|
R0914, # too-many-locals
|
||||||
W0603, # global-statement
|
W0603, # global-statement
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ from web3 import Web3
|
|||||||
from ragger.backend import BackendInterface
|
from ragger.backend import BackendInterface
|
||||||
from ragger.firmware import Firmware
|
from ragger.firmware import Firmware
|
||||||
from ragger.navigator import Navigator, NavInsID
|
from ragger.navigator import Navigator, NavInsID
|
||||||
from ragger.navigator.navigation_scenario import NavigateWithScenario
|
|
||||||
from ragger.error import ExceptionRAPDU
|
from ragger.error import ExceptionRAPDU
|
||||||
|
|
||||||
from constants import ABIS_FOLDER
|
from constants import ABIS_FOLDER
|
||||||
@@ -77,8 +76,8 @@ def test_blind_sign(firmware: Firmware,
|
|||||||
test_name += "_rejected"
|
test_name += "_rejected"
|
||||||
|
|
||||||
moves = []
|
moves = []
|
||||||
if firmware.device.startswith("nano"):
|
if firmware.is_nano:
|
||||||
if firmware.device == "nanos":
|
if firmware == Firmware.NANOS:
|
||||||
moves += [NavInsID.RIGHT_CLICK] * 2
|
moves += [NavInsID.RIGHT_CLICK] * 2
|
||||||
else:
|
else:
|
||||||
moves += [NavInsID.RIGHT_CLICK] * 4
|
moves += [NavInsID.RIGHT_CLICK] * 4
|
||||||
@@ -89,13 +88,13 @@ def test_blind_sign(firmware: Firmware,
|
|||||||
moves += [NavInsID.BOTH_CLICK]
|
moves += [NavInsID.BOTH_CLICK]
|
||||||
|
|
||||||
if sign:
|
if sign:
|
||||||
if firmware.device == "nanos":
|
if firmware == Firmware.NANOS:
|
||||||
moves += [NavInsID.RIGHT_CLICK] * 10
|
moves += [NavInsID.RIGHT_CLICK] * 10
|
||||||
else:
|
else:
|
||||||
moves += [NavInsID.RIGHT_CLICK] * 6
|
moves += [NavInsID.RIGHT_CLICK] * 6
|
||||||
moves += [NavInsID.BOTH_CLICK]
|
moves += [NavInsID.BOTH_CLICK]
|
||||||
else:
|
else:
|
||||||
if firmware.device == "stax":
|
if firmware == Firmware.STAX:
|
||||||
tap_number = 2
|
tap_number = 2
|
||||||
else:
|
else:
|
||||||
tap_number = 3
|
tap_number = 3
|
||||||
@@ -126,7 +125,7 @@ def test_blind_sign_reject_in_risk_review(firmware: Firmware,
|
|||||||
test_name: str):
|
test_name: str):
|
||||||
app_client = EthAppClient(backend)
|
app_client = EthAppClient(backend)
|
||||||
|
|
||||||
if firmware.device not in ["stax", "flex"]:
|
if firmware.is_nano:
|
||||||
pytest.skip("Not supported on non-NBGL apps")
|
pytest.skip("Not supported on non-NBGL apps")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -146,7 +145,6 @@ def test_blind_sign_reject_in_risk_review(firmware: Firmware,
|
|||||||
def test_sign_parameter_selector(firmware: Firmware,
|
def test_sign_parameter_selector(firmware: Firmware,
|
||||||
backend: BackendInterface,
|
backend: BackendInterface,
|
||||||
navigator: Navigator,
|
navigator: Navigator,
|
||||||
scenario_navigator: NavigateWithScenario,
|
|
||||||
test_name: str,
|
test_name: str,
|
||||||
default_screenshot_path: Path):
|
default_screenshot_path: Path):
|
||||||
global DEVICE_ADDR
|
global DEVICE_ADDR
|
||||||
@@ -168,8 +166,8 @@ def test_sign_parameter_selector(firmware: Firmware,
|
|||||||
flows += data_len // 32
|
flows += data_len // 32
|
||||||
with app_client.sign(BIP32_PATH, tx_params):
|
with app_client.sign(BIP32_PATH, tx_params):
|
||||||
moves = []
|
moves = []
|
||||||
if firmware.device.startswith("nano"):
|
if firmware.is_nano:
|
||||||
if firmware.device == "nanos":
|
if firmware == Firmware.NANOS:
|
||||||
moves += [NavInsID.RIGHT_CLICK] * 2 + [NavInsID.BOTH_CLICK]
|
moves += [NavInsID.RIGHT_CLICK] * 2 + [NavInsID.BOTH_CLICK]
|
||||||
# Parameters on Nano S are split on multiple pages, hardcoded because the two parameters don't use the
|
# Parameters on Nano S are split on multiple pages, hardcoded because the two parameters don't use the
|
||||||
# same amount of pages because of non-monospace fonts
|
# same amount of pages because of non-monospace fonts
|
||||||
@@ -178,19 +176,19 @@ def test_sign_parameter_selector(firmware: Firmware,
|
|||||||
else:
|
else:
|
||||||
moves += ([NavInsID.RIGHT_CLICK] * 2 + [NavInsID.BOTH_CLICK]) * flows
|
moves += ([NavInsID.RIGHT_CLICK] * 2 + [NavInsID.BOTH_CLICK]) * flows
|
||||||
|
|
||||||
if firmware.device == "nanos":
|
if firmware == Firmware.NANOS:
|
||||||
moves += [NavInsID.RIGHT_CLICK] * 2
|
moves += [NavInsID.RIGHT_CLICK] * 2
|
||||||
else:
|
else:
|
||||||
moves += [NavInsID.RIGHT_CLICK] * 4
|
moves += [NavInsID.RIGHT_CLICK] * 4
|
||||||
moves += [NavInsID.BOTH_CLICK]
|
moves += [NavInsID.BOTH_CLICK]
|
||||||
|
|
||||||
if firmware.device == "nanos":
|
if firmware == Firmware.NANOS:
|
||||||
moves += [NavInsID.RIGHT_CLICK] * 9
|
moves += [NavInsID.RIGHT_CLICK] * 9
|
||||||
else:
|
else:
|
||||||
moves += [NavInsID.RIGHT_CLICK] * 5
|
moves += [NavInsID.RIGHT_CLICK] * 5
|
||||||
moves += [NavInsID.BOTH_CLICK]
|
moves += [NavInsID.BOTH_CLICK]
|
||||||
else:
|
else:
|
||||||
if firmware.device == "stax":
|
if firmware == Firmware.STAX:
|
||||||
tap_number = 2
|
tap_number = 2
|
||||||
else:
|
else:
|
||||||
tap_number = 3
|
tap_number = 3
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
from pathlib import Path
|
|
||||||
import pytest
|
import pytest
|
||||||
from web3 import Web3
|
from web3 import Web3
|
||||||
|
|
||||||
@@ -33,7 +32,7 @@ def verbose_fixture(request) -> bool:
|
|||||||
|
|
||||||
def common(firmware: Firmware, app_client: EthAppClient) -> int:
|
def common(firmware: Firmware, app_client: EthAppClient) -> int:
|
||||||
|
|
||||||
if firmware.device == "nanos":
|
if firmware == Firmware.NANOS:
|
||||||
pytest.skip("Not supported on LNS")
|
pytest.skip("Not supported on LNS")
|
||||||
challenge = app_client.get_challenge()
|
challenge = app_client.get_challenge()
|
||||||
return ResponseParser.challenge(challenge.data)
|
return ResponseParser.challenge(challenge.data)
|
||||||
@@ -43,7 +42,6 @@ def test_send_fund(firmware: Firmware,
|
|||||||
backend: BackendInterface,
|
backend: BackendInterface,
|
||||||
navigator: Navigator,
|
navigator: Navigator,
|
||||||
scenario_navigator: NavigateWithScenario,
|
scenario_navigator: NavigateWithScenario,
|
||||||
default_screenshot_path: Path,
|
|
||||||
verbose: bool):
|
verbose: bool):
|
||||||
app_client = EthAppClient(backend)
|
app_client = EthAppClient(backend)
|
||||||
challenge = common(firmware, app_client)
|
challenge = common(firmware, app_client)
|
||||||
@@ -62,12 +60,12 @@ def test_send_fund(firmware: Firmware,
|
|||||||
"value": Web3.to_wei(AMOUNT, "ether"),
|
"value": Web3.to_wei(AMOUNT, "ether"),
|
||||||
"chainId": CHAIN_ID
|
"chainId": CHAIN_ID
|
||||||
}):
|
}):
|
||||||
if firmware.device.startswith("nano"):
|
if firmware.is_nano:
|
||||||
end_text = "Accept"
|
end_text = "Accept"
|
||||||
else:
|
else:
|
||||||
end_text = "Sign"
|
end_text = "Sign"
|
||||||
|
|
||||||
scenario_navigator.review_approve(default_screenshot_path, f"domain_name_verbose_{str(verbose)}", end_text)
|
scenario_navigator.review_approve(test_name=f"domain_name_verbose_{str(verbose)}", custom_screen_text=end_text)
|
||||||
|
|
||||||
|
|
||||||
def test_send_fund_wrong_challenge(firmware: Firmware, backend: BackendInterface):
|
def test_send_fund_wrong_challenge(firmware: Firmware, backend: BackendInterface):
|
||||||
@@ -81,8 +79,7 @@ def test_send_fund_wrong_challenge(firmware: Firmware, backend: BackendInterface
|
|||||||
|
|
||||||
def test_send_fund_wrong_addr(firmware: Firmware,
|
def test_send_fund_wrong_addr(firmware: Firmware,
|
||||||
backend: BackendInterface,
|
backend: BackendInterface,
|
||||||
scenario_navigator: NavigateWithScenario,
|
scenario_navigator: NavigateWithScenario):
|
||||||
default_screenshot_path: Path):
|
|
||||||
app_client = EthAppClient(backend)
|
app_client = EthAppClient(backend)
|
||||||
challenge = common(firmware, app_client)
|
challenge = common(firmware, app_client)
|
||||||
|
|
||||||
@@ -100,18 +97,17 @@ def test_send_fund_wrong_addr(firmware: Firmware,
|
|||||||
"value": Web3.to_wei(AMOUNT, "ether"),
|
"value": Web3.to_wei(AMOUNT, "ether"),
|
||||||
"chainId": CHAIN_ID
|
"chainId": CHAIN_ID
|
||||||
}):
|
}):
|
||||||
if firmware.device.startswith("nano"):
|
if firmware.is_nano:
|
||||||
end_text = "Accept"
|
end_text = "Accept"
|
||||||
else:
|
else:
|
||||||
end_text = "Sign"
|
end_text = "Sign"
|
||||||
|
|
||||||
scenario_navigator.review_approve(default_screenshot_path, "domain_name_wrong_addr", end_text)
|
scenario_navigator.review_approve(test_name="domain_name_wrong_addr", custom_screen_text=end_text)
|
||||||
|
|
||||||
|
|
||||||
def test_send_fund_non_mainnet(firmware: Firmware,
|
def test_send_fund_non_mainnet(firmware: Firmware,
|
||||||
backend: BackendInterface,
|
backend: BackendInterface,
|
||||||
scenario_navigator: NavigateWithScenario,
|
scenario_navigator: NavigateWithScenario):
|
||||||
default_screenshot_path: Path):
|
|
||||||
app_client = EthAppClient(backend)
|
app_client = EthAppClient(backend)
|
||||||
challenge = common(firmware, app_client)
|
challenge = common(firmware, app_client)
|
||||||
|
|
||||||
@@ -126,18 +122,17 @@ def test_send_fund_non_mainnet(firmware: Firmware,
|
|||||||
"value": Web3.to_wei(AMOUNT, "ether"),
|
"value": Web3.to_wei(AMOUNT, "ether"),
|
||||||
"chainId": 5
|
"chainId": 5
|
||||||
}):
|
}):
|
||||||
if firmware.device.startswith("nano"):
|
if firmware.is_nano:
|
||||||
end_text = "Accept"
|
end_text = "Accept"
|
||||||
else:
|
else:
|
||||||
end_text = "Sign"
|
end_text = "Sign"
|
||||||
|
|
||||||
scenario_navigator.review_approve(default_screenshot_path, "domain_name_non_mainnet", end_text)
|
scenario_navigator.review_approve(test_name="domain_name_non_mainnet", custom_screen_text=end_text)
|
||||||
|
|
||||||
|
|
||||||
def test_send_fund_unknown_chain(firmware: Firmware,
|
def test_send_fund_unknown_chain(firmware: Firmware,
|
||||||
backend: BackendInterface,
|
backend: BackendInterface,
|
||||||
scenario_navigator: NavigateWithScenario,
|
scenario_navigator: NavigateWithScenario):
|
||||||
default_screenshot_path: Path):
|
|
||||||
app_client = EthAppClient(backend)
|
app_client = EthAppClient(backend)
|
||||||
challenge = common(firmware, app_client)
|
challenge = common(firmware, app_client)
|
||||||
|
|
||||||
@@ -152,12 +147,12 @@ def test_send_fund_unknown_chain(firmware: Firmware,
|
|||||||
"value": Web3.to_wei(AMOUNT, "ether"),
|
"value": Web3.to_wei(AMOUNT, "ether"),
|
||||||
"chainId": 9
|
"chainId": 9
|
||||||
}):
|
}):
|
||||||
if firmware.device.startswith("nano"):
|
if firmware.is_nano:
|
||||||
end_text = "Accept"
|
end_text = "Accept"
|
||||||
else:
|
else:
|
||||||
end_text = "Sign"
|
end_text = "Sign"
|
||||||
|
|
||||||
scenario_navigator.review_approve(default_screenshot_path, "domain_name_unknown_chain", end_text)
|
scenario_navigator.review_approve(test_name="domain_name_unknown_chain", custom_screen_text=end_text)
|
||||||
|
|
||||||
|
|
||||||
def test_send_fund_domain_too_long(firmware: Firmware, backend: BackendInterface):
|
def test_send_fund_domain_too_long(firmware: Firmware, backend: BackendInterface):
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
from pathlib import Path
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from ragger.error import ExceptionRAPDU
|
from ragger.error import ExceptionRAPDU
|
||||||
@@ -17,7 +16,6 @@ BIP32_PATH = "m/44'/60'/0'/0/0"
|
|||||||
def common(backend: BackendInterface,
|
def common(backend: BackendInterface,
|
||||||
scenario: NavigateWithScenario,
|
scenario: NavigateWithScenario,
|
||||||
test_name: str,
|
test_name: str,
|
||||||
screenshot_path: Path,
|
|
||||||
msg: str):
|
msg: str):
|
||||||
|
|
||||||
app_client = EthAppClient(backend)
|
app_client = EthAppClient(backend)
|
||||||
@@ -27,7 +25,7 @@ def common(backend: BackendInterface,
|
|||||||
_, DEVICE_ADDR, _ = ResponseParser.pk_addr(app_client.response().data)
|
_, DEVICE_ADDR, _ = ResponseParser.pk_addr(app_client.response().data)
|
||||||
|
|
||||||
with app_client.personal_sign(BIP32_PATH, msg.encode('utf-8')):
|
with app_client.personal_sign(BIP32_PATH, msg.encode('utf-8')):
|
||||||
scenario.review_approve(screenshot_path, test_name, "Sign")
|
scenario.review_approve(test_name=test_name, custom_screen_text="Sign")
|
||||||
|
|
||||||
# verify signature
|
# verify signature
|
||||||
vrs = ResponseParser.signature(app_client.response().data)
|
vrs = ResponseParser.signature(app_client.response().data)
|
||||||
@@ -37,29 +35,26 @@ def common(backend: BackendInterface,
|
|||||||
|
|
||||||
def test_personal_sign_metamask(backend: BackendInterface,
|
def test_personal_sign_metamask(backend: BackendInterface,
|
||||||
scenario_navigator: NavigateWithScenario,
|
scenario_navigator: NavigateWithScenario,
|
||||||
test_name: str,
|
test_name: str):
|
||||||
default_screenshot_path: Path):
|
|
||||||
|
|
||||||
msg = "Example `personal_sign` message"
|
msg = "Example `personal_sign` message"
|
||||||
common(backend, scenario_navigator, test_name, default_screenshot_path, msg)
|
common(backend, scenario_navigator, test_name, msg)
|
||||||
|
|
||||||
|
|
||||||
def test_personal_sign_non_ascii(backend: BackendInterface,
|
def test_personal_sign_non_ascii(backend: BackendInterface,
|
||||||
scenario_navigator: NavigateWithScenario,
|
scenario_navigator: NavigateWithScenario,
|
||||||
test_name: str,
|
test_name: str):
|
||||||
default_screenshot_path: Path):
|
|
||||||
|
|
||||||
msg = "0x9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658"
|
msg = "0x9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658"
|
||||||
common(backend, scenario_navigator, test_name, default_screenshot_path, msg)
|
common(backend, scenario_navigator, test_name, msg)
|
||||||
|
|
||||||
|
|
||||||
def test_personal_sign_opensea(firmware: Firmware,
|
def test_personal_sign_opensea(firmware: Firmware,
|
||||||
backend: BackendInterface,
|
backend: BackendInterface,
|
||||||
scenario_navigator: NavigateWithScenario,
|
scenario_navigator: NavigateWithScenario,
|
||||||
test_name: str,
|
test_name: str):
|
||||||
default_screenshot_path: Path):
|
|
||||||
|
|
||||||
if firmware.device == "nanos":
|
if firmware == Firmware.NANOS:
|
||||||
pytest.skip("Not supported on LNS")
|
pytest.skip("Not supported on LNS")
|
||||||
|
|
||||||
msg = "Welcome to OpenSea!\n\n"
|
msg = "Welcome to OpenSea!\n\n"
|
||||||
@@ -67,14 +62,12 @@ def test_personal_sign_opensea(firmware: Firmware,
|
|||||||
msg += "This request will not trigger a blockchain transaction or cost any gas fees.\n\n"
|
msg += "This request will not trigger a blockchain transaction or cost any gas fees.\n\n"
|
||||||
msg += "Your authentication status will reset after 24 hours.\n\n"
|
msg += "Your authentication status will reset after 24 hours.\n\n"
|
||||||
msg += "Wallet address:\n0x9858effd232b4033e47d90003d41ec34ecaeda94\n\nNonce:\n2b02c8a0-f74f-4554-9821-a28054dc9121"
|
msg += "Wallet address:\n0x9858effd232b4033e47d90003d41ec34ecaeda94\n\nNonce:\n2b02c8a0-f74f-4554-9821-a28054dc9121"
|
||||||
common(backend, scenario_navigator, test_name, default_screenshot_path, msg)
|
common(backend, scenario_navigator, test_name, msg)
|
||||||
|
|
||||||
|
|
||||||
def test_personal_sign_reject(firmware: Firmware,
|
def test_personal_sign_reject(firmware: Firmware,
|
||||||
backend: BackendInterface,
|
backend: BackendInterface,
|
||||||
scenario_navigator: NavigateWithScenario,
|
scenario_navigator: NavigateWithScenario):
|
||||||
test_name: str,
|
|
||||||
default_screenshot_path: Path):
|
|
||||||
|
|
||||||
msg = "This is an reject sign"
|
msg = "This is an reject sign"
|
||||||
|
|
||||||
@@ -82,11 +75,11 @@ def test_personal_sign_reject(firmware: Firmware,
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
with app_client.personal_sign(BIP32_PATH, msg.encode('utf-8')):
|
with app_client.personal_sign(BIP32_PATH, msg.encode('utf-8')):
|
||||||
if firmware.device.startswith("nano"):
|
if firmware.is_nano:
|
||||||
end_text = "Cancel"
|
end_text = "Cancel"
|
||||||
else:
|
else:
|
||||||
end_text = "Sign"
|
end_text = "Sign"
|
||||||
scenario_navigator.review_reject(default_screenshot_path, test_name, end_text)
|
scenario_navigator.review_reject(custom_screen_text=end_text)
|
||||||
|
|
||||||
except ExceptionRAPDU as e:
|
except ExceptionRAPDU as e:
|
||||||
assert e.status == StatusWord.CONDITION_NOT_SATISFIED
|
assert e.status == StatusWord.CONDITION_NOT_SATISFIED
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ def test_eip712_legacy(backend: BackendInterface, scenario_navigator: NavigateWi
|
|||||||
|
|
||||||
def autonext(firmware: Firmware, navigator: Navigator, default_screenshot_path: Path):
|
def autonext(firmware: Firmware, navigator: Navigator, default_screenshot_path: Path):
|
||||||
moves = []
|
moves = []
|
||||||
if firmware.device.startswith("nano"):
|
if firmware.is_nano:
|
||||||
moves = [NavInsID.RIGHT_CLICK]
|
moves = [NavInsID.RIGHT_CLICK]
|
||||||
else:
|
else:
|
||||||
moves = [NavInsID.SWIPE_CENTER_TO_LEFT]
|
moves = [NavInsID.SWIPE_CENTER_TO_LEFT]
|
||||||
@@ -123,10 +123,10 @@ def eip712_new_common(firmware: Firmware,
|
|||||||
golden_run)
|
golden_run)
|
||||||
with app_client.eip712_sign_new(BIP32_PATH):
|
with app_client.eip712_sign_new(BIP32_PATH):
|
||||||
moves = []
|
moves = []
|
||||||
if firmware.device.startswith("nano"):
|
if firmware.is_nano:
|
||||||
# need to skip the message hash
|
# need to skip the message hash
|
||||||
if not verbose and filters is None:
|
if not verbose and filters is None:
|
||||||
moves = [NavInsID.RIGHT_CLICK] * 2
|
moves += [NavInsID.RIGHT_CLICK] * 2
|
||||||
moves += [NavInsID.BOTH_CLICK]
|
moves += [NavInsID.BOTH_CLICK]
|
||||||
else:
|
else:
|
||||||
# this move is necessary most of the times, but can't be 100% sure with the fields grouping
|
# this move is necessary most of the times, but can't be 100% sure with the fields grouping
|
||||||
@@ -159,7 +159,7 @@ def test_eip712_new(firmware: Firmware,
|
|||||||
verbose: bool,
|
verbose: bool,
|
||||||
filtering: bool):
|
filtering: bool):
|
||||||
app_client = EthAppClient(backend)
|
app_client = EthAppClient(backend)
|
||||||
if firmware.device == "nanos":
|
if firmware == Firmware.NANOS:
|
||||||
pytest.skip("Not supported on LNS")
|
pytest.skip("Not supported on LNS")
|
||||||
|
|
||||||
test_path = f"{input_file.parent}/{'-'.join(input_file.stem.split('-')[:-1])}"
|
test_path = f"{input_file.parent}/{'-'.join(input_file.stem.split('-')[:-1])}"
|
||||||
@@ -420,7 +420,7 @@ def test_eip712_advanced_filtering(firmware: Firmware,
|
|||||||
global SNAPS_CONFIG
|
global SNAPS_CONFIG
|
||||||
|
|
||||||
app_client = EthAppClient(backend)
|
app_client = EthAppClient(backend)
|
||||||
if firmware.device == "nanos":
|
if firmware == Firmware.NANOS:
|
||||||
pytest.skip("Not supported on LNS")
|
pytest.skip("Not supported on LNS")
|
||||||
|
|
||||||
SNAPS_CONFIG = SnapshotsConfig(test_name + data_set.suffix)
|
SNAPS_CONFIG = SnapshotsConfig(test_name + data_set.suffix)
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
from pathlib import Path
|
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
@@ -36,27 +35,25 @@ def chain_fixture(request) -> Optional[int]:
|
|||||||
)
|
)
|
||||||
def test_get_pk_rejected(backend: BackendInterface,
|
def test_get_pk_rejected(backend: BackendInterface,
|
||||||
scenario_navigator: NavigateWithScenario,
|
scenario_navigator: NavigateWithScenario,
|
||||||
default_screenshot_path: Path,
|
|
||||||
path,
|
path,
|
||||||
suffix):
|
suffix):
|
||||||
app_client = EthAppClient(backend)
|
app_client = EthAppClient(backend)
|
||||||
|
|
||||||
with pytest.raises(ExceptionRAPDU) as e:
|
with pytest.raises(ExceptionRAPDU) as e:
|
||||||
with app_client.get_public_addr(bip32_path=path):
|
with app_client.get_public_addr(bip32_path=path):
|
||||||
scenario_navigator.address_review_reject(default_screenshot_path, f"get_pk_rejected_{suffix}")
|
scenario_navigator.address_review_reject(test_name=f"get_pk_rejected_{suffix}")
|
||||||
|
|
||||||
assert e.value.status == StatusWord.CONDITION_NOT_SATISFIED
|
assert e.value.status == StatusWord.CONDITION_NOT_SATISFIED
|
||||||
|
|
||||||
|
|
||||||
def test_get_pk(backend: BackendInterface,
|
def test_get_pk(backend: BackendInterface,
|
||||||
default_screenshot_path: Path,
|
|
||||||
scenario_navigator: NavigateWithScenario,
|
scenario_navigator: NavigateWithScenario,
|
||||||
with_chaincode: bool,
|
with_chaincode: bool,
|
||||||
chain: Optional[int]):
|
chain: Optional[int]):
|
||||||
app_client = EthAppClient(backend)
|
app_client = EthAppClient(backend)
|
||||||
|
|
||||||
with app_client.get_public_addr(chaincode=with_chaincode, chain_id=chain):
|
with app_client.get_public_addr(chaincode=with_chaincode, chain_id=chain):
|
||||||
scenario_navigator.address_review_approve(default_screenshot_path, f"get_pk_{chain}")
|
scenario_navigator.address_review_approve(test_name=f"get_pk_{chain}")
|
||||||
|
|
||||||
pk, _, chaincode = ResponseParser.pk_addr(app_client.response().data, with_chaincode)
|
pk, _, chaincode = ResponseParser.pk_addr(app_client.response().data, with_chaincode)
|
||||||
ref_pk, ref_chaincode = calculate_public_key_and_chaincode(curve=CurveChoice.Secp256k1,
|
ref_pk, ref_chaincode = calculate_public_key_and_chaincode(curve=CurveChoice.Secp256k1,
|
||||||
@@ -69,18 +66,17 @@ def test_get_pk(backend: BackendInterface,
|
|||||||
def test_get_eth2_pk(firmware: Firmware,
|
def test_get_eth2_pk(firmware: Firmware,
|
||||||
backend: BackendInterface,
|
backend: BackendInterface,
|
||||||
scenario_navigator: NavigateWithScenario,
|
scenario_navigator: NavigateWithScenario,
|
||||||
test_name: str,
|
test_name: str):
|
||||||
default_screenshot_path: Path):
|
|
||||||
|
|
||||||
app_client = EthAppClient(backend)
|
app_client = EthAppClient(backend)
|
||||||
|
|
||||||
path="m/12381/3600/0/0"
|
path="m/12381/3600/0/0"
|
||||||
with app_client.get_eth2_public_addr(bip32_path=path):
|
with app_client.get_eth2_public_addr(bip32_path=path):
|
||||||
scenario_navigator.address_review_approve(default_screenshot_path, test_name)
|
scenario_navigator.address_review_approve(test_name=test_name)
|
||||||
|
|
||||||
pk = app_client.response().data
|
pk = app_client.response().data
|
||||||
ref_pk = bls.SkToPk(mnemonic_and_path_to_key(SPECULOS_MNEMONIC, path))
|
ref_pk = bls.SkToPk(mnemonic_and_path_to_key(SPECULOS_MNEMONIC, path))
|
||||||
if firmware.name in ("stax", "flex"):
|
if firmware in (Firmware.STAX, Firmware.FLEX):
|
||||||
pk = pk[1:49]
|
pk = pk[1:49]
|
||||||
|
|
||||||
assert pk == ref_pk
|
assert pk == ref_pk
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
from pathlib import Path
|
|
||||||
from typing import Callable, Optional, Any
|
from typing import Callable, Optional, Any
|
||||||
import json
|
import json
|
||||||
import pytest
|
import pytest
|
||||||
@@ -51,7 +50,6 @@ class Action:
|
|||||||
def common_test_nft(firmware: Firmware,
|
def common_test_nft(firmware: Firmware,
|
||||||
backend: BackendInterface,
|
backend: BackendInterface,
|
||||||
scenario_navigator: NavigateWithScenario,
|
scenario_navigator: NavigateWithScenario,
|
||||||
default_screenshot_path: Path,
|
|
||||||
collec: NFTCollection,
|
collec: NFTCollection,
|
||||||
action: Action,
|
action: Action,
|
||||||
reject: bool,
|
reject: bool,
|
||||||
@@ -59,7 +57,7 @@ def common_test_nft(firmware: Firmware,
|
|||||||
global DEVICE_ADDR
|
global DEVICE_ADDR
|
||||||
app_client = EthAppClient(backend)
|
app_client = EthAppClient(backend)
|
||||||
|
|
||||||
if firmware.device == "nanos":
|
if firmware == Firmware.NANOS:
|
||||||
pytest.skip("Not supported on LNS")
|
pytest.skip("Not supported on LNS")
|
||||||
|
|
||||||
if DEVICE_ADDR is None: # to only have to request it once
|
if DEVICE_ADDR is None: # to only have to request it once
|
||||||
@@ -86,13 +84,13 @@ def common_test_nft(firmware: Firmware,
|
|||||||
test_name = f"{plugin_name.lower()}_{action.fn_name}_{str(collec.chain_id)}"
|
test_name = f"{plugin_name.lower()}_{action.fn_name}_{str(collec.chain_id)}"
|
||||||
if reject:
|
if reject:
|
||||||
test_name += "-rejected"
|
test_name += "-rejected"
|
||||||
scenario_navigator.review_reject(default_screenshot_path, test_name)
|
scenario_navigator.review_reject(test_name=test_name)
|
||||||
else:
|
else:
|
||||||
if firmware.device.startswith("nano"):
|
if firmware.is_nano:
|
||||||
end_text = "Accept"
|
end_text = "Accept"
|
||||||
else:
|
else:
|
||||||
end_text = "Sign"
|
end_text = "Sign"
|
||||||
scenario_navigator.review_approve(default_screenshot_path, test_name, end_text)
|
scenario_navigator.review_approve(test_name=test_name, custom_screen_text=end_text)
|
||||||
|
|
||||||
# verify signature
|
# verify signature
|
||||||
vrs = ResponseParser.signature(app_client.response().data)
|
vrs = ResponseParser.signature(app_client.response().data)
|
||||||
@@ -104,11 +102,10 @@ def common_test_nft_reject(test_fn: Callable,
|
|||||||
firmware: Firmware,
|
firmware: Firmware,
|
||||||
backend: BackendInterface,
|
backend: BackendInterface,
|
||||||
scenario_navigator: NavigateWithScenario,
|
scenario_navigator: NavigateWithScenario,
|
||||||
default_screenshot_path: Path,
|
|
||||||
collec: NFTCollection,
|
collec: NFTCollection,
|
||||||
action: Action):
|
action: Action):
|
||||||
with pytest.raises(ExceptionRAPDU) as e:
|
with pytest.raises(ExceptionRAPDU) as e:
|
||||||
test_fn(firmware, backend, scenario_navigator, default_screenshot_path, collec, action, True)
|
test_fn(firmware, backend, scenario_navigator, collec, action, True)
|
||||||
assert e.value.status == StatusWord.CONDITION_NOT_SATISFIED
|
assert e.value.status == StatusWord.CONDITION_NOT_SATISFIED
|
||||||
|
|
||||||
# ERC-721
|
# ERC-721
|
||||||
@@ -158,14 +155,12 @@ def action_721_fixture(request) -> Action:
|
|||||||
def test_erc721(firmware: Firmware,
|
def test_erc721(firmware: Firmware,
|
||||||
backend: BackendInterface,
|
backend: BackendInterface,
|
||||||
scenario_navigator: NavigateWithScenario,
|
scenario_navigator: NavigateWithScenario,
|
||||||
default_screenshot_path: Path,
|
|
||||||
collec_721: NFTCollection,
|
collec_721: NFTCollection,
|
||||||
action_721: Action,
|
action_721: Action,
|
||||||
reject: bool = False):
|
reject: bool = False):
|
||||||
common_test_nft(firmware,
|
common_test_nft(firmware,
|
||||||
backend,
|
backend,
|
||||||
scenario_navigator,
|
scenario_navigator,
|
||||||
default_screenshot_path,
|
|
||||||
collec_721,
|
collec_721,
|
||||||
action_721,
|
action_721,
|
||||||
reject,
|
reject,
|
||||||
@@ -174,13 +169,11 @@ def test_erc721(firmware: Firmware,
|
|||||||
|
|
||||||
def test_erc721_reject(firmware: Firmware,
|
def test_erc721_reject(firmware: Firmware,
|
||||||
backend: BackendInterface,
|
backend: BackendInterface,
|
||||||
scenario_navigator: NavigateWithScenario,
|
scenario_navigator: NavigateWithScenario):
|
||||||
default_screenshot_path: Path):
|
|
||||||
common_test_nft_reject(test_erc721,
|
common_test_nft_reject(test_erc721,
|
||||||
firmware,
|
firmware,
|
||||||
backend,
|
backend,
|
||||||
scenario_navigator,
|
scenario_navigator,
|
||||||
default_screenshot_path,
|
|
||||||
collecs_721[0],
|
collecs_721[0],
|
||||||
actions_721[0])
|
actions_721[0])
|
||||||
|
|
||||||
@@ -237,14 +230,12 @@ def action_1155_fixture(request) -> Action:
|
|||||||
def test_erc1155(firmware: Firmware,
|
def test_erc1155(firmware: Firmware,
|
||||||
backend: BackendInterface,
|
backend: BackendInterface,
|
||||||
scenario_navigator: NavigateWithScenario,
|
scenario_navigator: NavigateWithScenario,
|
||||||
default_screenshot_path: Path,
|
|
||||||
collec_1155: NFTCollection,
|
collec_1155: NFTCollection,
|
||||||
action_1155: Action,
|
action_1155: Action,
|
||||||
reject: bool = False):
|
reject: bool = False):
|
||||||
common_test_nft(firmware,
|
common_test_nft(firmware,
|
||||||
backend,
|
backend,
|
||||||
scenario_navigator,
|
scenario_navigator,
|
||||||
default_screenshot_path,
|
|
||||||
collec_1155,
|
collec_1155,
|
||||||
action_1155,
|
action_1155,
|
||||||
reject,
|
reject,
|
||||||
@@ -253,12 +244,10 @@ def test_erc1155(firmware: Firmware,
|
|||||||
|
|
||||||
def test_erc1155_reject(firmware: Firmware,
|
def test_erc1155_reject(firmware: Firmware,
|
||||||
backend: BackendInterface,
|
backend: BackendInterface,
|
||||||
scenario_navigator: NavigateWithScenario,
|
scenario_navigator: NavigateWithScenario):
|
||||||
default_screenshot_path: Path):
|
|
||||||
common_test_nft_reject(test_erc1155,
|
common_test_nft_reject(test_erc1155,
|
||||||
firmware,
|
firmware,
|
||||||
backend,
|
backend,
|
||||||
scenario_navigator,
|
scenario_navigator,
|
||||||
default_screenshot_path,
|
|
||||||
collecs_1155[0],
|
collecs_1155[0],
|
||||||
actions_1155[0])
|
actions_1155[0])
|
||||||
|
|||||||
@@ -46,18 +46,18 @@ def common(firmware: Firmware,
|
|||||||
_, DEVICE_ADDR, _ = ResponseParser.pk_addr(app_client.response().data)
|
_, DEVICE_ADDR, _ = ResponseParser.pk_addr(app_client.response().data)
|
||||||
|
|
||||||
with app_client.sign(path, tx_params):
|
with app_client.sign(path, tx_params):
|
||||||
if not firmware.device.startswith("nano") and confirm:
|
if not firmware.is_nano and confirm:
|
||||||
navigator.navigate_and_compare(default_screenshot_path,
|
navigator.navigate_and_compare(default_screenshot_path,
|
||||||
f"{test_name}/confirm",
|
f"{test_name}/confirm",
|
||||||
[NavInsID.USE_CASE_CHOICE_CONFIRM],
|
[NavInsID.USE_CASE_CHOICE_CONFIRM],
|
||||||
screen_change_after_last_instruction=False)
|
screen_change_after_last_instruction=False)
|
||||||
|
|
||||||
if firmware.device.startswith("nano"):
|
if firmware.is_nano:
|
||||||
end_text = "Accept"
|
end_text = "Accept"
|
||||||
else:
|
else:
|
||||||
end_text = "Sign"
|
end_text = "Sign"
|
||||||
|
|
||||||
scenario_navigator.review_approve(default_screenshot_path, test_name, end_text, (test_name != ""))
|
scenario_navigator.review_approve(custom_screen_text=end_text, do_comparison=test_name!="")
|
||||||
|
|
||||||
# verify signature
|
# verify signature
|
||||||
vrs = ResponseParser.signature(app_client.response().data)
|
vrs = ResponseParser.signature(app_client.response().data)
|
||||||
@@ -67,15 +67,13 @@ def common(firmware: Firmware,
|
|||||||
|
|
||||||
def common_reject(backend: BackendInterface,
|
def common_reject(backend: BackendInterface,
|
||||||
scenario_navigator: NavigateWithScenario,
|
scenario_navigator: NavigateWithScenario,
|
||||||
default_screenshot_path: Path,
|
|
||||||
tx_params: dict,
|
tx_params: dict,
|
||||||
test_name: str,
|
|
||||||
path: str = BIP32_PATH):
|
path: str = BIP32_PATH):
|
||||||
app_client = EthAppClient(backend)
|
app_client = EthAppClient(backend)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with app_client.sign(path, tx_params):
|
with app_client.sign(path, tx_params):
|
||||||
scenario_navigator.review_reject(default_screenshot_path, test_name)
|
scenario_navigator.review_reject()
|
||||||
|
|
||||||
except ExceptionRAPDU as e:
|
except ExceptionRAPDU as e:
|
||||||
assert e.status == StatusWord.CONDITION_NOT_SATISFIED
|
assert e.status == StatusWord.CONDITION_NOT_SATISFIED
|
||||||
@@ -235,10 +233,7 @@ def test_sign_nonce_display(firmware: Firmware,
|
|||||||
common(firmware, backend, navigator, scenario_navigator, default_screenshot_path, tx_params, test_name, "m/44'/60'/1'/0/0")
|
common(firmware, backend, navigator, scenario_navigator, default_screenshot_path, tx_params, test_name, "m/44'/60'/1'/0/0")
|
||||||
|
|
||||||
|
|
||||||
def test_sign_reject(backend: BackendInterface,
|
def test_sign_reject(backend: BackendInterface, scenario_navigator: NavigateWithScenario):
|
||||||
scenario_navigator: NavigateWithScenario,
|
|
||||||
test_name: str,
|
|
||||||
default_screenshot_path: Path):
|
|
||||||
tx_params: dict = {
|
tx_params: dict = {
|
||||||
"nonce": NONCE2,
|
"nonce": NONCE2,
|
||||||
"gasPrice": Web3.to_wei(GAS_PRICE, 'gwei'),
|
"gasPrice": Web3.to_wei(GAS_PRICE, 'gwei'),
|
||||||
@@ -247,7 +242,7 @@ def test_sign_reject(backend: BackendInterface,
|
|||||||
"value": Web3.to_wei(AMOUNT2, "ether"),
|
"value": Web3.to_wei(AMOUNT2, "ether"),
|
||||||
"chainId": CHAIN_ID
|
"chainId": CHAIN_ID
|
||||||
}
|
}
|
||||||
common_reject(backend, scenario_navigator, default_screenshot_path, tx_params, test_name, "m/44'/60'/1'/0/0")
|
common_reject(backend, scenario_navigator, tx_params, "m/44'/60'/1'/0/0")
|
||||||
|
|
||||||
|
|
||||||
def test_sign_error_transaction_type(backend: BackendInterface):
|
def test_sign_error_transaction_type(backend: BackendInterface):
|
||||||
|
|||||||
Reference in New Issue
Block a user