feat(linux): added esp_wifi mocking support

This commit is contained in:
Jakob Hasse 2023-06-26 13:22:03 +08:00
parent 453dc6ab40
commit 9ed56031b2
13 changed files with 212 additions and 1 deletions

View File

@ -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
)

View File

@ -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)

View File

@ -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;
};

View File

@ -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

View File

@ -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")

View File

@ -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

View File

@ -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;

View File

@ -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\*_,]*\))'

View File

@ -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)

View File

@ -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.

View File

@ -0,0 +1,3 @@
idf_component_register(SRCS "wifi_build_test.c"
INCLUDE_DIRS "."
PRIV_REQUIRES esp_wifi)

View File

@ -0,0 +1,68 @@
/*
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
#include <stdio.h>
#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");
}

View File

@ -0,0 +1 @@
CONFIG_IDF_TARGET="linux"