From 40a2c2ce9347eaefedd3c66d0be400069c0acbf1 Mon Sep 17 00:00:00 2001 From: matejcik Date: Fri, 15 Nov 2019 15:54:16 +0100 Subject: [PATCH] tests: improve clicktests --- tests/click_tests/__init__.py | 4 + tests/click_tests/reset.py | 43 ++-- .../click_tests/test_reset_slip39_advanced.py | 210 +++++++++--------- 3 files changed, 132 insertions(+), 125 deletions(-) diff --git a/tests/click_tests/__init__.py b/tests/click_tests/__init__.py index e69de29bb..6ea27fa22 100644 --- a/tests/click_tests/__init__.py +++ b/tests/click_tests/__init__.py @@ -0,0 +1,4 @@ +import pytest + +pytest.register_assert_rewrite("tests.click_tests.reset") +pytest.register_assert_rewrite("tests.click_tests.recovery") diff --git a/tests/click_tests/reset.py b/tests/click_tests/reset.py index 93b02d28a..2ff682b03 100644 --- a/tests/click_tests/reset.py +++ b/tests/click_tests/reset.py @@ -35,21 +35,24 @@ def read_words(debug, is_advanced=False): assert layout.text.startswith("Group") else: assert layout.text.startswith("Recovery share") - for i in range(6): - lines = debug.read_layout().lines - if i == 0: - words.append(read_word(lines[3])) - words.append(read_word(lines[4])) - debug.input(swipe=messages.DebugSwipeDirection.UP, wait=True) - elif i == 5: - words.append(read_word(lines[1])) - words.append(read_word(lines[2])) - else: - words.append(read_word(lines[1])) - words.append(read_word(lines[2])) - words.append(read_word(lines[3])) - words.append(read_word(lines[4])) - debug.input(swipe=messages.DebugSwipeDirection.UP, wait=True) + + lines = layout.lines + # first screen + words.append(read_word(lines[3])) + words.append(read_word(lines[4])) + lines = debug.input(swipe=messages.DebugSwipeDirection.UP, wait=True).lines + + # screens 2 through + for _ in range(4): + words.append(read_word(lines[1])) + words.append(read_word(lines[2])) + words.append(read_word(lines[3])) + words.append(read_word(lines[4])) + lines = debug.input(swipe=messages.DebugSwipeDirection.UP, wait=True).lines + + # final screen + words.append(read_word(lines[1])) + words.append(read_word(lines[2])) debug.press_yes() return words @@ -57,11 +60,13 @@ def read_words(debug, is_advanced=False): def confirm_words(debug, words): layout = debug.wait_layout() - layout.text.startswith("Check share") + assert "Select word" in layout.text for _ in range(3): - word_pos = int(debug.state().layout_lines[1].split()[2]) - button_pos = debug.state().layout_lines.index(words[word_pos - 1]) - 2 - debug.click(buttons.RESET_WORD_CHECK[button_pos], wait=True) + # "Select word 3 of 20" + # ^ + word_pos = int(layout.lines[1].split()[2]) + button_pos = layout.lines.index(words[word_pos - 1]) - 2 + layout = debug.click(buttons.RESET_WORD_CHECK[button_pos], wait=True) def validate_mnemonics(mnemonics, expected_ems): diff --git a/tests/click_tests/test_reset_slip39_advanced.py b/tests/click_tests/test_reset_slip39_advanced.py index feea93e99..2630a80d1 100644 --- a/tests/click_tests/test_reset_slip39_advanced.py +++ b/tests/click_tests/test_reset_slip39_advanced.py @@ -26,168 +26,166 @@ from . import reset EXTERNAL_ENTROPY = b"zlutoucky kun upel divoke ody" * 2 +with_mock_urandom = mock.patch("os.urandom", mock.Mock(return_value=EXTERNAL_ENTROPY)) + @pytest.mark.skip_t1 @pytest.mark.setup_client(uninitialized=True) +@with_mock_urandom def test_reset_slip39_advanced_2of2groups_2of2shares(device_handler): features = device_handler.features() debug = device_handler.debuglink() assert features.initialized is False - os_urandom = mock.Mock(return_value=EXTERNAL_ENTROPY) - with mock.patch("os.urandom", os_urandom), device_handler: - device_handler.run( - device.reset, - strength=128, - backup_type=messages.BackupType.Slip39_Advanced, - pin_protection=False, - ) + device_handler.run( + device.reset, + backup_type=messages.BackupType.Slip39_Advanced, + pin_protection=False, + ) - # confirm new wallet - reset.confirm_wait(debug, "Create new wallet") + # confirm new wallet + reset.confirm_wait(debug, "Create new wallet") - # confirm back up - reset.confirm_wait(debug, "Success") + # confirm back up + reset.confirm_wait(debug, "Success") - # confirm checklist - reset.confirm_read(debug, "Checklist") + # confirm checklist + reset.confirm_read(debug, "Checklist") - # set num of groups - reset.set_selection(debug, buttons.RESET_MINUS, 3) + # set num of groups + reset.set_selection(debug, buttons.RESET_MINUS, 3) - # confirm checklist - reset.confirm_read(debug, "Checklist") + # confirm checklist + reset.confirm_read(debug, "Checklist") - # set group threshold - reset.set_selection(debug, buttons.RESET_MINUS, 0) + # set group threshold + reset.set_selection(debug, buttons.RESET_MINUS, 0) - # confirm checklist - reset.confirm_read(debug, "Checklist") + # confirm checklist + reset.confirm_read(debug, "Checklist") - # set share num and threshold for groups - for _ in range(2): - # set num of shares - reset.set_selection(debug, buttons.RESET_MINUS, 3) + # set share num and threshold for groups + for _ in range(2): + # set num of shares + reset.set_selection(debug, buttons.RESET_MINUS, 3) - # set share threshold - reset.set_selection(debug, buttons.RESET_MINUS, 0) + # set share threshold + reset.set_selection(debug, buttons.RESET_MINUS, 0) - # confirm backup warning - reset.confirm_read(debug, "Caution") + # confirm backup warning + reset.confirm_read(debug, "Caution") - all_words = [] + all_words = [] + for _ in range(2): for _ in range(2): - for _ in range(2): - # read words - words = reset.read_words(debug, True) + # read words + words = reset.read_words(debug, True) - # confirm words - reset.confirm_words(debug, words) + # confirm words + reset.confirm_words(debug, words) - # confirm share checked - reset.confirm_read(debug, "Success") + # confirm share checked + reset.confirm_read(debug, "Success") - all_words.append(" ".join(words)) + all_words.append(" ".join(words)) - # confirm backup done - reset.confirm_read(debug, "Success") + # confirm backup done + reset.confirm_read(debug, "Success") - # generate secret locally - internal_entropy = debug.state().reset_entropy - secret = generate_entropy(128, internal_entropy, EXTERNAL_ENTROPY) + # generate secret locally + internal_entropy = debug.state().reset_entropy + secret = generate_entropy(128, internal_entropy, EXTERNAL_ENTROPY) - # validate that all combinations will result in the correct master secret - reset.validate_mnemonics(all_words, secret) + # validate that all combinations will result in the correct master secret + reset.validate_mnemonics(all_words, secret) - assert device_handler.result() == "Initialized" + assert device_handler.result() == "Initialized" - features = device_handler.features() - assert features.initialized is True - assert features.needs_backup is False - assert features.pin_protection is False - assert features.passphrase_protection is False - assert features.backup_type is messages.BackupType.Slip39_Advanced + features = device_handler.features() + assert features.initialized is True + assert features.needs_backup is False + assert features.pin_protection is False + assert features.passphrase_protection is False + assert features.backup_type is messages.BackupType.Slip39_Advanced @pytest.mark.skip_t1 @pytest.mark.setup_client(uninitialized=True) +@with_mock_urandom def test_reset_slip39_advanced_16of16groups_16of16shares(device_handler): features = device_handler.features() debug = device_handler.debuglink() assert features.initialized is False - os_urandom = mock.Mock(return_value=EXTERNAL_ENTROPY) - with mock.patch("os.urandom", os_urandom), device_handler: - device_handler.run( - device.reset, - strength=128, - backup_type=messages.BackupType.Slip39_Advanced, - pin_protection=False, - ) + device_handler.run( + device.reset, + backup_type=messages.BackupType.Slip39_Advanced, + pin_protection=False, + ) - # confirm new wallet - reset.confirm_wait(debug, "Create new wallet") + # confirm new wallet + reset.confirm_wait(debug, "Create new wallet") - # confirm back up - reset.confirm_wait(debug, "Success") + # confirm back up + reset.confirm_wait(debug, "Success") - # confirm checklist - reset.confirm_read(debug, "Checklist") + # confirm checklist + reset.confirm_read(debug, "Checklist") - # set num of groups - reset.set_selection(debug, buttons.RESET_PLUS, 11) + # set num of groups + reset.set_selection(debug, buttons.RESET_PLUS, 11) - # confirm checklist - reset.confirm_read(debug, "Checklist") + # confirm checklist + reset.confirm_read(debug, "Checklist") - # set group threshold - reset.set_selection(debug, buttons.RESET_PLUS, 11) + # set group threshold + reset.set_selection(debug, buttons.RESET_PLUS, 11) - # confirm checklist - reset.confirm_read(debug, "Checklist") + # confirm checklist + reset.confirm_read(debug, "Checklist") - # set share num and threshold for groups - for _ in range(16): - # set num of shares - reset.set_selection(debug, buttons.RESET_PLUS, 11) + # set share num and threshold for groups + for _ in range(16): + # set num of shares + reset.set_selection(debug, buttons.RESET_PLUS, 11) - # set share threshold - reset.set_selection(debug, buttons.RESET_PLUS, 11) + # set share threshold + reset.set_selection(debug, buttons.RESET_PLUS, 11) - # confirm backup warning - reset.confirm_read(debug, "Caution") + # confirm backup warning + reset.confirm_read(debug, "Caution") - all_words = [] + all_words = [] + for _ in range(16): for _ in range(16): - for _ in range(16): - # read words - words = reset.read_words(debug, True) + # read words + words = reset.read_words(debug, True) - # confirm words - reset.confirm_words(debug, words) + # confirm words + reset.confirm_words(debug, words) - # confirm share checked - reset.confirm_read(debug, "Success") + # confirm share checked + reset.confirm_read(debug, "Success") - all_words.append(" ".join(words)) + all_words.append(" ".join(words)) - # confirm backup done - reset.confirm_read(debug, "Success") + # confirm backup done + reset.confirm_read(debug, "Success") - # generate secret locally - internal_entropy = debug.state().reset_entropy - secret = generate_entropy(128, internal_entropy, EXTERNAL_ENTROPY) + # generate secret locally + internal_entropy = debug.state().reset_entropy + secret = generate_entropy(128, internal_entropy, EXTERNAL_ENTROPY) - # validate that all combinations will result in the correct master secret - reset.validate_mnemonics(all_words, secret) + # validate that all combinations will result in the correct master secret + reset.validate_mnemonics(all_words, secret) - assert device_handler.result() == "Initialized" + assert device_handler.result() == "Initialized" - features = device_handler.features() - assert features.initialized is True - assert features.needs_backup is False - assert features.pin_protection is False - assert features.passphrase_protection is False - assert features.backup_type is messages.BackupType.Slip39_Advanced + features = device_handler.features() + assert features.initialized is True + assert features.needs_backup is False + assert features.pin_protection is False + assert features.passphrase_protection is False + assert features.backup_type is messages.BackupType.Slip39_Advanced