From 4afb86fce38266e00e7a16f5708f3050c0b5244b Mon Sep 17 00:00:00 2001 From: Fu Hanxi Date: Tue, 16 Jan 2024 11:31:59 +0100 Subject: [PATCH 1/2] test: fix custom additional app for multicore test cases --- .../pytest_unicore_bootloader.py | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/tools/test_apps/system/unicore_bootloader/pytest_unicore_bootloader.py b/tools/test_apps/system/unicore_bootloader/pytest_unicore_bootloader.py index 2e5fdc4d11..f0193dbe04 100644 --- a/tools/test_apps/system/unicore_bootloader/pytest_unicore_bootloader.py +++ b/tools/test_apps/system/unicore_bootloader/pytest_unicore_bootloader.py @@ -1,9 +1,10 @@ -# SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 - import os import pytest +from artifacts_handler import ArtifactType +from idf_ci_utils import IDF_PATH from pytest_embedded import Dut @@ -12,12 +13,17 @@ from pytest_embedded import Dut @pytest.mark.esp32p4 @pytest.mark.generic @pytest.mark.parametrize('config', ['multicore'], indirect=True) -def test_multicore_app_and_unicore_bootloader(dut: Dut) -> None: +def test_multicore_app_and_unicore_bootloader(dut: Dut, app_downloader) -> None: # type: ignore dut.expect('Multicore bootloader') dut.expect('Multicore app') dut.expect('App is running') path_to_unicore_build = os.path.join(dut.app.app_path, f'build_{dut.target}_unicore') + if app_downloader: + app_downloader.download_app( + os.path.relpath(path_to_unicore_build, IDF_PATH), ArtifactType.BUILD_DIR_WITHOUT_MAP_AND_ELF_FILES + ) + dut.serial.bootloader_flash(path_to_unicore_build) dut.expect('Unicore bootloader') dut.expect('Multicore app') @@ -29,13 +35,18 @@ def test_multicore_app_and_unicore_bootloader(dut: Dut) -> None: @pytest.mark.esp32p4 @pytest.mark.generic @pytest.mark.parametrize('config', ['unicore'], indirect=True) -def test_unicore_app_and_multicore_bootloader(dut: Dut) -> None: +def test_unicore_app_and_multicore_bootloader(dut: Dut, app_downloader) -> None: # type: ignore dut.expect('Unicore bootloader') dut.expect('Unicore app') dut.expect('App is running') - path_to_unicore_build = os.path.join(dut.app.app_path, f'build_{dut.target}_multicore') - dut.serial.bootloader_flash(path_to_unicore_build) + path_to_multicore_build = os.path.join(dut.app.app_path, f'build_{dut.target}_multicore') + if app_downloader: + app_downloader.download_app( + os.path.relpath(path_to_multicore_build, IDF_PATH), ArtifactType.BUILD_DIR_WITHOUT_MAP_AND_ELF_FILES + ) + + dut.serial.bootloader_flash(path_to_multicore_build) dut.expect('Multicore bootloader') dut.expect('Unicore app') dut.expect('App is running') From 23c339e231d36614cd86c7c64c04b55eca1b1dda Mon Sep 17 00:00:00 2001 From: Fu Hanxi Date: Tue, 16 Jan 2024 20:21:40 +0100 Subject: [PATCH 2/2] ci: raise RuntimeError instead of SystemExit to avoid kill the process otherwise the pytest process will be killed immediately --- conftest.py | 5 +++++ tools/ci/idf_ci/uploader.py | 12 +++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/conftest.py b/conftest.py index 4820cbf1df..850a49faa0 100644 --- a/conftest.py +++ b/conftest.py @@ -123,6 +123,11 @@ class BuildReportDownloader: def download_app( self, app_build_path: str, artifact_type: ArtifactType = ArtifactType.BUILD_DIR_WITHOUT_MAP_AND_ELF_FILES ) -> None: + if app_build_path not in self.app_presigned_urls_dict: + raise ValueError(f'No presigned url found for {app_build_path}. ' + f'Usually this should not happen, please re-trigger a pipeline.' + f'If this happens again, please report this bug to the CI channel.') + url = self.app_presigned_urls_dict[app_build_path][artifact_type.value] logging.debug('Downloading app from %s', url) diff --git a/tools/ci/idf_ci/uploader.py b/tools/ci/idf_ci/uploader.py index 95b6819d57..ad91fa619e 100644 --- a/tools/ci/idf_ci/uploader.py +++ b/tools/ci/idf_ci/uploader.py @@ -1,14 +1,16 @@ # SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 - import glob import os import typing as t from datetime import timedelta -from zipfile import ZIP_DEFLATED, ZipFile +from zipfile import ZIP_DEFLATED +from zipfile import ZipFile import minio -from artifacts_handler import ArtifactType, get_minio_client, getenv +from artifacts_handler import ArtifactType +from artifacts_handler import get_minio_client +from artifacts_handler import getenv from idf_build_apps import App from idf_build_apps.utils import rmdir from idf_ci_utils import IDF_PATH @@ -103,7 +105,7 @@ class AppUploader: try: self._client.stat_object(getenv('IDF_S3_BUCKET'), obj_name) except minio.error.S3Error as e: - raise SystemExit( + raise RuntimeError( f'No such file on minio server: {obj_name}. ' f'Probably the build failed or the artifacts got expired. ' f'Full error message: {str(e)}' @@ -112,7 +114,7 @@ class AppUploader: self._client.fget_object(getenv('IDF_S3_BUCKET'), obj_name, zip_filename) print(f'Downloaded to {zip_filename}') except minio.error.S3Error as e: - raise SystemExit('Shouldn\'t happen, please report this bug in the CI channel' + str(e)) + raise RuntimeError('Shouldn\'t happen, please report this bug in the CI channel' + str(e)) with ZipFile(zip_filename, 'r') as zr: zr.extractall()