Files
esp-idf/tools/test_build_system/test_spaces.py
T
Jakub Kocka 7551e82048 ci(tools): Changed the approach of some build tests to cmake reconfigure
Where actually building the app is not needed cmake reconfigure was introduced instead.
This should be performance upgrade especially for Windows runners, where build is quite slow
2026-03-16 08:57:40 +01:00

124 lines
4.9 KiB
Python

# SPDX-FileCopyrightText: 2023-2026 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import logging
import os
import shutil
import subprocess
import sys
from pathlib import Path
import pytest
from test_build_system_helpers import IdfPyFunc
from test_build_system_helpers import run_idf_py
# In this test file the test are grouped into 3 bundles
# It would be better to have every test separate,
# but that would mean doing idf_copy each time, and copying takes most of the time
def clean_app_dir(app_path: Path) -> None:
(app_path / 'sdkconfig').unlink()
shutil.rmtree(app_path / 'build', ignore_errors=True)
@pytest.mark.buildv2_skip('Examples (spiffsgen, ulp, etc.) not yet ported to buildv2')
@pytest.mark.idf_copy_with_space
def test_spaces_bundle1(idf_copy: Path) -> None:
logging.info('Running test spaces bundle 1')
# test spiffsgen
run_idf_py('build', workdir=(idf_copy / 'examples' / 'storage' / 'spiffsgen'))
# test build ulp_fsm
run_idf_py('build', workdir=(idf_copy / 'examples' / 'system' / 'ulp' / 'ulp_fsm' / 'ulp'))
# test build ulp_riscv
run_idf_py(
'-DIDF_TARGET=esp32s2', 'build', workdir=(idf_copy / 'examples' / 'system' / 'ulp' / 'ulp_riscv' / 'gpio')
)
@pytest.mark.buildv2_skip('Examples (flash_encryption, https_x509_bundle) not yet ported to buildv2')
@pytest.mark.idf_copy_with_space
def test_spaces_bundle2(idf_copy: Path) -> None:
logging.info('Running test spaces bundle 2')
# test flash_encryption
run_idf_py('build', workdir=(idf_copy / 'examples' / 'security' / 'flash_encryption'))
# test_x509_cert_bundle
run_idf_py('build', workdir=(idf_copy / 'examples' / 'protocols' / 'https_x509_bundle'))
@pytest.mark.buildv2_skip('secure_boot test app not yet ported to buildv2')
@pytest.mark.idf_copy_with_space
def test_spaces_bundle3(idf_copy: Path) -> None:
logging.info('Running test spaces bundle 3')
secure_boot_app_path = idf_copy / 'tools' / 'test_apps' / 'security' / 'secure_boot'
# test secure_boot_v1
run_idf_py('-DSDKCONFIG_DEFAULTS=sdkconfig.defaults;sdkconfig.ci.00', 'build', workdir=secure_boot_app_path)
clean_app_dir(secure_boot_app_path)
# test secure_boot_v2
run_idf_py('-DSDKCONFIG_DEFAULTS=sdkconfig.defaults;sdkconfig.ci.01', 'build', workdir=secure_boot_app_path)
clean_app_dir(secure_boot_app_path)
# test app_signing
run_idf_py('-DSDKCONFIG_DEFAULTS=sdkconfig.defaults;sdkconfig.ci.02', 'build', workdir=secure_boot_app_path)
clean_app_dir(secure_boot_app_path)
# test secure_boot_release_mode
run_idf_py(
'-DSDKCONFIG_DEFAULTS=sdkconfig.defaults;sdkconfig.ci.04',
'-DIDF_TARGET=esp32s2',
'build',
workdir=secure_boot_app_path,
)
@pytest.mark.xfail(sys.platform == 'win32', reason='Bug with reproducible build')
# Use this bundle for tests which can be done with the default build_test_app
@pytest.mark.parametrize(
'dummy_',
[
# Dummy parameter with a space in it, used so that the test directory name contains a space
pytest.param('test spaces')
],
)
@pytest.mark.idf_copy_with_space
@pytest.mark.usefixtures('idf_copy')
def test_spaces_bundle4(dummy_: str, idf_py: IdfPyFunc, test_app_copy: Path) -> None:
logging.info(f'Running test spaces bundle 4 in {test_app_copy}')
(test_app_copy / 'sdkconfig').write_text('CONFIG_APP_REPRODUCIBLE_BUILD=y')
idf_py('build')
(test_app_copy / 'sdkconfig').unlink()
idf_py('set-target', 'esp32s2')
idf_py('dfu')
idf_py('uf2')
@pytest.mark.skipif(sys.platform == 'win32', reason='Unix test')
@pytest.mark.idf_copy_with_space
def test_install_export_unix(idf_copy: Path) -> None:
logging.info('install and export setup scripts')
env = dict(**os.environ)
install_cmd = './install.sh esp32'
export_cmd = '. ./export.sh'
logging.debug(f'running {install_cmd} in {idf_copy}')
subprocess.check_call(install_cmd, env=env, shell=True, cwd=idf_copy)
logging.debug(f'running {export_cmd} in {idf_copy}')
# The default shell used by subprocess.Popen on POSIX platforms is '/bin/sh',
# which in esp-env Docker image is 'dash'. The export script doesn't support
# IDF_PATH detection when used in dash, so we have to override the shell here.
subprocess.check_call(export_cmd, env=env, shell=True, cwd=idf_copy, executable='/bin/bash')
@pytest.mark.skipif(sys.platform != 'win32', reason='Windows test')
@pytest.mark.idf_copy_with_space
def test_install_export_win(idf_copy: Path) -> None:
logging.info('install and export setup scripts')
env = dict(**os.environ)
install_cmd = 'install.bat esp32'
export_cmd = 'export.bat'
logging.debug(f'running {install_cmd} in {idf_copy}')
subprocess.check_call(install_cmd, env=env, shell=True, cwd=idf_copy)
logging.debug(f'running {export_cmd} in {idf_copy}')
subprocess.check_call(export_cmd, env=env, shell=True, cwd=idf_copy)