mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-20 21:38:26 +00:00
167 lines
4.5 KiB
Python
167 lines
4.5 KiB
Python
|
from __future__ import annotations
|
||
|
|
||
|
import re
|
||
|
from dataclasses import dataclass
|
||
|
from pathlib import Path
|
||
|
from typing import Callable
|
||
|
|
||
|
HERE = Path(__file__).resolve().parent
|
||
|
|
||
|
TEST_FILE = HERE / "test-nonenglish.yml"
|
||
|
|
||
|
LANGS = {
|
||
|
"cs": "czech",
|
||
|
"fr": "french",
|
||
|
"de": "german",
|
||
|
"es": "spanish",
|
||
|
}
|
||
|
|
||
|
MODELS = ["T", "R"]
|
||
|
|
||
|
|
||
|
@dataclass
|
||
|
class Replacement:
|
||
|
start: str
|
||
|
end: str
|
||
|
replacement: str
|
||
|
|
||
|
|
||
|
def replace_content_between_markers(
|
||
|
file_path: Path | str, replacements: list[Replacement]
|
||
|
) -> None:
|
||
|
with open(file_path, "r") as file:
|
||
|
content = file.read()
|
||
|
|
||
|
for replace in replacements:
|
||
|
pattern = rf"({replace.start}.*?{replace.end})"
|
||
|
content = re.sub(
|
||
|
pattern,
|
||
|
f"{replace.start}\n{replace.replacement}\n{replace.end}",
|
||
|
content,
|
||
|
flags=re.DOTALL,
|
||
|
)
|
||
|
|
||
|
with open(file_path, "w") as file:
|
||
|
file.write(content)
|
||
|
|
||
|
|
||
|
def get_device_test(lang: str, model: str) -> str:
|
||
|
lang_long = LANGS[lang]
|
||
|
|
||
|
model_or_empty = f" {model}" if model != "T" else ""
|
||
|
model_needs_or_empty = f" {model}" if model != "T" else ""
|
||
|
|
||
|
return f"""\
|
||
|
core device{model_or_empty} test {lang_long}:
|
||
|
stage: test
|
||
|
<<: *gitlab_caching
|
||
|
needs:
|
||
|
- core unix frozen{model_needs_or_empty} debug build
|
||
|
variables:
|
||
|
TREZOR_PROFILING: "1" # so that we get coverage data
|
||
|
TREZOR_MODEL: "{model}"
|
||
|
MULTICORE: "4" # more could interfere with other jobs
|
||
|
TEST_LANG: "{lang}" # {lang_long}
|
||
|
only:
|
||
|
- schedules # nightly build
|
||
|
- /translations/ # translations branches
|
||
|
script:
|
||
|
- $NIX_SHELL --run "poetry run make -C core test_emu_ui_multicore | ts -s"
|
||
|
after_script:
|
||
|
- mv core/src/.coverage.* core # there will be more coverage files (one per core)
|
||
|
- mv tests/ui_tests/reports/test/ test_ui_report
|
||
|
- $NIX_SHELL --run "poetry run python ci/prepare_ui_artifacts.py | ts -s"
|
||
|
- diff -u tests/ui_tests/fixtures.json tests/ui_tests/fixtures.suggestion.json
|
||
|
artifacts:
|
||
|
name: "$CI_JOB_NAME-$CI_COMMIT_SHORT_SHA"
|
||
|
paths:
|
||
|
- ci/ui_test_records/
|
||
|
- test_ui_report
|
||
|
- tests/ui_tests/screens/
|
||
|
- tests/ui_tests/fixtures.suggestion.json
|
||
|
- tests/ui_tests/fixtures.results.json
|
||
|
- tests/junit.xml
|
||
|
- tests/trezor.log
|
||
|
- core/.coverage.*
|
||
|
when: always
|
||
|
expire_in: 1 week
|
||
|
reports:
|
||
|
junit: tests/junit.xml
|
||
|
"""
|
||
|
|
||
|
|
||
|
def get_click_test(lang: str, model: str) -> str:
|
||
|
lang_long = LANGS[lang]
|
||
|
|
||
|
model_or_empty = f" {model}" if model != "T" else ""
|
||
|
model_needs_or_empty = f" {model}" if model != "T" else ""
|
||
|
|
||
|
return f"""\
|
||
|
core click{model_or_empty} test {lang_long}:
|
||
|
stage: test
|
||
|
<<: *gitlab_caching
|
||
|
needs:
|
||
|
- core unix frozen{model_needs_or_empty} debug build
|
||
|
variables:
|
||
|
TREZOR_PROFILING: "1" # so that we get coverage data
|
||
|
TREZOR_MODEL: "{model}"
|
||
|
TEST_LANG: "{lang}" # {lang_long}
|
||
|
only:
|
||
|
- schedules # nightly build
|
||
|
- /translations/ # translations branches
|
||
|
script:
|
||
|
- $NIX_SHELL --run "poetry run make -C core test_emu_click_ui | ts -s"
|
||
|
after_script:
|
||
|
- mv core/src/.coverage core/.coverage.test_click
|
||
|
- mv tests/ui_tests/reports/test/ test_ui_report
|
||
|
- $NIX_SHELL --run "poetry run python ci/prepare_ui_artifacts.py | ts -s"
|
||
|
- diff -u tests/ui_tests/fixtures.json tests/ui_tests/fixtures.suggestion.json
|
||
|
artifacts:
|
||
|
name: "$CI_JOB_NAME-$CI_COMMIT_SHORT_SHA"
|
||
|
paths:
|
||
|
- ci/ui_test_records/
|
||
|
- test_ui_report
|
||
|
- tests/ui_tests/screens/
|
||
|
- tests/ui_tests/fixtures.suggestion.json
|
||
|
- tests/ui_tests/fixtures.results.json
|
||
|
- tests/trezor.log
|
||
|
- tests/junit.xml
|
||
|
- core/.coverage.*
|
||
|
reports:
|
||
|
junit: tests/junit.xml
|
||
|
expire_in: 1 week
|
||
|
when: always
|
||
|
"""
|
||
|
|
||
|
|
||
|
def get_all_tests_text(func: Callable[[str, str], str]) -> str:
|
||
|
text = ""
|
||
|
for model in MODELS:
|
||
|
for lang in LANGS:
|
||
|
content = func(lang, model)
|
||
|
text += content + "\n"
|
||
|
return text
|
||
|
|
||
|
|
||
|
def fill_device_tests() -> None:
|
||
|
replacement = Replacement(
|
||
|
start=r"##START_DEVICE_TESTS",
|
||
|
end=r"##END_DEVICE_TESTS",
|
||
|
replacement=get_all_tests_text(get_device_test),
|
||
|
)
|
||
|
replace_content_between_markers(TEST_FILE, [replacement])
|
||
|
|
||
|
|
||
|
def fill_click_tests() -> None:
|
||
|
replacement = Replacement(
|
||
|
start=r"##START_CLICK_TESTS",
|
||
|
end=r"##END_CLICK_TESTS",
|
||
|
replacement=get_all_tests_text(get_click_test),
|
||
|
)
|
||
|
replace_content_between_markers(TEST_FILE, [replacement])
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
fill_device_tests()
|
||
|
fill_click_tests()
|