Skip to content

Commit

Permalink
fix #377, fix #390, fix #392 - osal select API unit tests and fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
CDKnightNASA authored and Gerardo E. Cruz-Ortiz committed May 1, 2020
1 parent 19fb880 commit e4b3789
Show file tree
Hide file tree
Showing 8 changed files with 244 additions and 11 deletions.
21 changes: 18 additions & 3 deletions src/os/inc/osapi-os-core.h
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,21 @@ typedef struct
uint8 object_ids[(OS_MAX_NUM_OPEN_FILES + 7) / 8];
} OS_FdSet;

/**
* @brief For the OS_SelectSingle() function's in/out StateFlags parameter,
* the state(s) of the stream and the result of the select is a combination
* of one or more of these states.
*
* @sa OS_SelectSingle()
*/
typedef enum
{
OS_STREAM_STATE_BOUND = 0x01, /**< @brief whether the stream is bound */
OS_STREAM_STATE_CONNECTED = 0x02, /**< @brief whether the stream is connected */
OS_STREAM_STATE_READABLE = 0x04, /**< @brief whether the stream is readable */
OS_STREAM_STATE_WRITABLE = 0x08, /**< @brief whether the stream is writable */
} OS_StreamState_t;

/**
* @brief For the @ref OS_GetErrorName() function, to ensure
* everyone is making an array of the same length.
Expand Down Expand Up @@ -1430,9 +1445,9 @@ int32 OS_SelectMultiple(OS_FdSet *ReadSet, OS_FdSet *WriteSet, int32 msecs);
*
* This function can be used to wait for a single OSAL stream ID
* to become readable or writable. On entry, the "StateFlags"
* parameter should be set to the desired state (readble or writable)
* and upon return the flags will be set to the state actually
* detected.
* parameter should be set to the desired state (OS_STREAM_STATE_READABLE
* and/or OS_STREAM_STATE_WRITABLE) and upon return the flags
* will be set to the state actually detected.
*
* As this operates on a single ID, the filehandle is protected
* during this call, such that another thread accessing the same
Expand Down
8 changes: 0 additions & 8 deletions src/os/shared/os-impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,14 +105,6 @@ typedef struct
uint16 flags;
}OS_common_record_t;

typedef enum
{
OS_STREAM_STATE_BOUND = 0x01,
OS_STREAM_STATE_CONNECTED = 0x02,
OS_STREAM_STATE_READABLE = 0x04,
OS_STREAM_STATE_WRITABLE = 0x08,
} OS_StreamState_t;

/*tasks */
typedef struct
{
Expand Down
10 changes: 10 additions & 0 deletions src/os/shared/osapi-select.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ int32 OS_SelectSingle(uint32 objid, uint32 *StateFlags, int32 msecs)
uint32 local_id;
OS_common_record_t *record;

if(StateFlags == NULL) return OS_INVALID_POINTER;

return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, OS_OBJECT_TYPE_OS_STREAM, objid, &local_id, &record);
if (return_code == OS_SUCCESS)
{
Expand Down Expand Up @@ -102,6 +104,8 @@ int32 OS_SelectMultiple(OS_FdSet *ReadSet, OS_FdSet *WriteSet, int32 msecs)
*-----------------------------------------------------------------*/
int32 OS_SelectFdZero(OS_FdSet *Set)
{
if (Set == NULL) return OS_INVALID_POINTER;

memset(Set,0,sizeof(OS_FdSet));
return OS_SUCCESS;
} /* end OS_SelectFdZero */
Expand All @@ -119,6 +123,8 @@ int32 OS_SelectFdAdd(OS_FdSet *Set, uint32 objid)
int32 return_code;
uint32 local_id;

if(Set == NULL) return OS_INVALID_POINTER;

return_code = OS_ObjectIdToArrayIndex(OS_OBJECT_TYPE_OS_STREAM, objid, &local_id);
if (return_code == OS_SUCCESS)
{
Expand All @@ -141,6 +147,8 @@ int32 OS_SelectFdClear(OS_FdSet *Set, uint32 objid)
int32 return_code;
uint32 local_id;

if(Set == NULL) return OS_INVALID_POINTER;

return_code = OS_ObjectIdToArrayIndex(OS_OBJECT_TYPE_OS_STREAM, objid, &local_id);
if (return_code == OS_SUCCESS)
{
Expand All @@ -163,6 +171,8 @@ bool OS_SelectFdIsSet(OS_FdSet *Set, uint32 objid)
int32 return_code;
uint32 local_id;

if(Set == NULL) return false;

return_code = OS_ObjectIdToArrayIndex(OS_OBJECT_TYPE_OS_STREAM, objid, &local_id);
if (return_code != OS_SUCCESS)
{
Expand Down
1 change: 1 addition & 0 deletions src/unit-tests/oscore-test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ set(TEST_MODULE_FILES
ut_oscore_binsem_test.c
ut_oscore_misc_test.c
ut_oscore_queue_test.c
ut_oscore_select_test.c
ut_oscore_countsem_test.c
ut_oscore_mutex_test.c
ut_oscore_task_test.c
Expand Down
164 changes: 164 additions & 0 deletions src/unit-tests/oscore-test/ut_oscore_select_test.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
/*================================================================================*
** File: ut_oscore_select_test.c
** Owner: Chris Knight
** Date: March 2020
**================================================================================*/

/*--------------------------------------------------------------------------------*
** Includes
**--------------------------------------------------------------------------------*/

#include "ut_oscore_select_test.h"

/*--------------------------------------------------------------------------------*
** Macros
**--------------------------------------------------------------------------------*/

#define UT_SELECT_FN "/cf/select_test.tmp"

/*--------------------------------------------------------------------------------*
** Data types
**--------------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------*
** External global variables
**--------------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------*
** Global variables
**--------------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------*
** External function prototypes
**--------------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------*
** Local function prototypes
**--------------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------*
** Local function definitions
**--------------------------------------------------------------------------------*/

char *fsAddrPtr = NULL;
static int32 setup_file(void)
{
OS_mkfs(fsAddrPtr, "/ramdev3", " ", 512, 20);
OS_mount("/ramdev3", "/drive3");
return OS_creat("/drive3/select_test.txt", OS_READ_WRITE);
}

static void teardown_file(int32 fd)
{
OS_close(fd);
OS_remove("/drive3/select_test.txt");
OS_unmount("/drive3");
OS_rmfs("/ramdev3");
}

/*--------------------------------------------------------------------------------*
** Syntax: OS_SelectFdZero, OS_SelectFdAdd, OS_SelectFdClear, OS_SelectFdIsSet
** Purpose: Configure file descriptor set for select
** Parameters: To-be-filled-in
** Returns: OS_INVALID_POINTER if the pointer passed in is null
** OS_SUCCESS if succeeded
**--------------------------------------------------------------------------------*/
void UT_os_select_fd_test(void)
{
OS_FdSet FdSet;
int32 fd = setup_file();

if(OS_SelectFdZero(&FdSet) == OS_ERR_NOT_IMPLEMENTED
|| OS_SelectFdAdd(&FdSet, fd) == OS_ERR_NOT_IMPLEMENTED
|| OS_SelectFdClear(&FdSet, fd) == OS_ERR_NOT_IMPLEMENTED)
{
UtAssertEx(false, UTASSERT_CASETYPE_NA, __FILE__, __LINE__, "OS_SelectFd...() not implemented");
goto UT_os_select_fd_test_exit_tag;
}

UtAssert_Simple(OS_SelectFdZero(NULL) == OS_INVALID_POINTER);
UtAssert_Simple(OS_SelectFdAdd(NULL, 0) == OS_INVALID_POINTER);
UtAssert_Simple(OS_SelectFdClear(NULL, 0) == OS_INVALID_POINTER);
UtAssert_Simple(OS_SelectFdIsSet(NULL, 0) == false);

OS_SelectFdZero(&FdSet);
OS_SelectFdAdd(&FdSet, fd);
UtAssert_Simple(OS_SelectFdIsSet(&FdSet, fd));

OS_SelectFdZero(&FdSet);
OS_SelectFdAdd(&FdSet, fd);
OS_SelectFdClear(&FdSet, fd);
UtAssert_Simple(!OS_SelectFdIsSet(&FdSet, fd));

UT_os_select_fd_test_exit_tag:
teardown_file(fd);
}

/*--------------------------------------------------------------------------------*
** Syntax: int32 OS_SelectSingle(uint32 objid, uint32 *StateFlags, int32 msecs);
** Purpose: Select on a single file descriptor
** Parameters: To-be-filled-in
** Returns: OS_INVALID_POINTER if the pointer passed in is null
** OS_SUCCESS if succeeded
**--------------------------------------------------------------------------------*/
void UT_os_select_single_test(void)
{
uint32 StateFlags;
int32 fd = setup_file();

if(OS_SelectSingle(fd, &StateFlags, 0) == OS_ERR_NOT_IMPLEMENTED)
{
UtAssertEx(false, UTASSERT_CASETYPE_NA, __FILE__, __LINE__, "OS_SelectSingle() not implemented");
goto UT_os_select_single_test_exit_tag;
}

UtAssert_Simple(OS_SelectSingle(fd, NULL, 0) != OS_SUCCESS);

StateFlags = OS_STREAM_STATE_WRITABLE;
UtAssert_Simple(OS_SelectSingle(fd, &StateFlags, 0) == OS_SUCCESS && StateFlags & OS_STREAM_STATE_WRITABLE);

StateFlags = OS_STREAM_STATE_READABLE;
UtAssert_Simple(OS_SelectSingle(fd, &StateFlags, 1) == OS_SUCCESS);

UT_os_select_single_test_exit_tag:
teardown_file(fd);
}

/*--------------------------------------------------------------------------------*
** Syntax: int32 OS_SelectMultiple(OS_FdSet *ReadSet, OS_FdSet *WriteSet, int32 msecs)
** Purpose: Select on a multiple file descriptors
** Parameters: To-be-filled-in
** Returns: OS_INVALID_POINTER if the pointer passed in is null
** OS_SUCCESS if succeeded
**--------------------------------------------------------------------------------*/
void UT_os_select_multi_test(void)
{
OS_FdSet ReadSet, WriteSet;
int32 fd = setup_file();

if(OS_SelectMultiple(&ReadSet, &WriteSet, 1) == OS_ERR_NOT_IMPLEMENTED)
{
UtAssertEx(false, UTASSERT_CASETYPE_NA, __FILE__, __LINE__, "OS_SelectMultiple() not implemented");
goto UT_select_multi_test_exit_tag;
}

OS_SelectFdZero(&WriteSet);
OS_SelectFdAdd(&WriteSet, fd);
UtAssert_Simple(OS_SelectMultiple(NULL, &WriteSet, 1) == OS_SUCCESS);

OS_SelectFdZero(&ReadSet);
OS_SelectFdAdd(&ReadSet, fd);
UtAssert_Simple(OS_SelectMultiple(&ReadSet, NULL, 1) == OS_SUCCESS);

OS_SelectFdZero(&ReadSet);
OS_SelectFdAdd(&ReadSet, fd);
OS_SelectFdZero(&WriteSet);
UtAssert_Simple(OS_SelectMultiple(&ReadSet, &WriteSet, 0) == OS_SUCCESS);

UT_select_multi_test_exit_tag:
teardown_file(fd);
}

/*================================================================================*
** End of File: ut_oscore_queue_test.c
**================================================================================*/
46 changes: 46 additions & 0 deletions src/unit-tests/oscore-test/ut_oscore_select_test.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*================================================================================*
** File: ut_oscore_select_test.h
** Owner: Chris Knight
** Date: March 2020
**================================================================================*/

#ifndef _UT_OSCORE_SELECT_TEST_H_
#define _UT_OSCORE_SELECT_TEST_H_

/*--------------------------------------------------------------------------------*
** Includes
**--------------------------------------------------------------------------------*/

#include "ut_os_support.h"

/*--------------------------------------------------------------------------------*
** Macros
**--------------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------*
** Data types
**--------------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------*
** External global variables
**--------------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------*
** Global variables
**--------------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------*
** Function prototypes
**--------------------------------------------------------------------------------*/

void UT_os_select_fd_test(void);
void UT_os_select_single_test(void);
void UT_os_select_multi_test(void);

/*--------------------------------------------------------------------------------*/

#endif /* _UT_OSCORE_SELECT_TEST_H_ */

/*================================================================================*
** End of File: ut_oscore_select_test.h
**================================================================================*/
4 changes: 4 additions & 0 deletions src/unit-tests/oscore-test/ut_oscore_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,10 @@ void UtTest_Setup(void)
UtTest_Add(UT_os_queue_get_id_by_name_test, NULL, NULL, "OS_QueueGetIdByName");
UtTest_Add(UT_os_queue_get_info_test, NULL, NULL, "OS_QueueGetInfo");

UtTest_Add(UT_os_select_fd_test, NULL, NULL, "OS_SelectFd");
UtTest_Add(UT_os_select_single_test, NULL, NULL, "OS_SelectSingle");
UtTest_Add(UT_os_select_multi_test, NULL, NULL, "OS_SelectMultiple");

UtTest_Add(
NULL,
UT_os_init_task_misc,
Expand Down
1 change: 1 addition & 0 deletions src/unit-tests/oscore-test/ut_oscore_test.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include "ut_oscore_countsem_test.h"
#include "ut_oscore_mutex_test.h"
#include "ut_oscore_queue_test.h"
#include "ut_oscore_select_test.h"
#include "ut_oscore_task_test.h"
#include "ut_oscore_interrupt_test.h"
#include "ut_oscore_exception_test.h"
Expand Down

0 comments on commit e4b3789

Please sign in to comment.