From 1b857002a0192a8e56379a62f9a099736555f4ad Mon Sep 17 00:00:00 2001 From: Alex Campbell Date: Wed, 16 Dec 2020 12:31:36 -0500 Subject: [PATCH] fix #377 fix race condition --- src/tests/select-test/select-test.c | 210 +++++++++++++++++----------- 1 file changed, 129 insertions(+), 81 deletions(-) diff --git a/src/tests/select-test/select-test.c b/src/tests/select-test/select-test.c index 29344e3a1..80c8cc5bc 100644 --- a/src/tests/select-test/select-test.c +++ b/src/tests/select-test/select-test.c @@ -22,8 +22,9 @@ * Filename: select-test.c * * Purpose: This file contains functional tests for "osapi-select" - * Single select test will create a server and client to stream data between them and the select watches that stream. - * Multi select test will setup a second server and client also streaming data between them so that it can watch multiple streams. + * Single select test will create a server and client to stream data between them and the select watches that stream. + * Multi select test will setup a second server and client also streaming data between them so that it can watch + * multiple streams. * */ @@ -47,7 +48,8 @@ OS_SockAddr_t s_addr; OS_SockAddr_t s2_addr; OS_SockAddr_t c_addr; OS_SockAddr_t c2_addr; -osal_id_t bin_sem_id; +osal_id_t bin_sem_id; +osal_id_t bin_sem_id2; /* *************************************** MAIN ************************************** */ @@ -64,16 +66,25 @@ static osal_id_t setup_file(void) void BinSemSetup(void) { uint32 status; - OS_bin_sem_prop_t bin_sem_prop; + OS_bin_sem_prop_t bin_sem_prop; + OS_bin_sem_prop_t bin_sem_prop2; /* - ** Create the binary semaphore - */ + * Create the binary semaphore + * BinSem1 is used to control when the server can accept connections + * BinSem2 is used to make sure all sub task finish before the main task does. + */ status = OS_BinSemCreate(&bin_sem_id, "BinSem1", 0, 0); UtAssert_True(status == OS_SUCCESS, "BinSem1 create Id=%lx Rc=%d", OS_ObjectIdToInteger(bin_sem_id), (int)status); status = OS_BinSemGetInfo(bin_sem_id, &bin_sem_prop); UtAssert_True(status == OS_SUCCESS, "BinSem1 value=%d Rc=%d", (int)bin_sem_prop.value, (int)status); + + status = OS_BinSemCreate(&bin_sem_id2, "BinSem2", 0, 0); + UtAssert_True(status == OS_SUCCESS, "BinSem2 create Id=%lx Rc=%d", OS_ObjectIdToInteger(bin_sem_id2), (int)status); + + status = OS_BinSemGetInfo(bin_sem_id2, &bin_sem_prop2); + UtAssert_True(status == OS_SUCCESS, "BinSem2 value=%d Rc=%d", (int)bin_sem_prop2.value, (int)status); } void Setup_Server(void) @@ -141,18 +152,24 @@ void Setup_Client(void) void Server_Fn(void) { - osal_id_t connsock_id = OS_OBJECT_ID_UNDEFINED; - OS_SockAddr_t addr; + osal_id_t connsock_id = OS_OBJECT_ID_UNDEFINED; + OS_SockAddr_t addr; + uint32 status; /* Accept incoming connections */ - OS_SocketAccept(s_socket_id, &connsock_id, &addr, OS_PEND); + OS_SocketAccept(s_socket_id, &connsock_id, &addr, OS_PEND); - uint32 status = OS_BinSemTake(bin_sem_id); + status = OS_BinSemTake(bin_sem_id); UtAssert_True(status == OS_SUCCESS, "BinSem1 Server 1 take Rc=%d", (int)status); - OS_close(s_socket_id); - OS_close(connsock_id); + status = OS_close(s_socket_id); + UtAssert_True(status == OS_SUCCESS, "status after close s_socket_id = %d", (int)status); + status = OS_close(connsock_id); + UtAssert_True(status == OS_SUCCESS, "status after close connsock_id = %d", (int)status); + + status = OS_BinSemGive(bin_sem_id2); + UtAssert_True(status == OS_SUCCESS, "BinSem2 Server 1 give Rc=%d", (int)status); } /* end Server_Fn */ void Setup_Server2(void) @@ -166,8 +183,8 @@ void Setup_Server2(void) /* Open a server socket */ s2_socket_id = OS_OBJECT_ID_UNDEFINED; - expected = OS_SUCCESS; - actual = OS_SocketOpen(&s2_socket_id, OS_SocketDomain_INET, OS_SocketType_STREAM); + expected = OS_SUCCESS; + actual = OS_SocketOpen(&s2_socket_id, OS_SocketDomain_INET, OS_SocketType_STREAM); UtAssert_True(actual == expected, "OS_SocketOpen() (%ld) == OS_SUCCESS", (long)actual); UtAssert_True(OS_ObjectIdDefined(s2_socket_id), "s2_socket_id (%lu) != 0", OS_ObjectIdToInteger(s2_socket_id)); @@ -198,7 +215,7 @@ void Setup_Client2(void) */ /* Open a client socket */ - expected = OS_SUCCESS; + expected = OS_SUCCESS; c2_socket_id = OS_OBJECT_ID_UNDEFINED; actual = OS_SocketOpen(&c2_socket_id, OS_SocketDomain_INET, OS_SocketType_STREAM); @@ -220,36 +237,53 @@ void Setup_Client2(void) void Server_Fn2(void) { - osal_id_t connsock_id = OS_OBJECT_ID_UNDEFINED; - OS_SockAddr_t addr; + osal_id_t connsock_id = OS_OBJECT_ID_UNDEFINED; + OS_SockAddr_t addr; + uint32 status; /* Accept incoming connections */ - OS_SocketAccept(s2_socket_id, &connsock_id, &addr, OS_PEND); + OS_SocketAccept(s2_socket_id, &connsock_id, &addr, OS_PEND); - OS_close(s2_socket_id); - OS_close(connsock_id); + status = OS_close(s2_socket_id); + UtAssert_True(status == OS_SUCCESS, "status after close s2_socket_id = %d", (int)status); + status = OS_close(connsock_id); + UtAssert_True(status == OS_SUCCESS, "status after close connsock_id = %d", (int)status); } /* end Server_Fn */ -void Setup_Single(void){ +void Setup_Single(void) +{ Setup_Server(); Setup_Client(); BinSemSetup(); } -void Setup_Multi(void){ +void Setup_Multi(void) +{ Setup_Single(); Setup_Server2(); - Setup_Client2(); + Setup_Client2(); } -void Teardown_Single(void){ - OS_BinSemDelete(bin_sem_id) ; +void Teardown_Single(void) +{ + uint32 status; + OS_close(c_socket_id); + status = OS_BinSemTake(bin_sem_id2); + UtAssert_True(status == OS_SUCCESS, "BinSem2 Teardown single take Rc=%d", (int)status); + + OS_BinSemDelete(bin_sem_id); + OS_BinSemDelete(bin_sem_id2); } -void Teardown_Multi(void){ - OS_BinSemFlush(bin_sem_id); +void Teardown_Multi(void) +{ + uint32 status; + + status = OS_BinSemFlush(bin_sem_id); + UtAssert_True(status == OS_SUCCESS, "BinSem1 Teardown multi flush Rc=%d", (int)status); + OS_close(c2_socket_id); Teardown_Single(); } @@ -260,8 +294,8 @@ void TestSelectSingleRead(void) * Test Case For: * int32 OS_SelectSingle(uint32 objid, uint32 *StateFlags, int32 msecs); */ - int32 expected = OS_SUCCESS; - int32 actual; + int32 expected = OS_SUCCESS; + int32 actual; /* * Create a server thread, and connect client from @@ -270,17 +304,17 @@ void TestSelectSingleRead(void) /* Create a server task/thread */ int32 status = OS_TaskCreate(&s_task_id, "Server", Server_Fn, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), - OSAL_PRIORITY_C(50), 0); + OSAL_PRIORITY_C(50), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)status); /* Connect to a server */ actual = OS_SocketConnect(c_socket_id, &s_addr, 10); - UtAssert_True(actual == expected, "OS_SocketConnect() (%ld) == OS_SUCCESS", (long)actual); + UtAssert_True(actual == expected, "OS_SocketConnect() (%ld) == OS_SUCCESS", (long)actual); uint32 StateFlags; - expected = OS_ERROR_TIMEOUT; + expected = OS_ERROR_TIMEOUT; StateFlags = OS_STREAM_STATE_READABLE; - actual = OS_SelectSingle(c_socket_id, &StateFlags, 100); + actual = OS_SelectSingle(c_socket_id, &StateFlags, 100); /* Verify Outputs */ UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_ERROR_TIMEOUT", (long)actual); @@ -288,13 +322,14 @@ void TestSelectSingleRead(void) status = OS_BinSemGive(bin_sem_id); - expected = OS_SUCCESS; + expected = OS_SUCCESS; StateFlags = OS_STREAM_STATE_READABLE; - actual = OS_SelectSingle(c_socket_id, &StateFlags, 100); + actual = OS_SelectSingle(c_socket_id, &StateFlags, 100); /* Verify Outputs */ UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_SUCCESS", (long)actual); - UtAssert_True(StateFlags == OS_STREAM_STATE_READABLE, "OS_SelectSingle() (%d) == OS_STREAM_STATE_READABLE", StateFlags); + UtAssert_True(StateFlags == OS_STREAM_STATE_READABLE, "OS_SelectSingle() (%d) == OS_STREAM_STATE_READABLE", + StateFlags); } void TestSelectMultipleRead(void) @@ -310,7 +345,7 @@ void TestSelectMultipleRead(void) int32 status; OS_SelectFdZero(&ReadSet); - OS_SelectFdZero(&WriteSet); + OS_SelectFdZero(&WriteSet); /* * Create a server thread, and connect client from @@ -348,17 +383,18 @@ void TestSelectMultipleRead(void) UtAssert_True(OS_SelectFdIsSet(&ReadSet, c2_socket_id), "OS_SelectFdIsSet(2) == true"); } -void TestSelectSingleWrite(void){ +void TestSelectSingleWrite(void) +{ /* * Test Case For: * int32 OS_SelectSingle(uint32 objid, uint32 *StateFlags, int32 msecs); */ - - int32 actual; + + int32 actual; uint32 StateFlags; - int32 expected = OS_SUCCESS; - int count = 0; - char Buf_send_c[16834] = {0}; + int32 expected = OS_SUCCESS; + int count = 0; + char Buf_send_c[16834] = {0}; /* * Create a server thread, and connect client from @@ -367,45 +403,51 @@ void TestSelectSingleWrite(void){ /* Create a server task/thread */ int32 status = OS_TaskCreate(&s_task_id, "Server", Server_Fn, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), - OSAL_PRIORITY_C(50), 0); + OSAL_PRIORITY_C(50), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)status); /* Connect to a server */ actual = OS_SocketConnect(c_socket_id, &s_addr, 10); - UtAssert_True(actual == expected, "OS_SocketConnect() (%ld) == OS_SUCCESS", (long)actual); + UtAssert_True(actual == expected, "OS_SocketConnect() (%ld) == OS_SUCCESS", (long)actual); - while (actual != OS_ERROR_TIMEOUT && count < MAX_BUFFER_LOOP) + while (actual != OS_ERROR_TIMEOUT && count < MAX_BUFFER_LOOP) { strcpy(Buf_send_c, "16 KB buffer filler"); - actual = OS_TimedWrite(c_socket_id, Buf_send_c, sizeof(Buf_send_c), 10); + actual = OS_TimedWrite(c_socket_id, Buf_send_c, sizeof(Buf_send_c), 10); StateFlags = OS_STREAM_STATE_WRITABLE; - actual = OS_SelectSingle(c_socket_id, &StateFlags, 100); + actual = OS_SelectSingle(c_socket_id, &StateFlags, 100); count++; - } + } status = OS_BinSemGive(bin_sem_id); - if(count >= MAX_BUFFER_LOOP){ - UtAssertEx(false, UTASSERT_CASETYPE_MIR, __FILE__, __LINE__, "%s", "Unable to cause OS_STREAM_STATE_WRITEABLE timeout with large looped writes, skipping verification"); - }else{ - expected = OS_ERROR_TIMEOUT; + if (count >= MAX_BUFFER_LOOP) + { + UtAssertEx(false, UTASSERT_CASETYPE_MIR, __FILE__, __LINE__, "%s", + "Unable to cause OS_STREAM_STATE_WRITEABLE timeout with large looped writes, skipping verification"); + } + else + { + expected = OS_ERROR_TIMEOUT; /* Verify Outputs */ UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_ERROR_TIMEOUT", (long)actual); UtAssert_True(StateFlags == 0, "OS_SelectSingle() (%d) == None", StateFlags); - expected = OS_SUCCESS; + expected = OS_SUCCESS; StateFlags = OS_STREAM_STATE_WRITABLE; - actual = OS_SelectSingle(c_socket_id, &StateFlags, 100); + actual = OS_SelectSingle(c_socket_id, &StateFlags, 100); /* Verify Outputs */ UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_SUCCESS", (long)actual); - UtAssert_True(StateFlags == OS_STREAM_STATE_WRITABLE, "OS_SelectSingle() (%d) == OS_STREAM_STATE_WRITABLE", StateFlags); + UtAssert_True(StateFlags == OS_STREAM_STATE_WRITABLE, "OS_SelectSingle() (%d) == OS_STREAM_STATE_WRITABLE", + StateFlags); } } -void TestSelectMultipleWrite(void){ +void TestSelectMultipleWrite(void) +{ /* * Test Case For: * int32 OS_SelectSingle(uint32 objid, uint32 *StateFlags, int32 msecs); @@ -415,9 +457,9 @@ void TestSelectMultipleWrite(void){ int32 expected = OS_SUCCESS; int32 actual; int32 status; - uint32 StateFlags; - int count = 0; - char Buf_send_c[16834] = {0}; + uint32 StateFlags; + int count = 0; + char Buf_send_c[16834] = {0}; OS_SelectFdZero(&ReadSet); OS_SelectFdZero(&WriteSet); @@ -427,7 +469,7 @@ void TestSelectMultipleWrite(void){ * this thread to server thread and verify connection */ - /* Create a server task/thread */ + /* Create a server task/thread */ status = OS_TaskCreate(&s_task_id, "Server", Server_Fn, OSAL_TASK_STACK_ALLOCATE, OSAL_SIZE_C(16384), OSAL_PRIORITY_C(50), 0); UtAssert_True(status == OS_SUCCESS, "OS_TaskCreate() (%ld) == OS_SUCCESS", (long)status); @@ -445,59 +487,65 @@ void TestSelectMultipleWrite(void){ UtAssert_True(actual == expected, "OS_SocketConnect() (%ld) == OS_SUCCESS", (long)actual); OS_SelectFdAdd(&WriteSet, c_socket_id); - OS_SelectFdAdd(&WriteSet, c2_socket_id); + OS_SelectFdAdd(&WriteSet, c2_socket_id); UtAssert_True(OS_SelectFdIsSet(&WriteSet, c_socket_id), "OS_SelectFdIsSet(1) == true"); UtAssert_True(OS_SelectFdIsSet(&WriteSet, c2_socket_id), "OS_SelectFdIsSet(1) == true"); - while (actual != OS_ERROR_TIMEOUT && count < MAX_BUFFER_LOOP) + while (actual != OS_ERROR_TIMEOUT && count < MAX_BUFFER_LOOP) { strcpy(Buf_send_c, "16 KB buffer filler"); - actual = OS_TimedWrite(c_socket_id, Buf_send_c, sizeof(Buf_send_c), 10); + actual = OS_TimedWrite(c_socket_id, Buf_send_c, sizeof(Buf_send_c), 10); StateFlags = OS_STREAM_STATE_WRITABLE; - actual = OS_SelectSingle(c_socket_id, &StateFlags, 100); + actual = OS_SelectSingle(c_socket_id, &StateFlags, 100); count++; - } + } - if(count >= MAX_BUFFER_LOOP){ - UtAssertEx(false, UTASSERT_CASETYPE_MIR, __FILE__, __LINE__, "%s", "Unable to cause OS_STREAM_STATE_WRITEABLE timeout with large looped writes, skipping verification"); - }else{ + if (count >= MAX_BUFFER_LOOP) + { + UtAssertEx(false, UTASSERT_CASETYPE_MIR, __FILE__, __LINE__, "%s", + "Unable to cause OS_STREAM_STATE_WRITEABLE timeout with large looped writes, skipping verification"); + } + else + { actual = OS_SelectMultiple(&ReadSet, &WriteSet, 100); /* Verify Outputs */ UtAssert_True(actual == expected, "OS_SelectMultiple() (%ld) == OS_SUCCESS", (long)actual); UtAssert_True(!OS_SelectFdIsSet(&WriteSet, c_socket_id), "OS_SelectFdIsSet(1) == false"); UtAssert_True(OS_SelectFdIsSet(&WriteSet, c2_socket_id), "OS_SelectFdIsSet(2) == true"); - } + } } void TestSelectSingleFile(void) { - int32 expected = OS_SUCCESS; - int32 actual; - uint32 StateFlags; + int32 expected = OS_SUCCESS; + int32 actual; + uint32 StateFlags; osal_id_t fd = setup_file(); - - expected = OS_SUCCESS; + + expected = OS_SUCCESS; StateFlags = OS_STREAM_STATE_READABLE; - actual = OS_SelectSingle(fd, &StateFlags, 100); + actual = OS_SelectSingle(fd, &StateFlags, 100); /* Verify Outputs */ UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_SUCCESS", (long)actual); - UtAssert_True(StateFlags == OS_STREAM_STATE_READABLE, "OS_SelectSingle() (%d) == OS_STREAM_STATE_READABLE", StateFlags); + UtAssert_True(StateFlags == OS_STREAM_STATE_READABLE, "OS_SelectSingle() (%d) == OS_STREAM_STATE_READABLE", + StateFlags); StateFlags = OS_STREAM_STATE_WRITABLE; - actual = OS_SelectSingle(fd, &StateFlags, 100); + actual = OS_SelectSingle(fd, &StateFlags, 100); /* Verify Outputs */ UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_SUCCESS", (long)actual); - UtAssert_True(StateFlags == OS_STREAM_STATE_WRITABLE, "OS_SelectSingle() (%d) == OS_STREAM_STATE_WRITABLE", StateFlags); + UtAssert_True(StateFlags == OS_STREAM_STATE_WRITABLE, "OS_SelectSingle() (%d) == OS_STREAM_STATE_WRITABLE", + StateFlags); - expected = OS_ERROR_TIMEOUT; + expected = OS_ERROR_TIMEOUT; StateFlags = OS_STREAM_STATE_BOUND; - actual = OS_SelectSingle(fd, &StateFlags, 100); + actual = OS_SelectSingle(fd, &StateFlags, 100); /* Verify Outputs */ UtAssert_True(actual == expected, "OS_SelectSingle() (%ld) == OS_ERROR_TIMEOUT", (long)actual);