From bc420d90f6106e82d314fb7c8f6b0be20a87ff53 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Fri, 27 May 2022 12:56:01 -0600 Subject: [PATCH 1/2] Fix #1258, Add OS_StatusToString API --- src/os/inc/osapi-error.h | 25 +++++++++++++++ src/os/shared/src/osapi-errors.c | 17 ++++++++++ .../shared/src/coveragetest-errors.c | 32 +++++++++++++++++++ .../oscore-test/ut_oscore_misc_test.c | 31 ++++++++++++++++++ .../oscore-test/ut_oscore_misc_test.h | 1 + src/unit-tests/oscore-test/ut_oscore_test.c | 1 + src/ut-stubs/osapi-error-stubs.c | 17 ++++++++++ 7 files changed, 124 insertions(+) diff --git a/src/os/inc/osapi-error.h b/src/os/inc/osapi-error.h index fd40dc9f9..69637e8b8 100644 --- a/src/os/inc/osapi-error.h +++ b/src/os/inc/osapi-error.h @@ -46,6 +46,20 @@ */ typedef char os_err_name_t[OS_ERROR_NAME_LENGTH]; +/** + * @brief Status converted to string length limit + * + * Used for sizing os_status_string_t intended for use in printing osal_status_t values + * Sized to fit LONG_MIN including NULL termination + */ +#define OS_STATUS_STRING_LENGTH 12 + +/** + * @brief For the @ref OS_StatusToString() function, to ensure + * everyone is making an array of the same length. + */ +typedef char os_status_string_t[OS_STATUS_STRING_LENGTH]; + /** @defgroup OSReturnCodes OSAL Return Code Defines * * The specific status/return code definitions listed in this section may be extended or refined @@ -165,6 +179,17 @@ static inline long OS_StatusToInteger(osal_status_t Status) * @retval #OS_ERROR if error could not be converted */ int32 OS_GetErrorName(int32 error_num, os_err_name_t *err_name); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Convert status to a string + * + * @param[in] status Status value to convert + * @param[out] status_string Buffer to store status converted to string + * + * @return Passed in string pointer + */ +os_status_string_t *OS_StatusToString(osal_status_t status, os_status_string_t *status_string); /**@}*/ #endif /* OSAPI_ERROR_H */ diff --git a/src/os/shared/src/osapi-errors.c b/src/os/shared/src/osapi-errors.c index cab5241a9..f810e6386 100644 --- a/src/os/shared/src/osapi-errors.c +++ b/src/os/shared/src/osapi-errors.c @@ -98,6 +98,23 @@ static const OS_ErrorTable_Entry_t OS_GLOBAL_ERROR_NAME_TABLE[] = { ********************************************************************************* */ +/*---------------------------------------------------------------- + * + * Function: OS_StatusToString + * + * Purpose: Implemented per public OSAL API + * See description in API and header file for detail + * + *-----------------------------------------------------------------*/ +os_status_string_t *OS_StatusToString(osal_status_t status, os_status_string_t *status_string) +{ + if (status_string != NULL) + { + snprintf(*status_string, sizeof(*status_string), "%ld", OS_StatusToInteger(status)); + } + return status_string; +} + /*---------------------------------------------------------------- * * Function: OS_GetErrorName diff --git a/src/unit-test-coverage/shared/src/coveragetest-errors.c b/src/unit-test-coverage/shared/src/coveragetest-errors.c index e38f82e4d..09726485f 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-errors.c +++ b/src/unit-test-coverage/shared/src/coveragetest-errors.c @@ -45,6 +45,37 @@ void Test_OS_GetErrorName(void) OSAPI_TEST_FUNCTION_RC(OS_GetErrorName(-555555, NULL), OS_INVALID_POINTER); } +/*--------------------------------------------------------------------------------* +** OS_StatusToString test helper function to avoid repeating logic +**--------------------------------------------------------------------------------*/ +void Test_OS_StatusToString_Helper(osal_status_t status) +{ + os_status_string_t status_string; + os_status_string_t *rtn_addr; + char expected[OS_STATUS_STRING_LENGTH + 1]; + + /* Used oversized string to test for truncation */ + snprintf(expected, sizeof(expected), "%ld", OS_StatusToInteger(status)); + rtn_addr = OS_StatusToString(status, &status_string); + UtAssert_ADDRESS_EQ(rtn_addr, &status_string); + UtAssert_STRINGBUF_EQ(status_string, sizeof(status_string), expected, sizeof(expected)); +} + +/*--------------------------------------------------------------------------------* +** Functional OS_StatusToString test +**--------------------------------------------------------------------------------*/ +void Test_OS_StatusToString(void) +{ + /* NULL test */ + UtAssert_ADDRESS_EQ(OS_StatusToString(OS_SUCCESS, NULL), NULL); + + /* Status value tests */ + Test_OS_StatusToString_Helper(OS_SUCCESS); + Test_OS_StatusToString_Helper(OS_ERROR); + Test_OS_StatusToString_Helper(OSAL_STATUS_C(INT32_MAX)); + Test_OS_StatusToString_Helper(OSAL_STATUS_C(INT32_MIN)); +} + /* Osapi_Test_Setup * * Purpose: @@ -69,4 +100,5 @@ void Osapi_Test_Teardown(void) {} void UtTest_Setup(void) { ADD_TEST(OS_GetErrorName); + ADD_TEST(OS_StatusToString); } diff --git a/src/unit-tests/oscore-test/ut_oscore_misc_test.c b/src/unit-tests/oscore-test/ut_oscore_misc_test.c index de5092f0c..d1ffd2c9f 100644 --- a/src/unit-tests/oscore-test/ut_oscore_misc_test.c +++ b/src/unit-tests/oscore-test/ut_oscore_misc_test.c @@ -409,6 +409,37 @@ void UT_os_geterrorname_test(void) UtAssert_StrCmp(errNames[2], "OS_ERR_NO_FREE_IDS", "%s == %s", errNames[2], "OS_ERR_NO_FREE_IDS"); } +/*--------------------------------------------------------------------------------* +** OS_StatusToString test helper function to avoid repeating logic +**--------------------------------------------------------------------------------*/ +void UT_os_statustostring_test_helper(osal_status_t status) +{ + os_status_string_t status_string; + os_status_string_t *rtn_addr; + char expected[OS_STATUS_STRING_LENGTH + 1]; + + /* Used oversized string to test for truncation */ + snprintf(expected, sizeof(expected) - 1, "%ld", OS_StatusToInteger(status)); + rtn_addr = OS_StatusToString(status, &status_string); + UtAssert_ADDRESS_EQ(rtn_addr, &status_string); + UtAssert_STRINGBUF_EQ(status_string, sizeof(status_string), expected, sizeof(expected)); +} + +/*--------------------------------------------------------------------------------* +** Functional OS_StatusToString test +**--------------------------------------------------------------------------------*/ +void UT_os_statustostring_test(void) +{ + /* NULL test */ + UtAssert_ADDRESS_EQ(OS_StatusToString(OS_SUCCESS, NULL), NULL); + + /* Status value tests */ + UT_os_statustostring_test_helper(OS_SUCCESS); + UT_os_statustostring_test_helper(OS_ERROR); + UT_os_statustostring_test_helper(OSAL_STATUS_C(INT32_MAX)); + UT_os_statustostring_test_helper(OSAL_STATUS_C(INT32_MIN)); +} + /*--------------------------------------------------------------------------------* ** Syntax: int32 OS_HeapGetInfo(OS_heap_prop_t *heap_prop) ** Purpose: Returns current info on the heap diff --git a/src/unit-tests/oscore-test/ut_oscore_misc_test.h b/src/unit-tests/oscore-test/ut_oscore_misc_test.h index 2cb553ce6..08b7c492e 100644 --- a/src/unit-tests/oscore-test/ut_oscore_misc_test.h +++ b/src/unit-tests/oscore-test/ut_oscore_misc_test.h @@ -63,6 +63,7 @@ void UT_os_getlocaltime_test(void); void UT_os_setlocaltime_test(void); void UT_os_geterrorname_test(void); +void UT_os_statustostring_test(void); void UT_os_heapgetinfo_test(void); diff --git a/src/unit-tests/oscore-test/ut_oscore_test.c b/src/unit-tests/oscore-test/ut_oscore_test.c index 80356d9b8..f0495fdb3 100644 --- a/src/unit-tests/oscore-test/ut_oscore_test.c +++ b/src/unit-tests/oscore-test/ut_oscore_test.c @@ -245,6 +245,7 @@ void UtTest_Setup(void) UtTest_Add(UT_os_task_getid_by_sysdata_test, UT_os_task_getid_by_sysdata_test, NULL, "OS_TaskFindIdBySystemData"); UtTest_Add(UT_os_geterrorname_test, NULL, NULL, "OS_GetErrorName"); + UtTest_Add(UT_os_statustostring_test, NULL, NULL, "OS_StatusToString"); UtTest_Add(UT_os_getlocaltime_test, NULL, NULL, "OS_GetLocalTime"); UtTest_Add(UT_os_setlocaltime_test, NULL, NULL, "OS_SetLocalTime"); diff --git a/src/ut-stubs/osapi-error-stubs.c b/src/ut-stubs/osapi-error-stubs.c index 1a5df75f0..488ae38ce 100644 --- a/src/ut-stubs/osapi-error-stubs.c +++ b/src/ut-stubs/osapi-error-stubs.c @@ -43,3 +43,20 @@ int32 OS_GetErrorName(int32 error_num, os_err_name_t *err_name) return UT_GenStub_GetReturnValue(OS_GetErrorName, int32); } + +/* + * ---------------------------------------------------- + * Generated stub function for OS_StatusToString() + * ---------------------------------------------------- + */ +os_status_string_t *OS_StatusToString(osal_status_t status, os_status_string_t *status_string) +{ + UT_GenStub_SetupReturnBuffer(OS_StatusToString, os_status_string_t *); + + UT_GenStub_AddParam(OS_StatusToString, osal_status_t, status); + UT_GenStub_AddParam(OS_StatusToString, os_status_string_t *, status_string); + + UT_GenStub_Execute(OS_StatusToString, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_StatusToString, os_status_string_t *); +} From d902e374edb7e33ab3f673bb5798148cc74e5ee5 Mon Sep 17 00:00:00 2001 From: Jacob Hageman Date: Mon, 6 Jun 2022 16:54:34 -0600 Subject: [PATCH 2/2] Fix #1258, Return char * from OS_StatusToString --- src/os/inc/osapi-error.h | 2 +- src/os/shared/src/osapi-errors.c | 7 +++++-- src/unit-test-coverage/shared/src/coveragetest-errors.c | 8 ++++---- src/unit-tests/oscore-test/ut_oscore_misc_test.c | 8 ++++---- src/ut-stubs/osapi-error-stubs.c | 6 +++--- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/os/inc/osapi-error.h b/src/os/inc/osapi-error.h index 69637e8b8..7dc911fb2 100644 --- a/src/os/inc/osapi-error.h +++ b/src/os/inc/osapi-error.h @@ -189,7 +189,7 @@ int32 OS_GetErrorName(int32 error_num, os_err_name_t *err_name); * * @return Passed in string pointer */ -os_status_string_t *OS_StatusToString(osal_status_t status, os_status_string_t *status_string); +char *OS_StatusToString(osal_status_t status, os_status_string_t *status_string); /**@}*/ #endif /* OSAPI_ERROR_H */ diff --git a/src/os/shared/src/osapi-errors.c b/src/os/shared/src/osapi-errors.c index f810e6386..acd7a039c 100644 --- a/src/os/shared/src/osapi-errors.c +++ b/src/os/shared/src/osapi-errors.c @@ -106,13 +106,16 @@ static const OS_ErrorTable_Entry_t OS_GLOBAL_ERROR_NAME_TABLE[] = { * See description in API and header file for detail * *-----------------------------------------------------------------*/ -os_status_string_t *OS_StatusToString(osal_status_t status, os_status_string_t *status_string) +char *OS_StatusToString(osal_status_t status, os_status_string_t *status_string) { + char *string = NULL; + if (status_string != NULL) { snprintf(*status_string, sizeof(*status_string), "%ld", OS_StatusToInteger(status)); + string = *status_string; } - return status_string; + return string; } /*---------------------------------------------------------------- diff --git a/src/unit-test-coverage/shared/src/coveragetest-errors.c b/src/unit-test-coverage/shared/src/coveragetest-errors.c index 09726485f..d16de96ed 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-errors.c +++ b/src/unit-test-coverage/shared/src/coveragetest-errors.c @@ -50,14 +50,14 @@ void Test_OS_GetErrorName(void) **--------------------------------------------------------------------------------*/ void Test_OS_StatusToString_Helper(osal_status_t status) { - os_status_string_t status_string; - os_status_string_t *rtn_addr; - char expected[OS_STATUS_STRING_LENGTH + 1]; + os_status_string_t status_string; + char * rtn_addr; + char expected[OS_STATUS_STRING_LENGTH + 1]; /* Used oversized string to test for truncation */ snprintf(expected, sizeof(expected), "%ld", OS_StatusToInteger(status)); rtn_addr = OS_StatusToString(status, &status_string); - UtAssert_ADDRESS_EQ(rtn_addr, &status_string); + UtAssert_ADDRESS_EQ(rtn_addr, status_string); UtAssert_STRINGBUF_EQ(status_string, sizeof(status_string), expected, sizeof(expected)); } diff --git a/src/unit-tests/oscore-test/ut_oscore_misc_test.c b/src/unit-tests/oscore-test/ut_oscore_misc_test.c index d1ffd2c9f..6f8b59dee 100644 --- a/src/unit-tests/oscore-test/ut_oscore_misc_test.c +++ b/src/unit-tests/oscore-test/ut_oscore_misc_test.c @@ -414,14 +414,14 @@ void UT_os_geterrorname_test(void) **--------------------------------------------------------------------------------*/ void UT_os_statustostring_test_helper(osal_status_t status) { - os_status_string_t status_string; - os_status_string_t *rtn_addr; - char expected[OS_STATUS_STRING_LENGTH + 1]; + os_status_string_t status_string; + char * rtn_addr; + char expected[OS_STATUS_STRING_LENGTH + 1]; /* Used oversized string to test for truncation */ snprintf(expected, sizeof(expected) - 1, "%ld", OS_StatusToInteger(status)); rtn_addr = OS_StatusToString(status, &status_string); - UtAssert_ADDRESS_EQ(rtn_addr, &status_string); + UtAssert_ADDRESS_EQ(rtn_addr, status_string); UtAssert_STRINGBUF_EQ(status_string, sizeof(status_string), expected, sizeof(expected)); } diff --git a/src/ut-stubs/osapi-error-stubs.c b/src/ut-stubs/osapi-error-stubs.c index 488ae38ce..62eee38a0 100644 --- a/src/ut-stubs/osapi-error-stubs.c +++ b/src/ut-stubs/osapi-error-stubs.c @@ -49,14 +49,14 @@ int32 OS_GetErrorName(int32 error_num, os_err_name_t *err_name) * Generated stub function for OS_StatusToString() * ---------------------------------------------------- */ -os_status_string_t *OS_StatusToString(osal_status_t status, os_status_string_t *status_string) +char *OS_StatusToString(osal_status_t status, os_status_string_t *status_string) { - UT_GenStub_SetupReturnBuffer(OS_StatusToString, os_status_string_t *); + UT_GenStub_SetupReturnBuffer(OS_StatusToString, char *); UT_GenStub_AddParam(OS_StatusToString, osal_status_t, status); UT_GenStub_AddParam(OS_StatusToString, os_status_string_t *, status_string); UT_GenStub_Execute(OS_StatusToString, Basic, NULL); - return UT_GenStub_GetReturnValue(OS_StatusToString, os_status_string_t *); + return UT_GenStub_GetReturnValue(OS_StatusToString, char *); }