Skip to content

Commit

Permalink
Fix #230: Add Test cases to improve code coverage test
Browse files Browse the repository at this point in the history
Add numerous unit test cases to improve the code coverage
ratios on the vxworks and shared implementation layers.

Prior to this change set, the coverage ratio was:
  lines......: 90.4% (2549 of 2820 lines)
  functions..: 95.9% (306 of 319 functions)

After this change set, the coverage ratio is:
  lines......: 99.9% (2846 of 2849 lines)
  functions..: 100.0% (330 of 330 functions)

Note these stats include some of the UT code itself,
and this is what added 11 functions.  No functions
were added to FSW code.

Note, one test condition will fail until the
fix for related bug #269 is merged.

This also fixes the posix coverage test so it
builds and runs, but coverage is still not
implemented here.
  • Loading branch information
jphickey committed Oct 21, 2019
1 parent 89fec29 commit dfa3393
Show file tree
Hide file tree
Showing 37 changed files with 995 additions and 63 deletions.
16 changes: 13 additions & 3 deletions src/unit-test-coverage/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -135,9 +135,19 @@ list(APPEND OSALCOVERAGE_STUB_LIB_LIST ut_osapi_stubs)
# - Links to the stub libraries of everything else, plus UT assert
function (add_coverage_tests SETNAME)
foreach(MODNAME ${ARGN})
if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/src/coveragetest-${MODNAME}.c)
set (TESTCASE_SRCFILE)
foreach (SRCFILE
"${PROJECT_SOURCE_DIR}/portable/coveragetest-${MODNAME}.c"
"${CMAKE_CURRENT_SOURCE_DIR}/src/coveragetest-${MODNAME}.c"
)
if (EXISTS "${SRCFILE}")
set (TESTCASE_SRCFILE "${SRCFILE}")
endif (EXISTS "${SRCFILE}")
endforeach()

if (TESTCASE_SRCFILE)
set(TESTNAME "${SETNAME}-${MODNAME}")
message (STATUS "Found test case for ${TESTNAME}")
message (STATUS "Found test case for ${TESTNAME} in ${TESTCASE_SRCFILE}")

if (DEFINED MODULE_LINK_MAP_${MODNAME})
set(LINKMOD ${MODULE_LINK_MAP_${MODNAME}})
Expand All @@ -146,7 +156,7 @@ function (add_coverage_tests SETNAME)
endif()

add_executable(${TESTNAME}-testrunner
src/coveragetest-${MODNAME}.c
${TESTCASE_SRCFILE}
$<TARGET_OBJECTS:ut_${SETNAME}_${LINKMOD}>)

set_target_properties(${TESTNAME}-testrunner PROPERTIES LINK_FLAGS "${UT_C_FLAGS}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,46 @@ void Test_OS_FileStat_Impl(void)

}

void Test_OS_FileChmod_Impl(void)
{
/*
* Test Case For:
* int32 OS_FileChmod_Impl(const char *local_path, uint32 access)
*/
struct OCS_stat RefStat;

/* failure mode 1 (stat) */
UT_SetForceFail(UT_KEY(OCS_stat), -1);
OSAPI_TEST_FUNCTION_RC(OS_FileChmod_Impl("local",OS_READ_WRITE), OS_ERROR);
UT_ClearForceFail(UT_KEY(OCS_stat));

/* failure mode 2 (chmod) */
UT_SetForceFail(UT_KEY(OCS_chmod), -1);
OSAPI_TEST_FUNCTION_RC(OS_FileChmod_Impl("local",OS_READ_WRITE), OS_ERROR);
UT_ClearForceFail(UT_KEY(OCS_chmod));

/* all permission bits with uid/gid match */
RefStat.st_uid = Osapi_Internal_GetSelfEUID();
RefStat.st_gid = Osapi_Internal_GetSelfEGID();
RefStat.st_mode = ~0;
RefStat.st_size = 1234;
RefStat.st_mtime = 5678;
UT_SetDataBuffer(UT_KEY(OCS_stat), &RefStat, sizeof(RefStat), false);

/* nominal 1 - full permissions with file owned by own uid/gid */
OSAPI_TEST_FUNCTION_RC(OS_FileChmod_Impl("local",OS_READ_WRITE), OS_SUCCESS);

/* nominal 2 - partial permissions */
OSAPI_TEST_FUNCTION_RC(OS_FileChmod_Impl("local", OS_READ_ONLY), OS_SUCCESS);
OSAPI_TEST_FUNCTION_RC(OS_FileChmod_Impl("local", OS_WRITE_ONLY), OS_SUCCESS);

/* nominal 3 - non-owned file */
++RefStat.st_uid;
++RefStat.st_gid;
UT_SetDataBuffer(UT_KEY(OCS_stat), &RefStat, sizeof(RefStat), false);
OSAPI_TEST_FUNCTION_RC(OS_FileChmod_Impl("local",OS_READ_WRITE), OS_SUCCESS);
}

void Test_OS_FileRemove_Impl (void)
{
/*
Expand Down Expand Up @@ -156,6 +196,7 @@ void OS_Application_Startup(void)
{
ADD_TEST(OS_FileOpen_Impl);
ADD_TEST(OS_FileStat_Impl);
ADD_TEST(OS_FileChmod_Impl);
ADD_TEST(OS_FileRemove_Impl);
ADD_TEST(OS_FileRename_Impl);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,6 @@

#include <overrides/time.h>

/* JPHFIX: FIXME: This should be in a header somehow, not here */
extern int32 OS_GetLocalTime_Impl(OS_time_t *time_struct);
extern int32 OS_SetLocalTime_Impl(const OS_time_t *time_struct);

#define OSAPI_TEST_FUNCTION_RC(func,exp) \
{ \
int32 rcexp = exp; \
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,13 @@ void Test_OS_GenericClose_Impl(void)
* int32 OS_GenericClose_Impl(uint32 local_id)
*/
OSAPI_TEST_FUNCTION_RC(OS_GenericClose_Impl,(0), OS_SUCCESS);

/*
* Test path where underlying close() fails.
* Should still return success.
*/
UT_SetForceFail(UT_KEY(OCS_close), -1);
OSAPI_TEST_FUNCTION_RC(OS_GenericClose_Impl,(0), OS_SUCCESS);
}

void Test_OS_GenericSeek_Impl (void)
Expand Down
8 changes: 7 additions & 1 deletion src/unit-test-coverage/posix/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
# CMake snippet for building the shared OSAL layer coverage tests

set(MODULE_LIST osapi osfileapi osfilesys osloader osnetwork osselect ostimer)
set(MODULE_LIST osapi)

# This unit test is allowed to directly include any internal file in
# the respective set under test.
include_directories(${OSAL_SOURCE_DIR}/src/os/${SETNAME})
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/modules/inc)

# The "ut-stubs" contains additional stubs specific to this sub-module
add_subdirectory(ut-stubs)
Expand All @@ -13,6 +14,11 @@ add_subdirectory(ut-stubs)
# (this is not a stub, this is the real code)
add_subdirectory(modules)

set(MODULE_LINK_MAP_posixio osfileapi)
set(MODULE_LINK_MAP_posixfile osfileapi)
set(MODULE_LINK_MAP_posixdirs osfileapi)
set(MODULE_LINK_MAP_posixgettime ostimer)

# Add all coverage tests in the src dir
add_coverage_tests(${SETNAME} ${MODULE_LIST})

6 changes: 6 additions & 0 deletions src/unit-test-coverage/posix/modules/src/stub-map-to-real.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@
#define SEEK_CUR OCS_SEEK_CUR
#define SEEK_END OCS_SEEK_END

#define STDOUT_FILENO OCS_STDOUT_FILENO
#define STDIN_FILENO OCS_STDIN_FILENO
#define STDERR_FILENO OCS_STDERR_FILENO

/* pthread-related identifiers */
#define PTHREAD_PRIO_INHERIT OCS_PTHREAD_PRIO_INHERIT
#define PTHREAD_MUTEX_RECURSIVE OCS_PTHREAD_MUTEX_RECURSIVE
Expand Down Expand Up @@ -161,6 +165,7 @@
#define ntohs OCS_ntohs
#define opendir OCS_opendir
#define open OCS_open
#define printf(...) OCS_printf(__VA_ARGS__)
#define pthread_attr_destroy OCS_pthread_attr_destroy
#define pthread_attr_getschedparam OCS_pthread_attr_getschedparam
#define pthread_attr_init OCS_pthread_attr_init
Expand Down Expand Up @@ -229,6 +234,7 @@
#define stdout OCS_stdout
#define strcmp OCS_strcmp
#define strcpy OCS_strcpy
#define strerror OCS_strerror
#define strlen OCS_strlen
#define strncmp OCS_strncmp
#define strncpy OCS_strncpy
Expand Down
1 change: 1 addition & 0 deletions src/unit-test-coverage/posix/modules/src/ut-osapi.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ OS_common_record_t * const OS_global_queue_table = OS_stub_queue_table;

OS_queue_internal_record_t OS_queue_table[OS_MAX_QUEUES];
OS_task_internal_record_t OS_task_table[OS_MAX_TASKS];
OS_console_internal_record_t OS_console_table[OS_MAX_CONSOLES];

OS_SharedGlobalVars_t OS_SharedGlobalVars =
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ UT_DEFAULT_STUB(OS_Posix_TimeBaseAPI_Impl_Init, (void))
UT_DEFAULT_STUB(OS_Posix_ModuleAPI_Impl_Init, (void))
UT_DEFAULT_STUB(OS_Posix_StreamAPI_Impl_Init, (void))
UT_DEFAULT_STUB(OS_Posix_DirAPI_Impl_Init, (void))
UT_DEFAULT_STUB(OS_Posix_FileSysAPI_Impl_Init, (void))

7 changes: 7 additions & 0 deletions src/unit-test-coverage/shared/modules/inc/ut-osapi-idmap.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,12 @@ void Osapi_Internal_ResetState(void);
*/
int32 Osapi_Call_ObjectIdFindNext(uint32 idtype, uint32 *array_index, OS_common_record_t **record);

/**
* Wrapper around the OS_ObjectIdConvertLock call so the test code can invoke it
* (it is defined as static)
*/
int32 Osapi_Call_ObjectIdConvertLock(OS_lock_mode_t lock_mode, uint32 idtype, uint32 reference_id, OS_common_record_t *obj);


#endif /* _OSAL_UT_OSAPI_IDMAP_H_ */

6 changes: 6 additions & 0 deletions src/unit-test-coverage/shared/modules/inc/ut-osapi-sockets.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#define _OSAL_UT_OSAPI_SOCKETS_H_

#include <common_types.h>
#include <os-impl.h>

/*****************************************************
*
Expand All @@ -20,6 +21,11 @@
*/
void Osapi_Internal_ResetState(void);

/**
* Invoke the OS_CreateSocketName() static helper function
*/
void Osapi_Call_CreateSocketName_Static(OS_stream_internal_record_t *sock,
const OS_SockAddr_t *Addr, const char *parent_name);

#endif /* _OSAL_UT_OSAPI_SOCKETS_H_ */

5 changes: 5 additions & 0 deletions src/unit-test-coverage/shared/modules/src/ut-osapi-idmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,8 @@ int32 Osapi_Call_ObjectIdFindNext(uint32 idtype, uint32 *array_index, OS_common_
{
return OS_ObjectIdFindNext(idtype, array_index, record);
}

int32 Osapi_Call_ObjectIdConvertLock(OS_lock_mode_t lock_mode, uint32 idtype, uint32 reference_id, OS_common_record_t *obj)
{
return OS_ObjectIdConvertLock(lock_mode, idtype, reference_id, obj);
}
5 changes: 5 additions & 0 deletions src/unit-test-coverage/shared/modules/src/ut-osapi-sockets.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,8 @@ OS_stream_internal_record_t OS_stream_table[OS_MAX_NUM_OPEN_FILES];
OS_common_record_t OS_stub_socket_table[OS_MAX_NUM_OPEN_FILES];
OS_common_record_t * const OS_global_stream_table = OS_stub_socket_table;

void Osapi_Call_CreateSocketName_Static(OS_stream_internal_record_t *sock, const OS_SockAddr_t *Addr, const char *parent_name)
{
OS_CreateSocketName(sock, Addr, parent_name);
}

11 changes: 11 additions & 0 deletions src/unit-test-coverage/shared/src/coveragetest-binsem.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
#include "os-shared-coveragetest.h"
#include "ut-osapi-binsem.h"

#include <overrides/string.h>

/*
**********************************************************************************
** PUBLIC API FUNCTIONS
Expand Down Expand Up @@ -47,6 +49,10 @@ void Test_OS_BinSemCreate(void)

UtAssert_True(actual == expected, "OS_BinSemCreate() (%ld) == OS_SUCCESS", (long)actual);
UtAssert_True(objid != 0, "objid (%lu) != 0", (unsigned long)objid);

OSAPI_TEST_FUNCTION_RC(OS_BinSemCreate(NULL, NULL, 0, 0), OS_INVALID_POINTER);
UT_SetForceFail(UT_KEY(OCS_strlen), 10 + OS_MAX_API_NAME);
OSAPI_TEST_FUNCTION_RC(OS_BinSemCreate(&objid, "UT", 0, 0), OS_ERR_NAME_TOO_LONG);
}

void Test_OS_BinSemDelete(void)
Expand Down Expand Up @@ -141,6 +147,8 @@ void Test_OS_BinSemGetIdByName(void)
actual = OS_BinSemGetIdByName(&objid, "NF");
UtAssert_True(actual == expected, "OS_BinSemGetIdByName() (%ld) == %ld",
(long)actual, (long)expected);

OSAPI_TEST_FUNCTION_RC(OS_BinSemGetIdByName(NULL, NULL), OS_INVALID_POINTER);
}

void Test_OS_BinSemGetInfo(void)
Expand Down Expand Up @@ -168,6 +176,9 @@ void Test_OS_BinSemGetInfo(void)
(unsigned long)prop.creator);
UtAssert_True(strcmp(prop.name, "ABC") == 0, "prop.name (%s) == ABC",
prop.name);


OSAPI_TEST_FUNCTION_RC(OS_BinSemGetInfo(0, NULL), OS_INVALID_POINTER);
}


Expand Down
54 changes: 37 additions & 17 deletions src/unit-test-coverage/shared/src/coveragetest-common.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
extern void OS_CleanUpObject(uint32 object_id, void *arg);


int32 Test_MicroSecPerTick = 0;
int32 Test_TicksPerSecond = 0;

/*
**********************************************************************************
Expand All @@ -35,8 +37,8 @@ extern void OS_CleanUpObject(uint32 object_id, void *arg);
/* as a side effect, the OS_TimeBaseAPI_Init must initialize the globals */
static int32 TimeBaseInitGlobal(void *UserObj, int32 StubRetcode, uint32 CallCount, const UT_StubContext_t *Context)
{
OS_SharedGlobalVars.MicroSecPerTick = 1000;
OS_SharedGlobalVars.TicksPerSecond = 1000;
OS_SharedGlobalVars.MicroSecPerTick = Test_MicroSecPerTick;
OS_SharedGlobalVars.TicksPerSecond = Test_TicksPerSecond;
return StubRetcode;
}

Expand Down Expand Up @@ -71,25 +73,39 @@ static int32 SetShutdownFlagHook(void *UserObj, int32 StubRetcode, uint32 CallCo
*/
void Test_OS_API_Init(void)
{
int32 expected = OS_SUCCESS;
int32 actual = ~OS_SUCCESS;

/* Setup Inputs */

UT_SetHookFunction(UT_KEY(OS_TimeBaseAPI_Init), TimeBaseInitGlobal, NULL);

/* Execute Test */
actual = OS_API_Init();
Test_MicroSecPerTick = 0;
Test_TicksPerSecond = 0;
OS_SharedGlobalVars.Initialized = false;
OSAPI_TEST_FUNCTION_RC(OS_API_Init(), OS_ERROR);

/* Verify Outputs */
UtAssert_True(actual == expected, "OS_API_Init() (%ld) != OS_SUCCESS", (long)actual);
Test_MicroSecPerTick = 1000;
Test_TicksPerSecond = 1000;
OS_SharedGlobalVars.Initialized = false;
OSAPI_TEST_FUNCTION_RC(OS_API_Init(), OS_SUCCESS);

/* Second call should return ERROR */
expected = OS_ERROR;
actual = OS_API_Init();
OSAPI_TEST_FUNCTION_RC(OS_API_Init(), OS_ERROR);

/* other error paths */
OS_SharedGlobalVars.Initialized = false;
UT_SetForceFail(UT_KEY(OS_ObjectIdInit), -222);
OSAPI_TEST_FUNCTION_RC(OS_API_Init(), -222);
UT_ResetState(UT_KEY(OS_ObjectIdInit));

OS_SharedGlobalVars.Initialized = false;
UT_SetForceFail(UT_KEY(OS_API_Impl_Init), -333);
OSAPI_TEST_FUNCTION_RC(OS_API_Init(), -333);
UT_ResetState(UT_KEY(OS_API_Impl_Init));

OS_SharedGlobalVars.Initialized = false;
UT_SetForceFail(UT_KEY(OS_TaskAPI_Init), -444);
OSAPI_TEST_FUNCTION_RC(OS_API_Init(), -444);
UT_ResetState(UT_KEY(OS_TaskAPI_Init));

/* Verify Outputs */
UtAssert_True(actual == expected, "OS_API_Init() (%ld) != OS_ERROR", (long)actual);
}

void Test_OS_ApplicationExit(void)
Expand Down Expand Up @@ -119,6 +135,9 @@ void Test_OS_CleanUpObject(void)
objtype = OS_OBJECT_TYPE_UNDEFINED;
while (objtype < OS_OBJECT_TYPE_USER)
{
UT_ResetState(0);
UT_SetForceFail(UT_KEY(OS_IdentifyObject), objtype);

switch(objtype)
{
case OS_OBJECT_TYPE_OS_TASK:
Expand Down Expand Up @@ -158,21 +177,22 @@ void Test_OS_CleanUpObject(void)

if (delhandler != 0)
{
UT_ResetState(0);
/* note the return code here is ignored -
* the goal is simply to defeat the default
* check that the objid was valid (it isn't) */
UT_SetForceFail(delhandler, OS_ERROR);
UT_SetForceFail(UT_KEY(OS_IdentifyObject), objtype);
OS_CleanUpObject(0, &ActualObjs);

CallCount = UT_GetStubCount(delhandler);
UtAssert_True(CallCount == 1, "Objtype %lu call count (%lu) == 1",
(unsigned long)objtype, (unsigned long)CallCount);
++ExpObjs;
}

else
{
OS_CleanUpObject(0, &ActualObjs);
}
++objtype;
++ExpObjs;
}


Expand Down
Loading

0 comments on commit dfa3393

Please sign in to comment.