diff --git a/components/bt/test/CMakeLists.txt b/components/bt/test/CMakeLists.txt deleted file mode 100644 index 180675d21d..0000000000 --- a/components/bt/test/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -if(CONFIG_BT_ENABLED OR CMAKE_BUILD_EARLY_EXPANSION) - idf_component_register(SRC_DIRS "." - PRIV_INCLUDE_DIRS "." - PRIV_REQUIRES cmock nvs_flash bt esp_ringbuf) - target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") -endif() diff --git a/components/bt/test_apps/.build-test-rules.yml b/components/bt/test_apps/.build-test-rules.yml new file mode 100644 index 0000000000..f96777d2da --- /dev/null +++ b/components/bt/test_apps/.build-test-rules.yml @@ -0,0 +1,8 @@ +# Documentation: .gitlab/ci/README.md#manifest-file-to-control-the-buildtest-apps + +components/bt/test_apps: + disable: + - if: IDF_TARGET not in ["esp32", "esp32c3"] + reason: Sufficient to run the tests on one chip of each architecture + depends_components: + - bt diff --git a/components/bt/test_apps/CMakeLists.txt b/components/bt/test_apps/CMakeLists.txt new file mode 100644 index 0000000000..ab61d4b68c --- /dev/null +++ b/components/bt/test_apps/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +set(COMPONENTS main) +list(PREPEND SDKCONFIG_DEFAULTS + "$ENV{IDF_PATH}/tools/test_apps/configs/sdkconfig.debug_helpers" + "sdkconfig.defaults") + +project(bt_test) diff --git a/components/bt/test_apps/README.md b/components/bt/test_apps/README.md new file mode 100644 index 0000000000..fc828476cb --- /dev/null +++ b/components/bt/test_apps/README.md @@ -0,0 +1,21 @@ +| Supported Targets | ESP32 | ESP32-C3 | +| ----------------- | ----- | -------- | + +# `bt` component unit tests + +When adding new test cases, check if the `depends_components` list in `.build-test-rules.yml` needs to be updated to include additional components. The test app will only be built and tested when these components are modified. + +To build and run this test app, using esp32c3 target for example: + +```bash +idf.py set-target esp32c3 +idf.py build flash monitor +``` + +To run tests using pytest: + +```bash +idf.py set-target esp32c3 +idf.py build +pytest --target=esp32c3 +``` diff --git a/components/bt/test_apps/main/CMakeLists.txt b/components/bt/test_apps/main/CMakeLists.txt new file mode 100644 index 0000000000..6aecb24e3d --- /dev/null +++ b/components/bt/test_apps/main/CMakeLists.txt @@ -0,0 +1,6 @@ +idf_component_register(SRCS "test_bt_main.c" + "test_bt_common.c" + "test_smp.c" + INCLUDE_DIRS "." + PRIV_REQUIRES unity bt + WHOLE_ARCHIVE) diff --git a/components/bt/test/test_bt_common.c b/components/bt/test_apps/main/test_bt_common.c similarity index 76% rename from components/bt/test/test_bt_common.c rename to components/bt/test_apps/main/test_bt_common.c index 47182235f1..402633d0a5 100644 --- a/components/bt/test/test_bt_common.c +++ b/components/bt/test_apps/main/test_bt_common.c @@ -11,10 +11,14 @@ #include #include "unity.h" +#include "sdkconfig.h" +// btdm_controller_compile_version_check defined only for ESP32 +#ifdef CONFIG_IDF_TARGET_ESP32 extern bool btdm_controller_compile_version_check(void); TEST_CASE("bt_controller_git_commit_check", "[bt_common]") { TEST_ASSERT(btdm_controller_compile_version_check() == true); } +#endif diff --git a/components/bt/test_apps/main/test_bt_main.c b/components/bt/test_apps/main/test_bt_main.c new file mode 100644 index 0000000000..53a93c95d0 --- /dev/null +++ b/components/bt/test_apps/main/test_bt_main.c @@ -0,0 +1,48 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "unity.h" +#include "unity_test_runner.h" +#include "esp_heap_caps.h" + +#define TEST_MEMORY_LEAK_THRESHOLD_DEFAULT 0 +static int leak_threshold = TEST_MEMORY_LEAK_THRESHOLD_DEFAULT; +void set_leak_threshold(int threshold) +{ + leak_threshold = threshold; +} + +static size_t before_free_8bit; +static size_t before_free_32bit; + +static void check_leak(size_t before_free, size_t after_free, const char *type) +{ + ssize_t delta = after_free - before_free; + printf("MALLOC_CAP_%s: Before %u bytes free, After %u bytes free (delta %d)\n", type, before_free, after_free, delta); + TEST_ASSERT_MESSAGE(delta >= leak_threshold, "memory leak"); +} + +void setUp(void) +{ + before_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + before_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); +} + +void tearDown(void) +{ + size_t after_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + size_t after_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); + check_leak(before_free_8bit, after_free_8bit, "8BIT"); + check_leak(before_free_32bit, after_free_32bit, "32BIT"); + + leak_threshold = TEST_MEMORY_LEAK_THRESHOLD_DEFAULT; +} + +void app_main(void) +{ + printf("Running bt component tests\n"); + unity_run_menu(); +} diff --git a/components/bt/test/test_smp.c b/components/bt/test_apps/main/test_smp.c similarity index 90% rename from components/bt/test/test_smp.c rename to components/bt/test_apps/main/test_smp.c index 9cf51c41a7..4eefbe12f4 100644 --- a/components/bt/test/test_smp.c +++ b/components/bt/test_apps/main/test_smp.c @@ -1,46 +1,32 @@ /* - * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ /* - Tests for the BLE SMP implementation -*/ + * Tests for the BLE SMP implementation + */ -#include -#include -#include -#include -#include #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" -#include "freertos/semphr.h" -#include "freertos/queue.h" -#include "freertos/xtensa_api.h" #include "unity.h" -#include "esp_heap_caps.h" -#include "esp_log.h" -#include "freertos/ringbuf.h" #include "esp_random.h" -#include "nvs_flash.h" #include "esp_bt.h" #include "esp_bt_main.h" #include "esp_bt_device.h" #include "esp_gap_ble_api.h" -#define TAG "ble_smp_test" - #define KEY_LENGTH_DWORDS_P256 8 typedef unsigned long DWORD; typedef uint32_t UINT32; typedef struct { -DWORD x[KEY_LENGTH_DWORDS_P256]; + DWORD x[KEY_LENGTH_DWORDS_P256]; DWORD y[KEY_LENGTH_DWORDS_P256]; DWORD z[KEY_LENGTH_DWORDS_P256]; } Point; @@ -79,7 +65,7 @@ static void bt_rand(void *buf, size_t len) for (int i = 0; i < (int)(len / sizeof(uint32_t)); i++) { uint32_t rand = esp_random(); - memcpy(buf + i*sizeof(uint32_t), &rand, sizeof(uint32_t)); + memcpy(buf + i * sizeof(uint32_t), &rand, sizeof(uint32_t)); } return; diff --git a/components/bt/test_apps/pytest_bt.py b/components/bt/test_apps/pytest_bt.py new file mode 100644 index 0000000000..74b0a76afc --- /dev/null +++ b/components/bt/test_apps/pytest_bt.py @@ -0,0 +1,12 @@ +# SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 + +import pytest +from pytest_embedded import Dut + + +@pytest.mark.generic +@pytest.mark.esp32 +@pytest.mark.esp32c3 +def test_bt(dut: Dut) -> None: + dut.run_all_single_board_cases() diff --git a/tools/unit-test-app/configs/bt b/components/bt/test_apps/sdkconfig.defaults similarity index 56% rename from tools/unit-test-app/configs/bt rename to components/bt/test_apps/sdkconfig.defaults index f10c710c52..5847dd3c63 100644 --- a/tools/unit-test-app/configs/bt +++ b/components/bt/test_apps/sdkconfig.defaults @@ -1,4 +1,3 @@ -CONFIG_IDF_TARGET="esp32" -TEST_COMPONENTS=bt CONFIG_BT_ENABLED=y CONFIG_UNITY_FREERTOS_STACK_SIZE=12288 +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=n