#include "unity.h"
#include "unity_fixture.h"
#include "ofc/config.h"
#include "ofc/timer.h"
#include "ofc/thread.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"
#define THREAD_TEST_RUN_INTERVAL 5000
typedef enum {
THREAD_TEST_STATE_IDLE,
THREAD_TEST_STATE_RUNNING
} THREAD_TEST_STATE;
typedef struct {
THREAD_TEST_STATE state;
} THREAD_TEST_APP;
#if defined(OFC_APP_DEBUG)
#endif
static OFC_APP_TEMPLATE ThreadTestAppDef =
{
"Thread Test App",
&ThreadTestPreSelect,
&ThreadTestPostSelect,
&ThreadTestDestroy,
#if defined(OFC_APP_DEBUG)
&thread_test_dump
#else
#endif
};
#if defined(OFC_APP_DEBUG)
{
THREAD_TEST_APP *ThreadApp ;
ThreadApp = ofc_app_get_data (app) ;
{
ofc_printf ("%-20s : %d\n", "Thread Test State",
}
}
#endif
while (!ofc_thread_is_deleting(hThread)) {
ofc_printf("Test Thread is Running\n");
ofc_sleep(1000);
}
ofc_printf("Test Thread is Exiting\n");
return (0);
}
THREAD_TEST_APP *ThreadApp;
THREAD_TEST_STATE entry_state;
ThreadApp = ofc_app_get_data(app);
do
{
entry_state = ThreadApp->state;
ofc_sched_clear_wait(ThreadApp->hScheduler, app);
switch (ThreadApp->state) {
default:
case THREAD_TEST_STATE_IDLE:
ofc_timer_set(ThreadApp->hTimer, THREAD_TEST_RUN_INTERVAL);
ofc_sched_add_wait(ThreadApp->hScheduler, app,
ThreadApp->hTimer);
ThreadApp->state = THREAD_TEST_STATE_RUNNING;
break;
case THREAD_TEST_STATE_RUNNING:
ofc_sched_add_wait(ThreadApp->hScheduler, app,
ThreadApp->hTimer);
break;
}
} while (ThreadApp->state != entry_state);
}
}
THREAD_TEST_APP *ThreadApp;
ThreadApp = ofc_app_get_data(app);
for (progress =
OFC_TRUE; progress && !ofc_app_destroying(app);) {
switch (ThreadApp->state) {
default:
case THREAD_TEST_STATE_IDLE:
break;
case THREAD_TEST_STATE_RUNNING:
if (hEvent == ThreadApp->hTimer) {
ofc_app_kill(app);
}
break;
}
}
}
}
THREAD_TEST_APP *ThreadApp;
ThreadApp = ofc_app_get_data(app);
switch (ThreadApp->state) {
default:
case THREAD_TEST_STATE_IDLE:
break;
case THREAD_TEST_STATE_RUNNING:
ofc_timer_destroy(ThreadApp->hTimer);
break;
}
}
}
TEST_GROUP(thread);
TEST_SETUP(thread) {
TEST_ASSERT_FALSE_MESSAGE(test_startup(), "Failed to Startup Framework");
}
TEST_TEAR_DOWN(thread) {
test_shutdown();
}
TEST(thread, test_thread) {
THREAD_TEST_APP *ThreadApp;
hThread = ofc_thread_create(&ThreadTestApp,
OFC_THREAD_THREAD_TEST, OFC_THREAD_SINGLETON,
ofc_printf("Could not create ThreadTestApp\n");
else {
ThreadApp->hScheduler = hScheduler;
ThreadApp->hTimer = ofc_timer_create("THREAD");
ThreadApp->state = THREAD_TEST_STATE_IDLE;
ThreadApp->hThread = hThread;
hApp = ofc_app_create(ThreadApp->hScheduler, &ThreadTestAppDef,
ThreadApp);
ofc_app_set_wait(hApp, hDone);
ofc_event_wait(hDone);
ofc_printf("Deleting Thread\n");
ofc_thread_delete(ThreadApp->hThread);
ofc_thread_wait(ThreadApp->hThread);
}
}
}
TEST_GROUP_RUNNER(thread) {
RUN_TEST_CASE(thread, test_thread);
}
#if !defined(NO_MAIN)
static void runAllTests(void)
{
RUN_TEST_GROUP(thread);
}
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
OFC_UINT32 OFC_DWORD
Definition: types.h:430
#define OFC_NULL
Definition: types.h:656
char OFC_CHAR
Definition: types.h:143
int OFC_INT
Definition: types.h:119
unsigned short int OFC_UINT16
Definition: types.h:183