diff --git a/.gitignore b/.gitignore index b8a8909c37..f70980b703 100644 --- a/.gitignore +++ b/.gitignore @@ -96,6 +96,8 @@ dependencies.lock managed_components # pytest log +pytest-embedded/ +# legacy one pytest_embedded_log/ list_job*.txt size_info*.txt diff --git a/.gitlab/ci/host-test.yml b/.gitlab/ci/host-test.yml index f4b3966d94..5658b97ac6 100644 --- a/.gitlab/ci/host-test.yml +++ b/.gitlab/ci/host-test.yml @@ -296,7 +296,7 @@ test_pytest_qemu: artifacts: paths: - XUNIT_RESULT.xml - - pytest_embedded_log/ + - pytest-embedded/ reports: junit: XUNIT_RESULT.xml allow_failure: true # IDFCI-1752 @@ -330,7 +330,7 @@ test_pytest_linux: artifacts: paths: - XUNIT_RESULT.xml - - pytest_embedded_log/ + - pytest-embedded/ - "**/build*/build_log.txt" reports: junit: XUNIT_RESULT.xml diff --git a/conftest.py b/conftest.py index 5270eb2dba..1fac842312 100644 --- a/conftest.py +++ b/conftest.py @@ -39,7 +39,8 @@ from dynamic_pipelines.constants import TEST_RELATED_APPS_DOWNLOAD_URLS_FILENAME from idf_ci.app import import_apps_from_txt from idf_ci.uploader import AppDownloader, AppUploader from idf_ci_utils import IDF_PATH, idf_relpath -from idf_pytest.constants import DEFAULT_SDKCONFIG, ENV_MARKERS, SPECIAL_MARKERS, TARGET_MARKERS, PytestCase +from idf_pytest.constants import DEFAULT_SDKCONFIG, ENV_MARKERS, SPECIAL_MARKERS, TARGET_MARKERS, PytestCase, \ + DEFAULT_LOGDIR from idf_pytest.plugin import IDF_PYTEST_EMBEDDED_KEY, ITEM_PYTEST_CASE_KEY, IdfPytestEmbedded from idf_pytest.utils import format_case_id from pytest_embedded.plugin import multi_dut_argument, multi_dut_fixture @@ -460,11 +461,12 @@ def pytest_runtest_makereport(item, call): # type: ignore job_id = os.getenv('CI_JOB_ID', 0) url = os.getenv('CI_PAGES_URL', '').replace('esp-idf', '-/esp-idf') - template = f'{url}/-/jobs/{job_id}/artifacts/pytest_embedded_log/{{}}' + template = f'{url}/-/jobs/{job_id}/artifacts/{DEFAULT_LOGDIR}/{{}}' logs_files = [] def get_path(x: str) -> str: - return x.split('pytest_embedded_log/', 1)[1] + return x.split(f'{DEFAULT_LOGDIR}/', 1)[1] + if isinstance(_dut, list): logs_files.extend([template.format(get_path(d.logfile)) for d in _dut]) dut_artifacts_url.append('{}:'.format(_dut[0].test_case_name)) diff --git a/pytest.ini b/pytest.ini index 82e028d894..069d1cf415 100644 --- a/pytest.ini +++ b/pytest.ini @@ -13,7 +13,7 @@ addopts = --logfile-extension ".txt" --check-duplicates y --ignore-glob */managed_components/* - --ignore pytest_embedded_log + --ignore pytest-embedded # ignore DeprecationWarning filterwarnings = diff --git a/tools/ci/dynamic_pipelines/templates/.dynamic_jobs.yml b/tools/ci/dynamic_pipelines/templates/.dynamic_jobs.yml index 72f0b76c20..4316648672 100644 --- a/tools/ci/dynamic_pipelines/templates/.dynamic_jobs.yml +++ b/tools/ci/dynamic_pipelines/templates/.dynamic_jobs.yml @@ -60,7 +60,7 @@ artifacts: paths: - XUNIT_RESULT*.xml - - pytest_embedded_log/ + - pytest-embedded/ # Child pipeline reports won't be collected in the main one # https://gitlab.com/groups/gitlab-org/-/epics/8205 # reports: diff --git a/tools/ci/idf_ci_utils.py b/tools/ci/idf_ci_utils.py index c865690a19..b355090ffc 100644 --- a/tools/ci/idf_ci_utils.py +++ b/tools/ci/idf_ci_utils.py @@ -11,7 +11,7 @@ import typing as t from functools import cached_property from pathlib import Path -IDF_PATH = os.path.abspath(os.getenv('IDF_PATH', os.path.join(os.path.dirname(__file__), '..', '..'))) +IDF_PATH: str = os.path.abspath(os.getenv('IDF_PATH', os.path.join(os.path.dirname(__file__), '..', '..'))) def get_submodule_dirs(full_path: bool = False) -> t.List[str]: diff --git a/tools/ci/idf_pytest/constants.py b/tools/ci/idf_pytest/constants.py index 4ff0687e54..89f3bbe1c1 100644 --- a/tools/ci/idf_pytest/constants.py +++ b/tools/ci/idf_pytest/constants.py @@ -19,6 +19,7 @@ from pytest_embedded.utils import to_list SUPPORTED_TARGETS = ['esp32', 'esp32s2', 'esp32c3', 'esp32s3', 'esp32c2', 'esp32c6', 'esp32h2', 'esp32p4'] PREVIEW_TARGETS: t.List[str] = [] # this PREVIEW_TARGETS excludes 'linux' target DEFAULT_SDKCONFIG = 'default' +DEFAULT_LOGDIR = 'pytest-embedded' TARGET_MARKERS = { 'esp32': 'support esp32 target', @@ -200,7 +201,7 @@ class PytestCase: for _t in [app.target for app in self.apps]: if _t in self.target_markers: skip = False - warnings.warn(f'`pytest.mark.[TARGET]` defined in parametrize for multi-dut test cases is deprecated. ' + warnings.warn(f'`pytest.mark.[TARGET]` defined in parametrize for multi-dut test cases is deprecated. ' # noqa: W604 f'Please use parametrize instead for test case {self.item.nodeid}') break @@ -233,7 +234,7 @@ class PytestCase: # temp markers should always use keyword arguments `targets` and `reason` if not temp_marker.kwargs.get('targets') or not temp_marker.kwargs.get('reason'): raise ValueError( - f'`{marker_name}` should always use keyword arguments `targets` and `reason`. ' + f'`{marker_name}` should always use keyword arguments `targets` and `reason`. ' # noqa: W604 f'For example: ' f'`@pytest.mark.{marker_name}(targets=["esp32"], reason="IDF-xxxx, will fix it ASAP")`' ) @@ -292,7 +293,7 @@ class PytestCase: bin_found[i] = 1 if sum(bin_found) == 0: - msg = f'Skip test case {self.name} because all following binaries are not listed in the app lists: ' + msg = f'Skip test case {self.name} because all following binaries are not listed in the app lists: ' # noqa: E713 for app in self.apps: msg += f'\n - {app.build_dir}' @@ -303,7 +304,7 @@ class PytestCase: return None # some found, some not, looks suspicious - msg = f'Found some binaries of test case {self.name} are not listed in the app lists.' + msg = f'Found some binaries of test case {self.name} are not listed in the app lists.' # noqa: E713 for i, app in enumerate(self.apps): if bin_found[i] == 0: msg += f'\n - {app.build_dir}' diff --git a/tools/ci/idf_pytest/tests/conftest.py b/tools/ci/idf_pytest/tests/conftest.py index bd85b7f4df..e0def5265b 100644 --- a/tools/ci/idf_pytest/tests/conftest.py +++ b/tools/ci/idf_pytest/tests/conftest.py @@ -19,6 +19,7 @@ if tools_dir not in sys.path: sys.path.append(tools_dir) from idf_ci_utils import IDF_PATH # noqa: E402 +from idf_pytest.constants import DEFAULT_LOGDIR # noqa: E402 def create_project(name: str, folder: Path) -> Path: @@ -57,9 +58,9 @@ void app_main(void) {} @pytest.fixture def work_dirpath() -> t.Generator[Path, None, None]: - os.makedirs(os.path.join(IDF_PATH, 'pytest_embedded_log'), exist_ok=True) + os.makedirs(os.path.join(IDF_PATH, DEFAULT_LOGDIR), exist_ok=True) - p = Path(tempfile.mkdtemp(prefix=os.path.join(IDF_PATH, 'pytest_embedded_log') + os.sep)) + p = Path(tempfile.mkdtemp(prefix=os.path.join(IDF_PATH, DEFAULT_LOGDIR) + os.sep)) try: yield p