feat(tests): allow for coverage report even when emulator is controlled by the tests

Allowing tests to specify the profiling wrapper over the emulator
it is starting.

[no changelog]
grdddj/different_colors_for_old_display
grdddj 1 year ago committed by Jiří Musil
parent 315b6f9b06
commit 41e07769e2

@ -57,12 +57,12 @@ core device test:
needs: needs:
- core unix frozen debug build - core unix frozen debug build
variables: variables:
TREZOR_PROFILING: 1 TREZOR_PROFILING: 1 # so that we get coverage data
MULTICORE: 4 # more could interfere with other jobs MULTICORE: 4 # more could interfere with other jobs
script: script:
- $NIX_SHELL --run "poetry run make -C core test_emu_ui_multicore | ts -s" - $NIX_SHELL --run "poetry run make -C core test_emu_ui_multicore | ts -s"
after_script: after_script:
- mv core/src/.coverage core/.coverage.test_emu - mv core/src/.coverage.* core # there will be more coverage files (one per core)
- mv tests/ui_tests/reports/test/ test_ui_report - mv tests/ui_tests/reports/test/ test_ui_report
- $NIX_SHELL --run "poetry run python ci/prepare_ui_artifacts.py | ts -s" - $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 - diff -u tests/ui_tests/fixtures.json tests/ui_tests/fixtures.suggestion.json

@ -17,6 +17,7 @@
from __future__ import annotations from __future__ import annotations
import os import os
from pathlib import Path
from typing import TYPE_CHECKING, Generator from typing import TYPE_CHECKING, Generator
import pytest import pytest
@ -37,6 +38,10 @@ if TYPE_CHECKING:
from _pytest.config.argparsing import Parser from _pytest.config.argparsing import Parser
from _pytest.terminal import TerminalReporter from _pytest.terminal import TerminalReporter
HERE = Path(__file__).resolve().parent
# So that we see details of failed asserts from this module # So that we see details of failed asserts from this module
pytest.register_assert_rewrite("tests.common") pytest.register_assert_rewrite("tests.common")
@ -83,8 +88,23 @@ def emulator(request: pytest.FixtureRequest) -> Generator["Emulator", None, None
# 1. normal link, 2. debug link and 3. webauthn fake interface # 1. normal link, 2. debug link and 3. webauthn fake interface
return 20000 + int(worker_id[2:]) * 3 return 20000 + int(worker_id[2:]) * 3
# So that we can generate coverage reports
profiling = os.environ.get("TREZOR_PROFILING") == "1"
if profiling:
core_dir = HERE.parent / "core"
profiling_wrapper = core_dir / "prof" / "prof.py"
main_args = [str(profiling_wrapper)]
# So that the coverage reports have the correct paths
os.environ["TREZOR_SRC"] = str(core_dir / "src")
else:
main_args = ["-m", "main"]
with EmulatorWrapper( with EmulatorWrapper(
model, port=_get_port(), headless=True, auto_interact=not interact model,
port=_get_port(),
headless=True,
auto_interact=not interact,
main_args=main_args,
) as emu: ) as emu:
yield emu yield emu

@ -17,7 +17,7 @@
import tempfile import tempfile
from collections import defaultdict from collections import defaultdict
from pathlib import Path from pathlib import Path
from typing import Dict, List, Optional, Tuple from typing import Dict, List, Optional, Sequence, Tuple
from trezorlib._internal.emulator import CoreEmulator, Emulator, LegacyEmulator from trezorlib._internal.emulator import CoreEmulator, Emulator, LegacyEmulator
@ -75,6 +75,7 @@ class EmulatorWrapper:
port: Optional[int] = None, port: Optional[int] = None,
headless: bool = True, headless: bool = True,
auto_interact: bool = True, auto_interact: bool = True,
main_args: Sequence[str] = ("-m", "main"),
) -> None: ) -> None:
if tag is not None: if tag is not None:
executable = filename_from_tag(gen, tag) executable = filename_from_tag(gen, tag)
@ -107,6 +108,7 @@ class EmulatorWrapper:
port=port, port=port,
headless=headless, headless=headless,
auto_interact=auto_interact, auto_interact=auto_interact,
main_args=main_args,
) )
else: else:
raise ValueError( raise ValueError(

Loading…
Cancel
Save