.host_test_template: extends: .rules:test:host_test stage: host_test image: $ESP_ENV_IMAGE tags: [build, shiny] dependencies: # set dependencies to null to avoid missing artifacts issue # run host_test jobs immediately, only after upload cache needs: - pipeline_variables - job: upload-pip-cache optional: true artifacts: false - job: upload-submodules-cache optional: true artifacts: false - job: fast_template_app optional: true artifacts: false artifacts: expire_in: 1 week when: always check_public_headers: extends: - .host_test_template - .rules:build:check script: - | targets="esp32 \ esp32s2 \ esp32s3 \ esp32c3 \ esp32c2 \ esp32c6 \ esp32c5 \ esp32h2 \ esp32p4 \ esp32c61 \ esp32h21 \ esp32h4 \ esp32s31" for libc in newlib picolibc; do for target in ${targets}; do case "${target}" in esp32|esp32s2|esp32s3) PREFIX="xtensa-${target}-elf-" ;; *) PREFIX="riscv32-esp-elf-" ;; esac IDF_TARGET=${target} python tools/ci/check_public_headers.py --jobs 4 --prefix ${PREFIX} --libc-type ${libc} done done test_nvs_coverage: extends: - .host_test_template - .rules:labels:nvs_coverage artifacts: paths: - components/nvs_flash/host_test/nvs_host_test/coverage_report script: - cd components/nvs_flash/host_test/nvs_host_test - idf.py build coverage # the 'long' host tests take approx 11 hours on our current runners. Adding some margin here for possible CPU contention timeout: 18 hours test_partition_table_on_host: extends: .host_test_template script: - cd components/partition_table/test_gen_esp32part_host - pytest_for_ut ./gen_esp32part_tests.py test_ldgen_on_host: extends: - .host_test_template - .rules:test:host_test_ldgen script: - cd tools/ldgen/test - export PYTHONPATH=$PYTHONPATH:.. - pytest_for_ut . variables: LC_ALL: C.UTF-8 test_spiffs_on_host: extends: .host_test_template script: - cd components/spiffs/test_spiffsgen/ - pytest_for_ut ./test_spiffsgen.py test_fatfsgen_on_host: extends: .host_test_template script: - cd components/fatfs/test_fatfsgen/ - pytest_for_ut ./test_fatfsgen.py ./test_wl_fatfsgen.py ./test_fatfsparse.py test_certificate_bundle_on_host: extends: .host_test_template script: - cd components/mbedtls/esp_crt_bundle/test_gen_crt_bundle/ - pytest_for_ut ./test_gen_crt_bundle.py # Test for create virtualenv. It must be invoked from Python, not from virtualenv. # Use docker image system python without any extra dependencies test_cli_installer: extends: - .host_test_template - .rules:test:host_test_cli_installer - .before_script:minimal artifacts: when: on_failure paths: - tools/tools.new.json - tools/test_idf_tools/test_python_env_logs.txt image: name: $ESP_ENV_IMAGE entrypoint: [""] # use system python3. no extra pip package installed script: # Tools must be downloaded for testing # We could use "idf_tools.py download all", but we don't want to install clang because of its huge size # cmake@version that is supported - python3 ${IDF_PATH}/tools/idf_tools.py download required qemu-riscv32 qemu-xtensa cmake cmake@3.22.1 - cd ${IDF_PATH}/tools/test_idf_tools - python3 -m pip install jsonschema # Testing with system python3, so don't use any third-party packages - python3 ./test_idf_tools.py -v - python3 ./test_idf_tools_python_env.py # It runs at the end because it modifies dependencies - IDF_TEST_MAY_BREAK_DEPENDENCIES=1 python3 ./test_idf_tools.py -v TestSystemDependencies.test_commands_when_nodeps test_efuse_table_on_host: extends: .host_test_template parallel: matrix: - IDF_TARGET: [esp32, esp32s2, esp32c3, esp32s3, esp32c2, esp32c6, esp32h2, esp32p4, esp32c5, esp32c61] artifacts: when: on_failure paths: - components/efuse/${IDF_TARGET}/esp_efuse_table.c script: - cd ${IDF_PATH}/components/efuse/ - ./efuse_table_gen.py -t "${IDF_TARGET}" ${IDF_PATH}/components/efuse/${IDF_TARGET}/esp_efuse_table.csv - git diff --exit-code -- ${IDF_TARGET}/esp_efuse_table.c || { echo 'Differences found for ${IDF_TARGET} target. Please run idf.py efuse-common-table and commit the changes.'; exit 1; } - cd ${IDF_PATH}/components/efuse/test_efuse_host - pytest_for_ut ./efuse_tests.py test_logtrace_proc: extends: .host_test_template artifacts: when: on_failure paths: - tools/esp_app_trace/test/logtrace/output - tools/esp_app_trace/test/logtrace/.coverage script: - cd ${IDF_PATH}/tools/esp_app_trace/test/logtrace - ./test.sh test_sysviewtrace_proc: extends: .host_test_template artifacts: when: on_failure paths: - tools/esp_app_trace/test/sysview/output - tools/esp_app_trace/test/sysview/.coverage script: - cd ${IDF_PATH}/tools/esp_app_trace/test/sysview - ./test.sh test_tools: extends: - .host_test_template - .rules:test:host_test_tools artifacts: paths: - ${IDF_PATH}/*.out - ${IDF_PATH}/XUNIT_*.xml reports: junit: ${IDF_PATH}/XUNIT_*.xml variables: LC_ALL: C.UTF-8 INSTALL_EXTRA_TOOLS: "qemu-xtensa qemu-riscv32" # for test_idf_qemu.py script: - stat=0 - run_cmd idf-ci gitlab download-known-failure-cases-file ${KNOWN_FAILURE_CASES_FILE_NAME} - cd ${IDF_PATH}/tools/ci/test_autocomplete - run_cmd pytest --noconftest test_autocomplete.py --junitxml=${IDF_PATH}/XUNIT_AUTOCOMP.xml --ignore-result-files ${KNOWN_FAILURE_CASES_FILE_NAME} || stat=1 - cd ${IDF_PATH}/tools/test_idf_py - run_cmd pytest --noconftest test_idf_py.py --junitxml=${IDF_PATH}/XUNIT_IDF_PY.xml --ignore-result-files ${KNOWN_FAILURE_CASES_FILE_NAME} || stat=1 - run_cmd pytest --noconftest test_hints.py --junitxml=${IDF_PATH}/XUNIT_HINTS.xml --ignore-result-files ${KNOWN_FAILURE_CASES_FILE_NAME} || stat=1 - run_cmd pytest --noconftest test_idf_qemu.py --junitxml=${IDF_PATH}/XUNIT_IDF_PY_QEMU.xml --ignore-result-files ${KNOWN_FAILURE_CASES_FILE_NAME} || stat=1 - cd ${IDF_PATH}/tools/test_bsasm - run_cmd pytest --noconftest test_bsasm.py --junitxml=${IDF_PATH}/XUNIT_BSASM.xml --ignore-result-files ${KNOWN_FAILURE_CASES_FILE_NAME} || stat=1 - cd ${IDF_PATH}/tools/test_mkdfu - run_cmd pytest --noconftest test_mkdfu.py --junitxml=${IDF_PATH}/XUNIT_MKDFU.xml --ignore-result-files ${KNOWN_FAILURE_CASES_FILE_NAME} || stat=1 - cd ${IDF_PATH}/tools/test_idf_size - run_cmd pytest --noconftest test_idf_size.py --junitxml=${IDF_PATH}/XUNIT_IDF_SIZE.xml --ignore-result-files ${KNOWN_FAILURE_CASES_FILE_NAME} || stat=1 - cd ${IDF_PATH}/tools/test_idf_diag - run_cmd pytest --noconftest test_idf_diag.py --junitxml=${IDF_PATH}/XUNIT_IDF_DIAG.xml --ignore-result-files ${KNOWN_FAILURE_CASES_FILE_NAME} || stat=1 - cd ${IDF_PATH} - shellcheck -s sh tools/detect_python.sh || stat=1 - shellcheck -s bash tools/detect_python.sh || stat=1 - shellcheck -s dash tools/detect_python.sh || stat=1 - "bash -c '. tools/detect_python.sh && echo Our Python: ${ESP_PYTHON?Python is not set}'" - "dash -c '. tools/detect_python.sh && echo Our Python: ${ESP_PYTHON?Python is not set}'" - "zsh -c '. tools/detect_python.sh && echo Our Python: ${ESP_PYTHON?Python is not set}'" - "fish -c 'source tools/detect_python.fish && echo Our Python: $ESP_PYTHON'" - exit "$stat" test_split_path_by_spaces: extends: .host_test_template script: - cd ${IDF_PATH}/tools - pytest_for_ut ./split_paths_by_spaces.py test_transport_on_host: extends: .host_test_template allow_failure: true # IDFCI-2781 [v5.5, v5.4] test_transport_on_host fails on ubuntu 24.04 script: - cd ${IDF_PATH}/components/tcp_transport/host_test - idf.py build - LSAN_OPTIONS=verbosity=1:log_threads=1 build/host_tcp_transport_test.elf test_sockets_on_host: extends: .host_test_template script: # test the tcp-client example with system sockets - cd ${IDF_PATH}/examples/protocols/sockets/tcp_client - echo 'CONFIG_EXAMPLE_IPV4_ADDR="127.0.0.1"' >> sdkconfig.defaults - idf.py --preview set-target linux - idf.py build - timeout 5 ./build/tcp_client.elf >test.log || true - grep "Socket unable to connect" test.log # test the udp-client example with lwip sockets - cd ${IDF_PATH}/examples/protocols/sockets/udp_client - idf.py --preview set-target linux - cat sdkconfig.ci.linux > sdkconfig - idf.py build - timeout 5 ./build/udp_client.elf >test.log || true - grep "Message sent" test.log test_eh_frame_parser: extends: .host_test_template script: - cd ${IDF_PATH}/components/esp_system/test_eh_frame_parser - make - ./eh_frame_test test_gen_soc_caps_kconfig: extends: .host_test_template script: - cd ${IDF_PATH}/tools/gen_soc_caps_kconfig/ - pytest_for_ut ./test/test_gen_soc_caps_kconfig.py test_idf_build_apps_load_soc_caps: extends: .host_test_template script: - cd tools/ci - pytest_for_ut ./test_soc_headers_load_in_idf_build_apps.py test_nvs_gen_check: extends: .host_test_template artifacts: paths: - XUNIT_RESULT.xml - components/nvs_flash/nvs_partition_tool reports: junit: XUNIT_RESULT.xml variables: LC_ALL: C.UTF-8 script: - cd ${IDF_PATH}/components/nvs_flash/nvs_partition_tool - pytest_for_ut test_nvs_gen_check.py test_esp_rom: extends: .host_test_template artifacts: paths: - XUNIT_RESULT.xml reports: junit: XUNIT_RESULT.xml script: - cd ${IDF_PATH}/components/esp_rom/ - pytest_for_ut test_esp_rom.py make_sure_soc_caps_compatible_in_idf_build_apps: extends: - .host_test_template - .rules:dev-push artifacts: paths: - new.json - base.json when: always when: manual script: - python tools/ci/idf_build_apps_dump_soc_caps.py new.json - git fetch --depth=1 origin $CI_MERGE_REQUEST_DIFF_BASE_SHA - git checkout -f $CI_MERGE_REQUEST_DIFF_BASE_SHA - git checkout $CI_COMMIT_SHA -- tools/ci/idf_build_apps_dump_soc_caps.py - python tools/ci/idf_build_apps_dump_soc_caps.py base.json - diff new.json base.json build_docker: extends: - .before_script:minimal - .rules:build:docker stage: host_test needs: [] image: espressif/docker-builder:1 tags: [shiny, dind] variables: DOCKER_TMP_IMAGE_NAME: "idf_tmp_image" script: - export DOCKER_BUILD_ARGS="--build-arg IDF_CLONE_URL=${CI_REPOSITORY_URL} --build-arg IDF_CLONE_BRANCH_OR_TAG=${CI_COMMIT_REF_NAME} --build-arg IDF_CHECKOUT_REF=${CI_COMMIT_TAG:-$CI_COMMIT_SHA} --build-arg IDF_CLONE_SHALLOW=1 --build-arg IDF_GITHUB_ASSETS=${INTERNAL_GITHUB_ASSETS}" - docker build --tag ${DOCKER_TMP_IMAGE_NAME} ${DOCKER_BUILD_ARGS} tools/docker/ # We can't mount $PWD/examples/get-started/blink into the container, see https://gitlab.com/gitlab-org/gitlab-ce/issues/41227. # The workaround mentioned there works, but leaves around directories which need to be cleaned up manually. # Therefore, build a copy of the example located inside the container. - docker run --rm --workdir /opt/esp/idf/examples/get-started/blink ${DOCKER_TMP_IMAGE_NAME} idf.py build ############################ # Host test with test apps # ############################ test_pytest_qemu: extends: - .host_test_template - .before_script:build artifacts: paths: - XUNIT_RESULT.xml - pytest-embedded/ - "**/build*/*.bin" reports: junit: XUNIT_RESULT.xml parallel: matrix: - IDF_TARGET: "esp32" INSTALL_EXTRA_TOOLS: "qemu-xtensa" # Skip Clang + Xtensa tests due to bootloader size issue IDF_TOOLCHAIN: [gcc] - IDF_TARGET: "esp32c3" INSTALL_EXTRA_TOOLS: "qemu-riscv32" IDF_TOOLCHAIN: [gcc, clang] script: - run_cmd idf-ci build run --build-system cmake --target $IDF_TARGET -m qemu --modified-files ${MR_MODIFIED_FILES} - run_cmd idf-ci gitlab download-known-failure-cases-file ${KNOWN_FAILURE_CASES_FILE_NAME} - run_cmd pytest --target $IDF_TARGET -m qemu --embedded-services idf,qemu --junitxml=XUNIT_RESULT.xml --ignore-result-files ${KNOWN_FAILURE_CASES_FILE_NAME} --qemu-extra-args \"-global driver=timer.$IDF_TARGET.timg,property=wdt_disable,value=true\" test_pytest_linux: extends: - .host_test_template - .before_script:build artifacts: paths: - XUNIT_RESULT.xml - pytest-embedded/ - "**/build*/build_log.txt" reports: junit: XUNIT_RESULT.xml script: - run_cmd idf-ci build run --build-system cmake -p components -p examples -p tools/test_apps --target linux --only-test-related --modified-files ${MR_MODIFIED_FILES} - run_cmd idf-ci gitlab download-known-failure-cases-file ${KNOWN_FAILURE_CASES_FILE_NAME} - run_cmd pytest --target linux --embedded-services idf --junitxml=XUNIT_RESULT.xml --ignore-result-files ${KNOWN_FAILURE_CASES_FILE_NAME} test_pytest_macos: extends: - .host_test_template - .brew-macos-settings artifacts: paths: - XUNIT_RESULT.xml - pytest-embedded/ - "**/build*/build_log.txt" reports: junit: XUNIT_RESULT.xml script: - run_cmd idf-ci build run -p components -p examples -p tools/test_apps --build-system cmake --target linux --only-test-related -m macos --modified-files ${MR_MODIFIED_FILES} - run_cmd idf-ci gitlab download-known-failure-cases-file ${KNOWN_FAILURE_CASES_FILE_NAME} - run_cmd pytest --target linux -m macos --junitxml=XUNIT_RESULT.xml --ignore-result-files ${KNOWN_FAILURE_CASES_FILE_NAME} ###################### # Build System Tests # ###################### .test_build_system_template: stage: host_test extends: - .build_template - .rules:build:check dependencies: # set dependencies to null to avoid missing artifacts issue needs: - job: fast_template_app artifacts: false optional: true artifacts: reports: junit: XUNIT_RESULT.xml paths: - XUNIT_RESULT.xml - test_build_system expire_in: 1 week when: always script: - ${IDF_PATH}/tools/ci/test_configure_ci_environment.sh - cd ${IDF_PATH}/tools/test_build_system - run_cmd idf-ci gitlab download-known-failure-cases-file ${KNOWN_FAILURE_CASES_FILE_NAME} - pytest --cleanup-idf-copy --parallel-count ${CI_NODE_TOTAL:-1} --parallel-index ${CI_NODE_INDEX:-1} --work-dir ${CI_PROJECT_DIR}/test_build_system --junitxml ${CI_PROJECT_DIR}/XUNIT_RESULT.xml --ignore-result-files ${KNOWN_FAILURE_CASES_FILE_NAME} .test_build_system_minimal_cmake_template: extends: .test_build_system_template variables: INSTALL_EXTRA_TOOLS: cmake@3.22.1 script: - MINIMAL_SUPPORTED_CMAKE_VERSION=$(echo "${INSTALL_EXTRA_TOOLS}" | sed -n 's/.*cmake@\([0-9.]*\).*/\1/p') - export PATH=$(echo "$PATH" | sed -E "s|/tools/cmake/[0-9.]+|/tools/cmake/${MINIMAL_SUPPORTED_CMAKE_VERSION}|") - ACTUAL_CMAKE_VERSION=$(cmake --version | head -n1 | awk '{print $3}') - | if [ "${ACTUAL_CMAKE_VERSION}" != "${MINIMAL_SUPPORTED_CMAKE_VERSION}" ]; then echo "ERROR: Wrong minimal CMake version! Detected: ${ACTUAL_CMAKE_VERSION}, but should be: ${MINIMAL_SUPPORTED_CMAKE_VERSION}" exit 1 fi - ${IDF_PATH}/tools/ci/test_configure_ci_environment.sh - cd ${IDF_PATH}/tools/test_build_system - run_cmd idf-ci gitlab download-known-failure-cases-file ${KNOWN_FAILURE_CASES_FILE_NAME} - pytest -k cmake --cleanup-idf-copy --parallel-count ${CI_NODE_TOTAL:-1} --parallel-index ${CI_NODE_INDEX:-1} --work-dir ${CI_PROJECT_DIR}/test_build_system --junitxml ${CI_PROJECT_DIR}/XUNIT_RESULT.xml --ignore-result-files ${KNOWN_FAILURE_CASES_FILE_NAME} pytest_build_system: extends: .test_build_system_template parallel: 3 pytest_buildv2_system: extends: - .test_build_system_template - .rules:labels:buildv2 parallel: 3 script: - ${IDF_PATH}/tools/ci/test_configure_ci_environment.sh - cd ${IDF_PATH}/tools/test_build_system - run_cmd idf-ci gitlab download-known-failure-cases-file ${KNOWN_FAILURE_CASES_FILE_NAME} - pytest --buildv2 --cleanup-idf-copy --parallel-count ${CI_NODE_TOTAL:-1} --parallel-index ${CI_NODE_INDEX:-1} --work-dir ${CI_PROJECT_DIR}/test_build_system --junitxml ${CI_PROJECT_DIR}/XUNIT_RESULT.xml --ignore-result-files ${KNOWN_FAILURE_CASES_FILE_NAME} -- test_non_default_target.py test_component_manager.py test_build.py test_bootloader.py test_git.py test_kconfig.py test_partition.py test_reproducible_build.py test_sdkconfig.py test_versions.py test_common.py test_components.py test_cmake.py test_idf_extension.py test_rebuild.py pytest_build_system_macos: extends: - .test_build_system_template - .brew-macos-settings - .rules:build:macos parallel: 3 pytest_build_system_minimal_cmake: extends: .test_build_system_minimal_cmake_template pytest_build_system_macos_minimal_cmake: extends: - .test_build_system_minimal_cmake_template - .brew-macos-settings - .rules:build:macos variables: INSTALL_EXTRA_TOOLS: ninja cmake@3.22.1