#include "unity.h"
#include "unity_fixture.h"
#include "ofc/config.h"
#include "ofc/timer.h"
#include "ofc/waitq.h"
#include "ofc/libc.h"
#include "ofc/sched.h"
#include "ofc/app.h"
#include "ofc/core.h"
#include "ofc/env.h"
#include "ofc/persist.h"
#include "ofc/event.h"
typedef enum {
WAITQ_TEST_STATE_IDLE,
WAITQ_TEST_STATE_RUNNING,
} WAITQ_TEST_STATE;
#define WAITQ_TEST_INTERVAL 2000
#define WAITQ_TEST_COUNT 5
#define WAITQ_MESSAGE "Wait Queue Test Message\n"
typedef struct {
WAITQ_TEST_STATE state;
} OFC_WAITQ_TEST;
static OFC_APP_TEMPLATE WaitQueueTestAppDef =
{
"Wait Queue Test Application",
&WaitQueueTestPreSelect,
&WaitQueueTestPostSelect,
&WaitQueueTestDestroy,
#if defined(OFC_APP_DEBUG)
#endif
};
OFC_WAITQ_TEST *waitqTest;
WAITQ_TEST_STATE entry_state;
waitqTest = ofc_app_get_data(app);
do
{
entry_state = waitqTest->state;
ofc_sched_clear_wait(waitqTest->scheduler, app);
switch (waitqTest->state) {
default:
case WAITQ_TEST_STATE_IDLE:
waitqTest->hWaitQueue = ofc_waitq_create();
waitqTest->hTimer = ofc_timer_create("WQ TEST");
ofc_timer_set(waitqTest->hTimer, WAITQ_TEST_INTERVAL);
waitqTest->state = WAITQ_TEST_STATE_RUNNING;
ofc_sched_add_wait(waitqTest->scheduler, app,
waitqTest->hTimer);
}
}
break;
case WAITQ_TEST_STATE_RUNNING:
ofc_sched_add_wait(waitqTest->scheduler, app,
waitqTest->hWaitQueue);
ofc_sched_add_wait(waitqTest->scheduler, app,
waitqTest->hTimer);
break;
}
} while (waitqTest->state != entry_state);
}
}
OFC_WAITQ_TEST *waitqTest;
waitqTest = ofc_app_get_data(app);
for (progress =
OFC_TRUE; progress && !ofc_app_destroying(app);) {
switch (waitqTest->state) {
default:
case WAITQ_TEST_STATE_IDLE:
break;
case WAITQ_TEST_STATE_RUNNING:
if (hWaitQueue == waitqTest->hWaitQueue) {
msg = ofc_waitq_dequeue(waitqTest->hWaitQueue);
ofc_printf(msg);
}
} else if (hWaitQueue == waitqTest->hTimer) {
if (waitqTest->count++ < WAITQ_TEST_COUNT) {
ofc_strcpy(msg, WAITQ_MESSAGE);
ofc_waitq_enqueue(waitqTest->hWaitQueue, msg);
ofc_timer_set(waitqTest->hTimer, WAITQ_TEST_INTERVAL);
ofc_printf("Wait Queue Timer Triggered\n");
hNext = waitqTest->hWaitQueue;
} else {
ofc_app_kill(app);
}
}
break;
}
}
}
return (hNext);
}
OFC_WAITQ_TEST *waitqTest;
waitqTest = ofc_app_get_data(app);
switch (waitqTest->state) {
default:
case WAITQ_TEST_STATE_IDLE:
break;
case WAITQ_TEST_STATE_RUNNING:
ofc_timer_destroy(waitqTest->hTimer);
ofc_waitq_destroy(waitqTest->hWaitQueue);
break;
}
}
}
TEST_GROUP(waitq);
TEST_SETUP(waitq) {
TEST_ASSERT_FALSE_MESSAGE(test_startup(), "Failed to Startup Framework");
}
TEST_TEAR_DOWN(waitq) {
test_shutdown();
}
TEST(waitq, test_waitq) {
OFC_WAITQ_TEST *waitqTest;
waitqTest->count = 0;
waitqTest->state = WAITQ_TEST_STATE_IDLE;
waitqTest->scheduler = hScheduler;
hApp = ofc_app_create(hScheduler, &WaitQueueTestAppDef, waitqTest);
ofc_app_set_wait(hApp, hDone);
ofc_event_wait(hDone);
}
}
TEST_GROUP_RUNNER(waitq) {
RUN_TEST_CASE(waitq, test_waitq);
}
#if !defined(NO_MAIN)
static void runAllTests(void)
{
RUN_TEST_GROUP(waitq);
}
int main(int argc, const char *argv[])
{
if (argc >= 2) {
if (ofc_strcmp(argv[1], "--config") == 0) {
}
}
return UnityMain(argc, argv, runAllTests);
}
#endif
#define OFC_MAX_PATH
Definition: file.h:119
#define OFC_HANDLE_NULL
Definition: handle.h:64
OFC_DWORD_PTR OFC_HANDLE
Definition: handle.h:43
OFC_CORE_LIB OFC_VOID ofc_free(OFC_LPVOID mem)
OFC_CORE_LIB OFC_LPVOID ofc_malloc(OFC_SIZET size)
@ OFC_FALSE
Definition: types.h:632
@ OFC_TRUE
Definition: types.h:636
void OFC_VOID
Definition: types.h:159
OFC_UINT8 OFC_BOOL
Definition: types.h:624
#define OFC_NULL
Definition: types.h:656
char OFC_CHAR
Definition: types.h:143
int OFC_INT
Definition: types.h:119