stabilize tests

This commit is contained in:
scgbckbone 2026-06-21 20:11:38 +02:00 committed by doc-hex
parent 64658621bb
commit 74d34cfcf7
5 changed files with 68 additions and 54 deletions

View File

@ -2244,7 +2244,7 @@ def verify_backup_file(goto_home, pick_menu_item, cap_story, need_keypress):
# Check on-device verify UX works.
goto_home()
pick_menu_item('Advanced/Tools')
pick_menu_item('Backup')
pick_menu_item('File Management')
pick_menu_item('Verify Backup')
time.sleep(0.1)
pick_menu_item(os.path.basename(fn))

View File

@ -631,8 +631,9 @@ def policy_sign(start_sign, end_sign, cap_story, get_last_violation):
@pytest.mark.parametrize("mag", [1000000, None, 2])
def test_ccc_magnitude(mag_ok, mag, setup_ccc, ccc_ms_setup,
bitcoind, settings_set, policy_sign,
bitcoind_create_watch_only_wallet):
bitcoind_create_watch_only_wallet, goto_home):
goto_home()
settings_set("ccc", None)
settings_set("chain", "XRT")
settings_set("multisig", [])
@ -669,8 +670,8 @@ def test_ccc_magnitude(mag_ok, mag, setup_ccc, ccc_ms_setup,
@pytest.mark.parametrize("whitelist_ok", [True, False])
def test_ccc_whitelist(whitelist_ok, setup_ccc, ccc_ms_setup,
bitcoind, settings_set, policy_sign,
bitcoind_create_watch_only_wallet):
bitcoind_create_watch_only_wallet, goto_home):
goto_home()
settings_set("ccc", None)
settings_set("chain", "XRT")
settings_set("multisig", [])
@ -704,9 +705,9 @@ def test_ccc_whitelist(whitelist_ok, setup_ccc, ccc_ms_setup,
def test_ccc_whitelist_nfc_import(setup_ccc, settings_set, pick_menu_item, cap_story,
cap_menu, press_select, press_nfc, nfc_write_text,
settings_get, skip_if_useless_way, is_q1):
settings_get, skip_if_useless_way, is_q1, goto_home):
skip_if_useless_way("nfc")
goto_home()
settings_set("ccc", None)
addr = "bcrt1qlk39jrclgnawa42tvhu2n7se987qm96qg8v76e"
@ -753,8 +754,8 @@ def test_ccc_whitelist_nfc_import(setup_ccc, settings_set, pick_menu_item, cap_s
def test_ccc_velocity(velocity_mi, setup_ccc, ccc_ms_setup, bitcoind, settings_set,
policy_sign, settings_get, bitcoind_create_watch_only_wallet,
enter_enabled_ccc, pick_menu_item, cap_story, need_keypress,
press_select, press_cancel):
press_select, press_cancel, goto_home):
goto_home()
settings_set("ccc", None)
settings_set("chain", "XRT")
settings_set("multisig", [])
@ -857,8 +858,8 @@ def test_ccc_velocity(velocity_mi, setup_ccc, ccc_ms_setup, bitcoind, settings_s
@pytest.mark.bitcoind
def test_ccc_warnings(setup_ccc, ccc_ms_setup, bitcoind, settings_set, policy_sign,
bitcoind_create_watch_only_wallet, settings_get):
bitcoind_create_watch_only_wallet, settings_get, goto_home):
goto_home()
settings_set("ccc", None)
settings_set("chain", "XRT")
settings_set("multisig", [])
@ -917,9 +918,10 @@ def test_ccc_warnings(setup_ccc, ccc_ms_setup, bitcoind, settings_set, policy_si
def test_maxed_out(settings_set, setup_ccc, enter_enabled_ccc, ccc_ms_setup, sim_exec,
bitcoind, settings_get, load_export, press_cancel, restore_main_seed,
bitcoind_create_watch_only_wallet, policy_sign, goto_eph_seed_menu,
pick_menu_item, word_menu_entry, press_select, import_multisig):
pick_menu_item, word_menu_entry, press_select, import_multisig, goto_home):
# - maxed out values: 24 words, 25 whitelisted p2wsh values
goto_home()
settings_set("ccc", None)
settings_set("chain", "XRT")
settings_set("multisig", [])
@ -980,10 +982,11 @@ def test_maxed_out(settings_set, setup_ccc, enter_enabled_ccc, ccc_ms_setup, sim
def test_ccc_whitelist_overlimit_no_mutation(settings_set, setup_ccc, enter_enabled_ccc,
ccc_ms_setup, bitcoind_create_watch_only_wallet,
settings_get, pick_menu_item, cap_menu, cap_story,
cap_screen, scan_a_qr, press_select, press_cancel,
is_q1, microsd_path, need_keypress, restore_main_seed):
cap_screen, scan_a_qr, press_select, press_cancel, goto_home,
is_q1, microsd_path, need_keypress):
# An over-limit whitelist import must be rejected WITHOUT having already
# mutated the (settings-backed) policy address list.
goto_home()
settings_set("ccc", None)
settings_set("chain", "XRT")
settings_set("multisig", [])
@ -1039,15 +1042,15 @@ def test_ccc_whitelist_overlimit_no_mutation(settings_set, setup_ccc, enter_enab
press_cancel()
press_cancel()
restore_main_seed()
@pytest.mark.parametrize("seed_vault", [True, False])
def test_load_and_sign_key_C(settings_set, setup_ccc, enter_enabled_ccc, ccc_ms_setup, sim_exec,
bitcoind_create_watch_only_wallet, pick_menu_item, load_export,
cap_story, press_cancel, bitcoind, policy_sign, restore_main_seed,
verify_ephemeral_secret_ui, word_menu_entry, import_multisig,
verify_ephemeral_secret_ui, word_menu_entry, import_multisig, goto_home,
press_select, settings_get, seed_vault, confirm_tmp_seed):
goto_home()
settings_set("ccc", None)
settings_set("chain", "XRT")
settings_set("multisig", [])
@ -1384,10 +1387,11 @@ def test_ms_setup_cosigner_import(way, ftype, is_bbqr, N, goto_home, settings_se
def test_ccc_challenge_qr_bad_checksum_crash(setup_ccc, goto_ccc_menu, cap_story, need_keypress,
press_select, press_cancel, scan_a_qr, sim_exec,
settings_set, is_q1):
settings_set, is_q1, goto_home):
if not is_q1:
pytest.skip('Q1 only (QR scan path)')
goto_home()
settings_set('ccc', None)
settings_set('seedvault', False) # avoid seed-vault bypass path
@ -1426,8 +1430,9 @@ def test_ccc_challenge_qr_bad_checksum_crash(setup_ccc, goto_ccc_menu, cap_story
def test_ccc_magnitude_cancel_preserves_value(setup_ccc, enter_enabled_ccc, settings_set,
settings_get, pick_menu_item, cap_menu,
settings_get, pick_menu_item, cap_menu, goto_home,
press_select, press_cancel, press_delete):
goto_home()
settings_set('ccc', None)
c_words = setup_ccc(mag=1) # 1 BTC magnitude
@ -1452,12 +1457,12 @@ def test_ccc_magnitude_cancel_preserves_value(setup_ccc, enter_enabled_ccc, sett
mag = settings_get('ccc')['pol']['mag']
assert mag == 1
settings_set('ccc', None)
@pytest.mark.bitcoind
def test_ccc_whitelist_op_return(setup_ccc, ccc_ms_setup, bitcoind, settings_set,
policy_sign, bitcoind_create_watch_only_wallet):
policy_sign, bitcoind_create_watch_only_wallet,
goto_home):
goto_home()
settings_set("ccc", None)
settings_set("chain", "XRT")
settings_set("multisig", [])

View File

@ -388,7 +388,7 @@ def test_huge_notes(size, encoding, goto_notes, enter_text, cap_menu, need_keypr
time.sleep(.5) # decompression time in some cases
m = cap_menu()
assert m[-2] == 'Export'
assert 'Export' in m
notes = settings_get('notes')
assert len(notes) == 1
@ -700,6 +700,7 @@ def test_sign_note_body(msg, addr_fmt, acct, need_some_notes,
def test_send_password_menu_item(need_some_passwords, goto_notes, cap_menu, pick_menu_item,
settings_set, settings_remove, press_cancel):
# covers regression where "Send Password" menu item was only shown when USB was disabled
settings_set("notes", [])
need_some_passwords()
settings_set('du', 1)

View File

@ -3616,15 +3616,19 @@ def test_tx_explorer_goto_idx_single_item_yikes(mi, fake_txn, start_sign, cap_st
menu = cap_menu()
assert "Inputs" in menu
assert "Outputs" in menu
press_cancel()
press_cancel()
def test_tx_explorer_goto_idx(fake_txn, start_sign, cap_story, use_testnet, need_keypress,
pick_menu_item, cap_screen, enter_number, press_cancel, is_q1):
pick_menu_item, cap_screen, enter_number, press_cancel, is_q1,
goto_home):
use_testnet()
num_ins = 27
num_outs = 32
psbt = fake_txn(num_ins, num_outs, segwit_in=True, change_outputs=[0])
goto_home()
start_sign(psbt)
title, story = cap_story()
assert title == "OK TO SEND?"
@ -3686,7 +3690,7 @@ def test_tx_explorer_goto_idx(fake_txn, start_sign, cap_story, use_testnet, need
def test_input_explorer_foreign_bad_sighash(fake_txn, start_sign, cap_story,
need_keypress, pick_menu_item, press_cancel,
use_testnet):
use_testnet, goto_home):
# PSBT has a foreign input (not ours) carrying a PSBT_IN_SIGHASH_TYPE value
# outside ALL_SIGHASH_FLAGS. consider_dangerous_sighash() only validates
# our-key inputs, so the PSBT passes validation and reaches the approval UX.
@ -3703,6 +3707,7 @@ def test_input_explorer_foreign_bad_sighash(fake_txn, start_sign, cap_story,
psbt.inputs[0].sighash = 0x05
psbt = fake_txn(2, 2, segwit_in=True, psbt_hacker=hack)
goto_home()
start_sign(psbt)
time.sleep(.1)
title, _ = cap_story()
@ -3745,7 +3750,9 @@ def test_txn_nVersion_zero(segwit, fake_txn, start_sign, cap_story, goto_home):
@pytest.mark.parametrize("segwit_in", [True, False])
@pytest.mark.parametrize("num_ins", [2, 110])
def test_duplicate_inputs(segwit_in, num_ins, fake_txn, start_sign, end_sign, cap_story):
def test_duplicate_inputs(segwit_in, num_ins, fake_txn, start_sign, end_sign, cap_story,
goto_home):
goto_home()
psbt = fake_txn(num_ins, 2, segwit_in=segwit_in, dupe_ins=[num_ins-1])
start_sign(psbt)
title, story = cap_story()
@ -3755,7 +3762,8 @@ def test_duplicate_inputs(segwit_in, num_ins, fake_txn, start_sign, end_sign, ca
assert title == "OK TO SEND?"
def test_txid_qr(fake_txn, start_sign, cap_story, press_cancel, press_select):
def test_txid_qr(fake_txn, start_sign, cap_story, press_cancel, press_select, goto_home):
goto_home()
psbt = fake_txn(1, 2, change_outputs=[0])
start_sign(psbt, finalize=False)
press_select() # confirm signing

View File

@ -1056,48 +1056,48 @@ def test_qr_share_files(fname, pick_menu_item, goto_home, is_q1, cap_menu, cap_s
@pytest.mark.parametrize("way", ["nfc", "qr"])
def test_share_binary_txn_file(way, goto_home, pick_menu_item, src_root_dir, sim_root_dir,
press_select, cap_story, cap_screen_qr, is_q1,
nfc_read, nfc_block4rf):
press_select, cap_story, cap_screen_qr, is_q1,enable_nfc,
nfc_read, nfc_block4rf, garbage_collector):
if way == "qr" and not is_q1:
pytest.skip("QR share is Q1 only")
if way == "nfc":
enable_nfc()
with open(f"{src_root_dir}/testing/data/devils-txn.txn", "r") as f:
binary = bytes.fromhex(f.read().strip())
assert binary[2:8] != bytes(6)
fname = "binary-l01.txn"
dst = f"{sim_root_dir}/MicroSD/{fname}"
garbage_collector.append(dst)
with open(dst, "wb") as f:
f.write(binary)
try:
goto_home()
pick_menu_item("Advanced/Tools")
pick_menu_item("File Management")
pick_menu_item("NFC File Share" if way == "nfc" else "QR File Share")
time.sleep(.1)
pick_menu_item(fname)
time.sleep(.2)
goto_home()
pick_menu_item("Advanced/Tools")
pick_menu_item("File Management")
pick_menu_item("NFC File Share" if way == "nfc" else "QR File Share")
time.sleep(.1)
pick_menu_item(fname)
time.sleep(.2)
title, story = cap_story()
assert "ERROR" not in title
title, story = cap_story()
assert "ERROR" not in title
if way == "nfc":
nfc_block4rf()
res = nfc_read()
got_txn = None
for got in ndef.message_decoder(res):
if got.type == 'urn:nfc:ext:bitcoin.org:txn':
got_txn = bytes(got.data)
break
assert got_txn == binary
press_select()
else:
qr = cap_screen_qr()
assert qr.decode().lower() == b2a_hex(binary).decode().lower()
finally:
try: os.remove(dst)
except OSError: pass
if way == "nfc":
nfc_block4rf()
res = nfc_read()
got_txn = None
for got in ndef.message_decoder(res):
if got.type == 'urn:nfc:ext:bitcoin.org:txn':
got_txn = bytes(got.data)
break
assert got_txn == binary
press_select()
else:
qr = cap_screen_qr()
assert qr.decode().lower() == b2a_hex(binary).decode().lower()
@pytest.mark.parametrize("word,cs_word", [
@ -1120,11 +1120,11 @@ def test_q1_24_8char_words(set_seed_words, is_q1, goto_home, pick_menu_item, pre
if not is_q1:
raise pytest.skip("only Q")
goto_home()
# longest words in wordlist_en have 8 chars
words = ([word] * 23) + [cs_word]
set_seed_words(" ".join(words))
goto_home()
pick_menu_item("Advanced/Tools")
pick_menu_item("Danger Zone")
pick_menu_item("Seed Functions")