diff --git a/module/scmi_power_capping/src/scmi_power_capping_protocol.c b/module/scmi_power_capping/src/scmi_power_capping_protocol.c index 84173e269..4cff0701c 100644 --- a/module/scmi_power_capping/src/scmi_power_capping_protocol.c +++ b/module/scmi_power_capping/src/scmi_power_capping_protocol.c @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2023, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2023-2024, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause * @@ -125,9 +125,7 @@ static const fwk_id_t pcapping_protocol_power_measurements_notification = MOD_POWER_METER_NOTIFICATION_IDX_MEASUREMENTS_CHANGED); #endif -static int (*handler_table[MOD_SCMI_POWER_CAPPING_COMMAND_COUNT])( - fwk_id_t, - const uint32_t *) = { +static handler_table_t handler_table[MOD_SCMI_POWER_CAPPING_COMMAND_COUNT] = { [MOD_SCMI_PROTOCOL_VERSION] = scmi_power_capping_protocol_version_handler, [MOD_SCMI_PROTOCOL_ATTRIBUTES] = scmi_power_capping_protocol_attributes_handler, @@ -152,7 +150,7 @@ static int (*handler_table[MOD_SCMI_POWER_CAPPING_COMMAND_COUNT])( #endif }; -static unsigned int payload_size_table[MOD_SCMI_POWER_CAPPING_COMMAND_COUNT] = { +static size_t payload_size_table[MOD_SCMI_POWER_CAPPING_COMMAND_COUNT] = { [MOD_SCMI_PROTOCOL_VERSION] = 0, [MOD_SCMI_PROTOCOL_ATTRIBUTES] = 0, [MOD_SCMI_PROTOCOL_MESSAGE_ATTRIBUTES] = @@ -195,8 +193,29 @@ static_assert( #ifdef BUILD_HAS_MOD_RESOURCE_PERMS static int scmi_power_capping_permissions_handler( unsigned int message_id, - fwk_id_t service_id, - const uint32_t *payload); + fwk_id_t cap_service_id, + const uint32_t *payload) +{ + unsigned int agent_id; + enum mod_res_perms_permissions perms; + int status; + + status = + pcapping_protocol_ctx.scmi_api->get_agent_id(cap_service_id, &agent_id); + + if (status != FWK_SUCCESS) { + return FWK_E_ACCESS; + } + + perms = pcapping_protocol_ctx.res_perms_api->agent_has_resource_permission( + agent_id, MOD_SCMI_PROTOCOL_ID_POWER_CAPPING, message_id, *payload); + + if (perms == MOD_RES_PERMS_ACCESS_DENIED) { + status = FWK_E_ACCESS; + } + + return status; +} #endif /* @@ -894,44 +913,6 @@ static int scmi_power_capping_get_scmi_protocol_id( return FWK_SUCCESS; } -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS -static int scmi_power_capping_permissions_handler( - unsigned int message_id, - fwk_id_t cap_service_id, - const uint32_t *payload) -{ - unsigned int agent_id; - enum mod_res_perms_permissions perms; - int status; - - status = - pcapping_protocol_ctx.scmi_api->get_agent_id(cap_service_id, &agent_id); - - if (status != FWK_SUCCESS) { - return FWK_E_ACCESS; - } - - if (message_id < MOD_SCMI_POWER_CAPPING_DOMAIN_ATTRIBUTES) { - perms = - pcapping_protocol_ctx.res_perms_api->agent_has_protocol_permission( - agent_id, MOD_SCMI_PROTOCOL_ID_POWER_CAPPING); - } else { - perms = - pcapping_protocol_ctx.res_perms_api->agent_has_resource_permission( - agent_id, - MOD_SCMI_PROTOCOL_ID_POWER_CAPPING, - message_id, - *payload); - } - - if (perms == MOD_RES_PERMS_ACCESS_DENIED) { - status = FWK_E_ACCESS; - } - - return status; -} -#endif - static int scmi_power_capping_message_handler( fwk_id_t protocol_id, fwk_id_t service_id, @@ -939,44 +920,24 @@ static int scmi_power_capping_message_handler( size_t payload_size, unsigned int message_id) { - uint32_t domain_id; -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - int status; -#endif - - fwk_assert(payload != NULL); - - if (message_id >= FWK_ARRAY_SIZE(handler_table)) { - return scmi_power_capping_respond_error(service_id, SCMI_NOT_FOUND); - } - - if (message_id >= MOD_SCMI_POWER_CAPPING_DOMAIN_ATTRIBUTES) { - domain_id = *payload; - if (domain_id >= pcapping_protocol_ctx.power_capping_domain_count) { - return scmi_power_capping_respond_error(service_id, SCMI_NOT_FOUND); - } - } - - if (handler_table[message_id] == NULL) { - /* Message is not supported */ - return scmi_power_capping_respond_error(service_id, SCMI_NOT_SUPPORTED); - } - - if (payload_size != payload_size_table[message_id]) { - /* Incorrect payload size */ - return scmi_power_capping_respond_error( - service_id, SCMI_PROTOCOL_ERROR); - } - -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - status = - scmi_power_capping_permissions_handler(message_id, service_id, payload); - if (status != FWK_SUCCESS) { - return scmi_power_capping_respond_error(service_id, SCMI_DENIED); + int validation_result; + + validation_result = pcapping_protocol_ctx.scmi_api->scmi_message_validation( + MOD_SCMI_PROTOCOL_ID_POWER_CAPPING, + service_id, + payload, + payload_size, + message_id, + payload_size_table, + (unsigned int)MOD_SCMI_POWER_CAPPING_COMMAND_COUNT, + handler_table); + + if (validation_result == SCMI_SUCCESS) { + return handler_table[message_id](service_id, payload); + } else { + return pcapping_protocol_ctx.scmi_api->respond( + service_id, &validation_result, sizeof(validation_result)); } -#endif - - return handler_table[message_id](service_id, payload); } static struct mod_scmi_to_protocol_api diff --git a/module/scmi_power_capping/test/CMakeLists.txt b/module/scmi_power_capping/test/CMakeLists.txt index 604ef26d2..ce7742237 100644 --- a/module/scmi_power_capping/test/CMakeLists.txt +++ b/module/scmi_power_capping/test/CMakeLists.txt @@ -1,6 +1,6 @@ # # Arm SCP/MCP Software -# Copyright (c) 2023, Arm Limited and Contributors. All rights reserved. +# Copyright (c) 2023-2024, Arm Limited and Contributors. All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause # @@ -112,7 +112,6 @@ target_sources(${UNIT_TEST_TARGET} ${MODULE_UT_MOCK_SRC}/Mockmod_power_meter_extra.c ${MODULE_UT_MOCK_SRC}/Mockmod_resource_perms_extra.c) - ################################################################################ # Test scmi_power_capping_protocol.c + notifications # ################################################################################ diff --git a/module/scmi_power_capping/test/mocks/Mockmod_scmi_extra.c b/module/scmi_power_capping/test/mocks/Mockmod_scmi_extra.c index a05113ab1..ebdf53405 100644 --- a/module/scmi_power_capping/test/mocks/Mockmod_scmi_extra.c +++ b/module/scmi_power_capping/test/mocks/Mockmod_scmi_extra.c @@ -8,15 +8,20 @@ static const char* CMockString_agent_count = "agent_count"; static const char* CMockString_agent_id = "agent_id"; static const char* CMockString_agent_idx = "agent_idx"; +static const char* CMockString_command_count = "command_count"; static const char* CMockString_element_count = "element_count"; static const char* CMockString_element_idx = "element_idx"; static const char* CMockString_get_agent_count = "get_agent_count"; static const char* CMockString_get_agent_id = "get_agent_id"; +static const char* CMockString_handler_table = "handler_table"; +static const char* CMockString_message_id = "message_id"; +static const char* CMockString_mod_scmi_from_protocol_api_scmi_frame_validation = "mod_scmi_from_protocol_api_scmi_frame_validation"; static const char* CMockString_operation_count = "operation_count"; static const char* CMockString_operation_id = "operation_id"; static const char* CMockString_payload = "payload"; static const char* CMockString_payload_p2a = "payload_p2a"; static const char* CMockString_payload_size = "payload_size"; +static const char* CMockString_payload_size_table = "payload_size_table"; static const char* CMockString_protocol_id = "protocol_id"; static const char* CMockString_respond = "respond"; static const char* CMockString_scmi_notification_add_subscriber = "scmi_notification_add_subscriber"; @@ -142,6 +147,33 @@ typedef struct _CMOCK_scmi_notification_notify_CALL_INSTANCE } CMOCK_scmi_notification_notify_CALL_INSTANCE; +typedef struct _CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE +{ + UNITY_LINE_TYPE LineNumber; + char ExpectAnyArgsBool; + int ReturnVal; + uint8_t Expected_protocol_id; + fwk_id_t Expected_service_id; + const uint32_t* Expected_payload; + size_t Expected_payload_size; + size_t Expected_message_id; + const size_t* Expected_payload_size_table; + size_t Expected_command_count; + const handler_table_t* Expected_handler_table; + int Expected_payload_Depth; + int Expected_payload_size_table_Depth; + int Expected_handler_table_Depth; + char IgnoreArg_protocol_id; + char IgnoreArg_service_id; + char IgnoreArg_payload; + char IgnoreArg_payload_size; + char IgnoreArg_message_id; + char IgnoreArg_payload_size_table; + char IgnoreArg_command_count; + char IgnoreArg_handler_table; + +} CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE; + static struct Mockmod_scmi_extraInstance { char get_agent_count_IgnoreBool; @@ -186,6 +218,12 @@ static struct Mockmod_scmi_extraInstance CMOCK_scmi_notification_notify_CALLBACK scmi_notification_notify_CallbackFunctionPointer; int scmi_notification_notify_CallbackCalls; CMOCK_MEM_INDEX_TYPE scmi_notification_notify_CallInstance; + char mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreBool; + int mod_scmi_from_protocol_api_scmi_frame_validation_FinalReturn; + char mod_scmi_from_protocol_api_scmi_frame_validation_CallbackBool; + CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALLBACK mod_scmi_from_protocol_api_scmi_frame_validation_CallbackFunctionPointer; + int mod_scmi_from_protocol_api_scmi_frame_validation_CallbackCalls; + CMOCK_MEM_INDEX_TYPE mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance; } Mock; extern jmp_buf AbortFrame; @@ -285,6 +323,19 @@ void Mockmod_scmi_extra_Verify(void) call_instance = CMOCK_GUTS_NONE; (void)call_instance; } + call_instance = Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance; + if (Mock.mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreBool) + call_instance = CMOCK_GUTS_NONE; + if (CMOCK_GUTS_NONE != call_instance) + { + UNITY_SET_DETAIL(CMockString_mod_scmi_from_protocol_api_scmi_frame_validation); + UNITY_TEST_FAIL(cmock_line, CMockStringCalledLess); + } + if (Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallbackFunctionPointer != NULL) + { + call_instance = CMOCK_GUTS_NONE; + (void)call_instance; + } } void Mockmod_scmi_extra_Init(void) @@ -1466,3 +1517,248 @@ void scmi_notification_notify_CMockIgnoreArg_payload_size(UNITY_LINE_TYPE cmock_ cmock_call_instance->IgnoreArg_payload_size = 1; } +int mod_scmi_from_protocol_api_scmi_frame_validation(uint8_t protocol_id, fwk_id_t service_id, const uint32_t* payload, size_t payload_size, size_t message_id, const size_t* payload_size_table, size_t command_count, const handler_table_t* handler_table) +{ + UNITY_LINE_TYPE cmock_line = TEST_LINE_NUM; + CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE* cmock_call_instance; + UNITY_SET_DETAIL(CMockString_mod_scmi_from_protocol_api_scmi_frame_validation); + cmock_call_instance = (CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE*)CMock_Guts_GetAddressFor(Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance); + Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance = CMock_Guts_MemNext(Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance); + if (Mock.mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreBool) + { + UNITY_CLR_DETAILS(); + if (cmock_call_instance == NULL) + return Mock.mod_scmi_from_protocol_api_scmi_frame_validation_FinalReturn; + Mock.mod_scmi_from_protocol_api_scmi_frame_validation_FinalReturn = cmock_call_instance->ReturnVal; + return cmock_call_instance->ReturnVal; + } + if (!Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallbackBool && + Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallbackFunctionPointer != NULL) + { + int cmock_cb_ret = Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallbackFunctionPointer(protocol_id, service_id, payload, payload_size, message_id, payload_size_table, command_count, handler_table, Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallbackCalls++); + UNITY_CLR_DETAILS(); + return cmock_cb_ret; + } + UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringCalledMore); + cmock_line = cmock_call_instance->LineNumber; + if (!cmock_call_instance->ExpectAnyArgsBool) + { + if (!cmock_call_instance->IgnoreArg_protocol_id) + { + UNITY_SET_DETAILS(CMockString_mod_scmi_from_protocol_api_scmi_frame_validation,CMockString_protocol_id); + UNITY_TEST_ASSERT_EQUAL_HEX8(cmock_call_instance->Expected_protocol_id, protocol_id, cmock_line, CMockStringMismatch); + } + if (!cmock_call_instance->IgnoreArg_service_id) + { + UNITY_SET_DETAILS(CMockString_mod_scmi_from_protocol_api_scmi_frame_validation,CMockString_service_id); + UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(&cmock_call_instance->Expected_service_id), (void*)(&service_id), sizeof(fwk_id_t), cmock_line, CMockStringMismatch); + } + if (!cmock_call_instance->IgnoreArg_payload) + { + UNITY_SET_DETAILS(CMockString_mod_scmi_from_protocol_api_scmi_frame_validation,CMockString_payload); + if (cmock_call_instance->Expected_payload == NULL) + { UNITY_TEST_ASSERT_NULL(payload, cmock_line, CMockStringExpNULL); } + else + { UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY(cmock_call_instance->Expected_payload, payload, cmock_call_instance->Expected_payload_Depth, cmock_line, CMockStringMismatch); } + } + if (!cmock_call_instance->IgnoreArg_payload_size) + { + UNITY_SET_DETAILS(CMockString_mod_scmi_from_protocol_api_scmi_frame_validation,CMockString_payload_size); + UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(&cmock_call_instance->Expected_payload_size), (void*)(&payload_size), sizeof(size_t), cmock_line, CMockStringMismatch); + } + if (!cmock_call_instance->IgnoreArg_message_id) + { + UNITY_SET_DETAILS(CMockString_mod_scmi_from_protocol_api_scmi_frame_validation,CMockString_message_id); + UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(&cmock_call_instance->Expected_message_id), (void*)(&message_id), sizeof(size_t), cmock_line, CMockStringMismatch); + } + if (!cmock_call_instance->IgnoreArg_payload_size_table) + { + UNITY_SET_DETAILS(CMockString_mod_scmi_from_protocol_api_scmi_frame_validation,CMockString_payload_size_table); + if (cmock_call_instance->Expected_payload_size_table == NULL) + { UNITY_TEST_ASSERT_NULL(payload_size_table, cmock_line, CMockStringExpNULL); } + else + { UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((void*)(cmock_call_instance->Expected_payload_size_table), (void*)(payload_size_table), sizeof(const size_t), cmock_call_instance->Expected_payload_size_table_Depth, cmock_line, CMockStringMismatch); } + } + if (!cmock_call_instance->IgnoreArg_command_count) + { + UNITY_SET_DETAILS(CMockString_mod_scmi_from_protocol_api_scmi_frame_validation,CMockString_command_count); + UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(&cmock_call_instance->Expected_command_count), (void*)(&command_count), sizeof(size_t), cmock_line, CMockStringMismatch); + } + if (!cmock_call_instance->IgnoreArg_handler_table) + { + UNITY_SET_DETAILS(CMockString_mod_scmi_from_protocol_api_scmi_frame_validation,CMockString_handler_table); + if (cmock_call_instance->Expected_handler_table == NULL) + { UNITY_TEST_ASSERT_NULL(handler_table, cmock_line, CMockStringExpNULL); } + else + { UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((void*)(cmock_call_instance->Expected_handler_table), (void*)(handler_table), sizeof(const handler_table_t), cmock_call_instance->Expected_handler_table_Depth, cmock_line, CMockStringMismatch); } + } + } + if (Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallbackFunctionPointer != NULL) + { + cmock_call_instance->ReturnVal = Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallbackFunctionPointer(protocol_id, service_id, payload, payload_size, message_id, payload_size_table, command_count, handler_table, Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallbackCalls++); + } + UNITY_CLR_DETAILS(); + return cmock_call_instance->ReturnVal; +} + +void CMockExpectParameters_mod_scmi_from_protocol_api_scmi_frame_validation(CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE* cmock_call_instance, uint8_t protocol_id, fwk_id_t service_id, const uint32_t* payload, int payload_Depth, size_t payload_size, size_t message_id, const size_t* payload_size_table, int payload_size_table_Depth, size_t command_count, const handler_table_t* handler_table, int handler_table_Depth); +void CMockExpectParameters_mod_scmi_from_protocol_api_scmi_frame_validation(CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE* cmock_call_instance, uint8_t protocol_id, fwk_id_t service_id, const uint32_t* payload, int payload_Depth, size_t payload_size, size_t message_id, const size_t* payload_size_table, int payload_size_table_Depth, size_t command_count, const handler_table_t* handler_table, int handler_table_Depth) +{ + cmock_call_instance->Expected_protocol_id = protocol_id; + cmock_call_instance->IgnoreArg_protocol_id = 0; + memcpy((void*)(&cmock_call_instance->Expected_service_id), (void*)(&service_id), + sizeof(fwk_id_t[sizeof(service_id) == sizeof(fwk_id_t) ? 1 : -1])); /* add fwk_id_t to :treat_as_array if this causes an error */ + cmock_call_instance->IgnoreArg_service_id = 0; + cmock_call_instance->Expected_payload = payload; + cmock_call_instance->Expected_payload_Depth = payload_Depth; + cmock_call_instance->IgnoreArg_payload = 0; + memcpy((void*)(&cmock_call_instance->Expected_payload_size), (void*)(&payload_size), + sizeof(size_t[sizeof(payload_size) == sizeof(size_t) ? 1 : -1])); /* add size_t to :treat_as_array if this causes an error */ + cmock_call_instance->IgnoreArg_payload_size = 0; + memcpy((void*)(&cmock_call_instance->Expected_message_id), (void*)(&message_id), + sizeof(size_t[sizeof(message_id) == sizeof(size_t) ? 1 : -1])); /* add size_t to :treat_as_array if this causes an error */ + cmock_call_instance->IgnoreArg_message_id = 0; + cmock_call_instance->Expected_payload_size_table = payload_size_table; + cmock_call_instance->Expected_payload_size_table_Depth = payload_size_table_Depth; + cmock_call_instance->IgnoreArg_payload_size_table = 0; + memcpy((void*)(&cmock_call_instance->Expected_command_count), (void*)(&command_count), + sizeof(size_t[sizeof(command_count) == sizeof(size_t) ? 1 : -1])); /* add size_t to :treat_as_array if this causes an error */ + cmock_call_instance->IgnoreArg_command_count = 0; + cmock_call_instance->Expected_handler_table = handler_table; + cmock_call_instance->Expected_handler_table_Depth = handler_table_Depth; + cmock_call_instance->IgnoreArg_handler_table = 0; +} + +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreAndReturn(UNITY_LINE_TYPE cmock_line, int cmock_to_return) +{ + CMOCK_MEM_INDEX_TYPE cmock_guts_index = CMock_Guts_MemNew(sizeof(CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE)); + CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE* cmock_call_instance = (CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE*)CMock_Guts_GetAddressFor(cmock_guts_index); + UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringOutOfMemory); + memset(cmock_call_instance, 0, sizeof(*cmock_call_instance)); + Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance = CMock_Guts_MemChain(Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance, cmock_guts_index); + Mock.mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreBool = (char)0; + cmock_call_instance->LineNumber = cmock_line; + cmock_call_instance->ExpectAnyArgsBool = (char)0; + cmock_call_instance->ReturnVal = cmock_to_return; + Mock.mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreBool = (char)1; +} + +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockStopIgnore(void) +{ + if(Mock.mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreBool) + Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance = CMock_Guts_MemNext(Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance); + Mock.mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreBool = (char)0; +} + +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockExpectAnyArgsAndReturn(UNITY_LINE_TYPE cmock_line, int cmock_to_return) +{ + CMOCK_MEM_INDEX_TYPE cmock_guts_index = CMock_Guts_MemNew(sizeof(CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE)); + CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE* cmock_call_instance = (CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE*)CMock_Guts_GetAddressFor(cmock_guts_index); + UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringOutOfMemory); + memset(cmock_call_instance, 0, sizeof(*cmock_call_instance)); + Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance = CMock_Guts_MemChain(Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance, cmock_guts_index); + Mock.mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreBool = (char)0; + cmock_call_instance->LineNumber = cmock_line; + cmock_call_instance->ExpectAnyArgsBool = (char)0; + cmock_call_instance->ReturnVal = cmock_to_return; + cmock_call_instance->ExpectAnyArgsBool = (char)1; +} + +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, uint8_t protocol_id, fwk_id_t service_id, const uint32_t* payload, size_t payload_size, size_t message_id, const size_t* payload_size_table, size_t command_count, const handler_table_t* handler_table, int cmock_to_return) +{ + CMOCK_MEM_INDEX_TYPE cmock_guts_index = CMock_Guts_MemNew(sizeof(CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE)); + CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE* cmock_call_instance = (CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE*)CMock_Guts_GetAddressFor(cmock_guts_index); + UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringOutOfMemory); + memset(cmock_call_instance, 0, sizeof(*cmock_call_instance)); + Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance = CMock_Guts_MemChain(Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance, cmock_guts_index); + Mock.mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreBool = (char)0; + cmock_call_instance->LineNumber = cmock_line; + cmock_call_instance->ExpectAnyArgsBool = (char)0; + CMockExpectParameters_mod_scmi_from_protocol_api_scmi_frame_validation(cmock_call_instance, protocol_id, service_id, payload, payload_size, payload_size, message_id, payload_size_table, 1, command_count, handler_table, 1); + cmock_call_instance->ReturnVal = cmock_to_return; +} + +void mod_scmi_from_protocol_api_scmi_frame_validation_AddCallback(CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALLBACK Callback) +{ + Mock.mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreBool = (char)0; + Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallbackBool = (char)1; + Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallbackFunctionPointer = Callback; +} + +void mod_scmi_from_protocol_api_scmi_frame_validation_Stub(CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALLBACK Callback) +{ + Mock.mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreBool = (char)0; + Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallbackBool = (char)0; + Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallbackFunctionPointer = Callback; +} + +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockExpectWithArrayAndReturn(UNITY_LINE_TYPE cmock_line, uint8_t protocol_id, fwk_id_t service_id, const uint32_t* payload, int payload_Depth, size_t payload_size, size_t message_id, const size_t* payload_size_table, int payload_size_table_Depth, size_t command_count, const handler_table_t* handler_table, int handler_table_Depth, int cmock_to_return) +{ + CMOCK_MEM_INDEX_TYPE cmock_guts_index = CMock_Guts_MemNew(sizeof(CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE)); + CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE* cmock_call_instance = (CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE*)CMock_Guts_GetAddressFor(cmock_guts_index); + UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringOutOfMemory); + memset(cmock_call_instance, 0, sizeof(*cmock_call_instance)); + Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance = CMock_Guts_MemChain(Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance, cmock_guts_index); + Mock.mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreBool = (char)0; + cmock_call_instance->LineNumber = cmock_line; + cmock_call_instance->ExpectAnyArgsBool = (char)0; + CMockExpectParameters_mod_scmi_from_protocol_api_scmi_frame_validation(cmock_call_instance, protocol_id, service_id, payload, payload_Depth, payload_size, message_id, payload_size_table, payload_size_table_Depth, command_count, handler_table, handler_table_Depth); + cmock_call_instance->ReturnVal = cmock_to_return; +} + +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_protocol_id(UNITY_LINE_TYPE cmock_line) +{ + CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE* cmock_call_instance = (CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance)); + UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringIgnPreExp); + cmock_call_instance->IgnoreArg_protocol_id = 1; +} + +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_service_id(UNITY_LINE_TYPE cmock_line) +{ + CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE* cmock_call_instance = (CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance)); + UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringIgnPreExp); + cmock_call_instance->IgnoreArg_service_id = 1; +} + +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_payload(UNITY_LINE_TYPE cmock_line) +{ + CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE* cmock_call_instance = (CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance)); + UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringIgnPreExp); + cmock_call_instance->IgnoreArg_payload = 1; +} + +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_payload_size(UNITY_LINE_TYPE cmock_line) +{ + CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE* cmock_call_instance = (CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance)); + UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringIgnPreExp); + cmock_call_instance->IgnoreArg_payload_size = 1; +} + +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_message_id(UNITY_LINE_TYPE cmock_line) +{ + CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE* cmock_call_instance = (CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance)); + UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringIgnPreExp); + cmock_call_instance->IgnoreArg_message_id = 1; +} + +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_payload_size_table(UNITY_LINE_TYPE cmock_line) +{ + CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE* cmock_call_instance = (CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance)); + UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringIgnPreExp); + cmock_call_instance->IgnoreArg_payload_size_table = 1; +} + +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_command_count(UNITY_LINE_TYPE cmock_line) +{ + CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE* cmock_call_instance = (CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance)); + UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringIgnPreExp); + cmock_call_instance->IgnoreArg_command_count = 1; +} + +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_handler_table(UNITY_LINE_TYPE cmock_line) +{ + CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE* cmock_call_instance = (CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.mod_scmi_from_protocol_api_scmi_frame_validation_CallInstance)); + UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringIgnPreExp); + cmock_call_instance->IgnoreArg_handler_table = 1; +} + diff --git a/module/scmi_power_capping/test/mocks/Mockmod_scmi_extra.h b/module/scmi_power_capping/test/mocks/Mockmod_scmi_extra.h index 44be870e9..94fe02daf 100644 --- a/module/scmi_power_capping/test/mocks/Mockmod_scmi_extra.h +++ b/module/scmi_power_capping/test/mocks/Mockmod_scmi_extra.h @@ -174,6 +174,36 @@ void scmi_notification_notify_CMockIgnoreArg_scmi_response_message_id(UNITY_LINE void scmi_notification_notify_CMockIgnoreArg_payload_p2a(UNITY_LINE_TYPE cmock_line); #define scmi_notification_notify_IgnoreArg_payload_size() scmi_notification_notify_CMockIgnoreArg_payload_size(__LINE__) void scmi_notification_notify_CMockIgnoreArg_payload_size(UNITY_LINE_TYPE cmock_line); +#define mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreAndReturn(cmock_retval) mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreAndReturn(__LINE__, cmock_retval) +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreAndReturn(UNITY_LINE_TYPE cmock_line, int cmock_to_return); +#define mod_scmi_from_protocol_api_scmi_frame_validation_StopIgnore() mod_scmi_from_protocol_api_scmi_frame_validation_CMockStopIgnore() +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockStopIgnore(void); +#define mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn(cmock_retval) mod_scmi_from_protocol_api_scmi_frame_validation_CMockExpectAnyArgsAndReturn(__LINE__, cmock_retval) +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockExpectAnyArgsAndReturn(UNITY_LINE_TYPE cmock_line, int cmock_to_return); +#define mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAndReturn(protocol_id, service_id, payload, payload_size, message_id, payload_size_table, command_count, handler_table, cmock_retval) mod_scmi_from_protocol_api_scmi_frame_validation_CMockExpectAndReturn(__LINE__, protocol_id, service_id, payload, payload_size, message_id, payload_size_table, command_count, handler_table, cmock_retval) +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, uint8_t protocol_id, fwk_id_t service_id, const uint32_t* payload, size_t payload_size, size_t message_id, const size_t* payload_size_table, size_t command_count, const handler_table_t* handler_table, int cmock_to_return); +typedef int (* CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALLBACK)(uint8_t protocol_id, fwk_id_t service_id, const uint32_t* payload, size_t payload_size, size_t message_id, const size_t* payload_size_table, size_t command_count, const handler_table_t* handler_table, int cmock_num_calls); +void mod_scmi_from_protocol_api_scmi_frame_validation_AddCallback(CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALLBACK Callback); +void mod_scmi_from_protocol_api_scmi_frame_validation_Stub(CMOCK_mod_scmi_from_protocol_api_scmi_frame_validation_CALLBACK Callback); +#define mod_scmi_from_protocol_api_scmi_frame_validation_StubWithCallback mod_scmi_from_protocol_api_scmi_frame_validation_Stub +#define mod_scmi_from_protocol_api_scmi_frame_validation_ExpectWithArrayAndReturn(protocol_id, service_id, payload, payload_Depth, payload_size, message_id, payload_size_table, payload_size_table_Depth, command_count, handler_table, handler_table_Depth, cmock_retval) mod_scmi_from_protocol_api_scmi_frame_validation_CMockExpectWithArrayAndReturn(__LINE__, protocol_id, service_id, payload, payload_Depth, payload_size, message_id, payload_size_table, payload_size_table_Depth, command_count, handler_table, handler_table_Depth, cmock_retval) +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockExpectWithArrayAndReturn(UNITY_LINE_TYPE cmock_line, uint8_t protocol_id, fwk_id_t service_id, const uint32_t* payload, int payload_Depth, size_t payload_size, size_t message_id, const size_t* payload_size_table, int payload_size_table_Depth, size_t command_count, const handler_table_t* handler_table, int handler_table_Depth, int cmock_to_return); +#define mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreArg_protocol_id() mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_protocol_id(__LINE__) +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_protocol_id(UNITY_LINE_TYPE cmock_line); +#define mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreArg_service_id() mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_service_id(__LINE__) +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_service_id(UNITY_LINE_TYPE cmock_line); +#define mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreArg_payload() mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_payload(__LINE__) +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_payload(UNITY_LINE_TYPE cmock_line); +#define mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreArg_payload_size() mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_payload_size(__LINE__) +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_payload_size(UNITY_LINE_TYPE cmock_line); +#define mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreArg_message_id() mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_message_id(__LINE__) +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_message_id(UNITY_LINE_TYPE cmock_line); +#define mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreArg_payload_size_table() mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_payload_size_table(__LINE__) +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_payload_size_table(UNITY_LINE_TYPE cmock_line); +#define mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreArg_command_count() mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_command_count(__LINE__) +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_command_count(UNITY_LINE_TYPE cmock_line); +#define mod_scmi_from_protocol_api_scmi_frame_validation_IgnoreArg_handler_table() mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_handler_table(__LINE__) +void mod_scmi_from_protocol_api_scmi_frame_validation_CMockIgnoreArg_handler_table(UNITY_LINE_TYPE cmock_line); #if defined(__GNUC__) && !defined(__ICC) && !defined(__TMS470__) #if __GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ > 6 || (__GNUC_MINOR__ == 6 && __GNUC_PATCHLEVEL__ > 0))) diff --git a/module/scmi_power_capping/test/mod_scmi_extra.h b/module/scmi_power_capping/test/mod_scmi_extra.h index 471e9098c..72b6d93e6 100644 --- a/module/scmi_power_capping/test/mod_scmi_extra.h +++ b/module/scmi_power_capping/test/mod_scmi_extra.h @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2023, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2023-2024, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -10,6 +10,8 @@ #include "fwk_id.h" +#include + int get_agent_count(unsigned int *agent_count); int get_agent_id(fwk_id_t service_id, unsigned int *agent_id); int respond(fwk_id_t service_id, const void *payload, size_t size); @@ -39,4 +41,27 @@ int scmi_notification_notify( void *payload_p2a, size_t payload_size); +/*! + * \brief Validate received protocol message. + * + * \param protocol_id Protocol identifier. + * \param service_id Service identifier. + * \param payload Payload data to write, or NULL if a payload has already + * been written. + * \param payload_size Payload size. + * \param message_id Message identifier. + * \param payload_size_table Expected size of payload per message ID + * \param command_count total number of commands per protocol + * \param handler_table pointer to message handler + */ +int mod_scmi_from_protocol_api_scmi_frame_validation( + uint8_t protocol_id, + fwk_id_t service_id, + const uint32_t *payload, + size_t payload_size, + size_t message_id, + const size_t *payload_size_table, + size_t command_count, + const handler_table_t *handler_table); + #endif /* MOD_SCMI_EXTRA_H_ */ diff --git a/module/scmi_power_capping/test/scmi_power_capping_protocol_unit_test.c b/module/scmi_power_capping/test/scmi_power_capping_protocol_unit_test.c index 5f54fcaf3..99fd0e405 100644 --- a/module/scmi_power_capping/test/scmi_power_capping_protocol_unit_test.c +++ b/module/scmi_power_capping/test/scmi_power_capping_protocol_unit_test.c @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2023, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2023-2024, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -82,6 +82,7 @@ static const struct mod_scmi_from_protocol_api scmi_api = { .respond = respond, .get_agent_id = get_agent_id, .get_agent_count = get_agent_count, + .scmi_message_validation = mod_scmi_from_protocol_api_scmi_frame_validation, }; static const struct mod_power_allocator_api power_allocator_api = { @@ -254,6 +255,8 @@ void utest_message_handler_cmd_error(void) .status = SCMI_PROTOCOL_ERROR, }; + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_PROTOCOL_ERROR); EXPECT_RESPONSE_ERROR(ret_payload); /* Add payload to a command that normally doesn't expect a payload */ TEST_SCMI_COMMAND(MOD_SCMI_PROTOCOL_VERSION, dummy_payload); @@ -265,6 +268,8 @@ void utest_message_handler_invalid_cmd(void) .status = SCMI_NOT_FOUND, }; + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_NOT_FOUND); EXPECT_RESPONSE_ERROR(ret_payload); TEST_SCMI_COMMAND_NO_PAYLOAD(MOD_SCMI_POWER_CAPPING_COMMAND_COUNT); } @@ -279,6 +284,8 @@ void utest_message_handler_un_implemented_message(void) temp_handle = handler_table[MOD_SCMI_PROTOCOL_VERSION]; handler_table[MOD_SCMI_PROTOCOL_VERSION] = NULL; + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_NOT_SUPPORTED); EXPECT_RESPONSE_ERROR(ret_payload); TEST_SCMI_COMMAND_NO_PAYLOAD(MOD_SCMI_PROTOCOL_VERSION); @@ -292,9 +299,8 @@ void utest_message_handler_protocol_version(void) .version = SCMI_PROTOCOL_VERSION_POWER_CAPPING, }; -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_PROTOCOL_PASS_TEST(); -#endif + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_SUCCESS(ret_payload); TEST_SCMI_COMMAND_NO_PAYLOAD(MOD_SCMI_PROTOCOL_VERSION); } @@ -306,9 +312,8 @@ void utest_message_handler_protocol_attributes(void) .attributes = FAKE_POWER_CAPPING_IDX_COUNT, }; -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_PROTOCOL_PASS_TEST(); -#endif + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_SUCCESS(ret_payload); TEST_SCMI_COMMAND_NO_PAYLOAD(MOD_SCMI_PROTOCOL_ATTRIBUTES); } @@ -321,9 +326,9 @@ void utest_message_handler_protocol_msg_attributes_unsupported_msgs(void) struct scmi_protocol_message_attributes_p2a ret_payload = { .status = SCMI_NOT_FOUND }; -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_PROTOCOL_PASS_TEST(); -#endif + + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_NOT_FOUND); /* Test unsupported messages */ EXPECT_RESPONSE_ERROR(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_PROTOCOL_MESSAGE_ATTRIBUTES, cmd_payload); @@ -338,9 +343,8 @@ void utest_message_handler_protocol_msg_attributes_maxlimits(void) .status = SCMI_NOT_FOUND }; -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_PROTOCOL_PASS_TEST(); -#endif + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_NOT_FOUND); /* Test unsupported messages */ EXPECT_RESPONSE_ERROR(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_PROTOCOL_MESSAGE_ATTRIBUTES, cmd_payload); @@ -358,15 +362,11 @@ void utest_message_handler_protocol_msg_attributes_supported_msgs(void) for (message_id = 0; message_id < MOD_SCMI_POWER_CAPPING_CAP_SET; message_id++) { cmd_payload.message_id = message_id; + + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); #ifdef BUILD_HAS_MOD_RESOURCE_PERMS - /* Tests the command itself */ - RESOURCE_PERMISSION_PROTOCOL_PASS_TEST(); - /* Test the message received as an argument */ - if (message_id < MOD_SCMI_POWER_CAPPING_DOMAIN_ATTRIBUTES) { - RESOURCE_PERMISSION_PROTOCOL_PASS_TEST(); - } else { - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); - } + RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); #endif EXPECT_RESPONSE_SUCCESS(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_PROTOCOL_MESSAGE_ATTRIBUTES, cmd_payload); @@ -383,6 +383,8 @@ void utest_message_handler_domain_invalid(void) .status = SCMI_NOT_FOUND, }; + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_NOT_FOUND); EXPECT_RESPONSE_ERROR(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_DOMAIN_ATTRIBUTES, cmd_payload); } @@ -428,9 +430,8 @@ void utest_message_handler_domain_attributes_valid(void) FWK_MODULE_IDX_SCMI_POWER_CAPPING, cmd_payload.domain_id), (char *)ret_payload.name); -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); -#endif + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_SUCCESS(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_DOMAIN_ATTRIBUTES, cmd_payload); } @@ -456,10 +457,8 @@ void utest_message_handler_power_capping_get_valid(void) get_cap_IgnoreArg_cap(); get_cap_ReturnMemThruPtr_cap(&cap, sizeof(cap)); -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); -#endif - + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_SUCCESS(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_CAP_GET, cmd_payload); } @@ -483,10 +482,8 @@ void utest_message_handler_power_capping_get_failure(void) FWK_E_DEVICE); get_cap_IgnoreArg_cap(); -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); -#endif - + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_ERROR(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_CAP_GET, cmd_payload); } @@ -502,10 +499,8 @@ void utest_message_handler_power_capping_set_invalid_flags(void) .status = SCMI_INVALID_PARAMETERS, }; -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); -#endif - + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_INVALID_PARAMETERS); EXPECT_RESPONSE_ERROR(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_CAP_SET, cmd_payload); } @@ -524,10 +519,8 @@ void utest_message_handler_power_capping_set_config_not_supported(void) domain_ctx_table[FAKE_POWER_CAPPING_IDX_1].config = &scmi_power_capping_config_1; -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); -#endif - + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_NOT_SUPPORTED); EXPECT_RESPONSE_SUCCESS(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_CAP_SET, cmd_payload); } @@ -543,10 +536,8 @@ void utest_message_handler_power_capping_set_async_del_not_supported(void) .status = SCMI_NOT_SUPPORTED, }; -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); -#endif - + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_NOT_SUPPORTED); EXPECT_RESPONSE_SUCCESS(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_CAP_SET, cmd_payload); } @@ -570,10 +561,8 @@ void utest_message_handler_power_capping_set_domain_busy(void) fwk_id_is_equal_ExpectAndReturn(service_id_1, FWK_ID_NONE, false); -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); -#endif - + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_ERROR(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_CAP_SET, cmd_payload); } @@ -592,10 +581,9 @@ void utest_message_handler_power_capping_set_less_than_min_cap(void) }; test_set_cap_config_supported(cmd_payload.domain_id, true); -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); -#endif + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_ERROR(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_CAP_SET, cmd_payload); } @@ -614,10 +602,9 @@ void utest_message_handler_power_capping_set_more_than_max_cap(void) }; test_set_cap_config_supported(cmd_payload.domain_id, true); -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); -#endif + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_ERROR(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_CAP_SET, cmd_payload); } @@ -646,9 +633,8 @@ void utest_message_handler_power_capping_set_success_pending(void) fwk_id_is_equal_ExpectAndReturn(FWK_ID_NONE, FWK_ID_NONE, true); #endif -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); -#endif + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); status = scmi_power_capping_message_handler( dummy_protocol_id, @@ -689,10 +675,8 @@ void utest_message_handler_power_capping_set_success_sync(void) fwk_id_is_equal_ExpectAndReturn(FWK_ID_NONE, FWK_ID_NONE, true); #endif -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); -#endif - + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_SUCCESS(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_CAP_SET, cmd_payload); } @@ -723,10 +707,8 @@ void utest_message_handler_power_capping_set_success_sync_uncap(void) fwk_id_is_equal_ExpectAndReturn(FWK_ID_NONE, FWK_ID_NONE, true); #endif -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); -#endif - + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_SUCCESS(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_CAP_SET, cmd_payload); } @@ -752,10 +734,8 @@ void utest_message_handler_power_capping_get_pai_valid(void) get_coordinator_period_IgnoreArg_period(); get_coordinator_period_ReturnMemThruPtr_period(&pai, sizeof(pai)); -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); -#endif - + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_SUCCESS(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_PAI_GET, cmd_payload); } @@ -779,10 +759,8 @@ void utest_message_handler_power_capping_get_pai_failure(void) FWK_E_DEVICE); get_coordinator_period_IgnoreArg_period(); -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); -#endif - + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_ERROR(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_PAI_GET, cmd_payload); } @@ -811,10 +789,8 @@ void utest_message_handler_power_capping_set_pai_valid(void) pai, FWK_SUCCESS); -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); -#endif - + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_SUCCESS(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_PAI_SET, cmd_payload); } @@ -843,10 +819,8 @@ void utest_message_handler_power_capping_set_pai_failure(void) pai, FWK_E_DEVICE); -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); -#endif - + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_ERROR(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_PAI_SET, cmd_payload); } @@ -864,10 +838,9 @@ void utest_message_handler_power_capping_set_less_than_min_pai(void) }; test_set_pai_config_supported(cmd_payload.domain_id, true); -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); -#endif + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_ERROR(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_PAI_SET, cmd_payload); } @@ -885,10 +858,8 @@ void utest_message_handler_power_capping_set_more_than_max_pai(void) }; test_set_pai_config_supported(cmd_payload.domain_id, true); -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); -#endif - + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_ERROR(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_PAI_SET, cmd_payload); } @@ -924,10 +895,8 @@ void utest_message_handler_power_capping_get_power_measurement_valid(void) get_coordinator_period_IgnoreArg_period(); get_coordinator_period_ReturnMemThruPtr_period(&pai, sizeof(pai)); -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); -#endif - + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_SUCCESS(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_MEASUREMENTS_GET, cmd_payload); } @@ -951,10 +920,8 @@ void utest_message_handler_power_capping_get_power_measurement_failure(void) FWK_E_DEVICE); get_power_IgnoreArg_power(); -#ifdef BUILD_HAS_MOD_RESOURCE_PERMS - RESOURCE_PERMISSION_RESOURCE_PASS_TEST(); -#endif - + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_ERROR(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_MEASUREMENTS_GET, cmd_payload); } @@ -978,6 +945,8 @@ void utest_message_handler_power_capping_cap_notify_valid_enable(void) service_id_1, FWK_SUCCESS); + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_SUCCESS(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_CAP_NOTIFY, cmd_payload); } @@ -1006,6 +975,8 @@ void utest_message_handler_power_capping_cap_notify_valid_disable(void) MOD_SCMI_POWER_CAPPING_CAP_NOTIFY, FWK_SUCCESS); + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_SUCCESS(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_CAP_NOTIFY, cmd_payload); } @@ -1028,6 +999,8 @@ void utest_message_handler_power_capping_measurements_notify_valid_enable(void) service_id_1, FWK_SUCCESS); + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_SUCCESS(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_MEASUREMENTS_NOTIFY, cmd_payload); } @@ -1056,6 +1029,8 @@ void utest_message_handler_power_capping_measurements_notify_valid_disable(void) MOD_SCMI_POWER_CAPPING_MEASUREMENTS_NOTIFY, FWK_SUCCESS); + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_SUCCESS); EXPECT_RESPONSE_SUCCESS(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_MEASUREMENTS_NOTIFY, cmd_payload); } @@ -1181,9 +1156,8 @@ void utest_message_handler_invalid_agent_id(void) .status = SCMI_DENIED }; - get_agent_id_ExpectAndReturn(service_id_1, NULL, FWK_E_PARAM); - get_agent_id_IgnoreArg_agent_id(); - + mod_scmi_from_protocol_api_scmi_frame_validation_ExpectAnyArgsAndReturn( + SCMI_DENIED); EXPECT_RESPONSE_ERROR(ret_payload); TEST_SCMI_COMMAND(MOD_SCMI_POWER_CAPPING_DOMAIN_ATTRIBUTES, cmd_payload); } @@ -1205,19 +1179,14 @@ void utest_message_handler_invalid_resource_permissions(void) get_agent_id_ExpectAndReturn(service_id_1, NULL, FWK_SUCCESS); get_agent_id_IgnoreArg_agent_id(); get_agent_id_ReturnThruPtr_agent_id(&agent_id); - if (message_id < MOD_SCMI_POWER_CAPPING_DOMAIN_ATTRIBUTES) { - agent_has_protocol_permission_ExpectAndReturn( - agent_id, - MOD_SCMI_PROTOCOL_ID_POWER_CAPPING, - MOD_RES_PERMS_ACCESS_DENIED); - } else { - agent_has_resource_permission_ExpectAndReturn( - agent_id, - MOD_SCMI_PROTOCOL_ID_POWER_CAPPING, - message_id, - domain_id, - MOD_RES_PERMS_ACCESS_DENIED); - } + + agent_has_resource_permission_ExpectAndReturn( + agent_id, + MOD_SCMI_PROTOCOL_ID_POWER_CAPPING, + message_id, + domain_id, + MOD_RES_PERMS_ACCESS_DENIED); + status = scmi_power_capping_permissions_handler( message_id, service_id_1, &domain_id); TEST_ASSERT_EQUAL(status, FWK_E_ACCESS);