Skip to content

Commit

Permalink
Fix nasa#831, WIP coverage, need to update stubs
Browse files Browse the repository at this point in the history
  • Loading branch information
skliper committed Feb 25, 2021
1 parent b257683 commit ae471aa
Show file tree
Hide file tree
Showing 3 changed files with 183 additions and 3 deletions.
122 changes: 121 additions & 1 deletion src/unit-test-coverage/portable/src/coveragetest-bsd-sockets.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,29 @@
#include "os-shared-sockets.h"
#include "os-shared-idmap.h"
#include "os-shared-file.h"
#include "os-shared-select.h"
#include "os-impl-io.h"

#include "OCS_sys_socket.h"
#include "OCS_errno.h"

/* Unique error code for return testing */
#define UT_ERR_UNIQUE 0xDEADBEEF

/* OS_SelectSingle_Impl hook to set SelectFlags per input */
static int32 UT_Hook_OS_SelectSingle_Impl(void *UserObj, int32 StubRetcode, uint32 CallCount, const UT_StubContext_t *Context)
{
uint32 *SelectFlags;

SelectFlags = (uint32 *)UT_Hook_GetArgPtr(Context, "SelectFlags", sizeof(SelectFlags));

if (SelectFlags != NULL)
{
*SelectFlags = *((uint32 *)UserObj);
}

return 0;
}

void Test_OS_SocketOpen_Impl(void)
{
Expand All @@ -46,7 +67,7 @@ void Test_OS_SocketOpen_Impl(void)
OS_stream_table[0].socket_domain = -1;
OSAPI_TEST_FUNCTION_RC(OS_SocketOpen_Impl, (&token), OS_ERR_NOT_IMPLEMENTED);

/* Socket error */
/* Fail socket */
OS_stream_table[0].socket_domain = OS_SocketDomain_INET;
UT_SetDeferredRetcode(UT_KEY(OCS_socket), 1, -1);
OSAPI_TEST_FUNCTION_RC(OS_SocketOpen_Impl, (&token), OS_ERROR);
Expand All @@ -57,6 +78,94 @@ void Test_OS_SocketOpen_Impl(void)
OSAPI_TEST_FUNCTION_RC(OS_SocketOpen_Impl, (&token), OS_SUCCESS);
}

void Test_OS_SocketBind_Impl(void)
{
OS_object_token_t token = {0};
OS_SockAddr_t addr = {0};
struct OCS_sockaddr *sa = (struct OCS_sockaddr *)&addr.AddrData;

/* Set up token for index 0 */
token.obj_idx = UT_INDEX_0;

/* Default family case */
sa->sa_family = -1;
OSAPI_TEST_FUNCTION_RC(OS_SocketBind_Impl, (&token, &addr), OS_ERR_BAD_ADDRESS);

/* Note - not attempting to hit addrlen > OS_SOCKADDR_MAX_LEN at this point (NOT MC/DC)
* would require compiling with a small OS_SOCKADDR_MAX_LEN or bigger structure */

/* Fail bind */
sa->sa_family = OCS_AF_INET;
UT_SetDeferredRetcode(UT_KEY(OCS_bind), 1, -1);
OSAPI_TEST_FUNCTION_RC(OS_SocketBind_Impl, (&token, &addr), OS_ERROR);

/* Fail listen */
sa->sa_family = OCS_AF_INET6;
OS_stream_table[0].socket_type = OS_SocketType_STREAM;
UT_SetDeferredRetcode(UT_KEY(OCS_listen), 1, -1);
OSAPI_TEST_FUNCTION_RC(OS_SocketBind_Impl, (&token, &addr), OS_ERROR);

/* Success with OS_SocketType_STREAM */
OSAPI_TEST_FUNCTION_RC(OS_SocketBind_Impl, (&token, &addr), OS_SUCCESS);

/* Success with ~OS_SocketType_STREAM */
OS_stream_table[0].socket_type = ~OS_SocketType_STREAM;
OSAPI_TEST_FUNCTION_RC(OS_SocketBind_Impl, (&token, &addr), OS_SUCCESS);
}

void Test_OS_SocketConnect_Impl(void)
{
OS_object_token_t token = {0};
OS_SockAddr_t addr = {0};
struct OCS_sockaddr *sa = (struct OCS_sockaddr *)&addr.AddrData;
int32 selectflags;

/* Set up token for index 0 */
token.obj_idx = UT_INDEX_0;

/* Default family case */
sa->sa_family = -1;
addr.ActualLength = sizeof(struct OCS_sockaddr_in);
OSAPI_TEST_FUNCTION_RC(OS_SocketConnect_Impl, (&token, &addr, 0), OS_ERR_BAD_ADDRESS);

/* Sucessful connect */
sa->sa_family = OCS_AF_INET;
OSAPI_TEST_FUNCTION_RC(OS_SocketConnect_Impl, (&token, &addr, 0), OS_SUCCESS);

/* Fail connect, errno ! EINPROGRESS */
OCS_errno = ~OCS_EINPROGRESS;
UT_SetDefaultReturnValue(UT_KEY(OCS_connect), -1);
OSAPI_TEST_FUNCTION_RC(OS_SocketConnect_Impl, (&token, &addr, 0), OS_ERROR);

/* Fail OS_SelectSingle_Impl, errno == EINPROGRESS */
OCS_errno = OCS_EINPROGRESS;
sa->sa_family = OCS_AF_INET6;
addr.ActualLength = sizeof(struct OCS_sockaddr_in6);
OS_impl_filehandle_table[0].selectable = true;
UT_SetDeferredRetcode(UT_KEY(OS_SelectSingle_Impl), 1, UT_ERR_UNIQUE);
OSAPI_TEST_FUNCTION_RC(OS_SocketConnect_Impl, (&token, &addr, 0), UT_ERR_UNIQUE);

/* Timout error by clearing select flags with hook */
selectflags = 0;
UT_SetHookFunction(UT_KEY(OS_SelectSingle_Impl), UT_Hook_OS_SelectSingle_Impl, &selectflags);
OSAPI_TEST_FUNCTION_RC(OS_SocketConnect_Impl, (&token, &addr, 0), OS_ERROR_TIMEOUT);

/* Fail getsockopt status */
UT_SetDeferredRetcode(UT_KEY(OCS_getsockopt), 1, -1);
OSAPI_TEST_FUNCTION_RC(OS_SocketConnect_Impl, (&token, &addr, 0), OS_ERROR);

/* Nonzero getsockopt sockopt */
// TODO set sockopt nonzero
OSAPI_TEST_FUNCTION_RC(OS_SocketConnect_Impl, (&token, &addr, 0), OS_ERROR);

/* Success case with selectable */
OSAPI_TEST_FUNCTION_RC(OS_SocketConnect_Impl, (&token, &addr, 0), OS_SUCCESS);

/* Success case with not selectable */
OS_impl_filehandle_table[0].selectable = false;
OSAPI_TEST_FUNCTION_RC(OS_SocketConnect_Impl, (&token, &addr, 0), OS_SUCCESS);
}

/* ------------------- End of test cases --------------------------------------*/

/* Osapi_Test_Setup
Expand Down Expand Up @@ -86,4 +195,15 @@ void Osapi_Test_Teardown(void) {}
void UtTest_Setup(void)
{
ADD_TEST(OS_SocketOpen_Impl);
ADD_TEST(OS_SocketBind_Impl);
ADD_TEST(OS_SocketConnect_Impl);
// ADD_TEST(OS_SocketAccept_Impl);
// ADD_TEST(OS_SocketRecvFrom_Impl);
// ADD_TEST(OS_SocketSendTo_Impl);
// ADD_TEST(OS_SocketGetInfo_Impl);
// ADD_TEST(OS_SocketAddrInit_Impl);
// ADD_TEST(OS_SocketAddrToString_Impl);
// ADD_TEST(OS_SocketAddrFromString_Impl);
// ADD_TEST(OS_SocketAddrGetPort_Impl);
// ADD_TEST(OS_SocketAddrSetPort_Impl);
}
19 changes: 17 additions & 2 deletions src/unit-test-coverage/ut-stubs/src/osapi-select-impl-stubs.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,20 @@
#include "utstubs.h"
#include "os-shared-select.h"

UT_DEFAULT_STUB(OS_SelectSingle_Impl, (const OS_object_token_t *token, uint32 *SelectFlags, int32 msecs))
UT_DEFAULT_STUB(OS_SelectMultiple_Impl, (OS_FdSet * ReadSet, OS_FdSet *WriteSet, int32 msecs))
int32 OS_SelectSingle_Impl(const OS_object_token_t *token, uint32 *SelectFlags, int32 msecs)
{
UT_Stub_RegisterContext(UT_KEY(OS_SelectSingle_Impl), token);
UT_Stub_RegisterContextGenericArg(UT_KEY(OS_SelectSingle_Impl), SelectFlags);
UT_Stub_RegisterContextGenericArg(UT_KEY(OS_SelectSingle_Impl), msecs);

return UT_DEFAULT_IMPL(OS_SelectSingle_Impl);
}

int32 OS_SelectMultiple_Impl(OS_FdSet *ReadSet, OS_FdSet *WriteSet, int32 msecs)
{
UT_Stub_RegisterContext(UT_KEY(OS_SelectMultiple_Impl), ReadSet);
UT_Stub_RegisterContext(UT_KEY(OS_SelectMultiple_Impl), WriteSet);
UT_Stub_RegisterContextGenericArg(UT_KEY(OS_SelectMultiple_Impl), msecs);

return UT_DEFAULT_IMPL(OS_SelectMultiple_Impl);
}
45 changes: 45 additions & 0 deletions src/unit-test-coverage/ut-stubs/src/sys-socket-stubs.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,46 +27,91 @@

int OCS_accept(int fd, struct OCS_sockaddr *addr, OCS_socklen_t *addr_len)
{
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_accept), fd);
UT_Stub_RegisterContext(UT_KEY(OCS_accept), addr);
UT_Stub_RegisterContext(UT_KEY(OCS_accept), addr_len);

return UT_DEFAULT_IMPL(OCS_accept);
}

int OCS_bind(int fd, const struct OCS_sockaddr *addr, OCS_socklen_t len)
{
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_bind), fd);
UT_Stub_RegisterContext(UT_KEY(OCS_bind), addr);
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_bind), len);

return UT_DEFAULT_IMPL(OCS_bind);
}

int OCS_connect(int fd, const struct OCS_sockaddr *addr, OCS_socklen_t len)
{
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_connect), fd);
UT_Stub_RegisterContext(UT_KEY(OCS_connect), addr);
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_connect), len);

return UT_DEFAULT_IMPL(OCS_connect);
}

int OCS_getsockopt(int fd, int level, int optname, void *optval, OCS_socklen_t *optlen)
{
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_getsockopt), fd);
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_getsockopt), level);
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_getsockopt), optname);
UT_Stub_RegisterContext(UT_KEY(OCS_getsockopt), optval);
UT_Stub_RegisterContext(UT_KEY(OCS_getsockopt), optlen);

return UT_DEFAULT_IMPL(OCS_getsockopt);
}

int OCS_listen(int fd, int n)
{
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_listen), fd);
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_listen), n);

return UT_DEFAULT_IMPL(OCS_listen);
}

OCS_ssize_t OCS_recvfrom(int fd, void *buf, size_t n, int flags, struct OCS_sockaddr *addr, OCS_socklen_t *addr_len)
{
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_recvfrom), fd);
UT_Stub_RegisterContext(UT_KEY(OCS_recvfrom), buf);
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_recvfrom), n);
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_recvfrom), flags);
UT_Stub_RegisterContext(UT_KEY(OCS_recvfrom), addr);
UT_Stub_RegisterContext(UT_KEY(OCS_recvfrom), addr_len);

return UT_DEFAULT_IMPL(OCS_recvfrom);
}

OCS_ssize_t OCS_sendto(int fd, const void *buf, size_t n, int flags, const struct OCS_sockaddr *addr,
OCS_socklen_t addr_len)
{
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_sendto), fd);
UT_Stub_RegisterContext(UT_KEY(OCS_sendto), buf);
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_sendto), n);
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_sendto), flags);
UT_Stub_RegisterContext(UT_KEY(OCS_sendto), addr);
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_sendto), addr_len);

return UT_DEFAULT_IMPL(OCS_sendto);
}

int OCS_setsockopt(int fd, int level, int optname, const void *optval, OCS_socklen_t optlen)
{
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_setsockopt), fd);
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_setsockopt), level);
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_setsockopt), optname);
UT_Stub_RegisterContext(UT_KEY(OCS_setsockopt), optval);
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_setsockopt), optlen);

return UT_DEFAULT_IMPL(OCS_setsockopt);
}

int OCS_socket(int domain, int type, int protocol)
{
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_socket), domain);
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_socket), type);
UT_Stub_RegisterContextGenericArg(UT_KEY(OCS_socket), protocol);

return UT_DEFAULT_IMPL(OCS_socket);
}

0 comments on commit ae471aa

Please sign in to comment.