Skip to content

Commit cf3c5c3

Browse files
Improve ragger tests
- Use defined firmware instead of strings - Fix compatibility with Python 3.9 - Fix test navigation steps
1 parent fee187d commit cf3c5c3

File tree

9 files changed

+62
-92
lines changed

9 files changed

+62
-92
lines changed

tests/ragger/conftest.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import sys
22
from pathlib import Path
3+
from os import path
34
import warnings
45
import glob
56

@@ -17,8 +18,8 @@ def pytest_addoption(parser):
1718
parser.addoption("--with_lib_mode", action="store_true", help="Run the test with Library Mode")
1819

1920

20-
parent: Path = Path(__file__).parent
21-
testFiles = glob.glob("test_*.py", root_dir=f"{parent}")
21+
pattern = f"{Path(__file__).parent}/test_*.py"
22+
testFiles = [path.basename(x) for x in glob.glob(pattern)]
2223
collect_ignore = []
2324
if "--with_lib_mode" in sys.argv:
2425

tests/ragger/setup.cfg

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ disable = C0114, # missing-module-docstring
88
C0103, # invalid-name
99
R0801, # duplicate-code
1010
R0903, # too-few-public-methods
11+
R0904, # too-many-public-methods
12+
R0911, # too-many-statements
13+
R0912, # too-many-branches
1114
R0913, # too-many-arguments
1215
R0914, # too-many-locals
1316
W0603, # global-statement

tests/ragger/test_blind_sign.py

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from ragger.backend import BackendInterface
88
from ragger.firmware import Firmware
99
from ragger.navigator import Navigator, NavInsID
10-
from ragger.navigator.navigation_scenario import NavigateWithScenario
1110
from ragger.error import ExceptionRAPDU
1211

1312
from constants import ABIS_FOLDER
@@ -77,8 +76,8 @@ def test_blind_sign(firmware: Firmware,
7776
test_name += "_rejected"
7877

7978
moves = []
80-
if firmware.device.startswith("nano"):
81-
if firmware.device == "nanos":
79+
if firmware.is_nano:
80+
if firmware == Firmware.NANOS:
8281
moves += [NavInsID.RIGHT_CLICK] * 2
8382
else:
8483
moves += [NavInsID.RIGHT_CLICK] * 4
@@ -89,13 +88,13 @@ def test_blind_sign(firmware: Firmware,
8988
moves += [NavInsID.BOTH_CLICK]
9089

9190
if sign:
92-
if firmware.device == "nanos":
91+
if firmware == Firmware.NANOS:
9392
moves += [NavInsID.RIGHT_CLICK] * 10
9493
else:
9594
moves += [NavInsID.RIGHT_CLICK] * 6
9695
moves += [NavInsID.BOTH_CLICK]
9796
else:
98-
if firmware.device == "stax":
97+
if firmware == Firmware.STAX:
9998
tap_number = 2
10099
else:
101100
tap_number = 3
@@ -126,7 +125,7 @@ def test_blind_sign_reject_in_risk_review(firmware: Firmware,
126125
test_name: str):
127126
app_client = EthAppClient(backend)
128127

129-
if firmware.device not in ["stax", "flex"]:
128+
if firmware.is_nano:
130129
pytest.skip("Not supported on non-NBGL apps")
131130

132131
try:
@@ -146,7 +145,6 @@ def test_blind_sign_reject_in_risk_review(firmware: Firmware,
146145
def test_sign_parameter_selector(firmware: Firmware,
147146
backend: BackendInterface,
148147
navigator: Navigator,
149-
scenario_navigator: NavigateWithScenario,
150148
test_name: str,
151149
default_screenshot_path: Path):
152150
global DEVICE_ADDR
@@ -168,8 +166,8 @@ def test_sign_parameter_selector(firmware: Firmware,
168166
flows += data_len // 32
169167
with app_client.sign(BIP32_PATH, tx_params):
170168
moves = []
171-
if firmware.device.startswith("nano"):
172-
if firmware.device == "nanos":
169+
if firmware.is_nano:
170+
if firmware == Firmware.NANOS:
173171
moves += [NavInsID.RIGHT_CLICK] * 2 + [NavInsID.BOTH_CLICK]
174172
# Parameters on Nano S are split on multiple pages, hardcoded because the two parameters don't use the
175173
# same amount of pages because of non-monospace fonts
@@ -178,19 +176,19 @@ def test_sign_parameter_selector(firmware: Firmware,
178176
else:
179177
moves += ([NavInsID.RIGHT_CLICK] * 2 + [NavInsID.BOTH_CLICK]) * flows
180178

181-
if firmware.device == "nanos":
179+
if firmware == Firmware.NANOS:
182180
moves += [NavInsID.RIGHT_CLICK] * 2
183181
else:
184182
moves += [NavInsID.RIGHT_CLICK] * 4
185183
moves += [NavInsID.BOTH_CLICK]
186184

187-
if firmware.device == "nanos":
185+
if firmware == Firmware.NANOS:
188186
moves += [NavInsID.RIGHT_CLICK] * 9
189187
else:
190188
moves += [NavInsID.RIGHT_CLICK] * 5
191189
moves += [NavInsID.BOTH_CLICK]
192190
else:
193-
if firmware.device == "stax":
191+
if firmware == Firmware.STAX:
194192
tap_number = 2
195193
else:
196194
tap_number = 3

tests/ragger/test_domain_name.py

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from pathlib import Path
21
import pytest
32
from web3 import Web3
43

@@ -33,7 +32,7 @@ def verbose_fixture(request) -> bool:
3332

3433
def common(firmware: Firmware, app_client: EthAppClient) -> int:
3534

36-
if firmware.device == "nanos":
35+
if firmware == Firmware.NANOS:
3736
pytest.skip("Not supported on LNS")
3837
challenge = app_client.get_challenge()
3938
return ResponseParser.challenge(challenge.data)
@@ -43,7 +42,6 @@ def test_send_fund(firmware: Firmware,
4342
backend: BackendInterface,
4443
navigator: Navigator,
4544
scenario_navigator: NavigateWithScenario,
46-
default_screenshot_path: Path,
4745
verbose: bool):
4846
app_client = EthAppClient(backend)
4947
challenge = common(firmware, app_client)
@@ -62,12 +60,12 @@ def test_send_fund(firmware: Firmware,
6260
"value": Web3.to_wei(AMOUNT, "ether"),
6361
"chainId": CHAIN_ID
6462
}):
65-
if firmware.device.startswith("nano"):
63+
if firmware.is_nano:
6664
end_text = "Accept"
6765
else:
6866
end_text = "Sign"
6967

70-
scenario_navigator.review_approve(default_screenshot_path, f"domain_name_verbose_{str(verbose)}", end_text)
68+
scenario_navigator.review_approve(test_name=f"domain_name_verbose_{str(verbose)}", custom_screen_text=end_text)
7169

7270

7371
def test_send_fund_wrong_challenge(firmware: Firmware, backend: BackendInterface):
@@ -81,8 +79,7 @@ def test_send_fund_wrong_challenge(firmware: Firmware, backend: BackendInterface
8179

8280
def test_send_fund_wrong_addr(firmware: Firmware,
8381
backend: BackendInterface,
84-
scenario_navigator: NavigateWithScenario,
85-
default_screenshot_path: Path):
82+
scenario_navigator: NavigateWithScenario):
8683
app_client = EthAppClient(backend)
8784
challenge = common(firmware, app_client)
8885

@@ -100,18 +97,17 @@ def test_send_fund_wrong_addr(firmware: Firmware,
10097
"value": Web3.to_wei(AMOUNT, "ether"),
10198
"chainId": CHAIN_ID
10299
}):
103-
if firmware.device.startswith("nano"):
100+
if firmware.is_nano:
104101
end_text = "Accept"
105102
else:
106103
end_text = "Sign"
107104

108-
scenario_navigator.review_approve(default_screenshot_path, "domain_name_wrong_addr", end_text)
105+
scenario_navigator.review_approve(test_name="domain_name_wrong_addr", custom_screen_text=end_text)
109106

110107

111108
def test_send_fund_non_mainnet(firmware: Firmware,
112109
backend: BackendInterface,
113-
scenario_navigator: NavigateWithScenario,
114-
default_screenshot_path: Path):
110+
scenario_navigator: NavigateWithScenario):
115111
app_client = EthAppClient(backend)
116112
challenge = common(firmware, app_client)
117113

@@ -126,18 +122,17 @@ def test_send_fund_non_mainnet(firmware: Firmware,
126122
"value": Web3.to_wei(AMOUNT, "ether"),
127123
"chainId": 5
128124
}):
129-
if firmware.device.startswith("nano"):
125+
if firmware.is_nano:
130126
end_text = "Accept"
131127
else:
132128
end_text = "Sign"
133129

134-
scenario_navigator.review_approve(default_screenshot_path, "domain_name_non_mainnet", end_text)
130+
scenario_navigator.review_approve(test_name="domain_name_non_mainnet", custom_screen_text=end_text)
135131

136132

137133
def test_send_fund_unknown_chain(firmware: Firmware,
138134
backend: BackendInterface,
139-
scenario_navigator: NavigateWithScenario,
140-
default_screenshot_path: Path):
135+
scenario_navigator: NavigateWithScenario):
141136
app_client = EthAppClient(backend)
142137
challenge = common(firmware, app_client)
143138

@@ -152,12 +147,12 @@ def test_send_fund_unknown_chain(firmware: Firmware,
152147
"value": Web3.to_wei(AMOUNT, "ether"),
153148
"chainId": 9
154149
}):
155-
if firmware.device.startswith("nano"):
150+
if firmware.is_nano:
156151
end_text = "Accept"
157152
else:
158153
end_text = "Sign"
159154

160-
scenario_navigator.review_approve(default_screenshot_path, "domain_name_unknown_chain", end_text)
155+
scenario_navigator.review_approve(test_name="domain_name_unknown_chain", custom_screen_text=end_text)
161156

162157

163158
def test_send_fund_domain_too_long(firmware: Firmware, backend: BackendInterface):

tests/ragger/test_eip191.py

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from pathlib import Path
21
import pytest
32

43
from ragger.error import ExceptionRAPDU
@@ -17,7 +16,6 @@
1716
def common(backend: BackendInterface,
1817
scenario: NavigateWithScenario,
1918
test_name: str,
20-
screenshot_path: Path,
2119
msg: str):
2220

2321
app_client = EthAppClient(backend)
@@ -27,7 +25,7 @@ def common(backend: BackendInterface,
2725
_, DEVICE_ADDR, _ = ResponseParser.pk_addr(app_client.response().data)
2826

2927
with app_client.personal_sign(BIP32_PATH, msg.encode('utf-8')):
30-
scenario.review_approve(screenshot_path, test_name, "Sign")
28+
scenario.review_approve(test_name=test_name, custom_screen_text="Sign")
3129

3230
# verify signature
3331
vrs = ResponseParser.signature(app_client.response().data)
@@ -37,56 +35,51 @@ def common(backend: BackendInterface,
3735

3836
def test_personal_sign_metamask(backend: BackendInterface,
3937
scenario_navigator: NavigateWithScenario,
40-
test_name: str,
41-
default_screenshot_path: Path):
38+
test_name: str):
4239

4340
msg = "Example `personal_sign` message"
44-
common(backend, scenario_navigator, test_name, default_screenshot_path, msg)
41+
common(backend, scenario_navigator, test_name, msg)
4542

4643

4744
def test_personal_sign_non_ascii(backend: BackendInterface,
4845
scenario_navigator: NavigateWithScenario,
49-
test_name: str,
50-
default_screenshot_path: Path):
46+
test_name: str):
5147

5248
msg = "0x9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658"
53-
common(backend, scenario_navigator, test_name, default_screenshot_path, msg)
49+
common(backend, scenario_navigator, test_name, msg)
5450

5551

5652
def test_personal_sign_opensea(firmware: Firmware,
5753
backend: BackendInterface,
5854
scenario_navigator: NavigateWithScenario,
59-
test_name: str,
60-
default_screenshot_path: Path):
55+
test_name: str):
6156

62-
if firmware.device == "nanos":
57+
if firmware == Firmware.NANOS:
6358
pytest.skip("Not supported on LNS")
6459

6560
msg = "Welcome to OpenSea!\n\n"
6661
msg += "Click to sign in and accept the OpenSea Terms of Service: https://opensea.io/tos\n\n"
6762
msg += "This request will not trigger a blockchain transaction or cost any gas fees.\n\n"
6863
msg += "Your authentication status will reset after 24 hours.\n\n"
6964
msg += "Wallet address:\n0x9858effd232b4033e47d90003d41ec34ecaeda94\n\nNonce:\n2b02c8a0-f74f-4554-9821-a28054dc9121"
70-
common(backend, scenario_navigator, test_name, default_screenshot_path, msg)
65+
common(backend, scenario_navigator, test_name, msg)
7166

7267

7368
def test_personal_sign_reject(firmware: Firmware,
7469
backend: BackendInterface,
75-
scenario_navigator: NavigateWithScenario,
76-
test_name: str,
77-
default_screenshot_path: Path):
70+
scenario_navigator: NavigateWithScenario):
7871

7972
msg = "This is an reject sign"
8073

8174
app_client = EthAppClient(backend)
8275

8376
try:
8477
with app_client.personal_sign(BIP32_PATH, msg.encode('utf-8')):
85-
if firmware.device.startswith("nano"):
78+
if firmware.is_nano:
8679
end_text = "Cancel"
8780
else:
8881
end_text = "Sign"
89-
scenario_navigator.review_reject(default_screenshot_path, test_name, end_text)
82+
scenario_navigator.review_reject(custom_screen_text=end_text)
9083

9184
except ExceptionRAPDU as e:
9285
assert e.status == StatusWord.CONDITION_NOT_SATISFIED

tests/ragger/test_eip712.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ def test_eip712_legacy(backend: BackendInterface, scenario_navigator: NavigateWi
9090

9191
def autonext(firmware: Firmware, navigator: Navigator, default_screenshot_path: Path):
9292
moves = []
93-
if firmware.device.startswith("nano"):
93+
if firmware.is_nano:
9494
moves = [NavInsID.RIGHT_CLICK]
9595
else:
9696
moves = [NavInsID.SWIPE_CENTER_TO_LEFT]
@@ -123,10 +123,10 @@ def eip712_new_common(firmware: Firmware,
123123
golden_run)
124124
with app_client.eip712_sign_new(BIP32_PATH):
125125
moves = []
126-
if firmware.device.startswith("nano"):
126+
if firmware.is_nano:
127127
# need to skip the message hash
128128
if not verbose and filters is None:
129-
moves = [NavInsID.RIGHT_CLICK] * 2
129+
moves += [NavInsID.RIGHT_CLICK] * 2
130130
moves += [NavInsID.BOTH_CLICK]
131131
else:
132132
# 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,
159159
verbose: bool,
160160
filtering: bool):
161161
app_client = EthAppClient(backend)
162-
if firmware.device == "nanos":
162+
if firmware == Firmware.NANOS:
163163
pytest.skip("Not supported on LNS")
164164

165165
test_path = f"{input_file.parent}/{'-'.join(input_file.stem.split('-')[:-1])}"
@@ -420,7 +420,7 @@ def test_eip712_advanced_filtering(firmware: Firmware,
420420
global SNAPS_CONFIG
421421

422422
app_client = EthAppClient(backend)
423-
if firmware.device == "nanos":
423+
if firmware == Firmware.NANOS:
424424
pytest.skip("Not supported on LNS")
425425

426426
SNAPS_CONFIG = SnapshotsConfig(test_name + data_set.suffix)

0 commit comments

Comments
 (0)