From 914d003c7b13ad60b1f406af0c87ffb754c85a94 Mon Sep 17 00:00:00 2001 From: Tomas Rezucha Date: Fri, 21 Mar 2025 10:31:40 +0100 Subject: [PATCH] test(usb): Extend USB mock with usb_host_device_info() Also provide mocks for CTRL transfers usb_host_transfer_submit_control() --- tools/mocks/usb/include/mock_add_usb_device.h | 64 ++++++++++++++++++- tools/mocks/usb/mock_add_usb_device.c | 56 +++++++++++++++- 2 files changed, 118 insertions(+), 2 deletions(-) diff --git a/tools/mocks/usb/include/mock_add_usb_device.h b/tools/mocks/usb/include/mock_add_usb_device.h index bf49e3bfa8..f4c03fb55e 100644 --- a/tools/mocks/usb/include/mock_add_usb_device.h +++ b/tools/mocks/usb/include/mock_add_usb_device.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -289,6 +289,68 @@ esp_err_t usb_host_transfer_submit_invalid_response_mock_callback(usb_transfer_t */ esp_err_t usb_host_transfer_submit_timeout_mock_callback(usb_transfer_t *transfer, int call_count); +/** + * @brief Submit CTRL transfer, success + * @note CMock callback function, registered to usb_host_transfer_submit_control() + * + * Transfer callback is called, transfer status marked as completed, correct number of transferred bytes + * + * @param[in] client_hdl Client handle + * @param[in] transfer Pointer to USB transfer + * @param[out] call_count Call count of the callback function (CMock mandatory argument) + * + * @return + * - ESP_OK: Transfer submitted + * - ESP_ERR_INVALID_ARG: Invalid input argument + */ +esp_err_t usb_host_transfer_submit_control_success_mock_callback(usb_host_client_handle_t client_hdl, usb_transfer_t *transfer, int call_count); + +/** + * @brief Submit CTRL transfer, error + * @note CMock callback function, registered to usb_host_transfer_submit_control() + * + * Transfer callback is called, transfer status marked as error, incorrect number of transferred bytes + * + * @param[in] client_hdl Client handle + * @param[in] transfer Pointer to USB transfer + * @param[out] call_count Call count of the callback function (CMock mandatory argument) + * + * @return + * - ESP_OK: Transfer submitted + * - ESP_ERR_INVALID_ARG: Invalid input argument + */ +esp_err_t usb_host_transfer_submit_control_invalid_response_mock_callback(usb_host_client_handle_t client_hdl, usb_transfer_t *transfer, int call_count); + +/** + * @brief Submit CTRL transfer, time the transfer out + * @note CMock callback function, registered to usb_host_transfer_submit_control() + * + * Transfer callback is not called, because transfer timeout is not implemented in the USB Host Library + * + * @param[in] client_hdl Client handle + * @param[in] transfer Pointer to USB transfer + * @param[out] call_count Call count of the callback function (CMock mandatory argument) + * + * @return + * - ESP_OK: Transfer submitted + * - ESP_ERR_INVALID_ARG: Invalid input argument + */ +esp_err_t usb_host_transfer_submit_control_timeout_mock_callback(usb_host_client_handle_t client_hdl, usb_transfer_t *transfer, int call_count); + +/** + * @brief USB Host device info mock callback + * @note CMock callback function registered to usb_host_device_info() + * + * @param[in] dev_hdl Device handle + * @param[out] dev_info Device information + * @param[out] call_count Call count of the callback function (CMock mandatory argument) + * + * @return + * - ESP_OK: Device information obtained successfully + * - ESP_ERR_INVALID_ARG: Invalid argument + */ +esp_err_t usb_host_device_info_mock_callback(usb_device_handle_t dev_hdl, usb_device_info_t *dev_info, int call_count); + #ifdef __cplusplus } #endif diff --git a/tools/mocks/usb/mock_add_usb_device.c b/tools/mocks/usb/mock_add_usb_device.c index b8a0e5fba9..f683af647a 100644 --- a/tools/mocks/usb/mock_add_usb_device.c +++ b/tools/mocks/usb/mock_add_usb_device.c @@ -1,10 +1,11 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ #include +#include #include "esp_log.h" #include "usb_private.h" #include "usb/usb_types_ch9.h" @@ -374,3 +375,56 @@ esp_err_t usb_host_transfer_submit_timeout_mock_callback(usb_transfer_t *transfe MOCK_CHECK((transfer->bEndpointAddress & USB_B_ENDPOINT_ADDRESS_EP_NUM_MASK) != 0, ESP_ERR_INVALID_ARG); return ESP_OK; } + +esp_err_t usb_host_transfer_submit_control_success_mock_callback(usb_host_client_handle_t client_hdl, usb_transfer_t *transfer, int call_count) +{ + MOCK_CHECK(client_hdl != NULL && transfer != NULL, ESP_ERR_INVALID_ARG); + // Check that control transfer is valid + MOCK_CHECK(transfer->device_handle != NULL, ESP_ERR_INVALID_ARG); // Target device must be set + // Control transfers must be targeted at EP 0 + MOCK_CHECK((transfer->bEndpointAddress & USB_B_ENDPOINT_ADDRESS_EP_NUM_MASK) == 0, ESP_ERR_INVALID_ARG); + + transfer->status = USB_TRANSFER_STATUS_COMPLETED; + transfer->actual_num_bytes = transfer->num_bytes; + transfer->callback(transfer); + ESP_LOGD(MOCK_TAG_CB, "CTRL mocked transfer submitted, buff len: %d, buff: %s", transfer->num_bytes, transfer->data_buffer); + return ESP_OK; +} + +esp_err_t usb_host_transfer_submit_control_invalid_response_mock_callback(usb_host_client_handle_t client_hdl, usb_transfer_t *transfer, int call_count) +{ + MOCK_CHECK(client_hdl != NULL && transfer != NULL, ESP_ERR_INVALID_ARG); + // Check that control transfer is valid + MOCK_CHECK(transfer->device_handle != NULL, ESP_ERR_INVALID_ARG); // Target device must be set + // Control transfers must be targeted at EP 0 + MOCK_CHECK((transfer->bEndpointAddress & USB_B_ENDPOINT_ADDRESS_EP_NUM_MASK) == 0, ESP_ERR_INVALID_ARG); + + transfer->status = USB_TRANSFER_STATUS_ERROR; + transfer->actual_num_bytes = 0; + transfer->callback(transfer); + ESP_LOGD(MOCK_TAG_CB, "CTRL mocked transfer submitted, buff len: %d, buff: %s", transfer->num_bytes, transfer->data_buffer); + ESP_LOGW(MOCK_TAG_CB, "CTRL mocked transfer error"); + return ESP_OK; +} + +esp_err_t usb_host_transfer_submit_control_timeout_mock_callback(usb_host_client_handle_t client_hdl, usb_transfer_t *transfer, int call_count) +{ + MOCK_CHECK(client_hdl != NULL && transfer != NULL, ESP_ERR_INVALID_ARG); + // Check that control transfer is valid + MOCK_CHECK(transfer->device_handle != NULL, ESP_ERR_INVALID_ARG); // Target device must be set + // Control transfers must be targeted at EP 0 + MOCK_CHECK((transfer->bEndpointAddress & USB_B_ENDPOINT_ADDRESS_EP_NUM_MASK) == 0, ESP_ERR_INVALID_ARG); + return ESP_OK; +} + +esp_err_t usb_host_device_info_mock_callback(usb_device_handle_t dev_hdl, usb_device_info_t *dev_info, int call_count) +{ + MOCK_CHECK(dev_hdl != NULL && dev_info != NULL, ESP_ERR_INVALID_ARG); + + const device_list_t *current_device = (const device_list_t *) dev_hdl; + memset(dev_info, 0, sizeof(usb_device_info_t)); + dev_info->dev_addr = current_device->address; + dev_info->bMaxPacketSize0 = current_device->dev_desc->bMaxPacketSize0; + dev_info->bConfigurationValue = 1; + return ESP_OK; +}