diff --git a/tools/mocks/esp_event/CMakeLists.txt b/tools/mocks/esp_event/CMakeLists.txt index 24629a6ef6..34dc345375 100644 --- a/tools/mocks/esp_event/CMakeLists.txt +++ b/tools/mocks/esp_event/CMakeLists.txt @@ -6,5 +6,4 @@ idf_component_get_property(original_esp_event_dir esp_event COMPONENT_OVERRIDEN_ idf_component_mock(INCLUDE_DIRS "${original_esp_event_dir}/include" MOCK_HEADER_FILES ${original_esp_event_dir}/include/esp_event.h - ${original_esp_event_dir}/include/esp_event_base.h ) diff --git a/tools/mocks/esp_netif/CMakeLists.txt b/tools/mocks/esp_netif/CMakeLists.txt new file mode 100644 index 0000000000..2104150fc6 --- /dev/null +++ b/tools/mocks/esp_netif/CMakeLists.txt @@ -0,0 +1,14 @@ +# NOTE: This kind of mocking currently works on Linux targets only. +# On Espressif chips, too many dependencies are missing at the moment. +message(STATUS "building ESP NETIF MOCKS") + +idf_component_get_property(original_esp_netif_dir esp_netif COMPONENT_OVERRIDEN_DIR) + +set(include_dirs + "include" + "${original_esp_netif_dir}/include" + "${original_esp_netif_dir}/linux/stubs/include") + +idf_component_mock(INCLUDE_DIRS ${include_dirs} + REQUIRES esp_event + MOCK_HEADER_FILES ${original_esp_netif_dir}/include/esp_netif.h) diff --git a/tools/mocks/esp_netif/include/esp_netif_mock.h b/tools/mocks/esp_netif/include/esp_netif_mock.h new file mode 100644 index 0000000000..b6551b6753 --- /dev/null +++ b/tools/mocks/esp_netif/include/esp_netif_mock.h @@ -0,0 +1,15 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +/** + * Since esp_netif_obj is an opaque type (not defined, just declared), we define it here + * since its size is required by some of the mock functions. + */ +struct esp_netif_obj { + void *dummy; +}; diff --git a/tools/mocks/esp_netif/mock/mock_config.yaml b/tools/mocks/esp_netif/mock/mock_config.yaml new file mode 100644 index 0000000000..382aaf4c17 --- /dev/null +++ b/tools/mocks/esp_netif/mock/mock_config.yaml @@ -0,0 +1,12 @@ + :cmock: + :includes_c_pre_header: + # This is to define the esp_netif_t object, CMock needs its size for expect functions + - esp_netif_mock.h + :plugins: + - expect + - expect_any_args + - return_thru_ptr + - array + - ignore + - ignore_arg + - callback diff --git a/tools/mocks/esp_wifi/CMakeLists.txt b/tools/mocks/esp_wifi/CMakeLists.txt new file mode 100644 index 0000000000..5be6f93641 --- /dev/null +++ b/tools/mocks/esp_wifi/CMakeLists.txt @@ -0,0 +1,26 @@ +# NOTE: This kind of mocking currently works on Linux targets only. +# On Espressif chips, too many dependencies are missing at the moment. +message(STATUS "building ESP WIFI MOCKS") + +idf_component_get_property(original_esp_wifi_dir esp_wifi COMPONENT_OVERRIDEN_DIR) + +set(include_dirs + "${original_esp_wifi_dir}/include") + +idf_component_mock(INCLUDE_DIRS ${include_dirs} + REQUIRES esp_event esp_netif lwip + MOCK_HEADER_FILES ${original_esp_wifi_dir}/include/esp_wifi.h + ${original_esp_wifi_dir}/include/esp_wifi_default.h + ${original_esp_wifi_dir}/include/esp_wifi_netif.h + ${original_esp_wifi_dir}/include/esp_wifi_he.h + ${original_esp_wifi_dir}/include/esp_wifi_ap_get_sta_list.h + ${original_esp_wifi_dir}/include/esp_smartconfig.h + ${original_esp_wifi_dir}/include/esp_mesh.h + ${original_esp_wifi_dir}/include/esp_now.h + ${original_esp_wifi_dir}/include/smartconfig_ack.h) + +# -Warray-parameter has been introduced in GCC 11 +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION GREATER_EQUAL "11.0.0") + target_compile_options(${COMPONENT_LIB} PRIVATE -Wno-array-parameter) +endif() +target_sources(${COMPONENT_LIB} PRIVATE "global_symbols_mock.c") diff --git a/tools/mocks/esp_wifi/Kconfig b/tools/mocks/esp_wifi/Kconfig new file mode 100644 index 0000000000..f4fa3b9dd8 --- /dev/null +++ b/tools/mocks/esp_wifi/Kconfig @@ -0,0 +1,22 @@ +# Mock Kconfig file to provide definitions +menu "Wi-Fi" + config ESP_WIFI_STATIC_RX_BUFFER_NUM + int "Max number of WiFi static RX buffers" + range 2 25 + default 10 + + config ESP_WIFI_DYNAMIC_RX_BUFFER_NUM + int "Max number of WiFi dynamic RX buffers" + range 0 1024 + default 32 + + config ESP_WIFI_TX_BUFFER_TYPE + int + default 1 + + config ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM + int "Maximum espnow encrypt peers number" + range 0 17 + default 7 + +endmenu # Wi-Fi diff --git a/tools/mocks/esp_wifi/global_symbols_mock.c b/tools/mocks/esp_wifi/global_symbols_mock.c new file mode 100644 index 0000000000..aa515dfec5 --- /dev/null +++ b/tools/mocks/esp_wifi/global_symbols_mock.c @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "esp_wifi.h" + +/** + * The following global objects are defined when WiFi is mocked. + */ + +const wpa_crypto_funcs_t g_wifi_default_wpa_crypto_funcs = { }; + +wifi_osi_funcs_t g_wifi_osi_funcs = { }; + +uint64_t g_wifi_feature_caps = 0; diff --git a/tools/mocks/esp_wifi/mock/mock_config.yaml b/tools/mocks/esp_wifi/mock/mock_config.yaml new file mode 100644 index 0000000000..cbc630291d --- /dev/null +++ b/tools/mocks/esp_wifi/mock/mock_config.yaml @@ -0,0 +1,19 @@ +:cmock: + :includes_h_pre_header: + - esp_netif_types.h + :includes_c_pre_header: + # Some types are not directly included in header files + - esp_netif_types.h + - esp_wifi_types.h + - esp_netif_mock.h + - esp_smartconfig.h + :plugins: + - expect + - expect_any_args + - return_thru_ptr + - array + - ignore + - ignore_arg + - callback + :strippables: + - '(?:ESP_EVENT_DECLARE_BASE\s*\([\s\w\*_,]*\))' diff --git a/tools/test_apps/linux_compatible/wifi_build_test/CMakeLists.txt b/tools/test_apps/linux_compatible/wifi_build_test/CMakeLists.txt new file mode 100644 index 0000000000..8fcc1a0f85 --- /dev/null +++ b/tools/test_apps/linux_compatible/wifi_build_test/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) + +set(COMPONENTS main) +list(APPEND EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/tools/mocks/esp_wifi) +list(APPEND EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/tools/mocks/esp_netif) +list(APPEND EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/tools/mocks/esp_event) +list(APPEND EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/tools/mocks/lwip) + +project(wifi_build_test) diff --git a/tools/test_apps/linux_compatible/wifi_build_test/README.md b/tools/test_apps/linux_compatible/wifi_build_test/README.md new file mode 100644 index 0000000000..d0f363ef2c --- /dev/null +++ b/tools/test_apps/linux_compatible/wifi_build_test/README.md @@ -0,0 +1,4 @@ +| Supported Targets | Linux | +| ----------------- | ----- | + +This application is a build test. It checks that the WiFi mocks can be built correctly. Running it is possible but not useful. diff --git a/tools/test_apps/linux_compatible/wifi_build_test/main/CMakeLists.txt b/tools/test_apps/linux_compatible/wifi_build_test/main/CMakeLists.txt new file mode 100644 index 0000000000..9220b9ee55 --- /dev/null +++ b/tools/test_apps/linux_compatible/wifi_build_test/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "wifi_build_test.c" + INCLUDE_DIRS "." + PRIV_REQUIRES esp_wifi) diff --git a/tools/test_apps/linux_compatible/wifi_build_test/main/wifi_build_test.c b/tools/test_apps/linux_compatible/wifi_build_test/main/wifi_build_test.c new file mode 100644 index 0000000000..56a5c3463a --- /dev/null +++ b/tools/test_apps/linux_compatible/wifi_build_test/main/wifi_build_test.c @@ -0,0 +1,68 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +#include + +#include "sdkconfig.h" +#include "esp_wifi.h" +#include "Mockesp_wifi.h" +#include "Mockesp_wifi_default.h" +#include "Mockesp_wifi_netif.h" +#include "Mockesp_wifi_he.h" +#include "Mockesp_wifi_ap_get_sta_list.h" +#include "Mockesp_netif.h" +#include "Mockesp_mesh.h" +#include "Mockesp_now.h" +#include "Mockesp_smartconfig.h" +#include "Mocksmartconfig_ack.h" + +void app_main(void) +{ + esp_netif_init_IgnoreAndReturn(ESP_OK); + ESP_ERROR_CHECK(esp_netif_init()); + + esp_netif_create_default_wifi_sta_IgnoreAndReturn(ESP_OK); + esp_netif_create_default_wifi_sta(); + + esp_netif_create_default_wifi_ap_IgnoreAndReturn(ESP_OK); + esp_netif_create_default_wifi_ap(); + + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + esp_wifi_init_IgnoreAndReturn(ESP_OK); + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + esp_wifi_set_mode_IgnoreAndReturn(ESP_OK); + esp_wifi_set_config_IgnoreAndReturn(ESP_OK); + esp_wifi_start_IgnoreAndReturn(ESP_OK); + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) ); + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, NULL) ); + ESP_ERROR_CHECK(esp_wifi_start() ); + + esp_wifi_connect_IgnoreAndReturn(ESP_OK); + esp_wifi_connect(); + + esp_wifi_create_if_driver_IgnoreAndReturn(NULL); + esp_wifi_create_if_driver((wifi_interface_t) NULL); + + esp_wifi_ap_get_sta_list_with_ip_IgnoreAndReturn(ESP_OK); + esp_wifi_ap_get_sta_list_with_ip(NULL, NULL); + + esp_wifi_sta_itwt_setup_IgnoreAndReturn(ESP_OK); + esp_wifi_sta_itwt_setup((wifi_twt_setup_config_t*) NULL); + + sc_send_ack_stop_Ignore(); + sc_send_ack_stop(); + + esp_smartconfig_get_version_IgnoreAndReturn(NULL); + esp_smartconfig_get_version(); + + esp_mesh_init_IgnoreAndReturn(ESP_OK); + ESP_ERROR_CHECK(esp_mesh_init()); + + esp_now_init_IgnoreAndReturn(ESP_OK); + ESP_ERROR_CHECK(esp_now_init()); + + printf("WiFi build test done\n"); +} diff --git a/tools/test_apps/linux_compatible/wifi_build_test/sdkconfig.defaults b/tools/test_apps/linux_compatible/wifi_build_test/sdkconfig.defaults new file mode 100644 index 0000000000..9b39f10b99 --- /dev/null +++ b/tools/test_apps/linux_compatible/wifi_build_test/sdkconfig.defaults @@ -0,0 +1 @@ +CONFIG_IDF_TARGET="linux"