1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-12-20 21:38:26 +00:00

feat(tests): fix and extend translations tests

[no changelog]
This commit is contained in:
grdddj 2024-02-13 10:09:17 +01:00 committed by Jiří Musil
parent 294b6e6666
commit f4538b9426

View File

@ -30,7 +30,12 @@ pytestmark = pytest.mark.skip_t1
MAX_DATA_LENGTH = {models.T2T1: 48 * 1024, models.T2B1: 32 * 1024} MAX_DATA_LENGTH = {models.T2T1: 48 * 1024, models.T2B1: 32 * 1024}
def get_confirm(lang: str) -> str: def get_ping_button(lang: str) -> str:
content = get_lang_json(lang)
return content["translations"]["buttons__confirm"]
def get_ping_title(lang: str) -> str:
content = get_lang_json(lang) content = get_lang_json(lang)
return content["translations"]["words__confirm"] return content["translations"]["words__confirm"]
@ -64,12 +69,8 @@ def _check_ping_screen_texts(client: Client, title: str, right_button: str) -> N
assert ping == messages.Success(message="ahoj!") assert ping == messages.Success(message="ahoj!")
def test_change_language_errors(client: Client): def test_error_too_long(client: Client):
# TODO: check invalid signature
# TODO: may split it into multiple tests
assert client.features.language == "en-US" assert client.features.language == "en-US"
# Translations too long # Translations too long
# Sending more than allowed by the flash capacity # Sending more than allowed by the flash capacity
max_length = MAX_DATA_LENGTH[client.model] max_length = MAX_DATA_LENGTH[client.model]
@ -77,7 +78,11 @@ def test_change_language_errors(client: Client):
bad_data = (max_length + 1) * b"a" bad_data = (max_length + 1) * b"a"
device.change_language(client, language_data=bad_data) device.change_language(client, language_data=bad_data)
assert client.features.language == "en-US" assert client.features.language == "en-US"
_check_ping_screen_texts(client, get_ping_title("en"), get_ping_button("en"))
def test_error_invalid_data_length(client: Client):
assert client.features.language == "en-US"
# Invalid data length # Invalid data length
# Sending more data than advertised in the header # Sending more data than advertised in the header
with pytest.raises(exceptions.TrezorFailure, match="Invalid data length"), client: with pytest.raises(exceptions.TrezorFailure, match="Invalid data length"), client:
@ -85,18 +90,30 @@ def test_change_language_errors(client: Client):
bad_data = good_data + b"abcd" bad_data = good_data + b"abcd"
device.change_language(client, language_data=bad_data) device.change_language(client, language_data=bad_data)
assert client.features.language == "en-US" assert client.features.language == "en-US"
_check_ping_screen_texts(client, get_ping_title("en"), get_ping_button("en"))
def test_error_invalid_header_magic(client: Client):
assert client.features.language == "en-US"
# Invalid header magic # Invalid header magic
# Does not match the expected magic # Does not match the expected magic
with pytest.raises(exceptions.TrezorFailure, match="DataError"), client: with pytest.raises(
exceptions.TrezorFailure, match="Invalid translations data"
), client:
good_data = build_and_sign_blob("cs", client.model) good_data = build_and_sign_blob("cs", client.model)
bad_data = 4 * b"a" + good_data[4:] bad_data = 4 * b"a" + good_data[4:]
device.change_language(client, language_data=bad_data) device.change_language(client, language_data=bad_data)
assert client.features.language == "en-US" assert client.features.language == "en-US"
_check_ping_screen_texts(client, get_ping_title("en"), get_ping_button("en"))
def test_error_invalid_data_hash(client: Client):
assert client.features.language == "en-US"
# Invalid data hash # Invalid data hash
# Changing the data after their hash has been calculated # Changing the data after their hash has been calculated
with pytest.raises(exceptions.TrezorFailure, match="DataError"), client: with pytest.raises(
exceptions.TrezorFailure, match="Translation data verification failed"
), client:
good_data = build_and_sign_blob("cs", client.model) good_data = build_and_sign_blob("cs", client.model)
bad_data = good_data[:-8] + 8 * b"a" bad_data = good_data[:-8] + 8 * b"a"
device.change_language( device.change_language(
@ -104,7 +121,11 @@ def test_change_language_errors(client: Client):
language_data=bad_data, language_data=bad_data,
) )
assert client.features.language == "en-US" assert client.features.language == "en-US"
_check_ping_screen_texts(client, get_ping_title("en"), get_ping_button("en"))
def test_error_version_mismatch(client: Client):
assert client.features.language == "en-US"
# Translations version mismatch # Translations version mismatch
# Change the version to one not matching the current device # Change the version to one not matching the current device
with pytest.raises( with pytest.raises(
@ -117,7 +138,11 @@ def test_change_language_errors(client: Client):
language_data=build_and_sign_blob(data, client.model), language_data=build_and_sign_blob(data, client.model),
) )
assert client.features.language == "en-US" assert client.features.language == "en-US"
_check_ping_screen_texts(client, get_ping_title("en"), get_ping_button("en"))
def test_error_invalid_header_version(client: Client):
assert client.features.language == "en-US"
# Invalid header version # Invalid header version
# Version is not a valid semver with integers # Version is not a valid semver with integers
with pytest.raises(ValueError), client: with pytest.raises(ValueError), client:
@ -128,8 +153,25 @@ def test_change_language_errors(client: Client):
language_data=build_and_sign_blob(data, client.model), language_data=build_and_sign_blob(data, client.model),
) )
assert client.features.language == "en-US" assert client.features.language == "en-US"
_check_ping_screen_texts(client, get_ping_title("en"), get_ping_button("en"))
_check_ping_screen_texts(client, get_confirm("en"), get_confirm("en"))
def test_error_invalid_signature(client: Client):
assert client.features.language == "en-US"
# Invalid signature
# Changing the data in the signature section
with pytest.raises(
exceptions.TrezorFailure, match="Invalid translations data"
), client:
good_data = bytearray(build_and_sign_blob("cs", client.model))
bad_data = bytearray(good_data)
bad_data[128:256] = 128 * b"a"
device.change_language(
client,
language_data=bytes(bad_data),
)
assert client.features.language == "en-US"
_check_ping_screen_texts(client, get_ping_title("en"), get_ping_button("en"))
@pytest.mark.parametrize("lang", LANGUAGES) @pytest.mark.parametrize("lang", LANGUAGES)
@ -139,24 +181,24 @@ def test_full_language_change(client: Client, lang: str):
# Setting selected language # Setting selected language
set_language(client, lang) set_language(client, lang)
assert client.features.language[:2] == lang assert client.features.language[:2] == lang
_check_ping_screen_texts(client, get_confirm(lang), get_confirm(lang)) _check_ping_screen_texts(client, get_ping_title(lang), get_ping_button(lang))
# Setting the default language via empty data # Setting the default language via empty data
set_language(client, "en") set_language(client, "en")
assert client.features.language == "en-US" assert client.features.language == "en-US"
_check_ping_screen_texts(client, get_confirm("en"), get_confirm("en")) _check_ping_screen_texts(client, get_ping_title("en"), get_ping_button("en"))
def test_language_is_removed_after_wipe(client: Client): def test_language_is_removed_after_wipe(client: Client):
assert client.features.language == "en-US" assert client.features.language == "en-US"
_check_ping_screen_texts(client, get_confirm("en"), get_confirm("en")) _check_ping_screen_texts(client, get_ping_title("en"), get_ping_button("en"))
# Setting cs language # Setting cs language
set_language(client, "cs") set_language(client, "cs")
assert client.features.language == "cs-CZ" assert client.features.language == "cs-CZ"
_check_ping_screen_texts(client, get_confirm("cs"), get_confirm("cs")) _check_ping_screen_texts(client, get_ping_title("cs"), get_ping_button("cs"))
# Wipe device # Wipe device
device.wipe(client) device.wipe(client)
@ -172,7 +214,7 @@ def test_language_is_removed_after_wipe(client: Client):
) )
assert client.features.language == "en-US" assert client.features.language == "en-US"
_check_ping_screen_texts(client, get_confirm("en"), get_confirm("en")) _check_ping_screen_texts(client, get_ping_title("en"), get_ping_button("en"))
def test_translations_renders_on_screen(client: Client): def test_translations_renders_on_screen(client: Client):
@ -182,12 +224,12 @@ def test_translations_renders_on_screen(client: Client):
assert client.features.language == "en-US" assert client.features.language == "en-US"
# Normal english # Normal english
_check_ping_screen_texts(client, get_confirm("en"), get_confirm("en")) _check_ping_screen_texts(client, get_ping_title("en"), get_ping_button("en"))
# Normal czech # Normal czech
set_language(client, "cs") set_language(client, "cs")
assert client.features.language == "cs-CZ" assert client.features.language == "cs-CZ"
_check_ping_screen_texts(client, get_confirm("cs"), get_confirm("cs")) _check_ping_screen_texts(client, get_ping_title("cs"), get_ping_button("cs"))
# Modified czech - changed value # Modified czech - changed value
czech_data_copy = deepcopy(czech_data) czech_data_copy = deepcopy(czech_data)
@ -197,7 +239,7 @@ def test_translations_renders_on_screen(client: Client):
client, client,
language_data=build_and_sign_blob(czech_data_copy, client.model), language_data=build_and_sign_blob(czech_data_copy, client.model),
) )
_check_ping_screen_texts(client, new_czech_confirm, get_confirm("cs")) _check_ping_screen_texts(client, new_czech_confirm, get_ping_button("cs"))
# Modified czech - key deleted completely, english is shown # Modified czech - key deleted completely, english is shown
czech_data_copy = deepcopy(czech_data) czech_data_copy = deepcopy(czech_data)
@ -206,7 +248,7 @@ def test_translations_renders_on_screen(client: Client):
client, client,
language_data=build_and_sign_blob(czech_data_copy, client.model), language_data=build_and_sign_blob(czech_data_copy, client.model),
) )
_check_ping_screen_texts(client, get_confirm("en"), get_confirm("cs")) _check_ping_screen_texts(client, get_ping_title("en"), get_ping_button("cs"))
def test_reject_update(client: Client): def test_reject_update(client: Client):
@ -224,7 +266,7 @@ def test_reject_update(client: Client):
assert client.features.language == "en-US" assert client.features.language == "en-US"
_check_ping_screen_texts(client, get_confirm("en"), get_confirm("en")) _check_ping_screen_texts(client, get_ping_title("en"), get_ping_button("en"))
def test_silent_update(client: Client): def test_silent_update(client: Client):
@ -301,4 +343,4 @@ def test_silent_update(client: Client):
device.change_language(client, language_data) device.change_language(client, language_data)
assert client.features.language[:2] == lang assert client.features.language[:2] == lang
_check_ping_screen_texts(client, get_confirm(lang), get_confirm(lang)) _check_ping_screen_texts(client, get_ping_title(lang), get_ping_button(lang))